Cómo insertar texto al comienzo de una selección de varias líneas en vi / Vim


423

En Vim , ¿cómo inserto caracteres al comienzo de cada línea en una selección?

Por ejemplo, quiero comentar un bloque de código al anteponer //al comienzo de cada línea, suponiendo que el sistema de comentarios de mi idioma no permita comentarios de bloque como /* */. ¿Cómo haría esto?

Respuestas:


748
  • Presione Escpara ingresar al 'modo de comando'
  • Use Ctrl+ Vpara ingresar al modo de bloqueo visual
  • Mueva Up/ Downpara seleccionar las columnas de texto en las líneas que desea comentar.
  • Luego presiona Shift+ iy escribe el texto que deseas insertar.
  • Luego presione Esc, espere 1 segundo y el texto insertado aparecerá en cada línea.

Para obtener más información y leer, consulte " Insertar texto en varias líneas " en el Wiki de Vim Tips.


66
El único inconveniente con esto es que parece que Ctrl + V se anula en GVIM.
Jordan Parmer el

14
No es para mí (en Linux) no lo es
pixelbeat

23
Puede usar Ctrl-Q como reemplazo en gVim (como: ayuda Ctrl-V explica) pero necesita usar hjkl para navegar en este modo en lugar de las teclas de flecha
Gareth

99
Si su ctrl-v se anula en Windows gvim, debe editar el vimrc global para dejar de incluir mswin.vim.
graywh

18
¿Alguna idea de por qué esto no haría nada después de presionar esc? Esperé como 10 segundos para que algo sucediera en menos de cien líneas. No importa, estaba presionando Shift + vno CTRL + v. @ vkaul11 Probablemente lo mismo que hiciste jajaja
Tek

186

Esto reemplaza el comienzo de cada línea con "//":

:%s!^!//!

Esto reemplaza el comienzo de cada línea seleccionada (use el modo visual para seleccionar) con "//":

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

Tengagv en cuenta que (en modo normal) restaura la última selección visual, esto es útil de vez en cuando.


3
¡Gracias! Tiene sentido total. Y eliminar el texto es el siguiente: '<,'> s! ^ // !!
Jordan Parmer

