让我们说:
% ls ./ _
当foo
被调用时,_
光标位置在哪里。
foo(){
echo $COMMAND
}
zle -N foo
如何COMMAND
设置才能foo
写出发出的“命令”(例如,该行的第一个单词 - 不需要列出或&&
使用任何类似的地方)?
答案1
您可以访问许多变量用户定义的小部件,特别BUFFER
是包含该行的内容(或更广泛地说,整个缓冲区,可以是多行)。
如何从中提取第一个单词BUFFER
取决于您对单词的定义。在这种情况下,最有用的定义可能是基于 shell 语法,可以通过z
参数扩展标志。
first_word=${${(z)BUFFER}[1]}
其他合理的定义是使用空格分隔的单词,或由以下组成的单词$WORDCHARS
。有移动命令为此,虽然您可以通过zle
内置调用它们并观察CURSOR
move,但手动拆分字符串会更容易$BUFFER
。
在完成小部件中,正在完成的命令的单词位于words
范围。
答案2
所以你想要ls
从当前行的开头开始的位?让我们看看设置了什么zsh
……
% foo(){ set > whatallisset }
% zle -N foo
% bindkey "^W" foo
% ls ./ # here I mash control+w, etc
% fgrep 'ls ./' whatallisset
BUFFER='ls ./ '
LBUFFER='ls ./ '
因此,我们可能正在考虑解析其中一个变量的“第一个单词”,因此假设BUFFER
是最合适的,然后在深入zshexpn(1)
研究文档并寻找“拆分”相关的内容之后:
foo(){ echo -n ${${(z)BUFFER}[1]} }