
Yo uso bindkey -v
(para bash-ers set -o vi
creo 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-select
cuá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 -bc
argumento o cursorBlink
recurso 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 elctlseqs
archivo; 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'
}