在添加行到linebuffer之前,zsh清除RPS1

Ale*_*kov 8 shell zsh

我是一个vim用户,最近才开始玩zsh以便能够在shell中使用vi模式(由于缺少插入/命令模式指示,这在bash中不实用).在阅读了一些例子之后,我设置了以下功能来相应地更新线路(我选择了colorscheme以匹配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
Run Code Online (Sandbox Code Playgroud)

它工作得很好,除了当我运行更多命令时,先前命令的RPS1输出到屏幕.你可以想象,我的终端上有多个明亮的盒子会让你分心: 这是一个例子

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

ZyX*_*ZyX 11

请尝试以下代码:

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

忘掉这段代码吧.Zsh有一个你想要的行为选项:

setopt transientrprompt
Run Code Online (Sandbox Code Playgroud)

接受命令行时,从显示中删除任何右提示.这对于具有其他剪切/粘贴方法的终端可能是有用的.