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


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 el primer 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 de Ruby, pero podría ser JavaScript (//) o Haml (-#)


835
2017-11-04 21:06


origen


Respuestas:


Yo uso el Script NERD Commenter. Le permite comentar, descomentar o alternar fácilmente comentarios en su código.

Como se menciona en el comentarios:

para cualquiera que esté confundido por el uso, el líder predeterminado es "\", por lo que 10 \ cc comentará diez líneas y 10 \ cu descomentará esas diez líneas


155
2017-11-04 21:33



Para esas tareas uso la mayor parte del tiempo selección de bloque.

Pon el cursor sobre la primera # personaje, prensa CtrlV (o CtrlQ para gVim), baje hasta la última línea comentada y presione X, eso borrará todo # personajes verticalmente

Para comentar un bloque de texto es casi lo mismo:

  1. Primero, ve a la primera línea que quieras comentar, presiona CtrlV. Esto pondrá al editor en el VISUAL BLOCK modo.
  2. Luego, use la tecla de flecha y seleccione hasta la última línea
  3. Ahora presiona Cambioyo, que pondrá al editor en INSERT modo y luego presione #. Esto agregará un hash a la primera línea.
  4. Entonces presione Esc (dale un segundo), e insertará un # carácter en todas las otras líneas seleccionadas.

Para la versión simplificada de vim enviada por defecto con debian / ubuntu, escriba : s/^/# en el tercer paso en cambio.


1734
2017-11-04 21:16



Para comentar los bloques en vim:

  • prensa Esc (para dejar la edición u otro modo)
  • golpear ctrl+v (modo de bloque visual)
  • use las teclas de flecha arriba / abajo para seleccionar las líneas que desea (no resaltará todo, ¡está bien!)
  • Cambio+yo (capital I)
  • inserte el texto que desea, es decir %
  • prensa EscEsc

Para descomentar bloques en vim:

  • prensa Esc (para dejar la edición u otro modo)
  • golpear ctrl+v (modo de bloque visual)
  • utilizar el / teclas de flecha para seleccionar las líneas para descomentar.

    Si desea seleccionar varios caracteres, use uno o combine estos métodos:

    • use las teclas de flecha izquierda / derecha para seleccionar más texto
    • para seleccionar fragmentos de uso de texto cambio + / Tecla de flecha
    • puede presionar repetidamente las teclas de borrar a continuación, como un botón de eliminación normal

  • prensa re o X para eliminar caracteres, repetidamente si es necesario

671
2018-03-23 15:54



A veces me bombardean en una caja remota donde mis complementos y .vimrc no pueden ayudarme, o a veces NerdCommenter se equivoca (por ejemplo, JavaScript incrustado dentro de html).

En estos casos, una alternativa de baja tecnología es la incorporada norm comando, que simplemente ejecuta cualquier comando vim arbitrario en cada línea en su rango especificado. Por ejemplo:

Comentando con  #:

1. visually select the text rows (using V as usual)
2. :norm i#

Esto inserta "#" al comienzo de cada línea. Tenga en cuenta que cuando escriba: el rango se completará, por lo que realmente se verá como :'<,'>norm i#

Descompuesto  #:

1. visually select the text as before (or type gv to re-select the previous selection)
2. :norm x

Esto borra el primer carácter de cada línea. Si hubiera usado un comentario de 2 caracteres como //, simplemente lo haría :norm xx para eliminar ambos caracteres.

Si los comentarios están sangrados como en la pregunta del OP, entonces puede anclar su eliminación de esta manera:

:norm ^x

lo que significa "ir al primer carácter no espacial, luego eliminar un personaje".

Nota: Ya que norm es, literalmente, solo ejecutar comandos vim regulares, no estás limitado solo a comentarios, podrías hacer algunas ediciones 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 Escape.

Nota 2: Por supuesto, también puedes agregar un mapeo si te encuentras usando norm mucho. Poner la siguiente línea en ~ / .vimrc te permite escribir ctrl-n en lugar de :norm después de hacer su selección visual

vnoremap <C-n> :norm

Nota 3: Vim bare-bones a veces no tiene la norm comando compilado en él, 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)


210
2018-04-14 14:44



Tengo lo siguiente en mi .vimrc:

" Commenting blocks of code.
autocmd FileType c,cpp,java,scala let b:comment_leader = '// '
autocmd FileType sh,ruby,python   let b:comment_leader = '# '
autocmd FileType conf,fstab       let b:comment_leader = '# '
autocmd FileType tex              let b:comment_leader = '% '
autocmd FileType mail             let b:comment_leader = '> '
autocmd FileType vim              let b:comment_leader = '" '
noremap <silent> ,cc :<C-B>silent <C-E>s/^/<C-R>=escape(b:comment_leader,'\/')<CR>/<CR>:nohlsearch<CR>
noremap <silent> ,cu :<C-B>silent <C-E>s/^\V<C-R>=escape(b:comment_leader,'\/')<CR>//e<CR>:nohlsearch<CR>

