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.

durron597
fonte
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

jared
fonte
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 .

Giovanni Maggiorani
fonte
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.

Maçaneta
fonte
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>.

romainl
fonte
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
6
Observe que <C-c> não é exatamente o mesmo que<Esc> .
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

joeytwiddle
fonte
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.

Yichao Zhou
fonte
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.

ewatt
fonte
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.

Antony
fonte
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.

elias
fonte
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

kenorb
fonte
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>
J. Doe
fonte
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.

Wumbo
fonte
O parágrafo sobre vim e emacs é completamente desnecessário ...
D. Ben Knoble