我将 [左箭头] [右箭头] 映射到向后/向前字符,将 [ctrl-左箭头] [ctrl-右箭头] 映射到向后/向前单词”
有时我想前后移动到任意字符列表中的上一个/下一个出现的位置。例如,在长命令或长路径中,前后移动到上一个或下一个很有用,[ / | ; _ ]
因为这些是常见的主要分隔符。
看起来man zshzle
这似乎是可能的,但是适当的命令是什么样的?
答案1
跳转目标
是一种用于此类移动的工具——功能非常多样,但需要一些额外的按键。
假设它必然会CTRL+Y
。然后你按下CTRL+Y
,释放,再按下;
,释放。跳转目标然后突出显示命令行中出现的所有情况;
,并用A通过是:
# this; is; a; nonsense; command; line
变成
现在只需按A,b,C,... 使用光标跳转到相应位置。
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+W
和CTRL+E
。