# This function lets you implement widgets that can execute arbitrary commands # without losing the current command line, in a fashion similar to the # 'run-help' and 'which-command' widgets. You can use this, for example, to # create key bindings that let you instantly change directories, even while in # the middle of typing another command: # # autoload -Uz execute-command # setopt autopushd pushdminus pushdsilent # zle -N cd-upward ; cd-upward() { execute-command cd .. } # zle -N cd-backward; cd-backward() { execute-command pushd -1 } # zle -N cd-forward ; cd-forward() { execute-command pushd +0 } # bindkey '^[^[[A' cd-upward; bindkey '^[^[OA' cd-upward # bindkey '^[-' cd-backward # bindkey '^[=' cd-forward # case $CONTEXT in ( start ) # PS1 ;; ( cont ) # PS2 # Add a one-time hook that will re-run this widget at the top-level prompt. autoload -Uz add-zle-hook-widget local hook=line-init local func=:$hook:$WIDGET eval "$func() { # Make sure we don't run twice. add-zle-hook-widget -d $hook $func # Don't leave anything behind. zle -D $func unfunction $func zle $WIDGET }" add-zle-hook-widget $hook $func # Move the entire current multiline construct into the editor buffer. This # function is then aborted and we return to the top-level prompt, which # triggers the hook above. zle .push-line-or-edit return # Not actually necessary, but for clarity's sake ;; ( * ) # We don't want this to be used in a select loop or in vared. return 1 ;; esac # Push the current buffer onto the buffer stack and clear the buffer. The ZLE # will auto-restore it at the next top-level prompt. zle .push-line BUFFER="$*" zle .accept-line