1

У меня [стрелка влево] [стрелка вправо] сопоставлен с символом «назад / вперед», а [ctrl-стрелка влево] [ctrl-стрелка вправо] сопоставлен со словом «назад / вперед»

Иногда я хочу перейти назад и вперед к предыдущему / следующему вхождению любого из списка символов. Например, в длинной команде или длинном пути полезно перейти назад / вперед к предыдущему или следующему [ / | ; _ ] поскольку они являются общими основными разделителями.

Глядя на man zshzle похоже, что это возможно, но как будут выглядеть соответствующие команды?

1 ответ1

1

прыжок-мишень

инструмент для таких движений - очень универсальный, но за счет некоторых дополнительных нажатий клавиш.

Предположим, это связано с CTRL+Y Затем вы нажимаете CTRL+Y , отпускаете и нажимаете ; и отпустить. тогда цель прыжка высвечивает все случаи ; в командной строке и маркирует их с помощью г:

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

становится

Теперь просто нажмите a, b, c, ..., чтобы переместить курсор в соответствующую позицию.

функция оболочки

Однако также легко написать конкретную функцию, которая делает то, что вы хотите. Авторы этого блога собирают кредиты на оригинальную идею, я адаптировал код под ваши требования:

    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+W и CTRL+E , соответственно.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .