Atravessando texto no modo Inserir

321

Enquanto estiver no modo de inserção no Vim, existe alguma maneira de percorrer o texto movendo alguns caracteres para frente e para trás, além de usar as teclas de seta?

Se eu pressionar h, j, ke lenquanto no modo de Inserção, os personagens reais são impressos na tela em vez de mover através do texto.

O jeito que estou fazendo isso no momento é ter que recorrer a Ctrl+ [( Esc) e percorrer o texto; mas obviamente isso não é produtivo.

Andreas Grech
fonte
Como uma dica à parte: também é útil se você mapear o escape para uma combinação de teclas mais próxima (ou seja imap jk <Esc>), para que você não precise interromper o impulso e estender a mão pelo teclado para pressionar a tecla.
tsujin
3
Eu gosto ( <ESC>) mapeado em kjvez de jk; meu amigo Dijkstra é o culpado!
Dr Beco
7
Eu tenho jke kj, então, eu apenas pressiono como um botão grande com dois dedos e não importa a ordem em que estou de volta ao normal.
Edu Ruiz #

Respostas:

648

Você parece abusar do vim, mas é provável que não esteja muito familiarizado com ele.

O caminho certo é pressionar Esc, ir onde você deseja fazer uma pequena correção, corrigi-la, voltar e continuar editando. É eficaz porque o Vim tem muito mais movimentos do que o caractere usual para frente / para trás / para cima / para baixo. Depois que você aprender mais deles, isso será mais produtivo.

Aqui estão alguns casos de uso:

  • Você digitou acidentalmente "acidentalmente". Sem problemas, a sequência EscFfrdAcorrigirá o erro e o levará de volta para onde você estava editando. O Ffmovimento moverá o cursor para trás até o primeiro caractere "f" encontrado. Compare isso com Ctrl+DeldEnd , que faz praticamente o mesmo em um editor casual, mas exige mais pressionamentos de teclas e faz com que você mova sua mão para fora da área alfanumérica do teclado.
  • Você digitou acidentalmente "digitou acidentalmente", mas deseja corrigi-lo para "digitou intencionalmente". Em seguida Esc2bcw, apaga a palavra que você deseja corrigir e o leva ao modo de inserção, para que você possa digitá-la imediatamente novamente. Para voltar à edição, basta pressionar em Avez de End, para não precisar mover a mão para alcançar a Endtecla.
  • Você digitou acidentalmente "mouse" em vez de "mouse". Não tem problema - o bom e velho Ctrl+ wexcluirá a palavra anterior sem sair do modo de inserção. E acontece que é muito mais rápido apagar uma palavra pequena do que corrigir erros nela. Estou tão acostumado a isso que fechei a página do navegador quando estava digitando esta mensagem ...!
  • A contagem de repetições é amplamente subutilizada. Antes de fazer um movimento, você pode digitar um número; e o movimento será repetido esse número de vezes. Por exemplo, 15htrará o cursor 15 caracteres de volta e 4j moverá o cursor 4 linhas para baixo. Comece a usá-los e você se acostumará a isso em breve. Se você cometeu um erro com dez caracteres do seu cursor, descobrirá que pressionar a tecla 10 vezes é muito mais lento que a abordagem iterativa de mover o cursor. Portanto, você pode digitar rapidamente as teclas 12h(como adivinhar quantos caracteres você precisa para mover o cursor) e avançar imediatamente duas vezes llpara corrigir rapidamente o erro.

Porém, se você ainda deseja fazer pequenos percursos de texto sem sair do modo de inserção, siga as orientações de rson e use + . Tomando o primeiro exemplo que mencionei acima, + o moverá para um caractere "f" anterior e o deixará no modo de inserção.CtrlOCtrlOFf

P Shved
fonte
33
+1 Excelente resposta e obrigado por todos os exemplos que você deu!
Andreas Grech
79
Também é importante notar que você pode usar Ctrl+opara emitir um único comando no modo normal. Às vezes, isso pode levá-lo aonde você quer estar, principalmente quando combinado com os comandos de movimento t / T ef / F.
Randy Morris
6
"Você parece abusar do vim, mas é provável que não esteja muito familiarizado com ele." é um pouco condescendente. Não?
David Rivers
17
Este é um ótimo insight sobre como usar o Vim corretamente. No entanto, acho que pressionar "Esc" é uma dor, e acho que vale a pena ressaltar que você pode mapear uma tecla mais acessível para essa função, por exemplo, "imap jj <esc>".
Simétrica
25
Para corrigir um erro de digitação, você não deve sair do modo de inserção. O Vim é poderoso porque você cria ações atômicas e repetíveis. Inserir um erro de digitação e corrigi-lo cria duas ações separadas. A maneira correta de corrigir erros de digitação sem sair do modo de inserção. Se isso significa usar as teclas de seta para navegar até lá, tudo bem. O Vim possui algumas combinações de teclas para navegar no modo de inserção. Verifique :h ins-special-keys. ctrl-h: backspace,: ctrl-wdelete word,: ctrl-udelete para o início da linha alt-b,: retorna uma palavra.
everett1992
152

Enquanto estiver no modo de inserção , use CtrlOpara ir para o modo normal com apenas um comando:

CTRL-O h  move cursor left 
CTRL-O l  move cursor right
CTRL-O j  move cursor down
CTRL-O k  move cursor up

que é provavelmente a maneira mais simples de fazer o que você quer e é fácil de lembrar.

Outras teclas de controle muito úteis no modo de inserção:

CTRL-W    delete word to the left of cursor
CTRL-O D  delete everything to the right of cursor
CTRL-U    delete everything to the left of cursor
CTRL-H    backspace/delete
CTRL-J    insert newline (easier than reaching for the return key)
CTRL-T    indent current line
CTRL-D    un-indent current line

isso eliminará muitos comutadores desnecessários de volta ao modo normal.

Chris Sattinger
fonte
13
Obrigado. Essa deve ser considerada a resposta correta. É realmente útil.
Atcold 02/03
1
No meu mac, é minúsculo ou não maiúsculo. Isso é diferente do "padrão vim"? Eu vejo muitos lugares em que eles parecem dizer maiúsculas (a menos que seja apenas uma escrita desleixada). Você pode confirmar?
Floris
Ok, muito útil. No entanto, é difícil encontrar uma combinação interessante e isso é remover a linha. Coisa muito subestimada a ser feita no caso de inserir uma linha com precisão.
patrik
5
O @Floris Vim não distingue entre letras maiúsculas e minúsculas para combinações de ctrl. É por isso que não é possível mapear ctrl + shift + alguma coisa.
Mahmoud Al-Qudsi
92

Modo de inserção

Movimento

hjkl

Não obstante o que Pavel Shved disse - que provavelmente é mais aconselhável se acostumar com o Escmodo Insert - aqui está um exemplo de conjunto de mapeamentos para navegação rápida no modo Insert:

" provide hjkl movements in Insert mode via the <Alt> modifier key
inoremap <A-h> <C-o>h
inoremap <A-j> <C-o>j
inoremap <A-k> <C-o>k
inoremap <A-l> <C-o>l

Isso fará com que Alt+ hno modo Inserir passe um caractere para a esquerda, Alt+ jpara baixo e assim por diante, analogamente ao hjklmodo Normal.

Você precisa copiar esse código no seu arquivo vimrc para carregá-lo toda vez que iniciar o vim (você pode abri-lo digitando :new $myvimrccomeçando no modo Normal).


Qualquer movimento no modo Normal

Como a Alttecla modificadora não está mapeada (para algo importante) por padrão, você pode puxar da mesma maneira outras funcionalidades (ou todas) do modo Normal para o modo Inserir. Por exemplo:
movendo para o início da palavra atual com Alt+ b:

inoremap <A-b> <C-o>b
inoremap <A-w> <C-o>w


(Outros usos Altno modo Inserir)

Vale ressaltar que pode haver usos melhores para a Altchave do que replicar o comportamento no modo Normal: por exemplo, aqui estão os mapeamentos para copiar de uma linha adjacente a parte da coluna atual até o final da linha:

" Insert the rest of the line below the cursor.
" Mnemonic: Elevate characters from below line
inoremap <A-e> 
    \<Esc>
    \jl
        \y$
    \hk
        \p
        \a
" Insert the rest of the line above the cursor.
" Mnemonic:  Y depicts a funnel, through which the above line's characters pour onto the current line.
inoremap <A-y> 
    \<Esc>
    \kl
        \y$
    \hj
        \p
        \a

(Usei a \ continuação e o recuo da linha para aumentar a clareza - os comandos são interpretados como se estivessem escritos em uma única linha.)


Teclas de atalho incorporadas para edição

CTRL-H   delete the character  in front of the cursor (same as <Backspace>)
CTRL-W   delete the word       in front of the cursor
CTRL-U   delete all characters in front of the cursor (influenced by the 'backspace' option)

(Não há teclas de atalho embutidas para movimento no modo Inserir.)

Referência: :help insert-index


Modo de linha de comando

Esse conjunto de mapeamentos disponibiliza os movimentos superiores Alt+ na linha de comando:hjkl

" provide hjkl movements in Command-line mode via the <Alt> modifier key
cnoremap <A-h> <Left>
cnoremap <A-j> <Down>
cnoremap <A-k> <Up>
cnoremap <A-l> <Right>

Como alternativa, esses mapeamentos adicionam os movimentos ao modo Inserir e ao modo de linha de comando de uma só vez:

" provide hjkl movements in Insert mode and Command-line mode via the <Alt> modifier key
noremap! <A-h> <Left>
noremap! <A-j> <Down>
noremap! <A-k> <Up>
noremap! <A-l> <Right>


Os comandos de mapeamento para puxar os comandos do modo Normal para o modo de linha de comando são um pouco diferentes dos comandos de mapeamento do modo de inserção (porque o modo de linha de comando não possui o Ctrl+ do modo de inserção O):

" Normal mode command(s) go… --v <-- here
cnoremap <expr> <A-h> &cedit. 'h' .'<C-c>'
cnoremap <expr> <A-j> &cedit. 'j' .'<C-c>'
cnoremap <expr> <A-k> &cedit. 'k' .'<C-c>'
cnoremap <expr> <A-l> &cedit. 'l' .'<C-c>'

cnoremap <expr> <A-b> &cedit. 'b' .'<C-c>'
cnoremap <expr> <A-w> &cedit. 'w' .'<C-c>'


Teclas de atalho incorporadas para movimento e edição

CTRL-B       cursor to beginning of command-line
CTRL-E       cursor to end       of command-line

CTRL-F       opens the command-line window (unless a different key is specified in 'cedit')

CTRL-H       delete the character  in front of the cursor (same as <Backspace>)
CTRL-W       delete the word       in front of the cursor
CTRL-U       delete all characters in front of the cursor

CTRL-P       recall previous command-line from history (that matches pattern in front of the cursor)
CTRL-N       recall next     command-line from history (that matches pattern in front of the cursor)
<Up>         recall previous command-line from history (that matches pattern in front of the cursor)
<Down>       recall next     command-line from history (that matches pattern in front of the cursor)
<S-Up>       recall previous command-line from history
<S-Down>     recall next     command-line from history
<PageUp>     recall previous command-line from history
<PageDown>   recall next     command-line from history

<S-Left>     cursor one word left
<C-Left>     cursor one word left
<S-Right>    cursor one word right
<C-Right>    cursor one word right

<LeftMouse>  cursor at mouse click

Referência: :help ex-edit-index

Aaron Thoma
fonte
@YugalJindle: Obrigado! :) Agora adicionei informações sobre como ajustar o modo de linha de comando. (A abordagem é um pouco diferente do modo Inserir.)
Aaron Thoma
@ Zen: O que você quer dizer com "winkey"? Eu não referenciei a chave do Windows na minha resposta. Você quer dizer a Altchave?
Aaron Thoma
Shift - esquerda / direita para mover uma palavra inteira !! Como eu não sabia disso. Obrigado.
Floris
realmente em alt modo terminal envia automaticamente esc antes de seus comandos ........
Fuseteam
26

