Cómo comentar un bloque de código Python en Vim


186

Me preguntaba si había alguna asignación de teclas en Vim que me permitiera sangrar ciertas líneas de código (si esas líneas se han seleccionado en modo visual o n líneas por encima / debajo de la posición actual del cursor).

Básicamente, algo que convierte lo siguiente

def my_fun(x, y):
    return x + y

a

#def my_fun(x, y):
#    return x + y

Estoy de acuerdo con usar cualquiera #o """para comentar las líneas relevantes. Idealmente, también me gustaría que el mismo mapeo de teclas descomente las líneas si las líneas dadas han sido comentadas.


No es necesario reinventar la rueda, hay un complemento: tComment para usted, que admite el código de ( des ) comentarios para varios idiomas.
Miau

Respuestas:


411

Paso 1: vaya a la primera columna de la primera línea que desea comentar.

Estado inicial

Paso 2: Presione: Ctrl+ vy seleccione las líneas que desea comentar:

Seleccionar lineas

Paso 3: Shift - I#space(Ingrese el modo Insertar a la izquierda, escriba los caracteres para insertar. La selección desaparecerá, pero todas las líneas dentro de ella se modificarán después del Paso 4).

Comentario

Paso 4: Esc

<Esc>


44
Comentar las líneas de esta manera funciona muy bien. ¿Hay alguna forma de descomentar estas líneas? Shift-I # <ESC>no funcionó (tal vez lo estoy haciendo mal).
Rishabh Manocha

41
@ rishabh-manocha: use el bloque visual (Ctrl-V) para seleccionar todos los # agregados y escriba x para eliminarlos.
theosp 01 de

3
Debe recordar que Shift-I significa "insertar en la primera línea en blanco", por lo que no se puede usar para eliminar. Hacer una selección visual con Ctrl-V marca los caracteres a modificar, luego "x" borra un carácter en el área seleccionada, terminando con los caracteres '#'. Consulte ": h I" y ": h CTRL-V" en vim para obtener más información.
The Tin Man

55
@Samaursa Ctrl-V probablemente no funciona en Windows. Prueba Ctrl-Q en su lugar.
AZ.

1
Para eliminar 2 caracteres (si insertó '#'), ubique el cursor en la línea superior que desea modificar, presione ctrl-v para ingresar al modo de bloqueo visual, presione j (o flecha hacia abajo) para resaltar todas las líneas para modificar, presione l (o flecha derecha) para resaltar un ancho de 2 caracteres (presione una vez por columna para resaltar) y luego presione d para eliminar el texto resaltado.
thinkmassive


49

Puede agregar la siguiente asignación a su .vimrc

vnoremap <silent> # :s/^/#/<cr>:noh<cr>
vnoremap <silent> -# :s/^#//<cr>:noh<cr>

Resalta tu bloque con:

Shift+v

# para comentar tus líneas desde la primera columna.

-# para descomentar de la misma manera.


55
¡Simple es brillante! ¡Gracias!
I159

1
@architectonic no tiene efecto a menos que esté en modo visual, y '#' no está vinculado
actualizado el

1
He modificado un bit: Ctrl + k para comentario "vnoremap <silent> <Ck>: s # ^ # \ ## <cr>: noh <cr>"> Ctrl + u para comentar: "vnoremap <silent> <Cu >: s # ^ \ ### <cr>: noh <cr> "
Pradip Das

1
@JonathanHartley no tiene que usar '/' en este caso '#' es el delimitador. Entonces: s / ^ / # / y: s / ^ # // son las sustituciones equivalentes. Entonces reemplace el comienzo de la línea con '#' y reemplace '#' en la primera columna con ''. <cr>: noh <cr> simplemente borra la cadena de búsqueda para que no quede nada resaltado cuando haya terminado.
fechado el

1
@JonathanHartley honestamente, creo que acabo de seguir un patrón sin pensarlo. Ahora estoy sorprendido # vs / no apareció antes. Cambió la respuesta basada en el sentido común. ¡Gracias!
fechado el

26

Resalta tu bloque con: ShiftV

Comente el bloqueo seleccionado con: :norm i#(minúscula i)

Para descomentar, resalta tu bloqueo nuevamente y descomenta con: :norm ^x

El :normcomando realiza una acción para cada línea seleccionada. Al comentar se insertará un #al comienzo de cada línea, y sin comentar se eliminará #.


Con un Vim actualizado y una configuración simple, seleccionar líneas en modo visual (con Shift+v) y luego usar :norm i#solo cambia la primera línea seleccionada. Esto me funciona para comentar las líneas 389 a 391::389,391norm i #
mmell

