我试图在 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
,#XXXXXX
或rgb:XX/XX/XX
格式(使用其自身有限的xparse_color
,我猜它不能调用 X11,XParseColor()
因为它是跨平台的),所以你需要替换Cyan
为#0ff
,#00ffff
或rbg: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)