发送 zsh 提示给程序,用结果替换内容

Send zsh prompt to program and replace content with result

我想将我的提示内容发送到我的代码片段应用程序并用结果替换该行:

示例初始提示:

$ while foo bar

示例替换提示:

$ while foo ; do bar ; done

有了第一个提示,我会 运行 一个快捷方式,并用程序返回的值替换该行。

我想解决方案应该是这样的:

bindkey "^y" evaluateSnippets
evaluateSnippets() {
    return mySnippetsTool <<< "$promptLine"
}

我如何在 zsh 中完成它?

另一个相关的问题是是否可以在另一个快捷方式中仅替换提示的选定部分。

evaluate-snippets () {
    BUFFER=$(mySnippetsTool <<< $BUFFER)
}
zle -N evaluate-snippets
bindkey '^Y' evaluate-snippets

在小部件(又名键绑定背后的功能)中,编辑缓冲区的内容包含在参数 BUFFER 中。也可以通过写入 BUFFER 来修改编辑缓冲区。所以将 mySnippetsTool 的输出保存在 BUFFER 中应该就足够了。命令 zle -N foo 创建一个名为 foo 的小部件,它在调用时运行同名函数。

由于您可以以任何方式操作 BUFFER 的内容,因此也可以只修改其中的一部分。这里的主要警告是必须使用 shell 进行选择 - 例如visual-mode (v) 与 vicmd 键绑定或 set-mark-command (Control+@) 使用 emacs 键绑定 - 并且(可能)不能用鼠标完成。例如:

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

(注意: 可能需要对索引和范围进行一些微调,以匹配当前所选内容的预期。例如,当前光标位置是否是部分选择或不。)

您甚至可能不需要单独的命令。只要您没有设置标记并且光标位于行尾,这两个命令应该会产生相同的结果。