Se você é um purista do vim, pule a leitura desta resposta. OTOH, se você é novo no vim e está procurando algumas dicas úteis que você não encontrará nas centenas de tutoriais e blogs do vim, continue lendo ... :-)

Algumas maneiras não ortodoxas (vim)

Estamos em 2014 e, como alguém que voltou recentemente, vimposso oferecer alguns pontos de vista e dicas potencialmente contrários.

Use shift + esquerda ou shift + direita para percorrer as palavras

Embora a repetição seja um conceito poderoso no vim, eu (pessoalmente) acho estranho que usá-la me force a contar (linhas, caracteres, palavras, etc.) ou fazer palpites. Meu cérebro geralmente funciona como "eu quero o cursor " e não como "eu quero o cursor _5_words_to_the_left_". Ser capaz de mover rapidamente o cursor e observar visualmente onde o ponto de inserção dessa maneira me permite manter minha mente no que estou editando, em vez de ter que contar quantos saltos preciso fazer para chegar onde preciso editar.

Ative o modo mouse e use a roda do mouse e clicando em

... para navegar por grandes corpos de texto.

A maioria dos computadores (todos) modernos possui um touchpad que está intimamente integrado ao teclado (por exemplo, MacBooks). Os designers industriais passaram muitos anos aperfeiçoando esses designs, de modo que o velho problema de ter que afastar a mão do teclado não é mais um problema real. Ok, é se você está acostumado a um mouse e não gosta de mudar, mas para alguém novo no vim (como aqueles que podem encontrar este post por meio de uma pesquisa), isso não deve ser um problema.

