functions/accept-line
author Mikael Berthe <mikael@lilotux.net>
Sun, 15 Jul 2012 01:17:55 +0200
changeset 8 3f68f355bf1a
permissions -rw-r--r--
Update ..* commands Code from Frank Terbeck (https://dev.0x50.de/projects/ftzsh/).
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
8
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     1
### a generic accept-line wrapper
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     2
### distributed under the same terms as zsh itself.
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     3
#
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     4
# (Mikael: copied from Frank Terbeck repository
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     5
# at https://dev.0x50.de/projects/ftzsh/repository)
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     6
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     7
function Accept-Line() {
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     8
    setopt localoptions noksharrays
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     9
    local -a subs
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    10
    local -xi aldone
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    11
    local sub
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    12
    local alcontext=${1:-$alcontext}
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    13
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    14
    zstyle -a ":acceptline:${alcontext}" actions subs
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    15
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    16
    (( ${#subs} < 1 )) && return 0
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    17
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    18
    (( aldone = 0 ))
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    19
    for sub in ${subs} ; do
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    20
        [[ ${sub} == 'accept-line' ]] && sub='.accept-line'
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    21
        zle ${sub}
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    22
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    23
        (( aldone > 0 )) && break
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    24
    done
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    25
}
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    26
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    27
function Accept-Line-getdefault() {
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    28
    local default_action
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    29
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    30
    zstyle -s ":acceptline:${alcontext}" default_action default_action
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    31
    case ${default_action} in
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    32
        ((accept-line|))
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    33
            REPLY=".accept-line"
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    34
            ;;
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    35
        (*)
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    36
            REPLY=${default_action}
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    37
            ;;
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    38
    esac
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    39
}
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    40
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    41
function Accept-Line-HandleContext() {
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    42
    local REPLY
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    43
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    44
    zle Accept-Line
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    45
    Accept-Line-getdefault
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    46
    default_action="${REPLY}"
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    47
    zstyle -T ":acceptline:${alcontext}" call_default \
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    48
        && zle ${default_action}
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    49
}
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    50
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    51
function accept-line() {
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    52
    setopt localoptions noksharrays
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    53
    local -ax cmdline
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    54
    local -x alcontext
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    55
    local buf com fname format msg default_action
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    56
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    57
    alcontext='default'
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    58
    buf="${BUFFER}"
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    59
    cmdline=(${(z)BUFFER})
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    60
    com="${cmdline[1]}"
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    61
    fname="_${com}"
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    62
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    63
    Accept-Line 'preprocess'
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    64
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    65
    zstyle -t ":acceptline:${alcontext}" rehash \
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    66
        && [[ -z ${commands[$com]} ]]           \
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    67
        && rehash
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    68
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    69
    if    [[ -n ${com}               ]] \
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    70
       && [[ -n ${reswords[(r)$com]} ]] \
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    71
       || [[ -n ${aliases[$com]}     ]] \
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    72
       || [[ -n ${functions[$com]}   ]] \
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    73
       || [[ -n ${builtins[$com]}    ]] \
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    74
       || [[ -n ${commands[$com]}    ]] ; then
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    75
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    76
        # there is something sensible to execute, just do it.
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    77
        alcontext='normal'
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    78
        Accept-Line-HandleContext
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    79
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    80
        return
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    81
    fi
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    82
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    83
    if    [[ -o correct              ]] \
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    84
       || [[ -o correctall           ]] \
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    85
       && [[ -n ${functions[$fname]} ]] ; then
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    86
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    87
        # nothing there to execute but there is a function called
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    88
        # _command_name; a completion widget. Makes no sense to
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    89
        # call it on the commandline, but the correct{,all} options
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    90
        # will ask for it nevertheless, so warn the user.
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    91
        if [[ ${LASTWIDGET} == 'accept-line' ]] ; then
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    92
            # Okay, we warned the user before, he called us again,
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    93
            # so have it his way.
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    94
            alcontext='force'
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    95
            Accept-Line-HandleContext
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    96
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    97
            return
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    98
        fi
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    99
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   100
        if zstyle -t ":acceptline:${alcontext}" nocompwarn ; then
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   101
            alcontext='normal'
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   102
            Accept-Line-HandleContext
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   103
        else
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   104
            # prepare warning message for the user, configurable via zstyle.
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   105
            zstyle -s ":acceptline:${alcontext}" compwarnfmt msg
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   106
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   107
            if [[ -z ${msg} ]] ; then
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   108
                msg="%c will not execute and completion %f exists."
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   109
            fi
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   110
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   111
            zformat -f msg "${msg}" "c:${com}" "f:${fname}"
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   112
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   113
            zle -M -- "${msg}"
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   114
        fi
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   115
        return
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   116
    elif [[ -n ${buf//[$' \t\n']##/} ]] ; then
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   117
        # If we are here, the commandline contains something that is not
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   118
        # executable, which is neither subject to _command_name correction
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   119
        # and is not empty. might be a variable assignment
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   120
        alcontext='misc'
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   121
        Accept-Line-HandleContext
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   122
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   123
        return
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   124
    fi
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   125
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   126
    # If we got this far, the commandline only contains whitespace, or is empty.
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   127
    alcontext='empty'
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   128
    Accept-Line-HandleContext
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   129
}
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   130
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   131
zle -N accept-line
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   132
zle -N Accept-Line
3f68f355bf1a Update ..* commands
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   133
zle -N Accept-Line-HandleContext