8

私はvimユーザーですが、最近zshで遊んで、シェルで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を使ったよりクリーンな方法がありますか?

4

1 に答える 1

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

このコードは忘れてください。Zsh には、必要な動作のオプションがあります。

setopt transientrprompt

コマンド ラインを受け入れるときに、表示から適切なプロンプトを削除します。これは、他の切り取り/貼り付け方法を使用する端末で役立つ場合があります。

于 2013-01-15T14:39:07.190 に答える