Estou voltando ao Vim depois de usar o Emacs por alguns anos. Estou tentando entender o Vim lendo e assistindo aos tutoriais, além de usá-lo diariamente.
Ao editar texto, acho os comandos Emacs de Alt-F, Alt-B, Ctrl-a, Ctrl-e, Alt-D e Alt-Backspace muito úteis e intuitivos, permitindo edições locais rápidas e fáceis ao trabalhar com texto (palavras / código).
Qual é a maneira do Vim de implementar funcionalidades semelhantes? Retornar ao NORMAL
modo para emitir um único movimento, apenas para voltar ao INSERT
modo não é o ideal.
Exemplo 1: No INSERT
modo de inserção de a (
no início de uma expressão, como devo mover para o final da expressão ou a linha para inserir o correspondente )
no Vim?
Exemplo 2: Ao editar texto, pode-se querer excluir uma palavra para frente ou para trás enquanto escreve ou edita uma frase ou código. Seria incomum ter uma frase / código perfeitamente formado, pronto para digitar "uma vez" antes do tempo; frequentemente uma frase muda à medida que se trabalha com o texto. As restrições de INSERT
modo estão dificultando esse tipo de edição para mim no Vim. Sinto-me incapaz de manipular efetivamente o texto no modo de inserção, sempre tendo que voltar ao NORMAL
modo para movimentos simples ou excluir palavras.
PS: Alt-F e -B movem o cursor para frente ou para trás uma palavra. Ctrl-ae -e movem o cursor para o início ou o fim da linha. Alt-F exclui a palavra sob o cursor. Alt-Backspace exclui a palavra antes do cursor.
fonte
vim
edição, você passa a maior parte do tempo no modo normal e não no modo de inserção.Respostas:
1
Você pode obter esses ou melhores mapeamentos de comando (mindinho) muito rapidamente. Não estou recomendando esta solução, mas como exemplo, se você quiser mover o cursor para o início da linha,
<C-a>
poderá executar a seguinte linha depois de:
sair do modo normal (ou adicionar a linha ao seu vimrc)ou, se o início da linha significa o primeiro caractere não em branco da linha
Curioso, acabei de testar esses mapeamentos no buffer no qual estou escrevendo esta resposta e fiquei confuso por um momento porque eles não funcionaram. Então percebi que tinha esquecido de entrar no modo de inserção. Parece difícil deixar o modo de inserção para executar comandos no modo normal. Você pode descobrir depois de usar o Vim por um tempo que é o inverso - que você permanece no modo normal enquanto pensa e só faz excursões para inserir o modo em ocasiões específicas. Provavelmente, o Vim vale apenas (ou principalmente) o aprendizado, se você achar que faz mais edição do que escrevendo texto.
Portanto, é parte de uma resposta à sua pergunta sobre a execução rápida de comandos no modo normal a partir do modo de inserção
<C-o>
, que permite sair temporariamente do modo de inserção para executar um comando no modo normal e entrar novamente. Leia sobre isso em:help i_Ctrl-o
. Isso é útil para conveniências pontuais. Uma rota mais sustentável é provavelmente tentar adotar o modo normal como padrão para navegação e edição e entrar no modo de inserção apenas quando você realmente deseja inserir novos caracteres manualmente no buffer.2
Seus exemplos são muito gerais, por isso é difícil dar respostas específicas. Vou criar um exemplo específico na esperança de que se encaixe ou seja traduzível para algo que você encontrar. Para o seu número 1, depende de como você sabe para onde o parêntese de fechamento deve ir. digamos que eu tenho uma linha como
Isso deve ser uma linha do VimL, a linguagem de script do vim, e (ou algo parecido) ocorre em um arquivo de sintaxe do Vim em que estou discordando. Digamos que eu queira alterar a parte direita dessa expressão para uma chamada de função, talvez porque a função forneça padrões quando o dicionário
s:cchar
ainda não tiver um valor atribuído à"atx"
chave. Com o cursor (no modo normal) no primeiro caractere, 'l', devo digitarResumidamente, isso diz
f=
- avance para '=' (eu poderia ter ditofs
, mas provavelmente não pararia o suficiente para ver que os 's' que eu quero alcançar são os primeiros na linha, então eu iria para o personagem que é obviamente único e continue a partir daí)w
- próxima palavra, agora meu cursor está no 's' de 's: cchar'cf[
- mude para encaminhar para '['Neste ponto, a linha parece
onde
|
está o cursor e eu estou no modo de inserção. DigitoMyFunction(
e saio do modo de inserção (<Esc>
).$
- mova o cursor para o final da linha. Eu poderia ter usadoE
para o final da palavra grande ouf]
para a frente para ']' ou alguma outra moção, mas$
me ocorreu primeiro.r)
- substitua o caractere sob o cursor por um ')'Agora mudei a expressão de atribuição de atribuir de um dicionário de script local para usar o valor de retorno de uma função e, ao fazê-lo, apresentei parênteses. Não sei como é a sua necessidade particular de parênteses, talvez seja muito diferente; nesse caso, haverá uma sequência de comandos diferente para alcançá-lo. Se eu parasse para pensar mais no meu exemplo inventado, também encontraria maneiras mais eficientes de conseguir isso, mas quem tem tempo para parar e pensar.
(Experimente, copie e cole (desculpe, arranque) o texto e o comando para um buffer e, com o cursor no primeiro caractere, 'f', do comando hit
y$
. Agora, o comando está no seu registro sem nome. Vá para o início da primeira linha e pressione:normal <C-r>"
a) para entrar no modo de linha de comando, b) começar a executar um comando de modo normal a partir da linha de comando ec) colar ( atchoo put) o registro sem nome na linha de comando como normal comando de modo a ser executado. A única coisa que você precisa alterar no comando é substituir a<Esc>
série de caracteres falsos (porque você copiou o atchoo do seu navegador) pelo código da tecla Escape real, exclua-o e pressione<C-v>
e, em seguida, pressione a tecla Esc. Será algo como^[
. Agora pressione return para executar o comando. Ou ... apenas digite a sequência de teclas para testar os comandos, eu só queria mostrar que você pode interagir com o modo normal também no modo cmdline, e<C-v>
, e<C-r>
, e todas as outras glórias do país das maravilhas. Veja também:help Cmdline-mode
.)3
Para excluir uma palavra para trás, você pode usar o mapeamento padrão
<C-w>
(consulte:help i_Ctrl-w
). Não sei se existe um mapeamento padrão para excluir uma palavra, mas suponho que você possa fazer uma comMais uma vez,
<C-o>
você sairá do modo de inserção para um comando único edw
"excluirá" o movimento "word". Veja:help d
,:help w
. Se as palavras avançadas que você exclui não são palavras reais, mas nomes de classe.função #, você pode usarW
(consulte:help W
). Se você já está principalmente no modo normal você não precisa desses mapeamentos, basta fazerdw
,db
ou amigos.Alguns capítulos ajudam a examinar mais de perto
:help <C-o>
:help Insert
:help f
e as seções seguintes (F
,t
,T
,;
e,
):help word-motions
fonte
Para responder sua pergunta sobre edições locais: se você estiver no modo de inserção e pressione,
ctrl-O
você executará o próximo comando no modo de inserção. Pode ser útil se você decidir limpar a linha. Existem alguns outros comandos no modo de inserção para pequenas coisas, como colar a partir do registro e palavras de preenchimento automático. Você pode ler todos eles com:h ins-special-keys
.Muitas vezes, há uma maneira melhor de fazer as coisas no modo normal. Por exemplo, digamos que você queira colocar uma expressão entre parênteses. Algumas coisas que você pode fazer são
i(<end>)
,i(<esc>A)
,c$()<esc>P
. * Minha coisa favorita envolve ter um dos vim plugins, "necessário" vim-envolvente . Com o vim-surround, é apenasys$)
. O melhor de tudo isso é que, depois que você souber fazer em uma situação, poderá fazê-lo em todas as situações semelhantes. E se, em vez de adicionar parênteses ao final da linha, forem apenas três palavras? Você pode usarc3w()<esc>P
ouys3w)
. E a linha inteira?cc()<esc>P
ouyss)
.Uma coisa que ajuda muito é adicionar
inoremap jk <esc>
ao seu vimrc. Em seguida, você pode sair do modo de inserção pressionando jk. Isso tira a maior parte da sobrecarga de sair do modo de inserção, para que você possa executarjk<sequenceofcommands>i
comandos sem interromper a digitação.fonte
:h ins-special-keys
, confira:h ins-special-special
mais mapeamentos.Os comandos equivalentes em modo normal são
w
,b
,^
,$
,dw
,db
. Observe a lógica:dw
exclui o que é cobertow
edb
exclui o que é cobertob
. Qual comando você usaria para excluir o que é coberto^
? Ou arrancá-lo?Essa lógica de linguagem é o ponto principal da edição modal; pode levar algum tempo para se ajustar a ele, mas não há inversão de marcha.
Os comandos equivalentes em modo de inserção são:
<C-Right>
,<C-Left>
,<Home>
,<End>
,<C-w>
e ... nada, mas você pode criar um mapeamento simples:inoremap <C-something> <C-o>dw
.De fato. A abordagem correta é entrar no modo de inserção para inserir o mínimo de texto possível e retornar ao modo normal o mais rápido possível.
Como em qualquer editor de texto ou IDE ou processador de texto ou
<textarea>
:Mais uma vez, o modo de inserção é para inserir texto. "Manipular texto" e mover-se devem ocorrer no modo normal.
Por favor, faça perguntas mais precisas.
fonte
End
teclas de seta ou) noINSERT
modo está OK?Bem, pode-se dizer que o Vim-way é não permanecer no modo INSERT. O momento esclarecedor no Vim ocorre quando você percebe como não precisa permanecer no modo INSERIR. Existem várias maneiras de inserir texto, e todas elas começam no modo NORMAL.
Dito isto, eu não sou verdadeiro e reformulei as chaves para fazer o trabalho (à la Windows):
fonte