Movimentos do Grok Vim e edições simples


8

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 NORMALmodo para emitir um único movimento, apenas para voltar ao INSERTmodo não é o ideal.

Exemplo 1: No INSERTmodo 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 INSERTmodo 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 NORMALmodo 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.


1
A maneira do Vim pode ser usar um plug-in como o algoritmo.com.au/code/vimacs . : P Você pode incluir uma explicação sobre o que esses comandos fazem no emacs? Uma lista de Ctrl / Alt / Meta-foo / bar não faz sentido para quem não usa o emacs. E Ctrl-W exclui a palavra antes do cursor. Além disso, sinto que isso é um pouco amplo demais.
Muru

1
Se estivermos seguindo o caminho do plug-in, você deve conferir github.com/tpope/vim-rsi
dkns

3
Ao passar da linguagem de programação "A" para "B". É melhor não escrever "B" no estilo de "A", mas sim aprender os idiomas padrão de "B" (é uma lição difícil para a maioria dos desenvolvedores). A mesma regra se aplica aos editores. Não tente aplicar o fluxo de trabalho padrão do editor "A" ao seu novo editor "B". Prefira aprender os idiomas de usar "B" diretamente. Maior curva de aprendizado, mas muito mais produtivo a longo prazo. Na vimedição, você passa a maior parte do tempo no modo normal e não no modo de inserção.
Martin York

Respostas:


6

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)

inoremap <C-a> <C-o>0

ou, se o início da linha significa o primeiro caractere não em branco da linha

inoremap <C-a> <C-o>^

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

let cchar = s:cchar["atx"]

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:ccharainda não tiver um valor atribuído à "atx"chave. Com o cursor (no modo normal) no primeiro caractere, 'l', devo digitar

f=wcf[MyFunction(<Esc>$r)

Resumidamente, isso diz

  • f=- avance para '=' (eu poderia ter dito fs, 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

let cchar = |"atx"]

onde |está o cursor e eu estou no modo de inserção. Digito MyFunction(e saio do modo de inserção ( <Esc>).

  • $- mova o cursor para o final da linha. Eu poderia ter usado Epara o final da palavra grande ou f]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 com

inoremap <C-S-w> <C-o>dw

Mais uma vez, <C-o>você sairá do modo de inserção para um comando único e dw"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 usar W(consulte :help W). Se você já está principalmente no modo normal você não precisa desses mapeamentos, basta fazer dw, dbou amigos.

Alguns capítulos ajudam a examinar mais de perto

  • :help <C-o>
  • :help Insert
  • :help fe as seções seguintes ( F, t, T, ;e ,)
  • :help word-motions

5
Escrever NÃO é linear. Qualquer um que possa escrever prosa (ou código) do começo ao fim sem realizar algum tipo de edição é louco ou tem o poder de um Deus. Para o resto de nós, fazemos mais edições do que escrevendo e, portanto, pensar no seu editor como executar comandos de edição (modo NORMAL) primeiro e escrever (modo INSERIR) depois é mais eficiente. E esse é o verdadeiro ponto crucial do motivo pelo qual editores como Emacs, MS Word, Bloco de Notas etc. estão atrasados ​​em sua abordagem. É lamentável que o conceito sem modo exista, mas deve haver um menor denominador comum.
Sukima 3/08

12

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).

Para responder sua pergunta sobre edições locais: se você estiver no modo de inserção e pressione, ctrl-Ovocê 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.

Exemplo 1: Quando estiver no modo INSERT para inserir um (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?

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, é apenas ys$). 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 usar c3w()<esc>Pou ys3w). E a linha inteira? cc()<esc>Pou yss).

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 do modo INSERT estão dificultando esse tipo de edição no Vim. Sinto-me incapaz de manipular efetivamente o texto no modo de inserção, sempre tendo que voltar ao modo NORMAL para movimentos simples ou excluir palavras.

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 executar jk<sequenceofcommands>icomandos sem interromper a digitação.


Além disso :h ins-special-keys, confira :h ins-special-specialmais mapeamentos.
Lithis 7/08/15

9

Alt-F, Alt-B, Ctrl-a, Ctrl-e, Alt-D e Alt-Backspace

Os comandos equivalentes em modo normal são w, b, ^, $, dw, db. Observe a lógica: dwexclui o que é coberto we dbexclui o que é coberto b. 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.

Retornar ao NORMALmodo para emitir um único movimento, apenas para voltar ao INSERTmodo não é o ideal.

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.

Exemplo 1: No INSERTmodo 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?

Como em qualquer editor de texto ou IDE ou processador de texto ou <textarea>:

<End>)

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 INSERTmodo 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 NORMALmodo para movimentos simples ou excluir palavras.

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.


Usar movimentos (como Endteclas de seta ou) no INSERTmodo está OK?
SabreWolfy

4
Claro, qualquer coisa que facilite seu trabalho.
Romainl

3

Qual é a maneira do Vim de implementar funcionalidades semelhantes? Retornar ao modo NORMAL para emitir um único movimento, apenas para entrar novamente no modo INSERT não é o ideal.

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):

nmap <C-BACKSPACE> dbi
nmap <C-DEL> dei
imap <C-BACKSPACE> <ESC>ldbi
imap <C-DEL> <ESC>ldei
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.