Navegação no modo de inserção

20

Eu finalmente decidi abandonar as setas do teclado para navegar em favor de hjkl. Eu usei o Vim hardmodeplugin para desativar as teclas de seta.

Acostumei-me à navegação muito rápido, mas, de repente, a navegação no modo de inserção é impossível.

Existe alguma solução para isso? (o modo de inserção existente não é uma solução).

stdcall
fonte
8
Sim: use as setas :-) Isso é o que eles estão lá para ;-)
Martin Tournoij
@Carpetsmoker se as setas estão disponíveis Eu iria usá-los em vez de hjkl ....
stdcall
5
Mas a idéia é que sair do modo de inserção (ou seja, usá-lo exatamente para o que se destina, ou seja, pequenas inserções intercaladas com outros comandos) é exatamente a solução. Se não me engano, já o vi na ajuda, se eu encontrar um link, eu o publicarei. Parece que você se acostumou demais, não com as setas.
O Vee
Você pode ligar o teclado para usar as setas como um atalho como <kbd> super </kbd> + <kbd> j </kbd> para mover para baixo. <kbd> super </kbd> pode ser qualquer botão, por exemplo, <kbd> Caps Lock </kbd> é bastante comum
ivanjermakov

Respostas:

26

Existem muitas opções que você tem. Uma opção, e a IMO, a mais segura e fácil, é parar de desativar as teclas de seta. Eu entendo por que muitos vimmers hardcore dizem coisas como

Você nunca deve usar as teclas de seta novamente! Toda vez que você usa as setas, você perde 3 minutos, um filhote morre e alguém muda para o Emacs!

(Obviamente estou brincando) No entanto, há um objetivo para as teclas de seta. Eles são extremamente úteis para navegar:

  • No modo de inserção

  • Na linha de comando

Geralmente, quando as pessoas dizem para você não usar as teclas de seta, é porque elas querem que você reaprenda a navegação de uma maneira mais semelhante ao vim. Se você se sente confortável hjkle usa principalmente as teclas de seta no modo de inserção, não há um bom motivo para se forçar a não usá-las.

A opção 2 é remapear ctrl-hjklpara agir como teclas do cursor. Isso é bom porque você pode permanecer na homerow e se encaixa bem com a memória muscular que você já aprendeu a usar hjklno modo normal. De fato, é isso que eu faço . A principal desvantagem dessa abordagem é que pode ser difícil configurar no terminal vim porque <C-j>produz um NULbyte. Eu contorno isso usando Gvim. Não sei se existe ou não uma correção fácil para o console vim.

A opção 3 é usar <C-o>para fazer pequenos movimentos no modo normal. Por exemplo, se você estiver digitando

Hello world!
     cursor^

e você percebe que esqueceu uma vírgula, em vez de fazer leftleftleftleftleftleft, você pode simplesmente fazer <C-o>b<C-o>hou <C-o>2Foou qualquer outra combinação de movimentos do modo normal que desejar.

Claro, outra opção, e uma de que gosto muito é apenas usar Esc, fazer alguns pequenos movimentos antes de voltar ao modo normal. Você mencionou que prefere não fazer isso, mas às vezes essa é realmente a maneira mais eficiente.

Provavelmente também existem outras abordagens, mas essas são as que eu mais gosto que funcionaram para mim.

DJMcMayhem
fonte
2
Interessante - note que você usa <c-o>gke em <c-o>gjvez de <Up>e <Down>. Por que é que?
Kyle Strand
4
@kylestrand gke suba e desça gjvisualmente uma linha, mesmo que a linha esteja quebrada.
DJMcMayhem
4
Eu não acho que isso seja suficiente para garantir uma resposta por si só, mas eu gosto de ter as teclas de seta desativadas no modo normal (que é o que me forçou a aprender HJKL) e ativadas em todos os outros modos ( noremap <Up> <NOP>...) . Você gasta tempo suficiente no modo normal para aprender HJKL, mas eles estão lá quando você precisar. Ou pelo menos, acho que esse é um meio termo confortável entre deixá-los sempre desligados ou sempre ativados, e não requer o remapeamento de outras teclas (muitas pessoas como Ctrl-HJKL para se mover entre os painéis).
Itai Ferber
Btw, BASH e outros suportam vi combinações de teclas. Com esses mapeamentos, você pode <ESC> e usar o hjkl para percorrer o histórico do cmd (para cima / para baixo) ou modificar o comando atual (esquerda / direita)
Rolf
9

Eu gosto de usar a tecla Control para transformar as hjklteclas de movimento em teclas de movimento "universais". Aqui está a parte relevante da minha .vimrc:

" In insert or command mode, move normally by using Ctrl
inoremap <C-h> <Left>
inoremap <C-j> <Down>
inoremap <C-k> <Up>
inoremap <C-l> <Right>
cnoremap <C-h> <Left>
cnoremap <C-j> <Down>
cnoremap <C-k> <Up>
cnoremap <C-l> <Right>

As inoremapinstruções se aplicam ao modo de inserção, enquanto cnoremapas se aplicam ao modo de comando. (Estou usando esse mapeamento há tanto tempo que esqueci se há alguma maneira de navegar pelo histórico do modo de comando sem ele.)

(Editar: vejo que a outra resposta já mencionou essa possibilidade. Ainda assim, pode ser útil ver os comandos de mapeamento reais.)

Kyle Strand
fonte
3

Pressione esce use hjkle wWbBquaisquer outras navegações que você gostaria de fazer. O ponto principal do modo difícil é fazer com que você aprenda a navegar com movimentos vim mais complexos. Faça pequenas edições e depois vá para um novo local, usando o modo normal.

Se você não quiser aprender a navegar mais rápido com o modo de hardware ativado, confira minha resposta em outra pergunta sobre o mesmo tópico.

Arcanjo33
fonte
3

Se você deseja mover mais de uma ou duas posições ...

... a melhor opção é acertar ESC, mover-se e voltar ao modo de inserção novamente.

Não há sentido em criar mapeamentos como <C-h>mover para a esquerda e começar a pressioná-lo muitas vezes ... como usuário do vim, você não deve pressionar a mesma tecla várias vezes para obter um movimento inteligente.

(Se a ESCchave não estiver próxima dos seus dedos, seria uma boa opção criar um mapeamento para ela.)

Se você deseja mover uma ou duas posições no modo de inserção ...

... uma boa opção seria definir alguns movimentos usando sua <Leader>tecla:

(Eu uso ,como <Leader>chave, uma vez que parece perto e confortável aos meus dedos)

noremap! <Leader>h <left>   "move cursor left
noremap! <Leader>j <down>   "move cursor down
noremap! <Leader>k <up>     "move cursor up   
noremap! <Leader>l <right>  "move cursor right
noremap! <Leader>w <esc>wi  "move one word forward
noremap! <Leader>e <esc>ei  "move forward to the end of word
noremap! <Leader>b <esc>bi  "move one word backward
Rossijonas
fonte
1

Se você precisar modificar apenas uma pequena quantidade de texto ou palavra, poderá usá-lo <Ctrl-O>h/j/k/l.

<Ctrl-O> leva você de volta ao modo Normal apenas para esse comando e o coloca de volta no modo de inserção, para economizar uma certa quantidade de pressionamentos de tecla, se você precisar entrar no modo normal para um pequeno movimento.

Ref: 1. http://vim.wikia.com/wiki/Use_Ctrl-O_instead_of_Esc_in_insert_mode_mappings

alpha_989
fonte