Ahora puedes escribir ,cc para comentar una línea y ,cu descomentar una línea (funciona tanto en modo normal como visual).

(Lo robé de un sitio web hace muchos años, así que no puedo explicar completamente cómo funciona :). Hay un comentario donde se explica)


102
2017-11-04 21:14



Especifique qué líneas comentar en vim:

Revelar los números de línea:

:set number

entonces

:5,17s/^/#/     this will comment out line 5-17

o esto:

:%s/^/#/        will comment out all lines in file

82
2017-11-05 18:07



Así es como lo hago:

  1. Ve al primer personaje en la primera línea que quieras comentar.

  2. Golpear Ctrl+q en GVIM o Ctrl+v en VIM, luego baja para seleccionar el primer personaje en las líneas para comentar.

  3. Entonces presione doy agrega el caracter de comentario.

Descomponer funciona de la misma manera, simplemente escriba un espacio en lugar del carácter de comentario.


47
2017-11-04 21:13



He creado una simple adición a mi archivo .vimrc que funciona bastante bien y se puede ampliar fácilmente. Simplemente agrega un nuevo tipo de archivo al comment_map y su líder de comentarios.

Agregué un mapeo a los modos normales y visuales, pero puedes reasignar a lo que quieras. Prefiero solo tener una función de estilo 'alternar'. Uno tiene múltiples mapeos, etc.

let s:comment_map = { 
    \   "c": '\/\/',
    \   "cpp": '\/\/',
    \   "go": '\/\/',
    \   "java": '\/\/',
    \   "javascript": '\/\/',
    \   "lua": '--',
    \   "scala": '\/\/',
    \   "php": '\/\/',
    \   "python": '#',
    \   "ruby": '#',
    \   "rust": '\/\/',
    \   "sh": '#',
    \   "desktop": '#',
    \   "fstab": '#',
    \   "conf": '#',
    \   "profile": '#',
    \   "bashrc": '#',
    \   "bash_profile": '#',
    \   "mail": '>',
    \   "eml": '>',
    \   "bat": 'REM',
    \   "ahk": ';',
    \   "vim": '"',
    \   "tex": '%',
    \ }

function! ToggleComment()
    if has_key(s:comment_map, &filetype)
        let comment_leader = s:comment_map[&filetype]
        if getline('.') =~ "^\\s*" . comment_leader . " " 
            " Uncomment the line
            execute "silent s/^\\(\\s*\\)" . comment_leader . " /\\1/"
        else 
            if getline('.') =~ "^\\s*" . comment_leader
                " Uncomment the line
                execute "silent s/^\\(\\s*\\)" . comment_leader . "/\\1/"
            else
                " Comment the line
                execute "silent s/^\\(\\s*\\)/\\1" . comment_leader . " /"
            end
        end
    else
        echo "No comment leader found for filetype"
    end
endfunction


nnoremap <leader><Space> :call ToggleComment()<cr>
vnoremap <leader><Space> :call ToggleComment()<cr>

Nota:

No utilizo ninguna devolución de llamada o gancho en los tipos de archivo / carga, porque encuentro que ralentizan el inicio de Vim más que el .vimrc función / mapa estático pero eso es solo mi preferencia. También traté de mantenerlo simple y eficiente. Si usa autocomandos, debe asegurarse de ponerlos en un grupo de autocomandos o, de lo contrario, las devoluciones de llamada se agregarán al tipo de archivo varias veces por archivo cargado y provocarán una gran degradación del rendimiento.


28
2018-06-04 20:24



Use Control-V para seleccionar rectángulos de texto: vaya a la primera #tipo de caracter Ctrl+V, mueva a la derecha una vez, y luego hacia abajo, hasta el final de los comentarios. Ahora escribe x: estás borrando todo # caracteres seguidos de un espacio


22
2017-11-04 21:11



Alternar comentarios

Si todo lo que necesitas es alternar comentarios Prefiero ir con comentario.vim por tpope.

enter image description here

Instalación

Patógeno:

cd ~/.vim/bundle
git clone git://github.com/tpope/vim-commentary.git

vim-plug:

Plug 'tpope/vim-commentary'

Vundle:

Plugin 'tpope/vim-commentary'

Mayor personalización

Agregue esto a su archivo .vimrc: noremap <leader>/ :Commentary<cr>

Ahora puede alternar comentarios presionando Leader+/, al igual que Sublime y Atom.


20
2017-10-21 03:07



Primero presione -> CtrlV

Presione la tecla de flecha hacia arriba o hacia abajo según sea necesario

Luego presione -> Cambioyo

Luego inserta comentario usando -> Cambio#

Esc


16
2017-10-23 06:01