Copie a seleção do modo visual abaixo da seleção no vi

2

No vim, muitas vezes me vejo repetindo as mesmas etapas para copiar uma seção antes de fazer alterações nela:

  1. V para iniciar o modo visual linewise
  2. j até eu ter selecionado a seção que desejo copiar
  3. y para arrancar a seleção
  4. j para descer até a última linha do texto que acabei de selecionar
  5. p para copiar a seção arrancada abaixo da linha atual
  6. O para iniciar uma nova linha em branco acima do texto copiado
  7. ESC para sair do modo de inserção

Existe uma maneira mais eficiente de realizar isso (ou qualquer parte dela)? Em particular, parece que deve haver uma maneira melhor de colocar o texto abaixo da seleção que você acabou de selecionar, em vez de rolar para baixo para selecioná-lo, puxá-lo e rolar até o fundo novamente.

    
por jrdioko 12.10.2012 / 20:21

2 respostas

2

O gargalo real, aqui parece ser todo o jjjj… que você está fazendo. A suposta superioridade de hjkl sobre as teclas de seta é citada com tanta frequência que as pessoas tendem a esquecer o imenso valor dos movimentos e objetos de texto de Vim sobre ambos métodos tediosos.

Supondo que você esteja na primeira linha de um parágrafo, conforme definido pelo Vim (texto entre linhas em branco), y'}P deve arrancar todo o parágrafo incluindo a linha em branco que se segue e colá-lo acima da linha atual.

some text above 

[l]orem ipsum dolor sit amet
ipsum lorem dolor sit amet
lorem dolor ipsum sit amet
lorem ipsum sit dolor amet
lorem ipsum dolor amet sit

some text below

y'}P

some text above

[l]orem ipsum dolor sit amet
ipsum lorem dolor sit amet
lorem dolor ipsum sit amet
lorem ipsum sit dolor amet
lorem ipsum dolor amet sit

lorem ipsum dolor sit amet
ipsum lorem dolor sit amet
lorem dolor ipsum sit amet
lorem ipsum sit dolor amet
lorem ipsum dolor amet sit

some text below

v}yP deve funcionar também, de uma forma mais confortável.

Se o seu bloco não é um "parágrafo", provavelmente existe uma maneira de definir a seleção com um movimento em vez de jjj . Algo como V/it$<cr> .

editar

Aqui está outra variante que coloca a cópia abaixo do original: y'}'}p .

editar

Acho que a maneira mais genérica de encurtar todo o processo é estender a seleção visual:

  • com um movimento de busca se você puder identificar um "gancho" na última linha do bloco que deseja duplicar ( V/foo<CR> )

  • ou uma contagem ( V5j ).

Após a seleção, você pode:

  • yank ( y ),

  • mova para o final da seleção visual ( '> ou 5j , mas '> é mais genérico),

  • abra uma nova linha ( o ),

  • sair do modo de inserção ( <Esc> ),

  • colar ( p )

Este método é provavelmente o mais genérico, mas ainda é muito digitado. É aí que os mapeamentos chegam para o resgate:

vnoremap <F9> y'>o<Esc>p

A ideia, aqui, é separar o contextual do genérico:

  • a parte contextual é quando você define o bloco para duplicar, porque não há como prever o que você deseja duplicar deixo esta parte a seu critério, mas espero que você use um método melhor que jjjjjj…

  • a parte genérica é tudo o que segue a seleção, feita aqui com um mapeamento simples.

O processo inteiro agora está reduzido a V5j<F9> , o que é o mais rápido possível.

    
por 12.10.2012 / 21:54
3

Se eu entendi, seu objetivo é ter essencialmente duas cópias de um pedaço de texto, um após o outro. Nesse caso, tente isto:

  1. Shift-V
  2. j para selecionar a região
  3. y para arrancar
  4. Shift-P para colocar acima da sua localização atual
  5. Quando você faz o put, ele informa quantas linhas foram adicionadas. Digite este número e pressione j
  6. Shift-O

Sei que tudo isso faz com que a rolagem seja removida, mas, para qualquer quantidade considerável de texto, será a parte mais longa da evolução e a mais propensa a mais ou menos fotografar no local certo.

    
por 12.10.2012 / 20:45