Como inserir texto no início de uma seleção de várias linhas no vi / Vim

423

No Vim , como insiro caracteres no início de cada linha em uma seleção?

Por exemplo, eu quero comentar um bloco de código colocando um prefixo //no início de cada linha, assumindo que o sistema de comentários do meu idioma não permita comentários de bloco como esse /* */. Como eu faria isso?

Jordan Parmer
fonte

Respostas:

748
  • Pressione Escpara entrar no 'modo de comando'
  • Use Ctrl+ Vpara entrar no modo de bloqueio visual
  • Mova Up/ Downpara selecionar as colunas de texto nas linhas que deseja comentar.
  • Em seguida, pressione Shift+ ie digite o texto que deseja inserir.
  • Em seguida Esc, pressione , aguarde 1 segundo e o texto inserido aparecerá em todas as linhas.

Para mais informações e leitura, consulte " Inserir texto em várias linhas " no Wiki de dicas do Vim.

pixelbeat
fonte
6
O único problema com isso é que parece que Ctrl + V é substituído no GVIM.
Jordan Parmer
14
Não é para mim (no linux) não é
pixelbeat 31/10/08
23
Você pode usar Ctrl-Q como um substituto em gVim (como: ajuda Ctrl-V explica), mas você precisa usar hjkl para navegar neste modo, em vez das teclas de seta
Gareth
9
Se o seu ctrl-v for substituído no windows gvim, edite o global vimrc para parar de incluir o mswin.vim.
graywh
18
Alguma idéia de por que isso não faria nada depois de pressionar esc? Esperei 10 segundos para que algo acontecesse em menos de cem linhas - não importa, eu Shift + vnão estava pressionando CTRL + v. @ vkaul11 Provavelmente a mesma coisa que você fez lol
Tek
186

Isso substitui o início de cada linha por "//":

:%s!^!//!

Isso substitui o início de cada linha selecionada (use o modo visual para selecionar) por "//":

:'<,'>s!^!//!

Observe que gv(no modo normal) restaura a última seleção visual, que é útil de tempos em tempos.

