ZSH 键绑定在缓冲区中向后/向前搜索

ZSH 键绑定在缓冲区中向后/向前搜索

我将 [左箭头] [右箭头] 映射到向后/向前字符,将 [ctrl-左箭头] [ctrl-右箭头] 映射到向后/向前单词”

有时我想前后移动到任意字符列表中的上一个/下一个出现的位置。例如,在长命令或长路径中,前后移动到上一个或下一个很有用,[ / | ; _ ]因为这些是常见的主要分隔符。

看起来man zshzle这似乎是可能的,但是适当的命令是什么样的?

答案1

跳转目标

是一种用于此类移动的工具——功能非常多样,但需要一些额外的按键。

假设它必然会CTRL+Y。然后你按下CTRL+Y,释放,再按下;,释放。跳转目标然后突出显示命令行中出现的所有情况;,并用A通过

 # this; is; a; nonsense; command; line

变成

在此处输入图片描述

现在只需按AbC,... 使用光标跳转到相应位置。

shell 函数

不过,编写一个特定的函数来做你想做的事情也很容易。原始想法归功于这篇博文,我根据您的要求调整了代码:

    function backward-shell-block()          # original code from http://www.longhaired.org/blogg/individuell/2007-04-29-zsh
    {                                        # adapted by mpy at https://superuser.com/a/1407146/195224
      local blocks block colons commandline
      commandline=${LBUFFER//[\[\]\/|;_]/;}  # replace al disired block separators with ;
      blocks=("${(s:;:)commandline/\~/_}")   # split at ; and replace ~ to prevent FILENAME EXPANSION messing things up
      block=$blocks[-1]
      colons=-1
      while [[ $commandline[$colons] == ";" ]]; do
        (( colons-- ))
      done
      (( CURSOR -= $#block - $colons ))
    }
    function forward-shell-block()
    {
      local blocks block colons commandline
      commandline=${RBUFFER//[\[\]\/|;_]/;}
      blocks=("${(s:;:)commandline/\~/_}")
      if [[ $commandline[1] == ";" ]]; then
        block=$blocks[2]
      else
        block=$blocks[1]
      fi
      colons=1
      while [[ $commandline[$colons] == ";" ]]; do
        (( colons++ ))
      done
      (( CURSOR += $#block + $colons -1 ))
    }

    zle -N backward-shell-block
    zle -N forward-shell-block
    bindkey '^W' backward-shell-block
    bindkey '^E' forward-shell-block

在这里我将左、右跳跃函数分别绑定到CTRL+WCTRL+E

相关内容