Question Quel est un moyen rapide de commenter / décommenter les lignes dans Vim?


J'ai un fichier de code Ruby ouvert dans vi, il y a des lignes commentées avec #:

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

Dire que je veux décommenter toutes les lignes dans le premier def ... end section. Quel est un moyen efficace de le faire dans Vim?

En général, je cherche un moyen facile et fluide de commenter et de décommenter les lignes. Ici, j'ai affaire à du code Ruby, mais il pourrait s'agir de JavaScript (//) ou Haml (-#).


835
2017-11-04 21:06


origine


Réponses:


Je utilise l Script NERD Commenter. Il vous permet de facilement commenter, décommenter ou basculer les commentaires dans votre code.

Comme mentionné dans le commentaires:

pour toute personne qui est confuse par l'utilisation, le leader par défaut est "\", donc 10 \ cc commentera dix lignes et 10 \ cu va décommenter ces dix lignes


155
2017-11-04 21:33



Pour les tâches que j'utilise la plupart du temps bloquer la sélection.

Mettez votre curseur sur le premier # caractère, appuyez sur CtrlV (ou CtrlQ pour gVim), et descendez jusqu'à la dernière ligne commentée et appuyez sur X, cela va supprimer tous les # caractères verticalement.

Pour commenter un bloc de texte est presque le même:

  1. Tout d'abord, allez à la première ligne que vous voulez commenter, appuyez sur CtrlV. Cela mettra l'éditeur dans le VISUAL BLOCK mode.
  2. Ensuite, en utilisant la touche fléchée et sélectionnez jusqu'à la dernière ligne
  3. Maintenant appuyez sur Décalageje, ce qui mettra l'éditeur en INSERT mode, puis appuyez sur #. Cela va ajouter un hachage à la première ligne.
  4. Puis appuyez Esc (donnez-lui une seconde), et il va insérer un # caractère sur toutes les autres lignes sélectionnées.

Pour la version allégée de vim livré avec debian / ubuntu par défaut, tapez : s/^/# dans la troisième étape à la place.


1734
2017-11-04 21:16



Pour commenter les blocs dans vim:

  • presse Esc (pour quitter l'édition ou autre mode)
  • frappé ctrl+v (mode bloc visuel)
  • utilisez les flèches haut / bas pour sélectionner les lignes que vous voulez (ça ne va pas tout mettre en évidence - c'est OK!)
  • Décalage+je (capital I)
  • insérez le texte que vous voulez, c'est-à-dire %
  • presse EscEsc

Pour décommenter les blocs dans vim:

  • presse Esc (pour quitter l'édition ou autre mode)
  • frappé ctrl+v (mode bloc visuel)
  • Utilisez le / les touches fléchées pour sélectionner les lignes à décommenter.

    Si vous souhaitez sélectionner plusieurs caractères, utilisez-en un ou combinez ces méthodes:

    • utilisez les flèches gauche / droite pour sélectionner plus de texte
    • pour sélectionner des morceaux d'utilisation de texte décalage + / touche fléchée
    • vous pouvez appuyer plusieurs fois sur les touches de suppression ci-dessous, comme un bouton de suppression normal

  • presse  ou X pour supprimer des caractères, à plusieurs reprises si nécessaire

671
2018-03-23 15:54



Parfois, je suis shellé dans une boîte distante où mes plugins et .vimrc ne peuvent pas m'aider, ou parfois NerdCommenter se trompe (par exemple, JavaScript embarqué dans html).

Dans ces cas, une alternative low-tech est le built-in norm commande, qui exécute simplement des commandes vim arbitraires sur chaque ligne de votre plage spécifiée. Par exemple:

Commentant avec  #:

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

Cela insère "#" au début de chaque ligne. Notez que lorsque vous tapez: la plage sera remplie, donc cela ressemblera vraiment :'<,'>norm i#

Décommenter  #:

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

Ceci supprime le premier caractère de chaque ligne. Si j'avais utilisé un commentaire à 2 caractères comme //, je ferais simplement :norm xx pour supprimer les deux caractères.

Si les commentaires sont indentés comme dans la question OP, alors vous pouvez ancrer votre suppression comme ceci:

:norm ^x

ce qui signifie "aller au premier caractère non-espace, puis supprimer un caractère".

Remarque: Depuis norm est littéralement en train d'exécuter des commandes vim régulières, vous n'êtes pas limité aux commentaires, vous pouvez faire des modifications complexes sur chaque ligne. Si vous avez besoin du caractère d'échappement dans le cadre de votre séquence de commandes, tapez ctrl-v, puis appuyez sur la touche d'échappement.

Note 2: Vous pouvez bien sûr également ajouter une cartographie si vous vous trouvez en utilisant norm beaucoup. Par exemple, en mettant la ligne suivante dans ~ / .vimrc vous permet de taper ctrl-n au lieu de :norm après avoir fait votre sélection visuelle

vnoremap <C-n> :norm

Note 3: Bare-Bones vim n'a parfois pas le norm commande compilée dedans, alors assurez-vous d'utiliser la version renforcée, c'est-à-dire typiquement / usr / bin / vim, pas / bin / vi

(Merci à @Manbroski et @rakslice pour les améliorations incorporées dans cette réponse)


210
2018-04-14 14:44



J'ai ce qui suit dans mon .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>

Maintenant vous pouvez taper ,cc commenter une ligne et ,cu pour décommenter une ligne (fonctionne à la fois en mode normal et visuel).

(Je l'ai volé sur un site il y a plusieurs années, donc je ne peux pas complètement expliquer comment ça marche :). Il y a un commentaire où il est expliqué.)


102
2017-11-04 21:14



Spécifiez les lignes à commenter dans vim:

Révéler les numéros de ligne:

:set number

puis

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

ou ca:

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

82
2017-11-05 18:07



Voici comment je le fais:

  1. Aller au premier caractère sur la première ligne que vous voulez commenter.

  2. Frappé Ctrl+q dans GVIM ou Ctrl+v dans VIM, puis descendez pour sélectionner le premier caractère sur les lignes pour commenter.

  3. Puis appuyez cet ajoutez le caractère de commentaire.

La décompression fonctionne de la même manière, il suffit de taper un espace à la place du caractère de commentaire.


47
2017-11-04 21:13



Je suis venu avec un ajout simple à mon fichier .vimrc qui fonctionne plutôt bien et peut être étendu facilement. Vous ajoutez simplement un nouveau type de fichier à comment_map et à son chef de commentaire.

J'ai ajouté une cartographie aux modes normal et visuel, mais vous pouvez refaire ce que vous voulez. Je préfère seulement avoir une fonction de style 'bascule'. Un ours ayant plusieurs mappages 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>

Remarque:

Je n'utilise pas de rappels ou de crochets dans les types de fichiers / chargement, parce que je trouve qu'ils ralentissent le démarrage de Vim plus que le .vimrc fonction statique / carte fait mais c'est juste ma préférence. J'ai aussi essayé de le garder simple et performant. Si vous utilisez des autocommandes, vous devez vous assurer de les placer dans un groupe de commandes automatiques, sinon les rappels seront ajoutés au type de fichier plusieurs fois par fichier chargé et entraîneront une dégradation importante des performances.


28
2018-06-04 20:24



Utilisez Control-V pour sélectionner des rectangles de texte: aller au premier #caractère, type Ctrl+V, déplacez-vous une fois, puis vers le bas, jusqu'à la fin des commentaires. Maintenant tapez x: vous supprimez tous les # caractères suivis d'un espace.


22
2017-11-04 21:11



Activer les commentaires

Si tout ce dont vous avez besoin est bascule les commentaires Je préfère aller avec commentary.vim par tpope.

enter image description here

Installation

Agent pathogène:

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

vim-plug:

Plug 'tpope/vim-commentary'

Vundle:

Plugin 'tpope/vim-commentary'

Plus de personnalisation

Ajoutez ceci à votre fichier .vimrc: noremap <leader>/ :Commentary<cr>

Vous pouvez maintenant basculer les commentaires en appuyant sur Leader+/, tout comme Sublime et Atom.


20
2017-10-21 03:07



Première presse -> CtrlV

Appuyez sur la touche fléchée vers le haut ou vers le bas au besoin

Puis appuyez sur -> Décalageje

Puis insérer un commentaire en utilisant -> Décalage#

Esc


16
2017-10-23 06:01