发送zsh提示符以编程并用结果替换内容

时间:2018-05-01 12:00:17

标签: shell zsh prompt

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

示例初始提示:

$ while foo bar

示例替换提示:

$ while foo ; do bar ; done

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

我想解决方案是这样的:

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

如何在zsh中实现这一目标?

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

1 个答案:

答案 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

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

您甚至可能不需要单独的命令。只要您没有设置标记并且光标位于该行的最后,两个命令都应该提供相同的结果。