我想将我的提示内容发送到我的代码段应用程序并用结果替换该行:
示例初始提示:
$ while foo bar
示例替换提示:
$ while foo ; do bar ; done
有第一个提示我会运行一个快捷方式并用该程序返回的值替换该行。
我想解决方案是这样的:
bindkey "^y" evaluateSnippets
evaluateSnippets() {
return mySnippetsTool <<< "$promptLine"
}
如何在zsh中实现这一目标?
另一个相关问题是,是否可以在另一个快捷方式中仅替换提示的选定部分。
答案 0 :(得分:1)
evaluate-snippets () {
BUFFER=$(mySnippetsTool <<< $BUFFER)
}
zle -N evaluate-snippets
bindkey '^Y' evaluate-snippets
在小部件(也就是键绑定背后的函数)中,编辑缓冲区的内容包含在参数BUFFER
中。编辑缓冲区也可以通过写入BUFFER
进行修改。因此,在mySnippetsTool
中保存BUFFER
的输出就足够了。命令zle -N foo
创建一个名为foo
的窗口小部件,它在调用时运行相同名称的函数。
由于您可以以任何方式操纵BUFFER
的内容,因此也可以仅修改其中的部分内容。这里的主要警告是必须通过使用壳来完成选择 - 例如带有 vicmd 键绑定的visual-mode
( v )或带有 emacs <的set-mark-command
( Control + @ ) / em> keybindings - 和(可能)无法用鼠标完成。例如:
evaluate-snippets-selection () {
if [[ $CURSOR -gt $MARK ]]; then
start=$MARK
end=$(( CURSOR + 1 ))
else
start=$(( CURSOR + 1 ))
end=$MARK
fi
BUFFER="$BUFFER[0,start]$(mySnippetsTool <<< $BUFFER[start+1,end])$BUFFER[end+1,-1]"
}
zle -N evaluate-snippets-selection
bindkey '^Z' evaluate-snippets-selection
(注意:为了匹配当前所选内容的预期,可能需要对索引和范围进行一些微调。例如,当前光标位置是选择的一部分还是不。)
您甚至可能不需要单独的命令。只要您没有设置标记并且光标位于该行的最后,两个命令都应该提供相同的结果。