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.

Rishabh Manocha
fuente
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>

theosp
fuente
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
72

unidireccional manualmente

:set number
:10,12s/^/#
ghostdog74
fuente
44
¿Cómo los eliminas?
Charlie Parker
15
@CharlieParker::10,12s/^#//
bstpierre
1
Aprobado por ex respuesta (old school :)
mlv
Esto no funciona para el código sangrado
Andrés Pérez-Albela H.
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.

anticuado
fuente
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á #.

usuario2437225
fuente
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/^#//

fuente
19

Hay algunos buenos complementos para ayudar a comentar / descomentar líneas. Por ejemplo, The NERD Commenter .

Geoff Reedy
fuente
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
Lukas Cenovsky
fuente
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.

Darek
fuente
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 \)

Abid H. Mujtaba
fuente
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 .

Pierz
fuente
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?

Magnus
fuente
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.

yantaq
fuente
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>
Pradip Das
fuente