123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 |
- ### vim:ft=zsh:foldmethod=marker
- ###
- ### a generic accept-line wrapper
- ###
- ### Frank Terbeck <ft@bewatermyfriend.org>
- ### Last-Modified: Wed Dec 26 14:37:47 2007
- ###
- ### URI: <http://ft.bewatermyfriend.org/comp/zsh.html>
- ###
- function Accept-Line() {
- setopt localoptions noksharrays
- local -a subs
- local -xi aldone
- local sub
- zstyle -a ":acceptline:${alcontext}" actions subs
- (( ${#subs} < 1 )) && return 0
- (( aldone = 0 ))
- for sub in ${subs} ; do
- [[ ${sub} == 'accept-line' ]] && sub='.accept-line'
- zle ${sub}
- (( aldone > 0 )) && break
- done
- }
- function Accept-Line-getdefault() {
- local default_action
- zstyle -s ":acceptline:${alcontext}" default_action default_action
- case ${default_action} in
- ((accept-line|))
- printf ".accept-line"
- ;;
- (*)
- printf ${default_action}
- ;;
- esac
- }
- function accept-line() {
- setopt localoptions noksharrays
- local -a cmdline
- local -x alcontext
- local buf com fname format msg default_action
- alcontext='default'
- buf="${BUFFER}"
- cmdline=(${(z)BUFFER})
- com="${cmdline[1]}"
- fname="_${com}"
- zstyle -t ":acceptline:${alcontext}" rehash \
- && [[ -z ${commands[$com]} ]] \
- && rehash
- if [[ -n ${reswords[(r)$com]} ]] \
- || [[ -n ${aliases[$com]} ]] \
- || [[ -n ${functions[$com]} ]] \
- || [[ -n ${builtins[$com]} ]] \
- || [[ -n ${commands[$com]} ]] ; then
- # there is something sensible to execute, just do it.
- alcontext='normal'
- zle Accept-Line
- default_action=$(Accept-Line-getdefault)
- zstyle -T ":acceptline:${alcontext}" call_default \
- && zle ${default_action}
- return
- fi
- if [[ -o correct ]] \
- || [[ -o correctall ]] \
- && [[ -n ${functions[$fname]} ]] ; then
- # nothing there to execute but there is a function called
- # _command_name; a completion widget. Makes no sense to
- # call it on the commandline, but the correct{,all} options
- # will ask for it nevertheless, so warn the user.
- if [[ ${LASTWIDGET} == 'accept-line' ]] ; then
- # Okay, we warned the user before, he called us again,
- # so have it his way.
- alcontext='force'
- zle Accept-Line
- default_action=$(Accept-Line-getdefault)
- zstyle -T ":acceptline:${alcontext}" call_default \
- && zle ${default_action}
- return
- fi
- # prepare warning message for the user, configurable via zstyle.
- zstyle -s ":acceptline:${alcontext}" compwarnfmt msg
- if [[ -z ${msg} ]] ; then
- msg="%c will not execute and completion %f exists."
- fi
- zformat -f msg "${msg}" "c:${com}" "f:${fname}"
- zle -M -- "${msg}"
- return
- elif [[ -n ${buf//[$' \t\n']##/} ]] ; then
- # If we are here, the commandline contains something that is not
- # executable, which is neither subject to _command_name correction
- # and is not empty. might be a variable assignment
- alcontext='misc'
- zle Accept-Line
- default_action=$(Accept-Line-getdefault)
- zstyle -T ":acceptline:${alcontext}" call_default \
- && zle ${default_action}
- return
- fi
- # If we got this far, the commandline only contains whitespace, or is empty.
- alcontext='empty'
- zle Accept-Line
- default_action=$(Accept-Line-getdefault)
- zstyle -T ":acceptline:${alcontext}" call_default \
- && zle ${default_action}
- }
- zle -N accept-line
- zle -N Accept-Line
|