カラーカーソルはzshのviモードを表しますが、色をリセットすることはできません。

カラーカーソルはzshのviモードを表しますが、色をリセットすることはできません。

通常モード/挿入モードを示すためにzshでカーソルカラーを使用しようとしていますが、通常モードではカーソルカラーは挿入モードのデフォルトカラーにリセットされません。

ソースは次のとおりです。

# color cursor
zle-keymap-select () {
    if [ $KEYMAP = vicmd ]; then
        echo -ne "\033]12;Cyan\e[2 q\033[m"
    else
        echo -ne "\e[2 q\033[m"
        zle -K viins
    fi
}
zle -N zle-keymap-select

zle-line-init () {
    zle -K viins
    echo -ne "\e[2 q\033[m"
}
zle -N zle-line-init
_fix_cursor() {
    echo -ne "\e[2 q\033[m"
}
precmd_functions+=(_fix_cursor)

私が使用する端末エミュレータは敏捷性です。


tmux 内で zsh を使用すると、それに応じて色が変わりますが、tmux 外ではカーソルの色は変わりません。

答え1

どの端末エミュレータを使用しているかわかりませんが、xterm似たような端末でテキストカーソルの色を設定する手順は次のとおりです。\e]12;Cyan\a

デフォルト値にリセットする方法は次のとおりです。\e]112\a

\e[2 q形状を設定することです。安定化ブロック

\e[mすべてのテキストレンダリングプロパティ(太字、下線、強調、前景色、背景色...)をデフォルト値にリセットします。適切なプロンプト文字列定義があれば必要ありません。

編集するalacritty(現在使用中の端末であることを確認しました)\e]12;color\aエスケープシーケンスは実際にサポートされています#XXX、名前のみを使用し#XXXXXXたり、rgb:XX/XX/XX形式(独自の制限を使用する形式)で色を指定したりすることはサポートされていません。xparse_colorXParseColor()、クロスプラットフォームなのでX11を呼び出すことができないようです、またはそこにCyan置き換える必要があります(呼び出しターミナルもそれをサポートする必要があります)。#0ff#00ffffrbg:0/ff/ffXParseColor()

動作する理由tmux(最新バージョンのみ)は、実際にホスト端末にtmux変換し、たとえば、次のように出力をキャプチャするとホスト端末を観察できることです。\e]12;Cyan\a\e]12;rgb:00/ff/ff\ascript

だから:

_reset_cursor_color() printf '\e]112\a'

zle-keymap-select() {
    if [[ $KEYMAP = vicmd ]]; then
        printf '\e]12;#0ff\a'
    else
        _reset_cursor_color
    fi
}
zle -N zle-keymap-select

zle-line-init() zle -K viins
zle -N zle-line-init

precmd_functions+=(_reset_cursor_color)

関連情報