22

Por lo general, elimino un bloque visual ( <C-V>), luego busco y reemplazo el primer carácter con:

:'<,'>s/^/#

(Al ingresar al modo de comando con un bloque visual seleccionado, automáticamente se coloca '<,'> en la línea de comando). Luego puedo descomentar el bloque barriendo el mismo bloque visual y:

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


9

Tengo las siguientes líneas en mi .vimrc:

" comment line, selection with Ctrl-N,Ctrl-N
au BufEnter *.py nnoremap  <C-N><C-N>    mn:s/^\(\s*\)#*\(.*\)/\1#\2/ge<CR>:noh<CR>`n
au BufEnter *.py inoremap  <C-N><C-N>    <C-O>mn<C-O>:s/^\(\s*\)#*\(.*\)/\1#\2/ge<CR><C-O>:noh<CR><C-O>`n
au BufEnter *.py vnoremap  <C-N><C-N>    mn:s/^\(\s*\)#*\(.*\)/\1#\2/ge<CR>:noh<CR>gv`n

" uncomment line, selection with Ctrl-N,N
au BufEnter *.py nnoremap  <C-N>n     mn:s/^\(\s*\)#\([^ ]\)/\1\2/ge<CR>:s/^#$//ge<CR>:noh<CR>`n
au BufEnter *.py inoremap  <C-N>n     <C-O>mn<C-O>:s/^\(\s*\)#\([^ ]\)/\1\2/ge<CR><C-O>:s/^#$//ge<CR><C-O>:noh<CR><C-O>`n
au BufEnter *.py vnoremap  <C-N>n     mn:s/^\(\s*\)#\([^ ]\)/\1\2/ge<CR>gv:s/#\n/\r/ge<CR>:noh<CR>gv`n

Los atajos conservan la posición del cursor y sus comentarios siempre que comiencen #(hay espacio después de #). Por ejemplo:

# variable x
x = 0

Después de comentar:

# variable x
#x = 0

Después de desencantar:

# variable x
x = 0

Bien, pero creo que sería mejor usar la expresión s/^/#/regular más simple . Prefiero que el comentario char ocurra al principio de la línea ... pero mucho más importante, 'comentar comentarios' es realmente bastante importante. También eliminaría el au BufEnter *.py, ya que los #comentarios son lo suficientemente generales como para que los comandos se usen en todos los búferes de forma predeterminada.
travc

5

Francamente, uso un complemento tcomment para ese enlace . Puede manejar casi todas las sintaxis. Define movimientos agradables, usarlo con algunos emparejadores de bloques de texto específicos para Python lo convierte en una herramienta poderosa.


5

NERDcommenter es un excelente complemento para comentar que detecta automáticamente varios tipos de archivos y sus caracteres de comentarios asociados. Ridículamente fácil de instalar con Pathogen .

Comenta con <leader>cc. No comentar con <leader>cu. Y alternar comentarios con <leader>c<space>.

(La <leader>clave predeterminada en vim es \)


3

Hay muchos complementos de comentarios para vim, algunos de los cuales son multilingües, no solo python. Si usa un administrador de complementos como Vundle , puede buscarlos (una vez que haya instalado Vundle) usando, por ejemplo:

:PluginSearch comment

Y obtendrá una ventana de resultados. Alternativamente, puede simplemente buscar vim-scripts para complementos de comentarios .


3

No se requieren complementos ni asignaciones. Pruebe el comando "norma" incorporado, que literalmente ejecuta todo lo que desee en cada línea seleccionada.

Añadir comentarios

1. shift V to visually select lines
2. :norm i#

Eliminar # comentarios

1. visually select region as before
2. :norm x

O si sus comentarios están sangrados, puede hacerlo :norm ^x

Tenga en cuenta que estos son simples comandos vim precedidos por ": norma" para ejecutarlos en cada línea.

Respuesta más detallada para usar el comando "norma" en una de las respuestas aquí

¿Cuál es una forma rápida de comentar / descomentar líneas en Vim?


1

Un complemento de peso ligero muy mínimo : vim-commentary.

gcccomentar una línea
gcgcpara descomentar. echa un vistazo a la página del complemento para más información.

v+k/jresalte el bloque y luego gcccomente ese bloque.


0

CtrlK para comentario (modo visual):

vnoremap <silent> <C-k> :s#^#\##<cr>:noh<cr>

CtrlU para descomentar (modo visual):

vnoremap <silent> <C-u> :s#^\###<cr>:noh<cr>
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.