diff options
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | Functions/Zle/smart-insert-last-word | 79 |
2 files changed, 85 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog index ee6dfa094..4d83ab0c2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2000-09-07 Bart Schaefer <schaefer@zsh.org> + + * 12773: Doc/Zsh/contrib.yo, Functions/Zle/smart-insert-last-word: + Add the smart-insert-last-word function from zsh-users/3272. + Change "completion style" to "widget style" in a few places. + 2000-09-07 Sven Wischnowsky <wischnow@zsh.org> * 12769: Completion/Builtins/_cd: more sensible value diff --git a/Functions/Zle/smart-insert-last-word b/Functions/Zle/smart-insert-last-word new file mode 100644 index 000000000..512e118fe --- /dev/null +++ b/Functions/Zle/smart-insert-last-word @@ -0,0 +1,79 @@ +# smart-insert-last-word +# Inspired by Christoph Lange <langec@gmx.de> from zsh-users/3265; +# rewritten to correct multiple-call behavior after zsh-users/3270. +# +# This function as a ZLE widget can replace insert-last-word, like so: +# +# zle -N insert-last-word smart-insert-last-word +# +# With a numeric prefix, behaves like insert-last-word, except that words +# in comments are ignored when interactive_comments is set. +# +# Otherwise, the rightmost "interesting" word from the previous command is +# found and inserted. The default definition of "interesting" is that the +# word contains at least one alphabetic character, slash, or backslash. +# This definition can be overridden by use of a style like so: +# +# zstyle :insert-last-word match '*[[:alpha:]/\\]*' +# +# For example, you might want to include words that contain spaces: +# +# zstyle :insert-last-word match '*[[:alpha:][:space:]/\\]*' +# +# Or include numbers as long as the word is at least two characters long: +# +# zstyle :insert-last-word match '*([[:digit:]]?|[[:alpha:]/\\])*' +# +# That causes redirections like "2>" to be included. +# +# Note also that the style is looked up based on the widget name, so you +# can bind this function to different widgets to use different patterns: +# +# zle -N insert-last-assignment smart-insert-last-word +# zstyle :insert-last-assignment match '[[:alpha:]][][[:alnum:]]#=*' +# bindkey '\e=' insert-last-assignment + +emulate -L zsh +setopt extendedglob + +# Not strictly necessary: +# (($+_ilw_hist)) || integer -g _ilw_hist _ilw_count _ilw_cursor _ilw_lcursor + +integer cursor=$CURSOR lcursor=$CURSOR +local lastcmd pattern numeric=$NUMERIC + +# Save state for repeated calls +if (( HISTNO == _ilw_hist && cursor == _ilw_cursor )); then + NUMERIC=$[_ilw_count+1] + lcursor=$_ilw_lcursor +else + NUMERIC=1 + _ilw_lcursor=$lcursor +fi +_ilw_hist=$HISTNO +_ilw_count=$NUMERIC + +zle .up-history || return 1 # Retrieve previous command +lastcmd=( ${(z)BUFFER} ) # Split into shell words +zle .down-history # Return to current command +CURSOR=$cursor # Restore cursor position +NUMERIC=${numeric:-1} # In case of fall through + +(( NUMERIC > $#lastcmd )) && return 1 + +if [[ -z "$numeric" ]] +then + integer i=1 + zstyle -s :$WIDGET match pattern || + pattern='*[[:alpha:]/\\]*' + while ((i <= $#lastcmd)); do + if [[ $lastcmd[-i] == $~pattern ]]; then + NUMERIC=$i + break + else + ((++i)) + fi + done +fi +LBUFFER[lcursor+1,cursor+1]=$lastcmd[-NUMERIC] +_ilw_cursor=$CURSOR |