Zsh zle班次选择

log*_*og0 7 shell zsh zsh-zle

如何使用shift来选择命令行的一部分(就像许多文本编辑器一样)?

Ste*_*las 12

shift-arrow() {
  ((REGION_ACTIVE)) || zle set-mark-command
  zle $1
}
shift-left() shift-arrow backward-char
shift-right() shift-arrow forward-char
shift-up() shift-arrow up-line-or-history
shift-down() shift-arrow down-line-or-history
zle -N shift-left
zle -N shift-right
zle -N shift-up
zle -N shift-down

bindkey $terminfo[kLFT] shift-left
bindkey $terminfo[kRIT] shift-right
bindkey $terminfo[kri] shift-up
bindkey $terminfo[kind] shift-down
Run Code Online (Sandbox Code Playgroud)

这假定你的终端在发送不同的转义序列Shift-Arrows从一个在发送Arrow和你的terminfo数据库正确填入相应kLFT和Krit的能力,以及你使用emacs风格键绑定.

或者,稍微分解代码:

shift-arrow() {
  ((REGION_ACTIVE)) || zle set-mark-command
  zle $1
}
for key  kcap seq        widget (
    left  LFT $'\e[1;2D' backward-char
    right RIT $'\e[1;2C' forward-char
    up    ri  $'\e[1;2A' up-line-or-history
    down  ind $'\e[1;2B' down-line-or-history
  ) {
  functions[shift-$key]="shift-arrow $widget"
  zle -N shift-$key
  bindkey ${terminfo[k$kcap]-$seq} shift-$key
}
Run Code Online (Sandbox Code Playgroud)

上面是terminfo数据库没有信息的情况下的硬编码序列(使用xterm序列).


Jam*_*rgy 12

从近3年前扩展Stephane的优秀答案,我添加了一些更多的绑定,使行为(几乎)与Windows的所有标准键盘行为完全一致:

  • 使用导航键(箭头,主页,结束)时无需移位即可清除选择
  • BackspaceDel删除活动选择
  • 使用Ctrl+Shift+Left/ 时,选择范围扩展到下一个/上一个单词Ctrl+Shift+Right
  • Shift+Home并将Shift+End选择分别扩展到行的开头和结尾.Ctrl+Shift+HomeCtrl+Shift+End做同样的事情.

两件事情并不完全相同:

  • 与Windows不同,将选择扩展到下一个单词包括尾随空格.这可以修复,但它并没有打扰我.
  • 当有活动选择时键入将不会删除它并将其替换为您键入的字符.这似乎需要更多的工作来重新映射整个键盘.对我来说不值得麻烦.

请注意,默认的mintty行为是绑定Shift+EndShift+Home访问回滚缓冲区.这取代了zsh配置; 钥匙永远不会通过.为了使这些工作正常,您需要在/etc/minttyrc或中配置不同的密钥(或禁用回滚)~/.minttyrc.请参阅"修改为滚动" 在这里 -最简单的解决方案正好被设置ScrollMod=2绑定它Alt代替Shift.

所以一切:

〜/ .minttyrc

ScrollMod=2
Run Code Online (Sandbox Code Playgroud)

〜/ .zshrc

r-delregion() {
  if ((REGION_ACTIVE)) then
     zle kill-region
  else 
    local widget_name=$1
    shift
    zle $widget_name -- $@
  fi
}

r-deselect() {
  ((REGION_ACTIVE = 0))
  local widget_name=$1
  shift
  zle $widget_name -- $@
}

r-select() {
  ((REGION_ACTIVE)) || zle set-mark-command
  local widget_name=$1
  shift
  zle $widget_name -- $@
}

