Compare commits

..

6 Commits

Author SHA1 Message Date
Eric Freese
b27277e7ff wip playing with different strategies when for different patterns 2019-06-29 13:49:16 -06:00
Eric Freese
146020d9b2 Merge pull request #454 from zsh-users/develop
v0.6.3
2019-06-24 09:13:46 -06:00
Eric Freese
0636a39b51 0.6.3 2019-06-24 09:10:42 -06:00
Eric Freese
6769c941ba Update changelog for v0.6.3 release 2019-06-24 09:10:42 -06:00
Eric Freese
371d6441c0 Merge pull request #453 from zsh-users/fixes/move-cursor-on-accept
Fix moving cursor to end of buffer when suggestion accepted
2019-06-24 07:16:35 -06:00
Eric Freese
78e4379711 Fix moving cursor to end of buffer when suggestion accepted
$max_cursor_pos in this case was not the correct value to use. It was
calculated based on the old length of the $BUFFER. After the suggestion
is accepted, we need to recalculate the new max cursor length and use it
to set the $CURSOR.

Fixes issue #452. Follow-up to issue #302 (PR #450).
2019-06-23 12:37:08 -06:00
7 changed files with 95 additions and 27 deletions

View File

@@ -1,5 +1,8 @@
# Changelog # Changelog
## v0.6.3
- Fixed bug moving cursor to end of buffer after accepting suggestion (#453)
## v0.6.2 ## v0.6.2
- Fixed bug deleting the last character in the buffer in vi mode (#450) - Fixed bug deleting the last character in the buffer in vi mode (#450)
- Degrade gracefully when user doesn't have `zsh/system` module installed (#447) - Degrade gracefully when user doesn't have `zsh/system` module installed (#447)

View File

@@ -1 +1 @@
v0.6.2 v0.6.3

View File

@@ -5,12 +5,13 @@ describe 'a zle widget' do
context 'when added to ZSH_AUTOSUGGEST_ACCEPT_WIDGETS' do context 'when added to ZSH_AUTOSUGGEST_ACCEPT_WIDGETS' do
let(:options) { ["ZSH_AUTOSUGGEST_ACCEPT_WIDGETS+=(#{widget})"] } let(:options) { ["ZSH_AUTOSUGGEST_ACCEPT_WIDGETS+=(#{widget})"] }
it 'accepts the suggestion when invoked' do it 'accepts the suggestion and moves the cursor to the end of the buffer when invoked' do
with_history('echo hello') do with_history('echo hello') do
session.send_string('e') session.send_string('e')
wait_for { session.content }.to eq('echo hello') wait_for { session.content }.to eq('echo hello')
session.send_keys('C-b') session.send_keys('C-b')
wait_for { session.content(esc_seqs: true) }.to eq('echo hello') wait_for { session.content(esc_seqs: true) }.to eq('echo hello')
wait_for { session.cursor }.to eq([10, 0])
end end
end end
end end

View File

@@ -17,7 +17,10 @@ typeset -g ZSH_AUTOSUGGEST_ORIGINAL_WIDGET_PREFIX=autosuggest-orig-
# Will try each strategy in order until a suggestion is returned # Will try each strategy in order until a suggestion is returned
(( ! ${+ZSH_AUTOSUGGEST_STRATEGY} )) && { (( ! ${+ZSH_AUTOSUGGEST_STRATEGY} )) && {
typeset -ga ZSH_AUTOSUGGEST_STRATEGY typeset -ga ZSH_AUTOSUGGEST_STRATEGY
ZSH_AUTOSUGGEST_STRATEGY=(history) ZSH_AUTOSUGGEST_STRATEGY=(
'cd *:completion'
'*:history,completion'
)
} }
# Widgets that clear the suggestion # Widgets that clear the suggestion

View File

@@ -8,20 +8,45 @@
_zsh_autosuggest_fetch_suggestion() { _zsh_autosuggest_fetch_suggestion() {
typeset -g suggestion typeset -g suggestion
local -a strategies local -a strategy_specs spec_parts strategies
local strategy local strategy_spec strategy prefix
# Ensure we are working with an array # Ensure we are working with an array
strategies=(${=ZSH_AUTOSUGGEST_STRATEGY}) strategy_specs=(${ZSH_AUTOSUGGEST_STRATEGY})
for strategy in $strategies; do echo "fetching.." >> debug.log
# Try to get a suggestion from this strategy
_zsh_autosuggest_strategy_$strategy "$1"
# Ensure the suggestion matches the prefix for strategy_spec in $strategy_specs; do
[[ "$suggestion" != "$1"* ]] && unset suggestion echo "trying spec: '$strategy_spec'" >> debug.log
spec_parts=(${(s/:/)strategy_spec})
prefix="${spec_parts[1]}"
# Break once we've found a valid suggestion echo "checking prefix: $prefix" >> debug.log
[[ -n "$suggestion" ]] && break echo " spec parts: $spec_parts" >> debug.log
if [[ "$1" != ${~prefix} ]]; then
echo " '$1' didn't match prefix: '$prefix'" >> debug.log
continue;
fi
strategies=(${(s/,/)${spec_parts[2]}})
echo " trying strategies: $strategies" >> debug.log
for strategy in $strategies; do
echo " trying strategy $strategy" >> debug.log
# Try to get a suggestion from this strategy
_zsh_autosuggest_strategy_$strategy "$1"
# Ensure the suggestion matches the prefix
[[ "$suggestion" != "$1"* ]] && unset suggestion
# Break once we've found a valid suggestion
[[ -n "$suggestion" ]] && return
echo " didn't get suggestion" >> debug.log
done
done done
} }

View File

@@ -136,7 +136,11 @@ _zsh_autosuggest_accept() {
unset POSTDISPLAY unset POSTDISPLAY
# Move the cursor to the end of the buffer # Move the cursor to the end of the buffer
CURSOR=${max_cursor_pos} if [[ "$KEYMAP" = "vicmd" ]]; then
CURSOR=$(($#BUFFER - 1))
else
CURSOR=$#BUFFER
fi
fi fi
_zsh_autosuggest_invoke_original_widget $@ _zsh_autosuggest_invoke_original_widget $@

View File

@@ -1,6 +1,6 @@
# Fish-like fast/unobtrusive autosuggestions for zsh. # Fish-like fast/unobtrusive autosuggestions for zsh.
# https://github.com/zsh-users/zsh-autosuggestions # https://github.com/zsh-users/zsh-autosuggestions
# v0.6.2 # v0.6.3
# Copyright (c) 2013 Thiago de Arruda # Copyright (c) 2013 Thiago de Arruda
# Copyright (c) 2016-2019 Eric Freese # Copyright (c) 2016-2019 Eric Freese
# #
@@ -43,7 +43,10 @@ typeset -g ZSH_AUTOSUGGEST_ORIGINAL_WIDGET_PREFIX=autosuggest-orig-
# Will try each strategy in order until a suggestion is returned # Will try each strategy in order until a suggestion is returned
(( ! ${+ZSH_AUTOSUGGEST_STRATEGY} )) && { (( ! ${+ZSH_AUTOSUGGEST_STRATEGY} )) && {
typeset -ga ZSH_AUTOSUGGEST_STRATEGY typeset -ga ZSH_AUTOSUGGEST_STRATEGY
ZSH_AUTOSUGGEST_STRATEGY=(history) ZSH_AUTOSUGGEST_STRATEGY=(
'cd *:completion'
'*:history,completion'
)
} }
# Widgets that clear the suggestion # Widgets that clear the suggestion
@@ -398,7 +401,11 @@ _zsh_autosuggest_accept() {
unset POSTDISPLAY unset POSTDISPLAY
# Move the cursor to the end of the buffer # Move the cursor to the end of the buffer
CURSOR=${max_cursor_pos} if [[ "$KEYMAP" = "vicmd" ]]; then
CURSOR=$(($#BUFFER - 1))
else
CURSOR=$#BUFFER
fi
fi fi
_zsh_autosuggest_invoke_original_widget $@ _zsh_autosuggest_invoke_original_widget $@
@@ -704,21 +711,46 @@ _zsh_autosuggest_strategy_match_prev_cmd() {
_zsh_autosuggest_fetch_suggestion() { _zsh_autosuggest_fetch_suggestion() {
typeset -g suggestion typeset -g suggestion
local -a strategies local -a strategy_specs spec_parts strategies
local strategy local strategy_spec strategy prefix
# Ensure we are working with an array # Ensure we are working with an array
strategies=(${=ZSH_AUTOSUGGEST_STRATEGY}) strategy_specs=(${ZSH_AUTOSUGGEST_STRATEGY})
for strategy in $strategies; do echo "fetching.." >> debug.log
# Try to get a suggestion from this strategy
_zsh_autosuggest_strategy_$strategy "$1"
# Ensure the suggestion matches the prefix for strategy_spec in $strategy_specs; do
[[ "$suggestion" != "$1"* ]] && unset suggestion echo "trying spec: '$strategy_spec'" >> debug.log
spec_parts=(${(s/:/)strategy_spec})
prefix="${spec_parts[1]}"
# Break once we've found a valid suggestion echo "checking prefix: $prefix" >> debug.log
[[ -n "$suggestion" ]] && break echo " spec parts: $spec_parts" >> debug.log
if [[ "$1" != ${~prefix} ]]; then
echo " '$1' didn't match prefix: '$prefix'" >> debug.log
continue;
fi
strategies=(${(s/,/)${spec_parts[2]}})
echo " trying strategies: $strategies" >> debug.log
for strategy in $strategies; do
echo " trying strategy $strategy" >> debug.log
# Try to get a suggestion from this strategy
_zsh_autosuggest_strategy_$strategy "$1"
# Ensure the suggestion matches the prefix
[[ "$suggestion" != "$1"* ]] && unset suggestion
# Break once we've found a valid suggestion
[[ -n "$suggestion" ]] && return
echo " didn't get suggestion" >> debug.log
done
done done
} }