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

4 minutos de lectura

avatar de usuario
Rishabh Manocha

Me preguntaba si había algún mapeo de teclas en Vim que me permitiera sangrar ciertas líneas de código (ya sea que esas líneas hayan sido seleccionadas en modo visual o norte líneas arriba/abajo de la posición actual del cursor).

Así que 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 """ por comentar las líneas relevantes. Idealmente, también me gustaría el mismo mapeo de teclas para descomentar las líneas si las líneas dadas han sido comentadas.

  • No hay necesidad de reinventar la rueda, hay un complemento: tComentario para usted, que admite (des) código de comentarios para varios idiomas.

    – Maullar

    12 de febrero de 2015 a las 14:41

avatar de usuario
teosp

Paso 1: Ve a la primera columna de la primera línea que quieras comentar.

Estado inicial

Paso 2: Prensa: Control+v y seleccione las líneas que desea comentar:

Seleccionar líneas

Paso 3: CambioI#espacio (Ingrese al modo Insertar a la izquierda, escriba 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

5“>

  • 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 Manoja

    1 de abril de 2010 a las 16:14

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

    – teóspo

    1 de abril de 2010 a las 16:18

  • Debe recordar que Shift-I significa “insertar en el primer lugar que no esté en blanco en la línea”, por lo que no se puede usar para eliminar. Haciendo una selección visual con Ctrl-V marca los caracteres a modificar, luego “x” borra un carácter en el área seleccionada, terminando borrando los caracteres ‘#’. Consulte “:h I” y “:h CTRL-V” en vim para obtener más información.

    – el hombre de hojalata

    2 de abril de 2010 a las 9:39


  • @Samaursa Ctrl-V probablemente no funcione en Windows. Pruebe Ctrl-Q en su lugar.

    – AZ.

    10 de abril de 2012 a las 22:57

  • 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 hacia la derecha) para resaltar un ancho de 2 caracteres (presione una vez por columna para resaltar) y luego presione d para eliminar el texto resaltado.

    – piensa en masa

    26 de agosto de 2014 a las 18:46

unidireccional manualmente

:set number
:10,12s/^/#

  • aunque como los quitas?

    –Charlie Parker

    5 de diciembre de 2013 a las 22:30

  • @CharlieParker: :10,12s/^#//

    – bstpierre

    17 dic 2013 a las 14:40

  • Pulgares arriba para la respuesta ex (vieja escuela 🙂

    – mlv

    03/06/2015 a las 16:00

avatar de usuario
fechado

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.

  • ¡Lo simple es genial! ¡Gracias!

    – I159

    20 de febrero de 2014 a las 9:50

  • @architectonic no tiene efecto a menos que esté en modo visual, y ‘#’ no está vinculado en modo visual vimdoc.sourceforge.net/htmldoc/visual.html#visual-operators

    – fechado

    13 de diciembre de 2015 a las 5:16

  • He modificado un poco: Ctrl + k para comentar “vnoremap :s#^#\##:noh” > Ctrl + u para descomentar: “vnoremap :s#^\###:noh

    – Pradip Das

    21 de marzo de 2016 a las 10:15


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

    – fechado

    22 de septiembre de 2016 a las 16:06

  • @JonathanHartley, sinceramente, creo que solo seguí un patrón sin pensarlo. Ahora me sorprende que # vs / no haya aparecido antes. Cambié la respuesta basada en el sentido común. ¡Gracias!

    – fechado

    28/09/2016 a las 20:30

avatar de usuario
usuario2437225

Resalta tu bloque con: CambioV

Comenta el bloque seleccionado con: :norm i# (i minúscula)

Para descomentar, resalte su bloque nuevamente y elimine el comentario con: :norm ^x

los :norm El comando realiza una acción para cada línea seleccionada. Al comentar se insertará un # al comienzo de cada línea, y al quitar el comentario se eliminará #.

Por lo general, elimino un bloqueo visual (<C-V>), luego busque y reemplace 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/^#//

avatar de usuario
Geoff Reedy

Hay algunos buenos complementos para ayudar a comentar / descomentar líneas. Por ejemplo El comentarista NERD.

avatar de usuario
lukas cenovsky

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 accesos directos conservan la posición del cursor y los comentarios siempre que comiencen con # (hay espacio después de #). Por ejemplo:

# variable x
x = 0

Después de comentar:

# variable x
#x = 0

Después de descomentar:

# variable x
x = 0

  • Bien, pero creo que sería mejor usar el más simple s/^/#/ expresión regular Prefiero que el carácter de comentario aparezca al principio de la línea… pero mucho más importante, los ‘comentarios de comentarios’ son realmente importantes. yo tambien dejaria el au BufEnter *.pyya que # los comentarios son lo suficientemente generales como para que los comandos se utilicen en todos los búfer de forma predeterminada.

    – travc

    11 de octubre de 2014 a las 12:09


¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad