我正在尝试设置一些花哨的 zle 完成,需要将指向的单词传递给子进程。
Zsh 显然知道当前的单词/标记/目录,我可以看到如何根据当前单词绑定事物,但我不知道如何将“我在哪里”变成能够传递到子进程的变量。(我想要 emacs 的事情但在 zsh 中。)
答案1
我使用一个简单的 zle 小部件print-current-word
来说明如何在简单情况下在命令行中提取当前单词,即假设空格是总是单词分隔符。(因此当引用或转义空格发挥作用时,这会失败):
print-current-word() {
CURRENTWORD="${LBUFFER/* /}${RBUFFER/ */}"
print; print "The current word is: $CURRENTWORD"
}
zle -N print-current-word
$LBUFFER
并$RBUFFER
分别包含光标左侧和右侧的命令行。${name/pattern/repl}
返回变量姓名和图案替换为复制。因此在这种情况下,这会修剪到$LBUFFER
最后一个空白为止的所有内容,只留下当前单词的光标左侧部分。类似于$RBUFFER
。
更复杂的方法是:
print-current-word () {
local words i beginword
i=0
beginword=0
words=("${(z)BUFFER}")
while (( beginword <= CURSOR )); do
(( i++ ))
(( beginword += ${#words[$i]}+1 ))
done
CURRENTWORD="$words[$i]"
print; print "The current word is: $CURRENTWORD"
}
然而,这种方法也并非没有假设,因为它假设每个单词都由恰好一个空白(添加 +1 至beginword
)。
简单说一下一些特殊的事情:
words=("${(z)BUFFER}")
$BUFFER
使用 shell 解析规则将 (即完整的命令行) 拆分为 shell 单词扩展标志(z)
并将其放入数组中(( ... ))
激活 zsh 的数学模式${#name}
给出变量的长度姓名