让我的 zsh 提示符在 vi 模式下显示模式

让我的 zsh 提示符在 vi 模式下显示模式

我使用bindkey -v(对于 bash 用户,set -o vi我认为这也适用于 zsh)或 vi(m) 模式。但令我烦恼的是,我没有任何视觉提示来告诉我是处于插入模式还是命令模式。有谁知道如何让我的提示显示模式?

答案1

我发现通过。这是基本示例,尽管我仍在为自己定制它:

function zle-line-init zle-keymap-select {
    RPS1="${${KEYMAP/vicmd/-- NORMAL --}/(main|viins)/-- INSERT --}"
    RPS2=$RPS1
    zle reset-prompt
}

zle -N zle-line-init
zle -N zle-keymap-select

我会解释它,除非我还不太明白

答案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'
}

相关内容