Como substituir parcialmente o texto em um bloco de texto selecionado?

14

Não é fácil encontrar um bom título para o meu problema.

Estou ciente de inserir na frente de um bloco de texto:

Ctrl- v selecione o tipo de linhas I texto ESC

Agora eu gostaria de fazer isso, mas também substituindo uma parte da minha seleção de blocos. Atualmente estou fazendo duas operações

Ctrl- v selecione o bloco x voltar ao início

Seguido pela sequência que mencionei acima.

Existe uma maneira de combinar essas duas operações selecionando ( Ctrl- v) o bloco apenas uma vez?

Aqui está um pequeno exemplo:

Eu gostaria de transformar o seguinte bloco

1  text
2  text
3  text
4  text
5  text

para dentro

new text 
new text 
new text 
new text 
new text

fazendo apenas uma "operação".

Patrick B.
fonte
11
Não tenho 100% de certeza do que você deseja, talvez um exemplo real ajude (o que você tem versus o que deseja). Você está ciente de gv? Ele seleciona novamente a última seleção visual e pode ser útil aqui.
PhilippFrank

Respostas:

21

Digitar capós selecionar seu bloco em vez de xremoverá o texto no bloco de seleção e entrará no modo de inserção. Depois de digitar algo e sair do modo de inserção, você deve ter a mesma alteração em todas as linhas.

Tentar

Ctrl- v- selecione o bloco - c- insira o que for -Esc

Dumitru
fonte
1
    1
   1 1
  1   1
 1111111
 1     1
 1     1
 1     1

Imagine uma linha de três letras maiúsculas diferentes, como a acima. ^Vselecionando o acima, não pude alterar todos Ana última letra da linha devido a linhas de comprimento desiguais. As letras maiúsculas anteriores funcionaram bem com :s/\%V1/T/g "A letra maiúscula anterior era um T feito dos anos 1. Mude /T/para o que for.

Porém, selecionar a última letra de bloco mostrada acima, apenas mudou todos os '1s para' A's ao ponto dos A *, e o restante permaneceu um.

* A linha mais curta.

Para fazer todas as linhas do mesmo comprimento, preenchi-as com espaços. (Eu sou novo no vim, por isso tenho certeza de que um script melhor poderia ser escrito.)

Nota: O pico do A começou na linha 2.

let Maxlen = 0
" Find longest line
for i in range(2,8)
    let t = getline(i)
    let a = strlen(t)
    if a > Maxlen
        Maxlen = a
    endif
endfor

" Append spaces 'til all lines are the same length.
for i in range(2,8)
    let t = getline(i)
    let a = strlen(t)
    if a < Maxlen
        let b = Maxlen - a
        execute "normal!" . i . "gg0" . b . "A "
    endif
endfor

Depois disso, :s/\%V1/T/g trabalhou como anunciado na última letra de bloco da linha.

PS: Li que a executelinha acima deve funcionar sem os pontos, mas não funcionou para mim.

Ron
fonte
A linha de execução, vá para o início da linha i da letra do bloco e acrescente b espaços ao final da linha. 'b' é a diferença de comprimento entre a linha atual e a linha mais longa.
Ron