我使用bindkey -v
(对于 bash 用户,set -o vi
我认为这也适用于 zsh)或 vi(m) 模式。但令我烦恼的是,我没有任何视觉提示来告诉我是处于插入模式还是命令模式。有谁知道如何让我的提示显示模式?
答案1
答案2
您已经发现zle-keymap-select
每当模式改变时都会执行哪个。您可以使用它来设置除提示之外的其他视觉指示器,具体取决于您的终端支持的内容(当然还有您对模式指示器显示的品味)。
有一个标准术语信息能力更改光标的形状。然而,某些终端在两种模式下显示相同的光标。 Xterm 的不可见光标的概念是使其闪烁(并且必须使用-bc
命令行参数或cursorBlink
资源启用)。
zle-keymap-select () {
case $KEYMAP in
vicmd) print -rn -- $terminfo[cvvis];; # block cursor
viins|main) print -rn -- $terminfo[cnorm];; # less visible cursor
esac
}
print -n '\e]12;pink\a'
对于某些终端,您还可以使用(按颜色名称)或print -n '\e]12;#abcdef\a'
(按 RGB 规范)更改光标颜色。这些序列在 xterm 文档中进行了描述,位于ctlseqs
文件;现代终端模拟器通常模拟 xterm,尽管它们可能不支持其所有功能。
答案3
对于那些在使用带有多行提示的重置提示时遇到问题的人,结合使用https://stackoverflow.com/questions/3622943/zsh-vi-mode-status-line我最终做了:
terminfo_down_sc=$terminfo[cud1]$terminfo[cuu1]$terminfo[sc]$terminfo[cud1]
function insert-mode () { echo "-- INSERT --" }
function normal-mode () { echo "-- NORMAL --" }
precmd () {
# yes, I actually like to have a new line, then some stuff and then
# the input line
print -rP "
[%D{%a, %d %b %Y, %H:%M:%S}] %n %{$fg[blue]%}%m%{$reset_color%}"
# this is required for initial prompt and a problem I had with Ctrl+C or
# Enter when in normal mode (a new line would come up in insert mode,
# but normal mode would be indicated)
PS1="%{$terminfo_down_sc$(insert-mode)$terminfo[rc]%}%~ $ "
}
function set-prompt () {
case ${KEYMAP} in
(vicmd) VI_MODE="$(normal-mode)" ;;
(main|viins) VI_MODE="$(insert-mode)" ;;
(*) VI_MODE="$(insert-mode)" ;;
esac
PS1="%{$terminfo_down_sc$VI_MODE$terminfo[rc]%}%~ $ "
}
function zle-line-init zle-keymap-select {
set-prompt
zle reset-prompt
}
preexec () { print -rn -- $terminfo[el]; }
zle -N zle-line-init
zle -N zle-keymap-select
答案4
这是我用来在 zsh 中更改“Block”和“Beam”形状之间的光标的方法:
(测试用白蚁,gnome 终端和配对终端)
# vim mode config
# ---------------
# Activate vim mode.
bindkey -v
# Remove mode switching delay.
KEYTIMEOUT=5
# Change cursor shape for different vi modes.
function zle-keymap-select {
if [[ ${KEYMAP} == vicmd ]] ||
[[ $1 = 'block' ]]; then
echo -ne '\e[1 q'
elif [[ ${KEYMAP} == main ]] ||
[[ ${KEYMAP} == viins ]] ||
[[ ${KEYMAP} = '' ]] ||
[[ $1 = 'beam' ]]; then
echo -ne '\e[5 q'
fi
}
zle -N zle-keymap-select
# Use beam shape cursor on startup.
echo -ne '\e[5 q'
# Use beam shape cursor for each new prompt.
preexec() {
echo -ne '\e[5 q'
}