zle 读取行中的第一个单词?

zle 读取行中的第一个单词?

让我们说:

% ls ./ _

foo被调用时,_光标位置在哪里。

foo(){
    echo $COMMAND
}
zle -N foo

如何COMMAND设置才能foo写出发出的“命令”(例如,该行的第一个单词 - 不需要列出或&&使用任何类似的地方)?

答案1

您可以访问许多变量用户定义的小部件,特别BUFFER是包含该行的内容(或更广泛地说,整个缓冲区,可以是多行)。

如何从中提取第一个单词BUFFER取决于您对单词的定义。在这种情况下,最有用的定义可能是基于 shell 语法,可以通过z 参数扩展标志

first_word=${${(z)BUFFER}[1]}

其他合理的定义是使用空格分隔的单词,或由以下组成的单词$WORDCHARS。有移动命令为此,虽然您可以通过zle内置调用它们并观察CURSORmove,但手动拆分字符串会更容易$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]} }

相关内容