it-swarm-es.tech

hacer mi modo de presentación de solicitud de zsh en modo vi

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

48
xenoterracide

Encontré esto vía SU . Aquí está el ejemplo básico, aunque todavía lo estoy personalizando para mí:

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

25
xenoterracide

Ya has encontrado zle-keymap-select que se ejecuta cada vez que cambia el modo. Puede usarlo para configurar algún otro indicador visual que no sea el indicador, según lo que su terminal lo admita (y su gusto en la pantalla del indicador de modo, por supuesto).

Hay un estándar capacidad de terminfo para 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 hacer que parpadee (y esto debe habilitarse con -bc argumento de línea de comando o cursorBlink recurso).

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 el archivo ctlseqs ; Los emuladores de terminal modernos suelen emular xterm, aunque es posible que no admitan todas sus características.

Para las personas que tienen problemas al usar reset-Prompt con mensajes multilínea, esto funcionó para mí: http://zeitlens.com/posts/2014-06-29-howto-zsh-vi-style.html En combinación con https://stackoverflow.com/questions/3622943/zsh-vi-mode-status-line Terminé 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
9
Sebastian Blask

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

(Probado con Termite, gnome-terminal y mate-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'
}
6
Rotareti

Otra solución para cambiar la forma del cursor entre I-beam y block (para subrayar, use \033[4 q). Agregue esto a su ~/.zshrc.

zle-keymap-select () {
if [ $KEYMAP = vicmd ]; then
    printf "\033[2 q"
else
    printf "\033[6 q"
fi
}
zle -N zle-keymap-select
zle-line-init () {
zle -K viins
printf "\033[6 q"
}
zle -N zle-line-init
bindkey -v

Modificado de https://bbs.archlinux.org/viewtopic.php?id=95078 . Probado en gnome-terminal 3.22.


Actualizar

Otra solución más para cambiar las formas del cursor se puede encontrar aquí . Aparentemente, este funciona para iTerm2, que no tengo los medios para probar, pero lo agrego aquí en caso de que sea útil para otra persona. La adición final a tu ~/.zshrc sería

function zle-keymap-select zle-line-init
{
    # change cursor shape in iTerm2
    case $KEYMAP in
        vicmd)      print -n -- "\E]50;CursorShape=0\C-G";;  # block cursor
        viins|main) print -n -- "\E]50;CursorShape=1\C-G";;  # line cursor
    esac

    zle reset-Prompt
    zle -R
}

function zle-line-finish
{
    print -n -- "\E]50;CursorShape=0\C-G"  # block cursor
}

zle -N zle-line-init
zle -N zle-line-finish
zle -N zle-keymap-select
6
joelostblom

puedes probar VimMode

5
Hemant

Aquí hay otra versión, basada en publicación de Sebastian Blask . Se pretendía que fuera lo menos intrusivo posible, ya que todas las otras soluciones que pude encontrar utilizaron líneas adicionales, estado a la derecha o caracteres agregados.

Esto simplemente cambia el color de $ de blanco a rojo cuando el modo normal está habilitado. Edite la solicitud a su gusto

bindkey -v
function zle-line-init zle-keymap-select {
    case ${KEYMAP} in
        (vicmd)      Prompt=$'%{\e[0;32m%}%~%{\e[0m%} %{\e[0;31m%}$%{\e[0m%} ' ;;
        (main|viins) Prompt=$'%{\e[0;32m%}%~%{\e[0m%} $ ' ;;
        (*)          Prompt=$'%{\e[0;32m%}%~%{\e[0m%} $ ' ;;
    esac
    zle reset-Prompt
}

zle -N zle-line-init
zle -N zle-keymap-select
3
sealj553

Actualmente estoy usando Zsh con Bullet Train theme. Siguiendo el ejemplo dado por respuesta de Sebastian Blask , terminé con el siguiente código

bindkey -v
KEYTIMEOUT=1

function zle-line-init zle-keymap-select {
    case ${KEYMAP} in
        (vicmd)      BULLETTRAIN_Prompt_CHAR="N" ;;
        (main|viins) BULLETTRAIN_Prompt_CHAR="I" ;;
        (*)          BULLETTRAIN_Prompt_CHAR="I" ;;
    esac
    zle reset-Prompt
}

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

Esto solo cambiará el valor predeterminado $ a las letras [~ # ~] n [~ # ~] al modo normal y [~ # ~] i [~ # ~] para insertar el modo.

Esta imagen es un ejemplo cuando en modo normal presiono Ctrl+C:

enter image description here

3
Luciano Almeida

Una versión para oh-my-zsh usuarios

Hay un complemento para oh-my-zsh llamado vi-mode que se puede encontrar aquí:

robbyrussell/oh-my-zsh/plugins/vi-mode

Utilizo Antigen para administrar mis complementos, por lo que incluirlo fue tan simple como agregar esto a mi .zshrc:

antigen bundle vi-mode
2
Jonathan Landrum

El complemento zsh-vim-mode puede mostrar un indicador para los modos de inserción, comando, búsqueda, reemplazo y visual. Utiliza la técnica básica de otras respuestas para conectarse a los diversos enlaces ZLE (zle-keymap-select, zle-isearch-update, etc.). Comprueba [[ $ZLE_STATE = *overwrite* ]] para el modo de reemplazo. Comprueba $REGION_ACTIVE para identificar el modo visual.

La lógica se complica por algunas peculiaridades de cómo ZSH dispara eventos al salir del modo de búsqueda.

Otra característica interesante del módulo es la capacidad de cambiar la forma y el color del cursor según el modo. Por ejemplo, puede usar una barra vertical en modo INSERTAR y un subrayado parpadeante en modo BÚSQUEDA.

1
Tim Smith