for key     kcap   seq        mode   widget (
    sleft   kLFT   $'\e[1;2D' select   backward-char
    sright  kRIT   $'\e[1;2C' select   forward-char
    sup     kri    $'\e[1;2A' select   up-line-or-history
    sdown   kind   $'\e[1;2B' select   down-line-or-history

    send    kEND   $'\E[1;2F' select   end-of-line
    send2   x      $'\E[4;2~' select   end-of-line

    shome   kHOM   $'\E[1;2H' select   beginning-of-line
    shome2  x      $'\E[1;2~' select   beginning-of-line

    left    kcub1  $'\EOD'    deselect backward-char
    right   kcuf1  $'\EOC'    deselect forward-char

    end     kend   $'\EOF'    deselect end-of-line
    end2    x      $'\E4~'    deselect end-of-line

    home    khome  $'\EOH'    deselect beginning-of-line
    home2   x      $'\E1~'    deselect beginning-of-line

    csleft  x      $'\E[1;6D' select   backward-word
    csright x      $'\E[1;6C' select   forward-word
    csend   x      $'\E[1;6F' select   end-of-line
    cshome  x      $'\E[1;6H' select   beginning-of-line

    cleft   x      $'\E[1;5D' deselect backward-word
    cright  x      $'\E[1;5C' deselect forward-word

    del     kdch1   $'\E[3~'  delregion delete-char
    bs      x       $'^?'     delregion backward-delete-char

  ) {
  eval "key-$key() {
    r-$mode $widget \$@
  }"
  zle -N key-$key
  bindkey ${terminfo[$kcap]-$seq} key-$key
}
Run Code Online (Sandbox Code Playgroud)

这涵盖了我使用的几种不同键盘配置的键码.

注意: "key"列中的值没有任何意义,它们仅用于为zle构建命名引用.它们可以是任何东西.什么是重要的是seq,modewidget列.

