
Eu uso bindkey -v
(para bash-ers, set -o vi
acho 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-select
qual é 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 -bc
argumento ou cursorBlink
recurso 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, noctlseqs
arquivo; 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'
}