Tengo un archivo de código Ruby abierto en vi, hay líneas comentadas con #
:
class Search < ActiveRecord::Migration
def self.up
# create_table :searches do |t|
# t.integer :user_id
# t.string :name
# t.string :all_of
# t.string :any_of
# t.string :none_of
# t.string :exact_phrase
#
# t.timestamps
# end
end
def self.down
# drop_table :searches
end
end
Digamos que quiero descomentar todas las líneas en la primera def ... end
sección. ¿Cuál es una manera eficiente de hacer eso en Vim?
En general, estoy buscando una manera fácil y fluida de comentar y descomentar líneas. Aquí estoy tratando con el código Ruby, pero podría ser JavaScript ( //
) o Haml ( -#
).
Respuestas:
Yo uso el script NERD Commenter . Le permite comentar, descomentar o alternar fácilmente los comentarios en su código.
Como se menciona en los comentarios :
fuente
=begin
y=end
para comentar varias líneas en lugar de etiquetas hash.Para esas tareas que uso la mayor parte del tiempo selección del bloque de .
Coloque el cursor sobre el primer
#
carácter, presione CtrlV(o CtrlQpara gVim), baje hasta la última línea comentada y presionex , que eliminará todos los#
caracteres verticalmente.Para comentar un bloque de texto es casi lo mismo:
VISUAL BLOCK
modo.INSERT
modo y luego presione# . Esto agregará un hash a la primera línea.#
carácter en todas las demás líneas seleccionadas.Para la versión simplificada de vim que se entrega con debian / ubuntu de forma predeterminada, escriba
: s/^/#
el tercer paso en su lugar (cualquier resaltado restante del primer carácter de cada línea se puede eliminar con:nohl
).Aquí hay dos pequeñas grabaciones de pantalla para referencia visual.
Comentario:
Comentario:
fuente
n
(donde n es num líneas - 1), j,n
(donde n num número de longitud de la secuencia de caracteres de comentario - 1), l, x.Para comentar bloques en vim:
%
Para descomentar bloques en vim:
Si desea seleccionar varios caracteres, use uno o combine estos métodos:
fuente
A veces me envuelven en una caja remota donde mis complementos y .vimrc no pueden ayudarme, o a veces NerdCommenter se equivoca (por ejemplo, JavaScript incrustado en HTML).
En estos casos, una alternativa de baja tecnología es el
norm
comando incorporado , que solo ejecuta cualquier comando vim arbitrario en cada línea en su rango especificado. Por ejemplo:Comentando con
#
:Esto inserta "#" al comienzo de cada línea. Tenga en cuenta que cuando escribe: el rango se completará, por lo que realmente se verá como
:'<,'>norm i#
Sin comentarios
#
:Esto elimina el primer carácter de cada línea. Si hubiera usado un comentario de 2 caracteres como // entonces simplemente lo haría
:norm xx
para eliminar ambos caracteres.Si los comentarios están sangrados como en la pregunta del OP, puede anclar su eliminación de esta manera:
lo que significa "ir al primer carácter que no sea espacio, luego eliminar un carácter". Tenga en cuenta que, a diferencia de la selección de bloque, esta técnica funciona incluso si los comentarios tienen sangría desigual.
Nota : desde
norm
que literalmente solo se ejecutan comandos vim regulares, no está limitado a comentarios, también puede realizar algunas modificaciones complejas en cada línea. Si necesita el carácter de escape como parte de su secuencia de comandos, escriba ctrl-v y luego presione la tecla de escape (o incluso más fácil, simplemente grabe una macro rápida y luego use la norma para ejecutar esa macro en cada línea).Nota 2 : Por supuesto, también puede agregar una asignación si se encuentra usando
norm
mucho. Por ejemplo, poner la siguiente línea en ~ / .vimrc le permite escribir enctrl-n
lugar de:norm
después de hacer su selección visualNota 3 : Vim Bare-bones a veces no tiene el
norm
comando compilado, así que asegúrese de usar la versión reforzada, es decir, típicamente / usr / bin / vim, no / bin / vi(Gracias a @Manbroski y @rakslice por las mejoras incorporadas en esta respuesta)
fuente
:norm ^x
. Este método en general tiene la ventaja de trabajar con selecciones de región (por ejemplovi{
, seleccionará dentro de llaves). Tales selectores de objetos de texto no funcionan conVisual Block
./bin/vi
es vim 7.2, pero es una construcción diferente/usr/bin/vim
y tiene características como esta desactivadas.vip
para seleccionar un párrafo completo.Tengo lo siguiente en mi
.vimrc
:Ahora puede escribir
,cc
para comentar una línea y,cu
descomentar una línea (funciona tanto en modo normal como visual).(Lo robé de algún sitio web hace muchos años, así que ya no puedo explicar completamente cómo funciona :). Hay un comentario donde se explica).
fuente
Especifique qué líneas comentar en vim:
Revelar los números de línea:
entonces
o esto:
fuente
:%s/^/#/g
comentará todas las líneas? Me preguntaba el signo de porcentaje%
va{
o convar
ruby.Así es como lo hago:
Vaya al primer carácter en la primera línea que desea comentar.
Hit Ctrl+ qen gVim o Ctrl+ ven VIM, y luego ir hacia abajo para seleccionar el primer carácter en las líneas a comentar.
Luego presione cy agregue el carácter de comentario.
Descomentar funciona de la misma manera, simplemente escriba un espacio en lugar del carácter de comentario.
fuente
c
también elimina el primer personaje. La respuesta de CMS es correcta, es decir, presionar yI
luego escribir los caracteres de comentario y luegoEsc
(esto está en Windows vim)ESC
dos veces después de presionarc
y eso debería hacer el trucoSe me ocurrió una simple adición a mi archivo .vimrc que funciona bastante bien y se puede extender fácilmente. Simplemente agregue un nuevo tipo de archivo al comment_map y su líder de comentarios.
Agregué un mapeo a los modos normal y visual, pero puedes reasignarlo a lo que quieras. Prefiero solo tener una función de estilo 'alternar'. Uno lleva múltiples mapeos, etc.
Nota:
No utilizo devoluciones de llamada ni enlaces en los tipos / carga de archivos, porque encuentro que ralentizan el inicio de Vim más que la
.vimrc
función / mapa estático, pero esa es solo mi preferencia. También he tratado de mantenerlo simple y eficiente. Si utiliza los comandos automáticos, debe asegurarse de colocarlos en un grupo de comandos automáticos o, de lo contrario, las devoluciones de llamada se agregarán al tipo de archivo varias veces por archivo cargado y causarán una gran degradación del rendimiento.fuente
<leader><Space>
declaración en la parte inferior?\zs
y\ze
truco regex, el código se hizo un poco más pequeño. puedes verlo aquíCambiar comentarios
Si todo lo que necesita es alternar comentarios , prefiero ir con commentary.vim por tpope .
Instalación
Patógeno:
vim-plug:
Paquete:
Personalización adicional
Agregue esto a su archivo .vimrc:
noremap <leader>/ :Commentary<cr>
Ahora puede alternar comentarios presionando
Leader
+/
, al igual que Sublime y Atom.fuente
Use Control-V para seleccionar rectángulos de texto: vaya al primer
#
carácter, escriba Ctrl+ V, muévase a la derecha una vez y luego hacia abajo, hasta el final de los comentarios. Ahora escribax
: está eliminando todos los#
caracteres seguidos de un espacio.fuente
Aquí hay una sección de mi
.vimrc
:En modo normal y visual, esto me permite presionar ,icpara insertar comentarios y ,rceliminar comentarios.
fuente
.vimrc
.map
cubre los modos normales y visuales, por lo que no necesita lasvmap
líneasafter/ftplugin/ruby.vim
.<leader>ic
y<leader>rc
Yo uso vim 7.4 y esto funciona para mí.
Asumiendo que estamos comentando / descomentando 3 líneas.
Comentar:
si la línea no tiene tabulación / espacio al principio:
ctrl + V
entonces,jjj
luego,shift + I (cappital i)
luego//
,esc esc
si la línea tiene tabulación / espacio al principio, aún puede hacer lo anterior o cambiar por
c
:ctrl + V
luegojjj
,c
luego,//
entoncesesc esc
Para descomentar:
si las líneas no tienen tabulación / espacio al principio:
ctrl + V
entoncesjjj
,ll (lower cap L)
luegoc
si las líneas tienen pestaña / espacio al principio, luego un espacio de una y
esc
ctrl + V
luegojjj
a continuación,ll (lower cap L)
a continuación,c
a continuación,space
a continuación,esc
fuente
Me gusta usar el complemento tcomment: http://www.vim.org/scripts/script.php?script_id=1173
He asignado gc y gcc para comentar una línea o un bloque de código resaltado. Detecta el tipo de archivo y funciona realmente bien.
fuente
Con 30 respuestas por delante, intentaré dar una solución aún más fácil: inserte un
#
al principio de la línea. Luego baja una línea y presiona dot (.
). Para repetir, noj
,.
,j
,.
, etc ... Para uncomment, quita un#
(usted puede golpearx
sobre el#
), y hacer el uso de reversak
,.
etc ...fuente
I#<Esc>j
en el búfer, por ejemplo,c
y luego hacer10@c
, o cualquier número de líneas que le convenga.Cómo descomentar las siguientes tres líneas en vi:
Coloque el cursor sobre el
#
símbolo superior izquierdo y presione CtrlV. Esto te pone en modo de bloqueo visual. Presione la flecha hacia abajo o Jtres veces para seleccionar las tres líneas. Luego presione D. Todos los comentarios desaparecen. Para deshacer, presione U.Cómo comentar las siguientes tres líneas en vi:
Coloque el cursor sobre el carácter superior izquierdo, presione CtrlV. Esto te pone en modo de bloqueo visual. Presione ↓o Jtres veces para seleccionar las tres líneas. Entonces presione:
I//Esc
Esa es una mayúscula I, // y Escape.
Cuando presiona ESC, todas las líneas seleccionadas obtendrán el símbolo de comentario que especificó.
fuente
Sí, ya hay 33 respuestas (en su mayoría repetitivas) a esta pregunta.
Aquí hay otro enfoque sobre cómo comentar líneas en Vim: movimientos . La idea básica es comentar o descomentar líneas usando el mismo método que tirar de un párrafo escribiendo
yip
o eliminando 2 líneas escribiendodj
.Este enfoque te permitirá hacer cosas como:
ccj
comentar las siguientes 2 líneas ycuk
descomentarlas;cci{
comentar un bloqueo ycui{
descomentarlo;ccip
comentar un párrafo completo ycuip
descomentarlo.ccG
comentar todo hasta la última línea ycugg
descomentar todo hasta la primera línea.Todo lo que necesita son 2 funciones que operan sobre movimientos y 2 asignaciones para cada función. Primero, las asignaciones:
(Consulte el manual sobre el
g@
operador y eloperatorfunc
variable).Y ahora las funciones:
Modifique las expresiones regulares anteriores para adaptarse a su gusto en cuanto a dónde
#
debería estar:fuente
Si ya conoce los números de línea, entonces
n,ms/# //
funcionaría.fuente
Marco la primera y la última línea (ma y mb), y luego hago: 'a', bs / ^ # //
fuente
Yo uso EnhancedCommentify . Comenta todo lo que necesitaba (lenguajes de programación, scripts, archivos de configuración). Lo uso con enlaces de modo visual. Simplemente seleccione el texto que desea comentar y presione co / cc / cd.
fuente
Combiné la respuesta de Phil y jqno e hice comentarios alternos con espacios:
fuente
Existe este complemento que cambia la vida
tpope
llamadovim-commentary
https://github.com/tpope/vim-commentary
Este complemento proporciona :
Uso :
:<,'>
:<,'>Commentary
y presione Enter.fuente
vim-commentary
(como todos los complementos de tpope) tiene la ventaja de ser idiota vim.gc
= "ir a comentar",gcap
= "ir a comentar un párrafo", etc.Esta respuesta es más útil si no puede instalar complementos pero aún desea que sus caracteres de comentario sigan los niveles de sangría existentes.
Esta respuesta está aquí a 1) muestra el código correcto para pegar en una
.vimrc
de conseguirvim 7.4+
hacer el bloque de comentar / descomentar manteniendo nivel de sangría con 1 acceso directo en el modo visual y 2) para explicarlo. Aquí está el código:Cómo funciona:
let b:commentChar='//'
: Esto crea una variable en vim. elb
aquí se refiere al alcance, que en este caso está contenido en el búfer, es decir, el archivo abierto actualmente. Sus caracteres de comentario son cadenas y deben estar entre comillas, las comillas no son parte de lo que se sustituirá al alternar comentarios.autocmd BufNewFile,BufReadPost *...
: Los comandos automáticos se disparan en diferentes cosas, en este caso, se disparan cuando un nuevo archivo o el archivo de lectura termina con una cierta extensión. Una vez activado, ejecute el siguiente comando, que nos permite cambiar el tipocommentChar
de archivo dependiendo. Hay otras formas de hacer esto, pero son más confusas para los novatos (como yo).function! Docomment()
: Las funciones se declaran comenzandofunction
y terminando conendfunction
. Las funciones deben comenzar con una capital. los!
asegura que esta función sobrescribe los anteriores funciones definidas comoDocomment()
con esta versión deDocomment()
. Sin el!
, tuve errores, pero eso podría deberse a que estaba definiendo nuevas funciones a través de la línea de comando vim.execute '''<,''>s/^\s*/&'.escape(b:commentChar, '\/').' /e'
: Ejecutar llama a un comando. En este caso, estamos ejecutandosubstitute
, que puede tomar un rango (por defecto, esta es la línea actual), como%
para todo el búfer o'<,'>
para la sección resaltada.^\s*
es regex para que coincida con el inicio de una línea seguida de cualquier cantidad de espacio en blanco, que luego se agrega a (debido a&
). El.
que aquí se utiliza para la concatenación de cadenas, ya queescape()
no se puede ajustar entre comillas.escape()
le permite escapar de caracterescommentChar
que coinciden con los argumentos (en este caso,\
y/
) al anteponerlos con un\
. Después de esto, nos concatenamos nuevamente con el final de nuestrosubstitute
cadena, que tiene ele
bandera. Esta bandera nos permite fallar en silencio, lo que significa que si no encontramos una coincidencia en una línea determinada, no gritaremos al respecto. En general, esta línea nos permite poner un carácter de comentario seguido de un espacio justo antes del primer texto, lo que significa que mantenemos nuestro nivel de sangría.execute '''<,''>s/\v(^\s*)'.escape(b:commentChar, '\/').'\v\s*/\1/e'
: Esto es similar a nuestro último gran comando largo. Único a este, tenemos\v
, lo que asegura que no tenemos que escapar de nuestro()
, y1
, que se refiere al grupo que hicimos con nuestro()
. Básicamente, estamos haciendo coincidir una línea que comienza con cualquier cantidad de espacio en blanco y luego nuestro carácter de comentario seguido de cualquier cantidad de espacio en blanco, y solo mantenemos el primer conjunto de espacios en blanco. Nuevamente,e
dejemos de fallar en silencio si no tenemos un carácter de comentario en esa línea.let l:line=getpos("'<")[1]
: establece una variable muy similar a lo que hicimos con nuestro carácter de comentario, pero sel
refiere al ámbito local (local para esta función).getpos()
obtiene la posición de, en este caso, el inicio de nuestro resaltado, y[1]
significa que solo nos importa el número de línea, no otras cosas como el número de columna.if match(getline(l:line), '^\s*'.b:commentChar)>-1
: ya sabes cómoif
funciona.match()
verifica si lo primero contiene lo segundo, por lo que tomamos la línea en la que comenzamos a resaltar y verificamos si comienza con un espacio en blanco seguido de nuestro carácter de comentario.match()
devuelve el índice donde esto es cierto, y-1
si no se encontraron coincidencias. Comoif
evalúa todos los números distintos de cero para que sean verdaderos, tenemos que comparar nuestra salida para ver si es mayor que -1. La comparación envim
devuelve 0 si es falso y 1 si es verdadero, que es lo queif
quiere ver para evaluar correctamente.vnoremap <silent> <C-r> :<C-u>call Comment()<cr><cr>
:vnoremap
significa asignar el siguiente comando en modo visual, pero no asignarlo de forma recursiva (es decir, no cambiar ningún otro comando que pueda usarse de otras maneras). Básicamente, si eres un novato vim, siempre úsalonoremap
para asegurarte de no romper cosas.<silent>
significa "No quiero tus palabras, solo tus acciones" y le dice que no imprima nada en la línea de comando.<C-r>
es lo que estamos asignando, que es ctrl + r en este caso (tenga en cuenta que todavía puede usar Cr normalmente para "rehacer" en modo normal con esta asignación).C-u
es un poco confuso, pero básicamente se asegura de que no pierdas el rastro de tu resaltado visual (según esta respuesta , tu comando comienza con'<,'>
lo que queremos).call
aquí solo le dice a vim que ejecute la función que nombramos, y<cr>
refiere aenter
presionar el botón.call function()
en la línea de comando, y tenemos que presionarlo nuevamente para que nuestros sustitutos pasen por todo el camino (no estoy seguro de por qué, pero lo que sea).De todos modos, espero que esto ayude. Esto tomará todo lo resaltado con
v
,V
oC-v
, verifique si la primera línea está comentada, en caso afirmativo, intente descomentar todas las líneas resaltadas, y si no, agregue una capa adicional de caracteres de comentario a cada línea. Este es mi comportamiento deseado; No solo quería que cambiara si cada línea en el bloque estaba comentada o no, por lo que funciona perfectamente para mí después de hacer múltiples preguntas sobre el tema.fuente
Uso el plugin vim-commentary de Tim Pope .
fuente
Puede usar vim-commentary de tpope ( https://github.com/tpope/vim-commentary ) puede usarlo de la siguiente manera:
Ingrese al modo visual presionando
Entonces presione
Ahora todo lo que tiene que hacer con la selección es ingresar teclas:
Esto comentará toda la selección, para descomentar las teclas de repetición:
fuente
Aquí hay una línea básica basada en lo
C-v
seguido porI
método descrito anteriormente.Este comando (
:Comment
) agrega una cadena elegida al comienzo de cualquier línea seleccionada.Agregue esta línea a su
.vimrc
para crear un comando que acepte un solo argumento y coloque el argumento al comienzo de cada línea en la selección actual.Por ejemplo, si se selecciona el siguiente texto:
y ejecutas esto:
:Comment //
el resultado será:fuente
Comenzando con las ideas en las respuestas aquí, comencé mi propia función de comentarios. Activa y desactiva los comentarios. Puede manejar cosas como
//print('blue'); //this thing is blue
y solo alterna el primer comentario. Además, agrega comentarios y un solo espacio justo donde está el primer espacio no en blanco y no al comienzo de la línea. Además, no copia innecesariamente los espacios en blanco, sino que usa los zooms (: h \ zs para obtener ayuda) para evitar este trabajo adicional, al comentar y la línea sangrada. Espero que ayude a algunos minimalistas. Las sugerencias son bienvenidas.fuente
Yo uso comments.vim de Jasmeet Singh Anand (encontrado en vim.org),
Funciona con C, C ++, Java, PHP [2345], proc, CSS, HTML, htm, XML, XHTML, vim, vimrc, SQL, sh, ksh, csh, Perl, tex, fortran, ml, caml, ocaml, vhdl, haskel y archivos normales
Comenta y descomenta líneas en diferentes archivos fuente tanto en modo normal como visual
Uso:
fuente
El método más rápido e intuitivo de todos es reasignar
)
para comentarios de líneas, y luego(
para hacer comentarios sin comentarios. Pruébalo y no volverás.En Ruby o Bash , con sangría de 2 espacios:
En C / C ++ o PHP , con sangrías de 4 espacios:
Lo malo es que pierdes
(
y)
mueves las oraciones (perodas
puedes completarlas), y ocasionalmente recurres a seleccionar y reemplazar oCtrlV para manejar secciones largas. Pero eso es bastante raro.Y para el estilo C, los comentarios largos se manejan mejor con:
... Que combina bien con el uso
V[move]gq
para rehacer el ajuste de palabras.fuente
Este fragmento simple es de mi .vimrc:
Es para // - Comentarios, pero puedes adaptarlo fácilmente para otros personajes. Puede usar autocmd para establecer un líder como sugirió jqno.
Esta es una forma muy simple y eficiente de trabajar con rangos y modo visual de forma natural.
fuente
Me gusta
/* ... */
(comentarios de C ansi), así que aquí está mi truco para ti. Puede adaptarlo para usarlo en diferentes casos, por supuesto.Comenta con / * ... * /
Seleccione el texto (vaya al comienzo, comience el bloque visual, salte con
}
):Escriba el comando que se aplicará en la selección.
El comando se verá así:
:'<,'>norm i /* ^[$a */
Ver (i *) para más detalles.
Descomenta el / * ... * /
Seleccione el texto (como antes, u otra forma que desee):
Escriba el comando que se aplicará en la selección.
El comando se verá así:
:'<,'>norm :s-\s*/\*\s*-^M$bbld$
Ver (ii *) para más detalles.
Resultado
El efecto es comentarios línea por línea:
Se convierte (y viceversa):
Es mejor guardarlo como algo
map
o@reg
en tu.vimrc
, porque es mucho para escribir. Si prefiere una sola/*
y*/
que todo el bloque, utilice:Comenta con un solo / * * / todo el bloque
Guárdelo en un registro grabando con, digamos
qc
, luego, al comienzo de un párrafo para comentar:y no te olvides de
q
nuevo, para terminar el disco.Ver (iii *) para más detalles.
Descomentar un solo / * * / de un bloque
Guardar en el registro, por ejemplo,
@u
. Coloque el cursor en cualquier lugar dentro del bloque y:Guarde el registro terminando
q
comando.Ver (iv *) para más detalles.
Resultado
El efecto es un solo comentario para varias líneas:
Se convierte (y viceversa):
Explicaciones
(i *) Funciona mediante el uso
norm
que aplica el mismo comando repetidamente en cada línea seleccionada. El comando simplemente inserta un/*
, encuentra el final de esa línea y termina insertando un*/
(ii *) También se utiliza
norm
para repetir la búsqueda / reemplazo en cada línea. Buscarspaces /* spaces
y reemplazar por nada. Después de eso, encuentra el final de la línea, retrocede dos palabras, escribe una letra, borra hasta el final.(iii *) Selecciona el párrafo por
v}
, elimínelo, inserte un comentario abierto y cercano, muévalo a la mitad y pegue el bloque eliminado.(iv *) En cualquier lugar en el medio, encuentra hacia atrás a
/*
, lo elimina; encuentra hacia adelante a*/
, lo elimina.fuente