Como bônus, clique + arrastar coloca você no modo visual

Com o mouse ativado, clicar e arrastar tem o efeito de alternar para o modo visual e marcar uma região para puxar.

E use a roda de rolagem

Usar o mouse (roda) para rolar e clicar para posicionar o cursor (duh) funciona. Consulte http://usevim.com/2012/05/16/mouse/ para obter mais informações.

E entao...

Estes são o que eu chamaria de formas mais modernas (usando mouse, roda de rolagem etc.) de navegar no vim, igualmente eficazes, dependendo da sua preferência de entrada.

HTH

Shyam Habarakada
fonte
6
@MilesRout sim, eu tive um aviso. Mas, com toda a seriedade, eu acho que existe uma boa proporção de usuários do vim cujos cérebros funcionam da mesma forma que os meus. Ou seja ... meu cérebro geralmente funciona como "Quero o cursor lá" e não como "Quero o cursor 5_words_to_the_left ". E a maneira convencional do vim não funciona tão bem para essas pessoas. Eu amo o vim porque a) está disponível em qualquer lugar eb) possui recursos poderosos. No entanto, não sinto a necessidade de estar em conformidade com todos os seus mecanismos padrão.
Shyam Habarakada 14/10
4
@MilesRout Há muita religião nesse tipo de coisa no vim, então não vou debater com você sobre isso. O método de contagem de repetições não me ajuda, e a resposta aceita também o chama de algo muito subutilizado. Só posso adivinhar por que é esse o caso. Usar w, b etc. para navegar para lugares próximos é ótimo, mas para ir além, a roda do mouse funciona muito melhor para mim. Felicidades.
Shyam Habarakada
4
+1. Eu não entendo isso em votação. Existe um aviso. Pegue se quiser e pule se não gostar.
Fangmobile.com
Esta é uma resposta muito útil
Slava
1
Como alguém que recentemente se mudou para o VIM, acho que a premissa desta resposta é absolutamente imediata. A capacidade de contar instantaneamente o número de repetições necessárias para posicionar o cursor em um determinado local pode ou não ser algo que vem com experiência. Agora, assim como @ShyamHabarakada, meu cérebro simplesmente não funciona assim. Independentemente de quão pouco ortodoxo isso possa ser, eu pessoalmente mapeei fn + hjkl nas teclas de seta para movimentos muito pequenos. Para grandes movimentos, costumo aproximar várias repetições e depois afinar com elas. Para mim, isso é o mais rápido possível.
Jacoscaz 12/11/2015
14