Tomalak
fonte
3
Obrigado! Faz total sentido. E remover o texto é o seguinte: '<,'> s! ^ // !!
Jordan Parmer
4
Qual é o significado dos pontos de exclamação na resposta acima? (:% s ^ //!)
Henrik K
19
@HKK, normalmente se usa o caractere de barra / como um delimitador para o comando search and replace. Nesse caso, estamos inserindo uma barra como parte da pesquisa e substituí-lo, para usar um delímetro alternativo, o caractere de exclamação!
cyber-monge
+1 Isso funciona no VsVim onde (Ctrl + V) (Shiift + I) Esc não.
Seth Reno
4
+1, não tinha idéia de que você poderia usar outra coisa como delimitador regex (aqui eu estava usando /e ter que fugir do //em :s/^/\/\/vez de escrever :s!^!//)
Hashbrown
83

O padrão geral para pesquisa e substituição é:

:s/search/replace/

Substitui a primeira ocorrência de 'pesquisa' por 'substituir' para a linha atual

:s/search/replace/g

Substitui todas as ocorrências de 'pesquisa' por 'substituir' pela linha atual, 'g' é a abreviação de 'global'

Este comando substituirá cada ocorrência de 'pesquisa' por 'substituir' apenas para a linha atual. O% é usado para pesquisar sobre o arquivo inteiro. Para confirmar cada substituição interativamente, adicione um 'c' para confirmar:

:%s/search/replace/c

Confirmação interativa, substituindo 'pesquisa' por 'substituir' para o arquivo inteiro

Em vez do caractere%, você pode usar um intervalo de número de linha (observe que o caractere '^' é um caractere de pesquisa especial para o início da linha) :

:14,20s/^/#/

Insere um caractere '#' no início das linhas 14-20

Se você deseja usar outro caractere de comentário (como //), altere seu delimitador de comando:

:14,20s!^!//!

Insere uma sequência de caracteres '//' no início das linhas 14-20

Ou você sempre pode simplesmente escapar dos // caracteres como:

:14,20s/^/\/\//

Insere uma sequência de caracteres '//' no início das linhas 14-20

Se você não estiver vendo os números de linha no seu editor, digite o seguinte

:set nu
cyber-monge
fonte
para remover o início #: em vez de: 14,20s / # / ^ /, você deve usar: 14,20s / # //
cn1h
1
@ cn1h Acho que isso substituirá outros #na linha também. Você deve usar em seu ^#lugar.
Ankush981
Obrigado por explicar o básico. É bom saber por que algo acontece.
didierCH
38

Outra maneira que pode ser mais fácil para os iniciantes:

 some█
 code
 here

Coloque o cursor na primeira linha, por exemplo,

gg

e digite o seguinte para entrar no modo de inserção e adicionar seu texto:

I / / Space

 // █some
 code
 here

Pressione Escpara voltar ao modo de comando e use o dígrafo:

j . j .

 // some
 // code
 //█here

jé um comando de movimento para descer uma linha e .repetir o último comando de edição que você fez.

ninegrídeo
fonte
3
Isso é realmente simples :). Se você está tendo problemas, pode ser porque você está digitando uma barra (o outro símbolo com seu \) em |vez de uma capital I. Eu pensei que era um |no começo.
Cokedude
1
Se eu fizer "5". ele exclui 5 caracteres da mesma linha. Como faço para excluir 5 caracteres ao mesmo tempo de cada linha?
Rahul Prasad
1
@RahulPrasad Digamos que você tenha 25 linhas e, a partir da primeira linha, basta gravar 5xj em um registro e reproduzir esse registro 24 vezes, por exemplo: qa5xjq25 @ a Mas seria melhor se você publicasse isso como uma pergunta real Se ele não existir ...
ninegrid
26

E ainda outra maneira:

  • Mover para o início de uma linha
  • entre no modo Visual Block ( CTRL- v)
  • selecione as linhas que você deseja (movendo para cima / baixo com j/ k, ou pulando para uma linha com [linha] G)
  • pressione I(é o capital i)
  • digite o (s) caractere (s) de comentário
  • pressione ESC
Yewge
fonte
20

Isso adiciona #no início de cada linha:

:%s/^/#/

E as pessoas deixarão de reclamar da sua falta de scripts para comentar corretamente.

Jar-jarhead
fonte
2
E se você quiser adicionar # apenas às linhas selecionadas (ou poucas) #
Rahul Prasad
15

Se você quiser ser super estiloso, coloque isso no seu .vimrc:

vmap \c :s!^!//!<CR>
vmap \u :s!^//!!<CR>

Então, sempre no modo visual, você pode bater \ca c omment o bloco e \upara u ncomment-lo. Obviamente, você pode alterar essas teclas de atalho para o que for.

Lucas Oman
fonte
Votado porque introduziu algo novo - vmap!
Ankush981
11

Ainda outra maneira:

:'<,'>g/^/norm I//

/^/é apenas um padrão fictício para corresponder a todas as linhas. normpermite executar os comandos do modo normal a seguir. I//diz para entrar no modo de inserção enquanto pula o cursor para o início da linha e insira o texto a seguir (duas barras).

:g geralmente é útil para fazer algo complexo em várias linhas, onde você pode pular entre vários modos, excluir ou adicionar linhas, mover o cursor, executar várias macros etc. E você pode dizer para operar apenas em linhas que corresponde a um padrão.

Brian Carper
fonte
1
na verdade, o comando: g não é necessário. Isso fará:: '<,'> norma I //
Cyber ​​Oliveira
1
E: s também é melhor usar neste caso.
graywh
Essa é a resposta mais útil.
Peaceful
3

Para comentar blocos de código, gosto do plug-in NERD Commenter .

Selecione algum texto:

Shift-V
...select the lines of text you want to comment....

Comente:

,cc

Descomentar:

,cu

Ou apenas alterne o estado do comentário de uma linha ou bloco:

,c<space>
Kevin
fonte
2

Eu posso recomendar o plugin EnhCommentify .

por exemplo. coloque isso no seu vimrc:

let maplocalleader=','
vmap <silent> <LocalLeader>c <Plug>VisualTraditional
nmap <silent> <LocalLeader>c <Plug>Traditional
let g:EnhCommentifyBindInInsert = 'No'
let g:EnhCommentifyMultiPartBlocks = 'Yes'
let g:EnhCommentifyPretty = 'Yes'
let g:EnhCommentifyRespectIndent = 'Yes'
let g:EnhCommentifyUseBlockIndent = 'Yes'

você pode comentar / descomentar as linhas (selecionadas) com ', c'

Benedikt Waldvogel
fonte
3
Você também pode usar Nerd Commenter em vim.org/scripts/script.php?script_id=1218
Nathan Fellman
1

Marque a área a ser comentada como um bloco visual ( <C-V)

e fazer c#<ESC>p

  1. caltere-o para "#"
  2. ponha de volta

Se você fizer isso com frequência, defina um atalho (exemplo \q) em seu arquivo .vimrc

:vmap \q c#<ESC>p
JJoao
fonte
1

Caso a seleção de várias linhas de alguém seja realmente um parágrafo, não há necessidade de selecionar manualmente as linhas. O vim pode fazer isso por você:

  1. vip: selecione e marque o parágrafo inteiro
  2. shift-i: inserir texto no início da linha
  3. escape: sai do modo de inserção / entra no modo normal [início da linha ainda selecionado]
  4. escape: desmarcar o início da linha
O invisível
fonte
0

Para inserir "ABC" no início de cada linha:

1) Vá para o modo de comando

2):% norma I ABC

Mac
fonte
Isso adiciona o texto à esquerda do primeiro caractere não espaço na linha.
Kingsley