faz o meu modo de exibição do prompt zsh no modo vi

37

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

    
por xenoterracide 16.08.2010 / 23:45

10 respostas

19

Eu encontrei este via SU . Aqui está o exemplo básico, embora eu ainda esteja personalizando para mim:

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 isso, exceto que eu realmente não entendo ainda

    
por 22.08.2010 / 21:07
17

Você já encontrou zle-keymap-select , que é executado sempre que o modo é alterado. Você poderia usá-lo para definir algum outro indicador visual do que o prompt, dependendo do que o seu terminal suportar (e do seu gosto na exibição do indicador de modo, é claro).

Há um padrão capacidade terminfo para alterar a forma do cursor. No entanto, alguns terminais exibem o mesmo cursor nos dois modos. A noção do Xterm de um cursor menos visível é fazê-lo piscar (e isso deve ser ativado com o argumento de linha de comando -bc ou cursorBlink resource).

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' (por nome de cor) ou print -n '\e]12;#abcdef\a' (por especificação RGB). Essas sequências são descritas na documentação do xterm, no arquivo ctlseqs ; emuladores de terminal modernos geralmente emulam o xterm, embora possam não suportar todos os seus recursos.

    
por 23.08.2010 / 22:01
8

Para as pessoas que estão tendo problemas usando o prompt de redefinição com avisos de várias linhas, isso funcionou para mim: link Em combinação com link acabei 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
    
por 22.10.2014 / 19:01
5

você pode tentar VimMode

    
por 17.08.2010 / 12:32
4

Outra solução para alterar a forma do cursor entre viga e bloco (para sublinhado, use 3[4 q ). Adicione isso ao seu ~/.zshrc .

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

Modificado no link . Testado no gnome-terminal 3.22.

Atualizar

No entanto, outra solução para alterar as formas do cursor pode ser encontrada aqui . Este aparentemente funciona para o iTerm2, que eu não tenho como testar, mas adicionando-o aqui, caso seja útil para outra pessoa. A adição final ao seu ~/.zshrc seria

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
    
por 10.02.2017 / 15:49
4

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

(testado com Termite , gnome-terminal e 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'
}
    
por 02.12.2016 / 14:07
2

Atualmente estou usando o Zsh com o tema Trem-bala . Seguindo o exemplo dado por resposta de Sebastian Blask , acabei com o código abaixo

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

Isso só alterará o padrão $ para as letras N no modo normal e I para o modo de inserção.

Esta imagem é um exemplo quando pressiono Ctrl + C :

    
por 21.09.2017 / 21:52
2

Aqui está outra versão, baseada no post de Sebastian Blask . Isso foi planejado para ser o menos intrusivo possível, já que todas as outras soluções que eu encontrei usavam linhas extras, status à direita ou caracteres adicionais.

Isso simplesmente altera a cor de $ de branco para vermelho quando o modo normal é ativado. Edite o prompt ao seu gosto

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
    
por 04.11.2017 / 21:27
1

Uma versão para oh-my-zsh usuários

Há um plug-in para oh-my-zsh chamado vi-mode que pode ser encontrado aqui:

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

Eu uso o Antigen para gerenciar meus plugins, então incluí-lo foi tão simples quanto adicionar isso ao meu .zshrc :

antigen bundle vi-mode
    
por 12.01.2018 / 16:10
0

O plugin zsh-vim-mode é capaz de mostrar um indicador para insert, command, search, replace e modos visuais. Ele usa a técnica básica de outras respostas para conectar-se aos vários ganchos ZLE (zle-keymap-select, zle-isearch-update, etc.). Ele verifica [[ $ZLE_STATE = *overwrite* ]] para o modo de substituição. Ele verifica $REGION_ACTIVE para identificar o modo visual.

A lógica é complicada por algumas peculiaridades de como o ZSH dispara eventos ao sair do modo isearch.

Outro recurso interessante do módulo é a capacidade de alterar a forma do cursor e a cor com base no modo. Por exemplo, você pode usar uma barra vertical no modo INSERT e um sublinhado piscante no modo SEARCH.

    
por 29.06.2018 / 01:02