我在 ZSH 中注册了一个函数,该函数会在当前路径下搜索文件内容以查找匹配项,然后捕获结果文件名。然后将其绑定到组合键。键绑定、搜索和结果都正常工作(因为它们返回所需的值)。
当我使用键绑定时,该值会打印到当前 shell 行,但不会被识别为实际输入(即,如果我按 Enter 键,该值将被视为空,并且不会向提示历史记录添加任何内容)。我如何输出结果,就好像它是输入的并且是有效值一样。我尝试过echo
/ print
/ printf
(假设每个结果都相同),但也附加到BUFFER
并设置CURSOR
。
我确信这有充分的记录,但由于缺乏正确的术语,我找不到示例。有人能给我指出正确的方向吗?
打印到终端帮不了你。这会向用户显示一条消息(它不会出现在屏幕上的正确位置,并且会使行编辑器感到困惑,因为它会更改终端的光标位置 — 请使用
zle -M
或zle -R
代替)。这不是 shell 的输入。magic 变量
BUFFER
包含用户正在编辑的行,并CURSOR
包含输入光标位置。您可以通过修改BUFFER
和来更改用户输入缓冲区和光标位置CURSOR
。所以你走在正确的轨道上。不过,要在光标处插入某些内容,有一种更简单的方法:只需附加到 magic 变量LBUFFER
,zsh 将完成剩下的工作。LBUFFER
包含光标前的用户输入,并且可以直观地对其进行修改。下面是我
.zshrc
将命令的输出插入到输入缓冲区的一个工作示例。当我按下Alt+时,它会插入当前的 Git 分支名称v b。请注意,这个简单示例按原样插入命令的输出。对于文件名,您可能应该用引号括起来,以防它包含特殊字符。例如,如果命令的输出是,
A Song.mp3
则上面的简单代码只会插入A Song.mp3
命令行。但为了使其有用,它应该插入一些对命令有效的参数。如有必要,请使用q-
或q+
参数扩展标志引用命令的输出。请注意,如果您想根据光标周围的单词进行搜索,zsh 具有辅助函数,可让您免于自己进行命令行解析,并且它们还可以负责注入新文本。特别是,
modify-current-argument
用您选择的新 shell 单词替换光标周围的 shell 单词,并在必要时引用该单词。这是一个概念验证,展示了如何用包含该单词的最新文件替换光标所在的单词。通常我会在接下来看到的事物中找到答案。
我从https://github.com/junegunn/fzf/blob/master/shell/key-bindings.zsh中获得了一些灵感- 特别是
fzf-history-widget
函数。它LBUFFER
使用用户输入(如果不是修订历史命令)设置变量,然后调用zle reset-prompt
。我用我的BUFFER
+CURSOR
方法测试了这一点,它也有效,但该LBUFFER
方法更简洁。