在 zsh 函数中获取光标处的单词

在 zsh 函数中获取光标处的单词

我正在尝试设置一些花哨的 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}给出变量的长度姓名

相关内容