Muitas pessoas na comunidade Vim argumentam que você não deve navegar no modo Inserir, que não é o caminho do Vim. Eu acho que esse é um sentimento incorreto, aprendido ao fazer a transição dos editores padrão para o Vim.

O Vim é mais poderoso quando você usa suas ferramentas para criar ações ou descobertas atômicas e repetíveis.

Não há problema em navegar no modo Inserir se você estiver corrigindo um erro cometido na mesma sessão Inserir. Você não deve navegar fora do intervalo de texto modificado.

Se você cometer um erro ao inserir texto e sair do modo Inserir para corrigi-lo, não poderá repetir a ação pretendida, .repetirá a correção.

O Vim suporta muitas teclas de navegação no modo Inserir. Obviamente, existem as teclas de seta Home e End, mas também existem muitos outros atalhos. Veja :h ins-special-keys.

everett1992
fonte
4

No GVim, você pode usar o mouse. Mas, honestamente, o que há de errado em usar as teclas de seta? Há uma razão pela qual eles estão em um teclado.

Erich Kitzmueller
fonte
9
mas esse motivo não é atendido pelos usuários do vim. Um dos pontos fortes do vim é que você pode fazer todo tipo de coisa sem gastar muito tempo tirando as mãos da linha inicial do teclado. Em particular, os movimentos hjkl.
Aaron Thoma
1
Eu concordo com @ammoQ. Nada de errado em usar as teclas de seta. Se o uso das teclas de seta lhe proporcionar mais produtividade, vá em frente.
Eunwoo canção
elogio: uso hjkl com mais frequência do que as teclas de seta ao usar o vi, mas alternar entre os modos se tornou uma ação subconsciente para mim.
Erich Kitzmueller
4