44
¿Cuál es el significado de los signos de exclamación en la respuesta anterior? (:% s! ^! //!)
Henrik K

19
@HKK, normalmente se usa el carácter de barra diagonal / como delimitador para el comando de búsqueda y reemplazo. En este caso, estamos insertando una barra diagonal como parte de la búsqueda y reemplazo, por lo que usamos un delimitador alternativo, a saber, el carácter de exclamación.
cyber-monk

+1 Esto funciona en VsVim donde (Ctrl + V) (Shiift + I) Esc no lo hace.
Seth Reno

44
+1, no tenía idea de que podría usar otra cosa como delimitador de expresiones regulares (aquí estaba usando /y teniendo que escapar de la entrada //en :s/^/\/\/lugar de escribir :s!^!//)
Hashbrown

83

El patrón general para buscar y reemplazar es:

:s/search/replace/

Reemplaza la primera aparición de 'buscar' con 'reemplazar' para la línea actual

:s/search/replace/g

Reemplaza todas las apariciones de 'buscar' con 'reemplazar' para la línea actual, 'g' es la abreviatura de 'global'

Este comando reemplazará cada aparición de 'buscar' con 'reemplazar' solo para la línea actual. El% se utiliza para buscar en todo el archivo. Para confirmar cada reemplazo interactivamente agregue una 'c' para confirmar:

:%s/search/replace/c

La confirmación interactiva reemplaza 'buscar' por 'reemplazar' para todo el archivo

En lugar del carácter%, puede usar un rango de número de línea (tenga en cuenta que el carácter '^' es un carácter de búsqueda especial para el inicio de la línea) :

:14,20s/^/#/

Inserta un carácter '#' al comienzo de las líneas 14-20

Si desea utilizar otro carácter de comentario (como //), cambie su delimitador de comando:

:14,20s!^!//!

Inserta una secuencia de caracteres '//' al comienzo de las líneas 14-20

O siempre puedes escapar de los // caracteres como:

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

Inserta una secuencia de caracteres '//' al comienzo de las líneas 14-20

Si no ve números de línea en su editor, simplemente escriba lo siguiente

:set nu

para eliminar el comienzo #: en lugar de: 14,20s / # / ^ /, debe usar: 14,20s / # //
cn1h

1
@ cn1h Creo que esto también reemplazará a otros #en la línea. Deberías usar ^#en su lugar.
ankush981

Gracias por explicar lo básico. Es bueno saber por qué sucede algo.
didierCH

38

Otra forma que podría ser más fácil para los recién llegados:

 some█
 code
 here

Coloque el cursor en la primera línea, p. Ej. Por

gg

y escriba lo siguiente para ingresar al modo de inserción y agregar su texto:

I / / Space

 // █some
 code
 here

Presione Escpara volver al modo de comando y use el dígrafo:

j . j .

 // some
 // code
 //█here

jes un comando de movimiento para bajar una línea y .repite el último comando de edición que realizó.


3
Eso es realmente simple :). Si tiene problemas, puede deberse a que está escribiendo una barra (el otro símbolo con su \) en |lugar de una mayúscula I. Pensé que era un |al principio.
cokedude

1
Si hago "5" elimina 5 caracteres de la misma línea. ¿Cómo hago para eliminar 5 caracteres a la vez de cada línea?
Rahul Prasad

1
@RahulPrasad Digamos que tiene 25 líneas, luego, comenzando en el frente de la primera línea, simplemente grabe 5xj en un registro y juegue ese registro 24 veces, por ejemplo: qa5xjq25 @ a Pero sería mejor si publicara esto como una pregunta real si no existe ya ...
ninegrid

26

Y otra forma más:

  • Ir al principio de una línea
  • ingrese al modo de bloqueo visual ( CTRL- v)
  • seleccione las líneas que desee (subir / bajar con j/ ko saltar a una línea con [línea] G)
  • prensa I(eso es capital i)
  • escriba los caracteres de comentario
  • prensa ESC

20

Esto agrega #al comienzo de cada línea:

:%s/^/#/

Y la gente dejará de quejarse de su falta de guiones de comentarios adecuados.


2
¿Qué sucede si desea agregar # en solo las líneas seleccionadas (o pocas)
Rahul Prasad

15

Si quieres ponerte súper elegante, pon esto en tu .vimrc:

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

Entonces, siempre que en el modo visual, que puede golpear \ca c omment del bloque y \ude u ncomment ella. Por supuesto, puede cambiar esas teclas de acceso directo a lo que sea.


¡Votado porque introdujo algo nuevo vmap!
ankush981

11

Otra forma más:

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

/^/es solo un patrón ficticio para que coincida con cada línea. normle permite ejecutar los comandos en modo normal que siguen. I//dice que ingrese el modo de inserción mientras salta el cursor al comienzo de la línea, luego inserte el siguiente texto (dos barras).

:g a menudo es útil para hacer algo complejo en varias líneas, donde es posible que desee saltar entre múltiples modos, eliminar o agregar líneas, mover el cursor, ejecutar un montón de macros, etc. Y puede decirle que opere solo en líneas que coincidir con un patrón.


1
en realidad el comando: g no es necesario. Esto hará:: '<,'> norma I //
Cyber ​​Oliveira

1
Y: s también es mejor usar en este caso.
graywh

Esta es la respuesta más útil.
Pacífica

3

Para comentar bloques de código, me gusta el complemento NERD Commenter .

Selecciona un texto:

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

Comentario:

,cc

Comentario:

,cu

O simplemente alterna el estado de comentario de una línea o bloque:

,c<space>

2

Puedo recomendar el complemento EnhCommentify .

p.ej. pon esto a tu 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'

luego puede comentar / descomentar las líneas (seleccionadas) con ', c'


3
También puede usar Nerd Commenter en vim.org/scripts/script.php?script_id=1218
Nathan Fellman

1

Marque el área a comentar como un bloque visual ( <C-V)

y hacer c#<ESC>p

  1. ccolgarlo a "#"
  2. ponerlo de nuevo

Si lo hace con frecuencia, defina un atajo (ejemplo \q) en su .vimrc

:vmap \q c#<ESC>p

1

En caso de que la selección de varias líneas de alguien sea realmente un párrafo, no hay necesidad de seleccionar manualmente las líneas. vim puede hacer eso por ti:

  1. vip: selecciona y marca todo el párrafo
  2. shift-i: insertar texto al comienzo de la línea
  3. escape: salga del modo de inserción / ingrese al modo normal [los inicios de línea aún están seleccionados]
  4. escape: deseleccionar comienzos de línea

0

Para insertar "ABC" al comienzo de cada línea:

1) Ir al modo de comando

2):% norma I ABC


Esto agrega el texto a la izquierda del primer carácter sin espacio en la línea.
Kingsley
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.