faça meu prompt zsh mostrar o modo no modo vi

faça meu prompt zsh mostrar o modo no modo vi

Eu uso bindkey -v(para bash-ers, set -o viacho que funciona no zsh também) ou no modo vi(m). mas me incomoda não ter nenhuma indicação visual para me dizer se estou no modo de inserção ou no modo de comando. Alguém sabe como posso fazer meu prompt exibir o modo?

Responder1

eu encontreiesseatravés daSU. Aqui está o exemplo básico, embora ainda o esteja personalizando:

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

Eu explicaria, só que ainda não entendi direito

Responder2

Você já descobriu zle-keymap-selectqual é executado sempre que o modo muda. Você pode usá-lo para definir algum outro indicador visual além do prompt, dependendo do suporte do seu terminal (e do seu gosto na exibição do indicador de modo, é claro).

Existe um padrãocapacidade terminfopara alterar a forma do cursor. No entanto, alguns terminais exibem o mesmo cursor em ambos os modos. A noção do Xterm de um cursor menos visível é fazê-lo piscar (e isso deve ser habilitado com o -bcargumento ou cursorBlinkrecurso da linha de comando).

zle-keymap-select () {
  case $KEYMAP in
    vicmd) print -rn -- $terminfo[cvvis];; # block cursor
    viins|main) print -rn -- $terminfo[cnorm];; # less visible cursor
  esac
}

Com alguns terminais, você também pode alterar a cor do cursor com print -n '\e]12;pink\a'(pelo nome da cor) ou print -n '\e]12;#abcdef\a'(pela especificação RGB). Essas sequências estão descritas na documentação do xterm, noctlseqsarquivo; emuladores de terminal modernos normalmente emulam o xterm, embora possam não suportar todos os seus recursos.

Responder3

Para as pessoas que têm problemas ao usar o prompt de redefinição com prompts multilinha, em combinação comhttps://stackoverflow.com/questions/3622943/zsh-vi-mode-status-lineAcabei fazendo:

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

Responder4

Isto é o que eu uso para alterar o cursor entre as formas 'Block' e 'Beam' no zsh:

(Testado comCupim,terminal gnomeemate-terminal)

# 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'
}

informação relacionada