Outras maneiras de sair do modo Inserir além de Escape


74

A principal razão pela qual eu gosto do vim sobre o emacs é que a distância do meu movimento da mão para longe da linha inicial é muito baixa (mesmo como programador). No entanto, a única vez que faço isso é sair do modo de inserção pressionando Escape.

Recentemente, aprendi que posso usar Ctrl + C para sair do modo de inserção também. No entanto, isso não é realmente uma melhoria.

Como posso sair do modo de inserção sem que minhas mãos saiam da linha de casa e sem afetar enormemente o que tenho a capacidade de digitar? Nota: Eu uso um vim principalmente de baunilha com um layout de teclado dvorak, embora eu adoraria ouvir soluções para um layout qwerty também.


11
Você pode mapear qualquer combinação de teclas em qualquer lugar e não pode fazer mais nada. É isso que você quer dizer?
yo '

3
Aprendeu o atalho Ctrl + c THX!
Philippe Gachoud

Que tal mapear Caps Lock como Esc?
Kolob Canyon

@PhillippeGachaud: Não use Ctrl-C como substituto do Esc. Ctrl-C não é o mesmo que Escape, é um Escape forçado e pode se comportar de maneira diferente em algumas circunstâncias.
Lie Ryan

Respostas:


60

Uma ligação comum que você verá é jj , porque funciona bem para layouts QWERTY se você usar o posicionamento da linha inicial.

inoremap jj <ESC>

Nesse caso, para digitar um literal jj- você deve esperar 1 segundo (por padrão) entre digitar o segundo caractere. (veja :help 'timeout'para detalhes)

Também existe o c-oque o tirará da inserção, permitindo que você execute um comando normal e, em seguida, o coloque de volta na inserção.

http://vim.wikia.com/wiki/Avoid_the_escape_key


11
No dvorak, jé a cchave. Portanto, isso não seria muito ruim (para digitar cc). Eu também poderia vincular hh(qwerty jkey = dvorak h), que só me inicializaria se eu estivesse digitando shhhhhhhou algo assim.
precisa saber é o seguinte

7
cc é uma combinação de teclas de duas letras muito mais comum, pelo menos em inglês. Então, isso pode não ser a melhor escolha
Nick J Adams

4
Que tal imitar jk? Encontre duas teclas adjacentes em Dvorak, mas não combinações comuns no seu idioma preferido. tn, por exemplo, é o equivalente posicional de jk.
David Lord

11
Eu meio que tenho jk/ kjsaio do modo normal, mesmo em Dvorak; elas são as teclas "c" e "v" em um teclado QWERTY; portanto, são fáceis para meu ponteiro esquerdo e dedos médios.
Alxndr

2
Acho que podemos fazer ainda melhor - em iivez disso, use . Sim, você precisa tirar os dedos da fila de casa, mas ainda assim é confortável. E ainda mais crucialmente, você pode alternar entre os modos sem mover o dedo.
Sridhar Sarnobat

38

