【问题标题】:Send zsh prompt to program and replace content with result发送 zsh 提示编程并用结果替换内容
【发布时间】:2018-05-01 12:00:17
【问题描述】:

我想将提示内容发送到我的 sn-ps 应用程序并用结果替换该行:

初始提示示例:

$ while foo bar

示例替换提示:

$ while foo ; do bar ; done

在出现第一个提示时,我会运行一个快捷方式并将该行替换为程序返回的值。

我想解决方案是这样的:

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

我怎样才能在 zsh 中做到这一点?

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

【问题讨论】:

    标签: shell zsh prompt


    【解决方案1】:
    evaluate-snippets () {
        BUFFER=$(mySnippetsTool <<< $BUFFER)
    }
    zle -N evaluate-snippets
    bindkey '^Y' evaluate-snippets
    

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

    因为您可以以任何您想要的方式操作BUFFER 的内容,也可以只修改它的一部分。这里的主要警告是必须从外壳中进行选择 - 例如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
    

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

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

    【讨论】:

      猜你喜欢
      • 2015-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多