Para ter uma navegação um pouco melhor no modo de inserção, por que não mapear algumas teclas?

imap <C-b> <Left>
imap <C-f> <Right>
imap <C-e> <End>
imap <C-a> <Home>
" <C-a> is used to repeat last entered text. Override it, if its not needed

Se você puder trabalhar para que a tecla Meta funcione no seu terminal, poderá zombar ainda mais do modo emacs. A navegação no modo normal é muito melhor, mas para movimentos mais curtos, ajuda a permanecer no modo de inserção.

Para saltos mais longos, prefiro a seguinte tradução padrão:

<Meta-b>    maps to     <Esc><C-left>

Isso muda para o modo normal e retorna uma palavra

Alex
fonte
2

Acredito Homee End(e PageUp/ PageDn) também funcionam normalmente no modo de inserção, mas além disso, não acredito que haja outras chaves padrão definidas para a passagem de texto.

Âmbar
fonte
mas possivelmente não há nenhuma maneira de percorrer o texto usando apenas as teclas da letra?
Andreas Grech
5
Certamente não é, se você não quer ser capaz de digitar algumas letras ...;)
Hobbs
@hobbs Que tal ctrl + hjkl? Isso deve fazer sentido #
40402054 19/03/19
1

Desculpe, mas o vim não funciona dessa maneira.

Você deve alternar para o modo "normal", navegar e depois voltar a inserir novamente.

Johan
fonte
1

