【问题标题】:zsh clear RPS1 before adding line to linebufferzsh 在将行添加到行缓冲区之前清除 RPS1
【发布时间】:2012-12-28 07:06:09
【问题描述】:

我是 vim 用户,最近才开始使用 zsh 以便能够在 shell 中使用 vi 模式(由于缺少插入/命令模式指示器,这在 bash 中不实用)。在阅读了一些示例之后,我设置了以下函数来相应地更新行(我选择了与 vim-powerline 匹配的颜色方案,我也使用它):

vim_ins_mode="%{$fg[white]%}%{$fg_bold[blue]$bg[white]%} INSERT %{$reset_color%}"
vim_cmd_mode="%{$fg[green]%}%{$fg_bold[black]$bg[green]%} COMMAND %{$reset_color%}"
vim_mode=$vim_ins_mode
function zle-line-init zle-keymap-select {
    RPS1="${${KEYMAP/vicmd/${vim_cmd_mode}}/(main|viins)/${vim_ins_mode}}"
    RPS2=$RPS1
    zle reset-prompt
}
zle -N zle-line-init
zle -N zle-keymap-select

它工作得很好,除了当我运行更多命令时,之前命令的 RPS1 会输出到屏幕上。你可以想象,在我的终端上放多个明亮的盒子会让人分心:

我希望在此字段作为上一个命令转储到行缓冲区之前以某种方式清除此字段,但到目前为止,我查看的示例和 zsh 主题都没有打扰这样做。在我的旧 .bashrc 文件中,我有一个陷阱设置来重置我的命令的颜色,这样输出颜色就不会受到影响,我想知道这里是否有类似的可能?或者也许 zsh 有更清洁的方法?

【问题讨论】:

    标签: shell zsh


    【解决方案1】:

    试试下面的代码:

    function _-accept-line()
    {
        emulate -L zsh
        local SAVEDRPS1="$RPS1"
        RPS1=""
        zle reset-prompt
        RPS1="$SAVEDRPS1"
        zle .accept-line
    }
    zle -N accept-line _-accept-line
    

    忘记这段代码。 Zsh 可以选择你想要的行为:

    setopt transientrprompt
    

    在接受命令行时从显示中删除任何正确的提示。这对于使用其他剪切/粘贴方法的终端可能很有用。

    【讨论】:

    • 完美,正是我想要的,比摆弄陷阱干净得多
    • @AlexanderTsepkov 这个选项的有趣之处在于我一直在.zshrc 中使用它。但这不是默认设置,因此使用 zsh -f 测试您的代码会显示您的行为。这是您在删除之前不会注意到的小便利之一,所以我不记得我实际上在没有上述代码的情况下具有请求的行为。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多