讓我的 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'
}

相關內容