hacer que mi zsh se muestre en modo de visualización en modo vi

hacer que mi zsh se muestre en modo de visualización en modo vi

Yo uso bindkey -v(para bash-ers set -o vicreo que también funciona en zsh) o el modo vi(m). pero me molesta que no tengo ninguna señal visual que me diga si estoy en modo de inserción o en modo de comando. ¿Alguien sabe cómo puedo hacer que mi mensaje muestre el modo?

Respuesta1

encontréestea través deSU. Aquí está el ejemplo básico, aunque todavía lo estoy 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

Lo explicaría excepto que todavía no lo entiendo.

Respuesta2

Ya has encontrado zle-keymap-selectcuál se ejecuta cada vez que cambia el modo. Puede usarlo para configurar algún otro indicador visual además del mensaje, dependiendo de lo que admita su terminal (y su gusto en la visualización del indicador de modo, por supuesto).

Hay un estándarcapacidad de información terminológicapara cambiar la forma del cursor. Sin embargo, algunos terminales muestran el mismo cursor en ambos modos. La noción de Xterm de un cursor menos visible es hacerlo parpadear (y esto debe habilitarse con el -bcargumento o cursorBlinkrecurso de la línea 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
}

Con algunos terminales, también puede cambiar el color del cursor con print -n '\e]12;pink\a'(por nombre de color) o print -n '\e]12;#abcdef\a'(por especificación RGB). Estas secuencias se describen en la documentación de xterm, en elctlseqsarchivo; Los emuladores de terminal modernos normalmente emulan xterm, aunque es posible que no admitan todas sus funciones.

Respuesta3

Para las personas que tienen problemas al utilizar el mensaje de reinicio con mensajes de varias líneas, en combinación conhttps://stackoverflow.com/questions/3622943/zsh-vi-mode-status-lineTerminé haciendo:

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

Respuesta4

Esto es lo que uso para cambiar el cursor entre la forma 'Bloque' y 'Viga' en zsh:

(Probado conTermita,terminal-gnomeyterminal mate)

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

información relacionada