注意2:您几乎可以绑定任何所需的键,只需要控制台模拟器中使用的键码即可.打开常规控制台(不运行zsh)并键入Ctrl + V,然后键入所需的键.它应该发出代码.^[手段\E.

  • 如何在此处将 ctrl 换成 alt?另外,我怎样才能使这些与 ubuntu 和 xterm 兼容? (2认同)

Akh*_*rou 12

扩展了 Jamie Trewgy 的答案。

\n

包括以下功能:

\n
    \n
  • cmd+a:选择整个命令行提示文本
  • \n
  • cmd+x:剪切(复制和删除)当前命令行选择到剪贴板
  • \n
  • cmd+c:将当前命令行选择复制到剪贴板
  • \n
  • cmd+v:粘贴剪贴板选择
  • \n
  • ctrl+u:向后删除直到行首
  • \n
  • cmd+z:撤消
  • \n
  • cmd+shift+z: 重做
  • \n
  • 移位选择:\n
      \n
    • shift-left:选择左边的字符
    • \n
    • shift-right:选择右边的字符
    • \n
    • shift-up:向上选择行
    • \n
    • shift-down:向下选择直播
    • \n
    • cmd-shift-left:选择直到行首
    • \n
    • cmd-shift-right:选择直到行尾
    • \n
    • alt-shift-left:选择左侧的单词
    • \n
    • alt-shift-right:选择右侧的单词
    • \n
    • ctrl-shift-left:选择直到行首
    • \n
    • ctrl-shift-right:选择直到行尾
    • \n
    • ctrl-shift-a:选择直到行首
    • \n
    • ctrl-shift-e:选择直到行尾
    • \n
    \n
  • \n
  • unselect:按预期工作,在left/right, alt-left/right, cmd/ctrl-left/right,上esc+esc
  • \n
  • 删除选择Delete:在, ctrl+d,上按预期工作backspace
  • \n
  • 删除选择和插入字符:对所有可见 ASCII 字符和空格按预期工作
  • \n
  • 删除选择并插入剪贴板:按预期工作
  • \n
\n
\n
.zshrc
\n
# for my own convenience I explicitly set the signals\n#   that my terminal sends to the shell as variables.\n#   you might have different signals. you can see what\n#   signal each of your keys sends by running `$> cat`\n#   and pressing keys (you\'ll be able to see most keys)\n#   also some of the signals sent might be set in your \n#   terminal emulator application/program\n#   configurations/preferences. finally some terminals\n#   have a feature that shows you what signals are sent\n#   per key press.\n#\n# for context, at the time of writing these variables are\n#   set for the kitty terminal program, i.e these signals  \n#   are mostly ones sent by default by this terminal.\nexport KEY_ALT_F=\'\xc6\x92\'\nexport KEY_ALT_B=\'\xe2\x88\xab\'\nexport KEY_ALT_D=\'\xe2\x88\x82\'\nexport KEY_CTRL_U=$\'\\x15\' # ^U\nexport KEY_CMD_BACKSPACE=$\'^[b\'   # arbitrary; added via kitty config (send_text)\nexport KEY_CMD_Z=^[[122;9u\nexport KEY_SHIFT_CMD_Z=^[[122;10u\nexport KEY_CTRL_R=$\'\\x12\' # ^R\nexport KEY_CMD_C=^[[99;9u\nexport KEY_CMD_X=^[[120;9u\nexport KEY_CMD_V=^[[118;9u\nexport KEY_CMD_A=^[[97;9u\nexport KEY_CTRL_L=$\'\\x0c\' # ^L\nexport KEY_LEFT=${terminfo[kcub1]:-$\'^[[D\'}\nexport KEY_RIGHT=${terminfo[kcuf1]:-$\'^[[C\'}\nexport KEY_SHIFT_UP=${terminfo[kri]:-$\'^[[1;2A\'}\nexport KEY_SHIFT_DOWN=${terminfo[kind]:-$\'^[[1;2B\'}\nexport KEY_SHIFT_RIGHT=${terminfo[kRIT]:-$\'^[[1;2C\'}\nexport KEY_SHIFT_LEFT=${terminfo[kLFT]:-$\'^[[1;2D\'}\nexport KEY_ALT_LEFT=$\'^[[1;3D\'\nexport KEY_ALT_RIGHT=$\'^[[1;3C\'\nexport KEY_SHIFT_ALT_LEFT=$\'^[[1;4D\'\nexport KEY_SHIFT_ALT_RIGHT=$\'^[[1;4C\'\nexport KEY_CMD_LEFT=$\'^[[1;9D\'\nexport KEY_CMD_RIGHT=$\'^[[1;9C\'\nexport KEY_SHIFT_CMD_LEFT=$\'^[[1;10D\'\nexport KEY_SHIFT_CMD_RIGHT=$\'^[[1;10C\'\nexport KEY_CTRL_A=$\'\\x01\' # ^A\nexport KEY_CTRL_E=$\'\\x05\' # ^E\nexport KEY_SHIFT_CTRL_A=$\'^[[97;6u\'\nexport KEY_SHIFT_CTRL_E=$\'^[[101;6u\'\nexport KEY_SHIFT_CTRL_LEFT=$\'^[[1;6D\'\nexport KEY_SHIFT_CTRL_RIGHT=$\'^[[1;6C\'\nexport KEY_CTRL_D=$\'\\x04\' # ^D\n\n# -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --\n\n# copy selected terminal text to clipboard\nzle -N widget::copy-selection\nfunction widget::copy-selection {\n    if ((REGION_ACTIVE)); then\n        zle copy-region-as-kill\n        printf "%s" $CUTBUFFER | pbcopy\n    fi\n}\n\n# cut selected terminal text to clipboard\nzle -N widget::cut-selection\nfunction widget::cut-selection() {\n    if ((REGION_ACTIVE)) then\n        zle kill-region\n        printf "%s" $CUTBUFFER | pbcopy\n    fi\n}\n\n# paste clipboard contents\nzle -N widget::paste\nfunction widget::paste() {\n    ((REGION_ACTIVE)) && zle kill-region\n    RBUFFER="$(pbpaste)${RBUFFER}"\n    CURSOR=$(( CURSOR + $(echo -n "$(pbpaste)" | wc -m | bc) ))\n}\n\n# select entire prompt\nzle -N widget::select-all\nfunction widget::select-all() {\n    local buflen=$(echo -n "$BUFFER" | wc -m | bc)\n    CURSOR=$buflen   # if this is messing up try: CURSOR=9999999\n    zle set-mark-command\n    while [[ $CURSOR > 0 ]]; do\n        zle beginning-of-line\n    done\n}\n\n# scrolls the screen up, in effect clearing it\nzle -N widget::scroll-and-clear-screen\nfunction widget::scroll-and-clear-screen() {\n    printf "\\n%.0s" {1..$LINES}\n    zle clear-screen\n}\n\nfunction widget::util-select() {\n    ((REGION_ACTIVE)) || zle set-mark-command\n    local widget_name=$1\n    shift\n    zle $widget_name -- $@\n}\n\nfunction widget::util-unselect() {\n    REGION_ACTIVE=0\n    local widget_name=$1\n    shift\n    zle $widget_name -- $@\n}\n\nfunction widget::util-delselect() {\n    if ((REGION_ACTIVE)) then\n        zle kill-region\n    else\n        local widget_name=$1\n        shift\n        zle $widget_name -- $@\n    fi\n}\n\nfunction widget::util-insertchar() {\n    ((REGION_ACTIVE)) && zle kill-region\n    RBUFFER="${1}${RBUFFER}"\n    zle forward-char\n}\n\n#                       |  key sequence                   | command\n# --------------------- | ------------------------------- | -------------\n\nbindkey                   $KEY_ALT_F                        forward-word\nbindkey                   $KEY_ALT_B                        backward-word\nbindkey                   $KEY_ALT_D                        kill-word\nbindkey                   $KEY_CTRL_U                       backward-kill-line\nbindkey                   $KEY_CMD_BACKSPACE                backward-kill-line\nbindkey                   $KEY_CMD_Z                        undo\nbindkey                   $KEY_SHIFT_CMD_Z                  redo\nbindkey                   $KEY_CTRL_R                       history-incremental-search-backward\nbindkey                   $KEY_CMD_C                        widget::copy-selection\nbindkey                   $KEY_CMD_X                        widget::cut-selection\nbindkey                   $KEY_CMD_V                        widget::paste\nbindkey                   $KEY_CMD_A                        widget::select-all\nbindkey                   $KEY_CTRL_L                       widget::scroll-and-clear-screen\n\nfor keyname        kcap   seq                   mode        widget (\n\n    left           kcub1  $KEY_LEFT             unselect    backward-char\n    right          kcuf1  $KEY_RIGHT            unselect    forward-char\n\n    shift-up       kri    $KEY_SHIFT_UP         select      up-line-or-history\n    shift-down     kind   $KEY_SHIFT_DOWN       select      down-line-or-history\n    shift-right    kRIT   $KEY_SHIFT_RIGHT      select      forward-char\n    shift-left     kLFT   $KEY_SHIFT_LEFT       select      backward-char\n\n    alt-right         x   $KEY_ALT_RIGHT        unselect    forward-word\n    alt-left          x   $KEY_ALT_LEFT         unselect    backward-word\n    shift-alt-right   x   $KEY_SHIFT_ALT_RIGHT  select      forward-word\n    shift-alt-left    x   $KEY_SHIFT_ALT_LEFT   select      backward-word\n\n    cmd-right         x   $KEY_CMD_RIGHT        unselect    end-of-line\n    cmd-left          x   $KEY_CMD_LEFT         unselect    beginning-of-line\n    shift-cmd-right   x   $KEY_SHIFT_CMD_RIGHT  select      end-of-line\n    shift-cmd-left    x   $KEY_SHIFT_CMD_LEFT   select      beginning-of-line\n\n    ctrl-e            x   $KEY_CTRL_E           unselect    end-of-line\n    ctrl-a            x   $KEY_CTRL_A           unselect    beginning-of-line\n    shift-ctrl-e      x   $KEY_SHIFT_CTRL_E     select      end-of-line\n    shift-ctrl-a      x   $KEY_SHIFT_CTRL_A     select      beginning-of-line\n    shift-ctrl-right  x   $KEY_SHIFT_CTRL_RIGHT select      end-of-line\n    shift-ctrl-left   x   $KEY_SHIFT_CTRL_LEFT  select      beginning-of-line\n\n    del               x   $KEY_CTRL_D           delselect   delete-char\n\n    a                 x       \'a\'               insertchar  \'a\'\n    b                 x       \'b\'               insertchar  \'b\'\n    c                 x       \'c\'               insertchar  \'c\'\n    d                 x       \'d\'               insertchar  \'d\'\n    e                 x       \'e\'               insertchar  \'e\'\n    f                 x       \'f\'               insertchar  \'f\'\n    g                 x       \'g\'               insertchar  \'g\'\n    h                 x       \'h\'               insertchar  \'h\'\n    i                 x       \'i\'               insertchar  \'i\'\n    j                 x       \'j\'               insertchar  \'j\'\n    k                 x       \'k\'               insertchar  \'k\'\n    l                 x       \'l\'               insertchar  \'l\'\n    m                 x       \'m\'               insertchar  \'m\'\n    n                 x       \'n\'               insertchar  \'n\'\n    o                 x       \'o\'               insertchar  \'o\'\n    p                 x       \'p\'               insertchar  \'p\'\n    q                 x       \'q\'               insertchar  \'q\'\n    r                 x       \'r\'               insertchar  \'r\'\n    s                 x       \'s\'               insertchar  \'s\'\n    t                 x       \'t\'               insertchar  \'t\'\n    u                 x       \'u\'               insertchar  \'u\'\n    v                 x       \'v\'               insertchar  \'v\'\n    w                 x       \'w\'               insertchar  \'w\'\n    x                 x       \'x\'               insertchar  \'x\'\n    y                 x       \'y\'               insertchar  \'y\'\n    z                 x       \'z\'               insertchar  \'z\'\n    A                 x       \'A\'               insertchar  \'A\'\n    B                 x       \'B\'               insertchar  \'B\'\n    C                 x       \'C\'               insertchar  \'C\'\n    D                 x       \'D\'               insertchar  \'D\'\n    E                 x       \'E\'               insertchar  \'E\'\n    F                 x       \'F\'               insertchar  \'F\'\n    G                 x       \'G\'               insertchar  \'G\'\n    H                 x       \'H\'               insertchar  \'H\'\n    I                 x       \'I\'               insertchar  \'I\'\n    J                 x       \'J\'               insertchar  \'J\'\n    K                 x       \'K\'               insertchar  \'K\'\n    L                 x       \'L\'               insertchar  \'L\'\n    M                 x       \'M\'               insertchar  \'M\'\n    N                 x       \'N\'               insertchar  \'N\'\n    O                 x       \'O\'               insertchar  \'O\'\n    P                 x       \'P\'               insertchar  \'P\'\n    Q                 x       \'Q\'               insertchar  \'Q\'\n    R                 x       \'R\'               insertchar  \'R\'\n    S                 x       \'S\'               insertchar  \'S\'\n    T                 x       \'T\'               insertchar  \'T\'\n    U                 x       \'U\'               insertchar  \'U\'\n    V                 x       \'V\'               insertchar  \'V\'\n    W                 x       \'W\'               insertchar  \'W\'\n    X                 x       \'X\'               insertchar  \'X\'\n    Y                 x       \'Y\'               insertchar  \'Y\'\n    Z                 x       \'Z\'               insertchar  \'Z\'\n    0                 x       \'0\'               insertchar  \'0\'\n    1                 x       \'1\'               insertchar  \'1\'\n    2                 x       \'2\'               insertchar  \'2\'\n    3                 x       \'3\'               insertchar  \'3\'\n    4                 x       \'4\'               insertchar  \'4\'\n    5                 x       \'5\'               insertchar  \'5\'\n    6                 x       \'6\'               insertchar  \'6\'\n    7                 x       \'7\'               insertchar  \'7\'\n    8                 x       \'8\'               insertchar  \'8\'\n    9                 x       \'9\'               insertchar  \'9\'\n\n    exclamation-mark      x  \'!\'                insertchar  \'!\'\n    hash-sign             x  \'\\#\'               insertchar  \'\\#\'\n    dollar-sign           x  \'$\'                insertchar  \'$\'\n    percent-sign          x  \'%\'                insertchar  \'%\'\n    ampersand-sign        x  \'\\&\'               insertchar  \'\\&\'\n    star                  x  \'\\*\'               insertchar  \'\\*\'\n    plus                  x  \'+\'                insertchar  \'+\'\n    comma                 x  \',\'                insertchar  \',\'\n    dot                   x  \'.\'                insertchar  \'.\'\n    forwardslash          x  \'\\\\\'               insertchar  \'\\\\\'\n    backslash             x  \'/\'                insertchar  \'/\'\n    colon                 x  \':\'                insertchar  \':\'\n    semi-colon            x  \'\\;\'               insertchar  \'\\;\'\n    left-angle-bracket    x  \'\\<\'               insertchar  \'\\<\'\n    right-angle-bracket   x  \'\\>\'               insertchar  \'\\>\'\n    equal-sign            x  \'=\'                insertchar  \'=\'\n    question-mark         x  \'\\?\'               insertchar  \'\\?\'\n    left-square-bracket   x  \'[\'                insertchar  \'[\'\n    right-square-bracket  x  \']\'                insertchar  \']\'\n    hat-sign              x  \'^\'                insertchar  \'^\'\n    underscore            x  \'_\'                insertchar  \'_\'\n    left-brace            x  \'{\'                insertchar  \'{\'\n    right-brace           x  \'\\}\'               insertchar  \'\\}\'\n    left-parenthesis      x  \'\\(\'               insertchar  \'\\(\'\n    right-parenthesis     x  \'\\)\'               insertchar  \'\\)\'\n    pipe                  x  \'\\|\'               insertchar  \'\\|\'\n    tilde                 x  \'\\~\'               insertchar  \'\\~\'\n    at-sign               x  \'@\'                insertchar  \'@\'\n    dash                  x  \'\\-\'               insertchar  \'\\-\'\n    double-quote          x  \'\\"\'               insertchar  \'\\"\'\n    single-quote          x  "\\\'"               insertchar  "\\\'"\n    backtick              x  \'\\`\'               insertchar  \'\\`\'\n    whitespace            x  \'\\ \'               insertchar  \'\\ \'\n) {\n    eval "function widget::key-$keyname() {\n        widget::util-$mode $widget \\$@\n    }"\n    zle -N widget::key-$keyname\n    bindkey $seq widget::key-$keyname\n}\n\n# suggested by "e.nikolov", fixes autosuggest completion being \n# overriden by keybindings: to have [zsh] autosuggest [plugin\n# feature] complete visible suggestions, you can assign an array\n# of shell functions to the `ZSH_AUTOSUGGEST_ACCEPT_WIDGETS` \n# variable. when these functions are triggered, they will also \n# complete any visible suggestion. Example:\nexport ZSH_AUTOSUGGEST_ACCEPT_WIDGETS=(\n    widget::key-right\n    widget::key-shift-right\n    widget::key-cmd-right\n    widget::key-shift-cmd-right\n)\n
Run Code Online (Sandbox Code Playgroud)\n
\n
奖金
\n

有些人可能也会发现这些很有用,尽管我上面没有包含它们,只需将它们添加到 for 循环数组中即可:

\n
    \n
  1. 标签

    \n
        tab                   x  $\'\\x09\'           insertchar  \'\\   \'\n
    Run Code Online (Sandbox Code Playgroud)\n
    \n
      \n
    • 请注意,制表符补全将会失败
    • \n
    \n
    \n
  2. \n
  3. 其他

    \n
        send              kEND   $\'\\E[1;2F\'        select      end-of-line\n    send2             x      $\'\\E[4;2~\'        select      end-of-line\n\n    shome             kHOM   $\'\\E[1;2H\'        select      beginning-of-line\n    shome2            x      $\'\\E[1;2~\'        select      beginning-of-line\n\n    end               kend   $\'\\EOF\'           deselect    end-of-line\n    end2              x      $\'\\E4~\'           deselect    end-of-line\n\n    home              khome  $\'\\EOH\'           deselect    beginning-of-line\n    home2             x      $\'\\E1~\'           deselect    beginning-of-line\n\n    csend             x      $\'\\E[1;6F\'        select      end-of-line\n    cshome            x      $\'\\E[1;6H\'        select      beginning-of-line\n\n    cleft             x      $\'\\E[1;5D\'        deselect    backward-word\n    cright            x      $\'\\E[1;5C\'        deselect    forward-word\n\n    del               kdch1   $\'\\E[3~\'         delregion   delete-char\n
    Run Code Online (Sandbox Code Playgroud)\n
  4. \n
\n
\n
\n

旧的但可能对某些人仍然有用

\n
\n
笔记
\n

首先在终端应用程序(在我的例子中为 iTerm2)上配置某些键盘按键序列,以发送 shell 程序特定的信号。上述代码中使用的绑定是:

\n
\xe2\x9e\xa4 iTerm2\n   \xe2\x9e\xa4 Preferences\n     \xe2\x9e\xa4 Keys\n       \xe2\x9e\xa4 Key Bindings:\n
Run Code Online (Sandbox Code Playgroud)\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n
按键顺序按键绑定
cmd+shift+left发送转义序列:a
cmd+shift+right发送转义序列:e
ctrl+shift+a发送转义序列:a
ctrl+shift+e发送转义序列:e
cmd+left发送十六进制代码:\\x01
cmd+right发送十六进制代码:\\x05
cmd+a发送转义序列:\xc3\xa5
cmd+c发送转义序列:\xc3\xa7
cmd+v发送转义序列:\xe2\x88\x9a
cmd+x发送转义序列:\xe2\x89\x88
cmd+z发送转义序列:\xce\xa9
cmd+shift+z发送转义序列:\xc2\xb8
\n
\n

此步骤将终端键绑定到 shell 信号,即告诉终端程序/应用程序 (iTerm2)zsh在按下某些键盘按键序列时向 shell 程序 ( ) 发送什么信号。根据您的终端程序和偏好,您可以根据需要绑定按键,或使用默认信号。

\n
keyboard  -->  cmd+z  -->  iTerm2  -->  ^[\xce\xa9  -->  zsh  -->  undo (widget)\n
Run Code Online (Sandbox Code Playgroud)\n

然后上面的脚本将接收到的信号绑定到 shell 函数,称为小部件。即我们告诉 shell 程序,在接收到指定信号(按键序列)时运行指定的小部件。

\n

因此,在命令行上,按下键盘按键序列后,终端会向 shell 发送适当的信号,然后 shell 调用相应的小部件(函数)。在本例中,我们告诉 shell 绑定的函数是编辑命令行本身的函数,就好像它是一个文件一样。

\n

上面定义的小部件使用zsh内置zle(zsh 行编辑器)模块 API。更多信息可以查看官方文档:ZSH \xe2\x9e\xa4 18 Zsh Line Editor,以及官方指南:ZSH \xe2\x9e\xa4 Chapter 4: The Z-Shell Line Editor

\n
\n
    \n
  • 一个巧妙的技巧可以查看 shell 正在运行接收到哪些信号cat然后按键:

    \n
    \xe2\x9d\xaf cat\n^[[1;2D^[[1;2C^[\xce\xa9^[\xe2\x89\x88^[\xc3\xa7\n
    Run Code Online (Sandbox Code Playgroud)\n

    这是按下后的输出:shift-leftshift-rightcmd+zcmd+xcmd+c后的输出。

    \n

    某些键可能不会出现。在这种情况下,请检查您的终端配置,该密钥可能绑定到某些终端功能(例如cmd+n可能会打开一个新的终端窗格,cmd+t可能会打开一个新的终端选项卡)。

    \n

    另请参阅terminfo(5)查找某些键的另一种方法。

    \n
  • \n
\n
\n
\n

已知问题和问题修复

\n
    \n
  • 如果您使用 iTerm2,更改cmd+v绑定的内容可能会使粘贴到命令行以外的任何内容上的行为有所不同,并且需要重新映射该特定程序(例如,在诸如 之类的程序的搜索提示中less)。如果您想避免这种情况,请不要更改 iTerm2 的映射cmd+v,并注释掉/删除widget::paste.

    \n
  • \n
  • esc可能会与oh-my-zsh\ 的sudo插件发生冲突并给出奇怪的行为。您可以注释掉/删除esc数组中的行,或建​​议修复。

    \n
  • \n
  • right与 冲突zsh-autosuggestion,即它不会接受该建议。您可以从数组中注释掉


Jak*_*tka 6

此页面上的所有解决方案要么不完整,要么过于侵入性,因此它们会对其他插件(例如 zsh-autosuggestions 或 zsh-syntax-highlighting)产生负面干扰。因此,我想出了一种效果更好的不同方法。

https://github.com/jirutka/zsh-shift-select/

该插件不会覆盖任何现有的小部件,并且仅绑定移位键。它创建一个新的 Shift 选择键映射,当调用 Shift 选择(使用任何定义的 Shift 键)时自动激活该键映射,并在 Shift 选择中未定义的任何键上停用(当前键映射切换回主键)键映射。由于这种方法,它不会干扰其他插件(例如,它可以与 zsh-autosuggestions 一起使用,无需任何更改)。