彩色光标在 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)

我使用的终端模拟器是 alacritty。


如果我在 tmux 内使用 zsh,颜色会相应改变,但如果在 tmux 外,光标颜色不会改变。

答案1

我不知道您正在使用什么终端模拟器,但在xterm类似的终端中,设置文本光标颜色的顺序是\e]12;Cyan\a

将其重置为默认值的方法是\e]112\a

\e[2 q是将其形状设置为稳定块

\e[m将所有文本渲染属性(粗体、下划线、突出、前景色、背景色...)重置为默认值。如果您有合理的提示字符串定义,则不需要它。

编辑alacritty(您现在已经确认这是您使用的终端)确实支持\e]12;color\a转义序列,但不支持按名称指定颜色,仅支持#XXX,#XXXXXXrgb:XX/XX/XX格式(使用其自身有限的xparse_color,我猜它不能调用 X11,XParseColor()因为它是跨平台的),所以你需要替换Cyan#0ff,#00ffffrbg:0/ff/ff那里(调用 的终端也应该支持XParseColor())。

它工作的原因tmux(仅限较新的版本)实际上是tmux将其转换\e]12;Cyan\a为主机终端,如果您使用例如\e]12;rgb:00/ff/ff\a捕获其输出,您可以观察到主机终端。script

所以:

_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)

相关内容