diff options
Diffstat (limited to 'Functions/Zle')
-rw-r--r-- | Functions/Zle/smart-insert-last-word | 79 |
1 files changed, 79 insertions, 0 deletions
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 |