Além das alternativas embutidas <C-[>e <C-c>da <Esc>chave citada por outros, outra solução popular é remapear <CapsLock>como uma fuga adicional. Isso tanto em um teclado Qwerty quanto em Dvorak.

Dessa forma, você pode pressionar Esc com muita facilidade com o dedo mindinho esquerdo, sem remover as mãos do HomeRow (aliás, o CapsLock é onde o Escape costumava estar nos teclados quando o vi foi inventado).

O mapeamento pode ser feito:

  • no Windows usando o utilitário AutoHotKey ;
  • no Mac usando o utilitário KeyRemap4MacBook e outros;
  • no Linux, varia de acordo com o ambiente de desktop. Por exemplo, no Linux Mint / Cinnamon é apenas uma questão de selecionar a opção apropriada no comportamento do Menu-> Teclado-> Layout do Teclado-> Caps Lock. Como alternativa, mas com menos facilidade, ele pode ser remapeado no nível do Xorg usando o programa xmodmap e executando o seguinte .Xmodmaparquivo:

    clear Lock
    keycode 0x42 = Escape
    

    O sistema pode ser configurado para executá-lo automaticamente em cada login, colocando estrategicamente as seguintes linhas de script de shell (supondo que .Xmodmapesteja no seu diretório inicial ~) na cadeia de arquivos de origem automática de login:

    if [ -s ~/.Xmodmap ]; then
      xmodmap ~/.Xmodmap
    fi
    

    No entanto, é complicado, porque os arquivos de origem variam de acordo com o ambiente (desktop) usado. Como exemplo, eu tenho o xmodmap chamado como uma entrada nos "Aplicativos de Inicialização" do Cinnamon (o que me permite fazer mais do que a personalização padrão de remapeamento da chave da GUI).

Algumas pessoas vão ainda mais longe e programam a tecla CapsLock para se comportar:

  • como uma Ctrltecla pressionando e segurando
  • como uma Esctecla pressionando e soltando-a rapidamente.

Isso pode ser feito no Windows e Mac configurando / programando adequadamente o utilitário de remapeamento correspondente (especificamente para obter dicas sobre AutoHotkey aqui e para verificar KeyRemap4MacBook aqui ). No Linux, usando o programa xcape .


2
Concordo plenamente. Ter a tecla ctrl na linha inicial melhora bastante a usabilidade (percorrer as conclusões com ctrl + n, percorrer o arquivo com ctrl + f / ctrl + b, sair com ctrl +] etc. Todos esses combos de teclas são mais fáceis de executar desta maneira.
John O'M.

11
Sobre pressionar a Ctrltecla (na posição regular) sem torcer o dedo mindinho: você pode pressioná-lo com a palma da mão externa, como está bem descrito aqui (eu encontrei esse truque inteligente na 'Net, hora de dar voltar :) e parabéns a quem o inventou)
Giovanni Maggiorani

O FWIW KeyRemap4MacBook foi renomeado como Karabiner: pqrs.org/osx/karabiner/index.html.en
alxndr

Tentei esta solução, mas descobri que bati no Caps Lock por acidente ao pressionar Shift algumas vezes, o que era irritante. Portanto, sua milhagem pode variar dependendo da agilidade do seu mindinho esquerdo. :)
Godsmith 26/09/16

2
Se você remapear Ctrla Alt( Cmd) e vice-versa, então <C-[> realmente brilha. O mindinho é fraco, o polegar é forte. No QWERTY, você nem precisa sair de casa para isso, no Dvorak não é tão bom, mas aceitável.
Nash Bridges

28

Os mapeamentos que eu uso são:

inoremap jk <esc>
inoremap kj <esc>

Dessa forma, você pode simplesmente pressionar je kao mesmo tempo, sem ter que se preocupar com qual deles pressiona primeiro.


70
Mas estou escrevendo um livro sobre como jogar Edsgar Dijkstra jogando blackjack em Reykjavik! ;)
durron597

Ambos são horríveis se você quiser escrever qualquer holandês.
Hielke Walinga

12

<C-[>e <C-c>são duas alternativas nativas para <Esc>.

Veja :help i_<esc>e o :help i_ctrl-cque explica a diferença entre <C-c>e <Esc>.


Novamente, essas não são melhorias, pois o Ctrl está tão longe da linha inicial quanto o Escape.
precisa saber é o seguinte

4
@ durron597 Em um teclado QWERTY, o Ctrl pode estar tão longe da linha inicial, mas tem uma diferença importante: está abaixo da linha inicial. Você só precisa mover o dedo para pressioná-lo, enquanto que com Esc você deve girar a mão inteira um pouco. Além disso, ele <C-[>tem uma simetria agradável (os dois dedinhos se movendo em direções opostas).
wchargin


2
Acordado. O uso habitual de <C-c>pode sutilmente quebrar plugins e autocmds.
David Lord

Na minha máquina, funciona <C - [>, mas leva meio segundo a mais para se registrar do que <Cc> #
Alexander Mills #:

4

Você pode mapear Caps Lockpara Control sem usar nenhum programa externo :

  • No Mac OS X, visite Preferências do Sistema> Teclado -> Teclas do Modificador
  • No Linux, execute:setxkbmap -option caps:ctrl_modifier
  • No Windows, edite seu registro.

Isso traz Controlpara a linha inicial, facilitando a pressão de todos os traços modificados pelo Controle, incluindo Ctrl-[e Ctrl-Cque saem do modo Inserir no Vim.

Como alternativa, na parte inferior de sua resposta, Giovanni sugere mapear Caps Lockpara executar ambos Control e Escape dependendo do tamanho da impressora, mas isso requer a instalação de software extra.

Ctrl-[é a alternativa preferida , pois sempre funciona como Escape.

Uma diferença notável com Ctrl-Cé que quando sair uma edição em modo visual por blocos , Ctrl-Cvai manter as alterações feitas na linha atual, mas não vou repetir as mudanças sobre as outras linhas do bloco, que é o ponto de que modo.

Ele também não verifica abreviações ou aciona o evento InsertLeave. Vejo:help i_CTRL-C


4

Eu sugeriria usar meu plugin vim-easyescape .

Plug "zhou13/vim-easyescape"
let g:easyescape_chars = { "j": 1, "k": 1 }
let g:easyescape_timeout = 100
cnoremap jk <ESC>
cnoremap kj <ESC>

O problema com uma sequência simples de mapas inoremap jj <ESC>é que o Vim será pausado sempre que você digitar jou kno modo de inserção (ele está aguardando a próxima chave para determinar se é necessário aplicar o mapeamento). A pausa causa distração visual que você pode ou não perceber. O vim-easyescape não tem esse problema e suporta tempo limite personalizado.


3

No terminal vi e Vim, alt+ single-normal-mode-keyfuncionará para edições rápidas na maioria dos terminais.

Isso funciona porque a maioria dos terminais envia o modificador alt como o caractere de escape. Por exemplo, quando você digita, alt+ko emulador de terminal envia dois caracteres para o programa em execução: esc, k. Vi e Vim interpretam isso como você esperaria; ele sai do modo de inserção (por causa do escape) e executa o comando do modo normal (no exemplo, movendo o cursor uma linha acima).

Essa pode ser uma maneira conveniente de sair do modo de inserção se o teclado tiver a tecla alt ao lado da barra de espaço (para que possa ser pressionada com o polegar, deixando os dedos na linha inicial), desde que você esteja usando um emulador de terminal com esse comportamento e não se importe de executar um comando no modo normal.


2
Você pode elaborar o que é single-normal-mode-key? Você quer dizer Escape?
Kenorb

Um pressionamento de tecla única que você usaria no modo normal pode ser usado no modo de inserção com a tecla alt. por exemplo, Alt + x para excluir um caractere.
ewatt

2
Também não entendo bem essa resposta; Alt + x realmente parece fazer algo diferente de Alt no modo normal? E algumas outras chaves parecem não funcionar? Mas talvez eu esteja usando errado ..? Talvez você possa expandir um pouco sua resposta para explicar como ela funciona, e um link para alguns documentos do Vim também seria bom :-) Obrigado! :-)
Martin Tournoij

isso realmente depende da configuração do terminal e geralmente não é definido como você sugere.
Christian Brabandt

11
Votei isso de maneira positiva, depois verifiquei o histórico e percebi que, por algum motivo, um moderador o havia editado para adicionar 99% do texto do nada, em vez de apenas deixar um comentário como o resto de nós deve fazer. Então eu tive que reverter meu voto. Certamente o que aconteceu aqui vai além do escopo de edições sensatas? Rejeitei muito menos edições perturbadoras. O novo conteúdo é ótimo, com certeza, mas não pertence a esta resposta. Deveria ter sido seu.
Underscore_d

3

FWIW eu uso:

:map! ;l ^[
:vmap ;l ^[

Parece semelhante a acertar Return. Também uso ;como líder para outros mapeamentos no modo de inserção.

A única vez que eu precisei digitar ';' + letra é quando o código de golfe; Eu não tive nenhum conflito de outra maneira.


talvez seja melhor mapeá-lo para escapar do que mapeá-lo para ^ [certo? :)
Alexander Mills

2

Uso o Ctrl+ 3há bastante tempo, acho mais fácil digitar do que a maioria das alternativas e parece funcionar bem (pelo menos no Linux). Meu Caps Locké mapeado para Ctrl, portanto, é muito confortável digitá-lo.

Tentei usar o Ctrl+ cpor algum tempo, mas tive alguns problemas com os quais não me lembro exatamente agora, mas não estava obtendo exatamente o mesmo comportamento que Esc, como acontece agora com o Ctrl+ 3.


2
O que exatamente o Ctrl-3 deveria estar fazendo?
Christian Brabandt

Não sei como funciona, mas funciona como Escno Vim de baunilha. Eu o encontrei empiricamente testando combinações, não sei detalhes sobre como os internos funcionam.
Elias

11
Isso não é uma coisa vi, funciona também no shell. Muito útil no caso de você ter vi o modo ativado em seu shell com bindkey -v
golfadas

1

Se você possui um teclado em inglês dos EUA, pressionar Ctrl- [é equivalente a pressionar Esc. Isso fornece uma maneira fácil de sair do modo de inserção. Alternativamente, use Ctrl- c.

Se você vim no modo fácil ( -y), pressione Ctrl- l(Control-L) para sair do modo de inserção.

Também há Ctrl+ oque sairá temporariamente do modo de inserção apenas para executar um comando e retornar ao modo de inserção (consulte :help i_CTRL-O:)

Ou Ctrl+ r, mas é apenas para inserir o conteúdo do registro ou expressão, por exemplo Ctrl+ r, =5*5(ver: :help i_CTRL-R, :help c_CTRL-Re pós stackoverflow ).

Leia mais em: Evite a tecla de escape na vim wikia


3
FYI: Ctrl+rserve para inserir registros (incluindo a expressão =reg). Se você deseja executar temporariamente um comando único, use Ctrl+o.
Sukima

1

Eu me conformei <A-e>com a fuga:

noremap  <A-e> <Esc>
snoremap <A-e> <Esc>
inoremap <A-e> <Esc>
tnoremap <A-e> <Esc>

" For some reason in command line mode '\e' is interpreted as Enter.
cnoremap <A-e> <C-c>

Editar: Acabei de descobrir sobre o <C-\><C\n>que o envia ao modo normal a partir de qualquer outro modo. Ele também tem um comportamento geral melhor. Os mapeamentos se tornam:

noremap <A-e> <C-\><C-n>
noremap! <A-e> <C-\><C-n>

0
nnoremap <C-I> <C-I>
vnoremap <Tab> <Esc>gV
onoremap <Tab> <Esc>
inoremap <Tab> <Esc>`^

Eu remapeio a aba para sair. Eu acho que historicamente é onde a chave esc costumava estar, então eu a usei e nunca olhei para trás. Quase nunca preciso inserir uma guia em um documento e, quando o faço, pressiono shift + tab. Nunca perdi uma vez a encadernação da guia original.


O parágrafo sobre vim e emacs é completamente desnecessário ...
D. Ben Knoble
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.