Você pode criar mapeamentos que funcionam no modo de inserção. A maneira de fazer isso é via inoremap. Observe o 'i' no início do comando (o noremap é útil para evitar colisões com os principais mapas). O corolário é 'n' para o modo 'normal'. Você pode supor que o vim acha que é 'normal';)

No entanto, você realmente deseja navegar no texto usando o modo 'normal'. O Vim é excelente nesse tipo de coisa e todo esse poder está disponível no modo normal. O Vim já oferece maneiras fáceis de passar do modo normal para o modo de inserção (por exemplo, i, I, a, A, o, O). O truque é facilitar o acesso ao modo normal. A maneira de fazer isso é remapear a fuga para uma chave mais conveniente. Mas você precisa de um que não entre em conflito com sua digitação regular. Eu uso:

inoremap jj <Esc>

Como jj (que é 2j digitado um após o outro rapidamente) não parece aparecer no meu vocabulário. Outros vão remapear para onde é confortável.

A outra mudança essencial que faço é alternar as teclas CAPSLOCK e CONTROL no meu teclado (usando a configuração do teclado do computador host), já que quase nunca uso o CAPSLOCK e ele tem esse botão grande e bonito exatamente onde eu quero. (Isso é comum para os usuários do Emacs. A desvantagem é quando você se encontra em um teclado 'não corrigido'! Aaarggh!)

Depois de remapear o CAPSLOCK, você pode usar confortavelmente os seguintes remapeamentos no modo de inserção:

Tendo em mente que algumas chaves já estão mapeadas no modo de inserção (backwards-kill-word é Cw (Control-w) por padrão, você já deve ter as ligações desejadas.Portanto, eu prefiro o Ch no meu .vimrc :

inoremap <C-h> <C-w>

MAS, você provavelmente deseja o mesmo espasmo de memória muscular no modo normal, então também mapeio Ch como:

nnoremap <C-h> db

(d) elete (b) ackwards realiza a mesma coisa com o mesmo acorde de teclas. Esse tipo de edição rápida é um que considero útil na prática para erros de digitação. Mas atenha-se ao modo normal para se movimentar no texto e algo mais do que matar a palavra anterior. Quando você adquirir o hábito de alterar os modos (usando um remapeamento, é claro), será muito mais eficiente do que o remapeamento do modo de inserção.

pfries
fonte
remapeamento agradável para a fuga - eu acho que funcionará para praticamente qualquer coisa, exceto árabe transliterado!
JJT
0

Você pode usar imappara mapear qualquer tecla no modo de inserção para uma das teclas do cursor. Igual a:

imap h <Left>

Agora h funciona como no modo normal, movendo o cursor. (Mapear h dessa maneira é obviamente uma má escolha)

Dito isto, não acho que a maneira padrão de se movimentar no texto usando o VIM "não seja produtiva". Existem muitas maneiras muito poderosas de percorrer o texto no modo normal (como usar w e b, ou / e?, Ou f e F, etc.)

Peter van der Heijden
fonte
1
Eu não disse que a maneira padrão de percorrer o texto no vim não é produtiva; o que eu disse foi que era um pouco "chato" ter que sair do modo de inserção para voltar alguns caracteres e depois ter que voltar para inserir novamente; mas, novamente, talvez isso é porque eu não tenho bastante utilizado para vim ainda :)
Andreas Grech
Esta é a solução que eu estava procurando. Eu uso o imap <Ch> <Left> (eu sei que ele exclui um caractere, mas eu tenho backspace), que é tudo o que preciso, obrigado.
user4052054
0

Para alguns movimentos e ações usados ​​com freqüência, eu defini os seguintes mapeamentos. Isso economiza um pressionamento de tecla comparado à combinação CTRL + O e, como eu preciso deles com frequência, eles são recompensados ​​a longo prazo.

inoremap <A-$> <C-o>$
inoremap <A-^> <C-o>^
inoremap <A-h> <Left>
inoremap <A-l> <Right>
inoremap <A-O> <C-O>O
inoremap <A-o> <C-o>o
Alexander van Trijffel
fonte