web-dev-qa-db-fra.com

Qu'est-ce qu'un moyen rapide de commenter/décommenter des 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

Dites que je veux supprimer le commentaire de toutes les lignes de la première section def ... end. Quel est un moyen efficace de faire cela dans Vim?

En général, je recherche un moyen simple et fluide de commenter et de décommenter les lignes. Ici, je traite du code Ruby, mais ce peut être JavaScript (//) ou Haml (-#).

932
Ethan

J'utilise le script NERD Commenter . Il vous permet de commenter, de commenter ou de basculer facilement les commentaires dans votre code.

Comme mentionné dans les commentaires :

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

157
Manuel Ceron

J'utilise la plupart du temps pour ces tâches sélection de bloc .

Placez votre curseur sur le premier caractère #, appuyez sur CtrlV (ou CtrlQ pour gVim) et descendez jusqu'à la dernière ligne commentée, puis appuyez sur x, qui supprimera tous les caractères # verticalement.

Pour commenter un bloc de texte, c'est presque pareil:

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

Pour la version simplifiée de vim livrée avec debian/ubuntu par défaut, saisissez : s/^/# à la troisième étape.

Voici deux enregistrements sur petit écran pour référence visuelle.

Commentaire: Comment

Uncomment: Uncomment

2136
CMS

Pour commenter des blocs dans vim:

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

Pour annuler la mise en commentaire de blocs dans vim:

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

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

    • tilisez les flèches gauche/droite pour sélectionner plus de texte
    • pour sélectionner des morceaux d’utilisation du texte shift + / touche fléchée
    • vous pouvez appuyer plusieurs fois sur les touches de suppression ci-dessous, comme un bouton de suppression classique
  • presse d ou x supprimer des caractères, plusieurs fois si nécessaire
746
amelia

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

Dans ces cas, une alternative peu sophistiquée est la commande norm intégrée, qui n'exécute que les commandes vim arbitraires sur chaque ligne de la plage spécifiée. Par exemple:

Commenter avec #:

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

Ceci insère "#" au début de chaque ligne. Notez que lorsque vous tapez: la plage sera remplie, elle ressemblera donc 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 à deux caractères tel que //, je ferais simplement :norm xx pour supprimer les deux caractères. 

Si les commentaires sont en retrait comme dans la question du PO, vous pouvez alors ancrer votre suppression de la manière suivante: 

:norm ^x

ce qui signifie "aller au premier caractère sans espace, puis supprimer un caractère". Notez que contrairement à la sélection de bloc, cette technique fonctionne même si les commentaires ont une indentation inégale!

Note: Puisque norm est littéralement en train d'exécuter des commandes vim ordinaires, vous n'êtes pas limité aux commentaires, vous pouvez également éditer des lignes complexes. Si vous avez besoin du caractère d'échappement dans votre séquence de commandes, tapez ctrl-v puis appuyez sur la touche d'échappement (ou encore plus simplement, enregistrez une macro rapide puis utilisez norm pour exécuter cette macro sur chaque ligne).

Note 2: Vous pouvez bien sûr aussi ajouter un mapping si vous utilisez beaucoup norm. Par exemple, mettre la ligne suivante dans ~/.vimrc vous permet de saisir ctrl-n au lieu de :norm après avoir effectué votre sélection visuelle.

vnoremap <C-n> :norm

Note 3: Parfois, vim n'a pas la commande norm compilé, assurez-vous donc d'utiliser la version renforcée, c'est-à-dire typiquement/usr/bin/vim, pas/bin/vi

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

261
Magnus

J'ai les éléments suivants 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>

Vous pouvez maintenant taper ,cc pour commenter une ligne et ,cu pour la décommenter (fonctionne aussi bien en mode normal qu'en visuel).

(Je l'ai volé sur un site web il y a de nombreuses années alors je ne peux plus expliquer complètement comment ça marche :). Il y a un commentaire où il est expliqué.)

109
jqno

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
96
Carlos

Voici comment je le fais:

  1. Allez au premier caractère de la première ligne que vous voulez commenter.

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

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

Décommenter fonctionne de la même manière, il suffit de taper un espace au lieu du caractère de commentaire.

53
Marcin

Je viens d'ajouter un simple ajout à mon fichier .vimrc, qui fonctionne plutôt bien et peut être étendu facilement. Vous ajoutez simplement un nouveau type de fichier à la comment_map et son chef de commentaire.

J'ai ajouté un mappage aux modes normal et visuel, mais vous pouvez le transformer en tout ce que vous voulez. Je préfère seulement avoir une fonction de style 'bascule'. Un porte plusieurs mappings, 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 ni de points d'ancrage dans les types de fichiers/le chargement, car ils ralentissent plus le démarrage de Vim que la fonction/carte .vimrc statique, mais ce n'est que ma préférence. J'ai aussi essayé de rester simple et performant. Si vous utilisez des autocommandes, vous devez vous assurer de les placer dans un groupe d'autocommandes, 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
user427390

Basculer les commentaires

Si tout ce dont vous avez besoin est bascule les commentaires, je préfère utiliser commentary.vim by 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 + /, comme pour Sublime et Atom.

24
Flavio Wuensche

Utilisez Control-V pour sélectionner des rectangles de texte: allez au premier caractère #, tapez Ctrl+V, déplacez-vous à droite 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

Voici une section de mon .vimrc:

"insert and remove comments in visual and normal mode
vmap ,ic :s/^/#/g<CR>:let @/ = ""<CR>
map  ,ic :s/^/#/g<CR>:let @/ = ""<CR>
vmap ,rc :s/^#//g<CR>:let @/ = ""<CR>
map  ,rc :s/^#//g<CR>:let @/ = ""<CR>

En mode normal et en mode visuel, cela me permet d'appuyer sur ,ic insérer des commentaires et,rc supprimer des commentaires.

14
innaM

Comment décommenter les trois lignes suivantes dans vi:

#code code
#code
#code code code

Placez le curseur sur le symbole # en haut à gauche et appuyez sur CtrlV. Cela vous met en mode bloc visuel. Appuyez sur la flèche vers le bas ou J trois fois pour sélectionner les trois lignes. Puis appuyez D. Tous les commentaires disparaissent. Pour annuler, appuyez sur U.

Comment commenter les trois lignes suivantes dans vi:

code code
code
code code code

Placez le curseur sur le caractère supérieur gauche, appuyez sur CtrlV. Cela vous met en mode bloc visuel. presse  ou J trois fois pour sélectionner les trois lignes. Puis appuyez:

I//Esc

C'est une capitale I, // et Escape.

Lorsque vous appuyez sur ESC, toutes les lignes sélectionnées auront le symbole de commentaire que vous avez spécifié.

9
Ivor Scott

J'utilise vim 7.4 et cela fonctionne pour moi.
En supposant que nous commentions/décommentions 3 lignes. 

Commenter: 

si la ligne n'a pas de tabulation/espace au début: 
ctrl + V puis jjj puis shift + I (cappital i) puis //enfin esc esc 
Si la ligne a une tabulation/espace au début, vous pouvez toujours faire ce qui précède ou échanger c
ctrl + V puis jjj puis c puis //enfin esc esc 

Pour commenter:

si les lignes n'ont pas de tabulation/espace au début: 
ctrl + V puis jjj puis ll (lower cap L) puis c 

si les lignes ont des tabulations/espaces au début, alors vous en espacez une et esc 
ctrl + V puis jjj puis ll (lower cap L) puis c puis space puis esc 

9
Andy

J'aime utiliser le plugin tcomment: http://www.vim.org/scripts/script.php?script_id=1173

J'ai mappé gc et gcc pour commenter une ligne ou un bloc de code en surbrillance. Il détecte le type de fichier et fonctionne vraiment bien. 

9
Rick

Oui, il y a déjà 33 réponses (essentiellement répétitives) à cette question.

Voici une autre approche pour commenter les lignes dans Vim: motions. L'idée de base est de commenter ou de supprimer les commentaires en appliquant la même méthode que pour supprimer un paragraphe en tapant yip ou en supprimant 2 lignes en tapant dj.

Cette approche vous permettra de faire des choses comme:

  • ccj pour commenter les deux lignes suivantes et cuk pour les commenter;

  • cci{ pour commenter un blocage et cui{ pour le décommenter;

  • ccip pour commenter un paragraphe entier, et cuip pour le commenter.

  • ccG pour tout commenter jusqu'à la dernière ligne, et cugg pour tout commenter jusqu'à la première ligne.

Tout ce dont vous avez besoin est 2 fonctions qui opèrent sur les mouvements et 2 mappages pour chaque fonction. Tout d'abord, les mappages:

nnoremap <silent> cc  :set opfunc=CommentOut<cr>g@
vnoremap <silent> cc  :<c-u>call  CommentOut(visualmode(), 1)<cr>
nnoremap <silent> cu  :set opfunc=Uncomment<cr>g@
vnoremap <silent> cu  :<c-u>call  Uncomment(visualmode(), 1)<cr>

(Voir le manuel sur l'opérateur g@ et la variable operatorfunc.)

Et maintenant les fonctions:

function! CommentOut(type, ...)
  if a:0
    silent exe "normal!  :'<,'>s/^/#/\<cr>`<"
  else
    silent exe "normal!  :'[,']s/^/#/\<cr>'["
  endif
endfunction

function! Uncomment(type, ...)
  if a:0
    silent exe "normal!  :'<,'>s/^\\(\\s*\\)#/\\1/\<cr>`<"
  else
    silent exe "normal!  :'[,']s/^\\(\\s*\\)#/\\1/\<cr>`["
  endif
endfunction

Modifiez les expressions régulières ci-dessus en fonction de vos goûts pour savoir où le # devrait être:

7
n.r.

J'utilise EnhancedCommentify . Il commente tout ce dont j'avais besoin (langages de programmation, scripts, fichiers de configuration). Je l'utilise avec des liaisons en mode visuel. Sélectionnez simplement le texte que vous souhaitez commenter et appuyez sur co/cc/cd.

vmap co :call EnhancedCommentify('','guess')<CR>
vmap cc :call EnhancedCommentify('','comment')<CR>
vmap cd :call EnhancedCommentify('','decomment')<CR> 
6
qba

Je marque les première et dernière lignes (ma et mb), puis fais: 'a,' bs/^ # //

6
SDGator

Si vous connaissez déjà les numéros de ligne, alors n,ms/# // fonctionnerait.

5
uckelman

J'utilise le fichier vim-commentary plugin de Tim Pope. 

4
Jim Stewart

J'ai combiné les réponses de Phil et de jqno et formulé des commentaires avec des espaces:

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 = '"'
function! CommentToggle()
    execute ':silent! s/\([^ ]\)/' . b:comment_leader . ' \1/'
    execute ':silent! s/^\( *\)' . b:comment_leader . ' \?' . b:comment_leader . ' \?/\1/'
endfunction
map <F7> :call CommentToggle()<CR>
4
mathewguest

Il y a ce plug-in de changement de vie de tpope appelé vim-commentary

https://github.com/tpope/vim-commentary

Ce plugin fournit :

  • Santé mentale
  • Commentaires correctement mis en retrait
  • Ne commente pas les lignes vides/inutiles

Utilisation :

  • Installez via Vundle (ou Pathogen, je suppose).
  • Mettez votre texte en surbrillance et appuyez sur : qui affichera comme :<,'>
  • Tapez Commentaire ici :<,'>Commentary et appuyez sur Enter.
  • Boom. Votre bourgeon fait.
4
Weston Ganger

J'utilise comments.vim de Jasmeet Singh Anand (trouvé sur vim.org),

Il fonctionne avec C, C++, Java, PHP [2345], proc, CSS, HTML, HTML, HTML, XML, XHTML, VIM, VIMRC, SQL, sh, ksh, csh, Perl, tex, fortran, ml, caml, ocaml, vhdl, haskel et fichiers normaux

Il commente et supprime les lignes de différents fichiers sources en mode normal et visuel

Usage:

  • CtrlC pour commenter une seule ligne
  • CtrlX pour commenter une seule ligne
  • ShiftV et sélectionnez plusieurs lignes, puis CtrlC commenter les lignes multiples sélectionnées
  • ShiftV et sélectionnez plusieurs lignes, puis CtrlX pour commenter les lignes multiples sélectionnées
3
Ronan

La méthode la plus rapide et la plus intuitive consiste à remapper ) pour les commentaires détaillés des lignes, puis ( pour les annuler. Essayez et vous ne reviendrez pas.

Dans Ruby ou Bash, avec des retraits à 2 espaces:

map ) I# <Esc>j
map ( k^2x

Dans C/C++ ou PHP, avec indentations de 4 espaces:

map ) I//  <Esc>j
map ( k^4x

Les inconvénients sont que vous perdez ( et ) pour le mouvement de phrase (mais das peut y remplir), et vous aurez parfois recours à sélectionner-et-remplacer ou CtrlV pour manipuler de longues sections. Mais c'est assez rare.

Et pour le style C, les commentaires longs sont mieux gérés avec:

set cindent
set formatoptions=tcqr

... Ce qui se combine bien avec l'utilisation de V[move]gq pour refaire le retour à la ligne.

3
eukras

Voici une ligne de base basée sur la méthode C-v suivie de I décrite ci-dessus.

Cette commande (:Comment) ajoute une chaîne choisie au début des lignes sélectionnées.

command! -range -nargs=1 Comment :execute "'<,'>normal! <C-v>0I" . <f-args> . "<Esc><Esc>"

Ajoutez cette ligne à votre .vimrc pour créer une commande qui accepte un seul argument et place l’argument au début de chaque ligne de la sélection actuelle.

Par exemple. si le texte suivant est sélectionné:

1
2

et vous lancez ceci: :Comment //, le résultat sera:

//1
//2
3
bgran

En commençant par les idées dans les réponses ici, j'ai lancé ma propre fonction de commentaire… .. Elle active et désactive les commentaires. Il peut gérer des choses comme //print('blue'); //this thing is blue et ne fait que basculer le premier commentaire. De plus, il ajoute des commentaires et un seul espace, là où se trouve le premier espace non blanc, et non au tout début de la ligne . évitez ce travail supplémentaire, lorsque vous commentez et indentez la ligne . J'espère que cela aide certains minimalistes. Les suggestions sont les bienvenues.

" these lines are needed for ToggleComment()
autocmd FileType c,cpp,Java      let b:comment_leader = '//'
autocmd FileType arduino         let b:comment_leader = '//'
autocmd FileType sh,Ruby,python  let b:comment_leader = '#'
autocmd FileType zsh             let b:comment_leader = '#'
autocmd FileType conf,fstab      let b:comment_leader = '#'
autocmd FileType matlab,tex      let b:comment_leader = '%'
autocmd FileType vim             let b:comment_leader = '"'

" l:pos   --> cursor position
" l:space --> how many spaces we will use b:comment_leader + ' '

function! ToggleComment()
    if exists('b:comment_leader')
        let l:pos = col('.')
        let l:space = ( &ft =~ '\v(c|cpp|Java|arduino)' ? '3' : '2' )
        if getline('.') =~ '\v(\s*|\t*)' .b:comment_leader
            let l:space -= ( getline('.') =~ '\v.*\zs' . b:comment_leader . '(\s+|\t+)@!' ?  1 : 0 )
            execute 'silent s,\v^(\s*|\t*)\zs' .b:comment_leader.'[ ]?,,g'
            let l:pos -= l:space
        else
            exec 'normal! 0i' .b:comment_leader .' '
            let l:pos += l:space
        endif
        call cursor(line("."), l:pos)
    else
        echo 'no comment leader found for filetype'
    end
endfunction

nnoremap <Leader>t :call ToggleComment()<CR>
inoremap <Leader>t <C-o>:call ToggleComment()<CR>
xnoremap <Leader>t :'<,'>call ToggleComment()<CR>
3
mike

Ce simple extrait provient de mon fichier .vimrc:

function! CommentToggle()
    execute ':silent! s/\([^ ]\)/\/\/ \1/'
    execute ':silent! s/^\( *\)\/\/ \/\/ /\1/'
endfunction

map <F7> :call CommentToggle()<CR>

C'est pour // - Commentaires, mais vous pouvez l'adapter facilement pour d'autres personnages. Vous pouvez utiliser autocmd pour définir un leader comme suggéré par jqno.

C'est un moyen très simple et efficace de travailler naturellement avec les gammes et le mode visuel.

2
Phil

Vous pouvez utiliser vim-commentary par tpope ( https://github.com/tpope/vim-commentary ), vous pouvez l’utiliser comme suit:

Entrez en mode visuel en appuyant sur

'v'

Puis appuyez 

'j' repeatedly or e.g 4j to select 4 row

Maintenant, tout ce que vous avez à faire avec la sélection est d'entrer les clés:

'gc'

Cela mettra en commentaire toute la sélection, pour supprimer le commentaire des clés repead:

'gc'
2
Kingsley Ijomah

J'utilise vim-multiple-cursors pour cela.

  1. Pour sélectionner la région, aller au premier caractère de la première ou de la dernière ligne de la région à commenter en appuyant sur  (c'est zéro, pas la lettre "o"). Puis appuyez V et sélectionnez la région en utilisant JK ou flèches haut et bas.
  2. Placez ensuite un curseur virtuel sur chaque ligne de la sélection en appuyant sur CtrlN.
  3. Puis appuyez I pour éditer simultanément chaque ligne de la sélection.
2
nrz

Même si cette question a déjà une tonne de réponses, je pensais quand même que je donnerais un coup de main à un petit plugin que j'ai écrit: commentify .

Commentify utilise le paramètre commentstring pour décider comment mettre en commentaire un bloc de code. Vous n'avez donc pas besoin de conserver un mappage de différents types de commentaires dans votre configuration. Il prend en charge les commentaires basés sur la ligne (par exemple, //) et les commentaires bloqués (par exemple, , /* */).

Il mappe également le même raccourci (valeur par défaut: ctrl+c) pour les commentaires et les commentaires du bloc, vous n'avez donc pas à vous souvenir de deux mappages ou d'un ensemble complexe de commandes.

1
Jaymon

J'aime /* ... */ (commentaires de C ansi), alors voici mon tour pour vous. Vous pouvez bien sûr l'adapter pour l'utiliser dans différents cas.


Commenter avec/* ... */ 

Sélectionnez le texte (allez au début, démarrez bloc visuel, sautez avec }):

<c-V>}

Tapez la commande à appliquer dans la sélection

:norm i/* <c-v><esc>$a */

La commande ressemblera à: :'<,'>norm i /* ^[$a */

Voir (i *) pour plus de détails.


Décommentez le/* ... */ 

Sélectionnez le texte (comme avant ou autrement):

<c-V>}

Tapez la commande à appliquer dans la sélection

:norm :s-\s*/\*\s*-<c-v><enter>$bbld$

La commande ressemblera à: :'<,'>norm :s-\s*/\*\s*-^M$bbld$

Voir (ii *) pour plus de détails.


Résultat  

L'effet est commentaires ligne par ligne:

Comment block
Comment block
Comment block

Devient (et inversement):

/* Comment block */
/* Comment block */
/* Comment block */

Il est préférable de l’enregistrer sous la forme map ou @reg dans votre .vimrc, car c’est beaucoup à taper. Si vous préférez un seul /* et */ à l'ensemble du bloc, utilisez:

Commenter avec un seul/* */le bloc entier

Enregistrez-le dans un registre en enregistrant avec, disons, qc, puis, au début d'un paragraphe, pour commenter:

v}di/*  */<esc>hhhp

et n'oubliez pas q encore, pour terminer l'enregistrement.

Voir (iii *) pour plus de détails.


Décommentez un seul/* */d'un bloc

Enregistrez-le dans le registre, par exemple, @u. Placez votre curseur n'importe où dans le bloc et:

?/\*<enter>xx/\*/<enter>xx

Enregistrez le registre en finissant la commande q.

Voir (iv *) pour plus de détails.


Résultat  

L'effet est un seul commentaire pour plusieurs lignes:

Comment block
Comment block
Comment block

Devient (et inversement):

/* Comment block
Comment block
Comment block */

Explications

(i *) Cela fonctionne en utilisant norm qui applique la même commande à plusieurs reprises dans chaque ligne sélectionnée. La commande insère simplement un /*, trouve la fin de cette ligne et termine en insérant un */

:norm i/* <c-v><esc>$a */

(ii *) Il utilise également norm pour répéter la recherche/remplacement sur chaque ligne. Recherchez spaces /* spaces et ne remplacez rien. Après cela, trouve la fin de la ligne, deux mots en arrière, une lettre à droite, supprimez à la fin.

:norm :s-\s*/\*\s*-<c-v><enter>$bbld$

(iii *) Sélectionne le paragraphe avec v}, le supprime, insère un commentaire, ouvre et ferme, place le curseur au centre et colle le bloc supprimé.

v}di/*  */<esc>hhhp

(iv *) N'importe où au milieu, trouve en arrière un /*, le supprime; trouve en avant un */, le supprime.

?/\*<enter>xx/\*/<enter>xx
1
Dr Beco

Très bonne question, mais pas tellement de bonnes réponses à mon humble avis. Premièrement, je dirais que l’utilisation du mode d’insertion de bloc est une solution difficile ici, mais trop de frappes au clavier. Il est donc évident que cela doit fonctionner sur des lignes sélectionnées pour améliorer les performances de l’édition de code. Un autre point que personne ne mentionne: où le signe de commentaire doit être placé - au tout début de la ligne ou avant le texte actuel? C’est une question de goût probablement, mais à mon avis, il convient de le placer avant le texte pour que le code reste lisible: lorsque le signe de commentaire est placé au début de la ligne, la cohérence visuelle du code en retrait est rompue. liste à puces. En gardant cela à l’esprit, j’ai fini avec la solution suivante (je donne un exemple pour # commentaire). Dans ma vimrc:

vnoremap 1 :s:^\(\s*\)\([^#\t ]\):\1#\2:e<CR>
vnoremap 2 :s:^\(\s*\)#\(\s*\):\1\2:e<CR>

La touche 1 insère # avant le texte (après un espace) dans chaque ligne sélectionnée. Il vérifie s'il existe déjà #, ne pas insérer # deux fois. Et ignore également les lignes vides.
La clé 2 supprime un #. Il garde également les commentaires sur le côté droit de la ligne en toute sécurité.


Update: voici un exemple sur la manière de rendre la commande de commentaire à bascule dépendante du type de fichier. Pour en savoir plus sur ces choses, lisez: http://learnvimscriptthehardway.stevelosh.com/chapters/14.html

Pour que cela fonctionne, placez les lignes suivantes dans votre fichier .vimrc

" build the whole regex search/replace command
function! Build()
    let b:Comment_ON='''<,''>s:^\(\s*\)\([^\t ]\):\1' . b:cs . '\2:e'
    let b:Comment_OFF='''<,''>s:^\(\s*\)' . b:cs . '\(\s*\):\1\2:e'
endfunction

" run this group on Filetype event
augroup SetCS
    autocmd!
    "default comment sign
    autocmd FileType * let b:cs='--'
    "detect file type and assign comment sign
    autocmd FileType python,Ruby let b:cs='#'
    autocmd FileType c,cpp,Java,javascript,php let b:cs = '\/\/'
    autocmd FileType vim let b:cs='"'
    autocmd FileType * call Build()
augroup END

vnoremap 1 :<C-u>execute b:Comment_ON<CR>
vnoremap 2 :<C-u>execute b:Comment_OFF<CR>
1
Mikhail V

Personnellement, je n'aime pas une fonction "bascule" de commentaire, car elle détruira les commentaires déjà inclus dans le code. De plus, je veux que le caractère de commentaire apparaisse à l'extrême gauche, toujours, afin que je puisse facilement voir les blocs de commentaires. Aussi, je veux que cela fonctionne imbriqué (si je commente d'abord un bloc et plus tard un bloc englobant) . Par conséquent, j'ai légèrement modifié l'une des solutions. J'utilise F5 pour commenter et Shift - F5 pour supprimer le commentaire. De plus, j'ai ajouté un/g à la fin de la commande s /:

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 = '"'
autocmd FileType nasm             let b:comment_leader = ';'

function! CommentLine()
    execute ':silent! s/^\(.*\)/' . b:comment_leader . ' \1/g'
endfunction

function! UncommentLine()
    execute ':silent! s/^' . b:comment_leader . ' //g'
endfunction

map <F5> :call CommentLine()<CR>
map <S-F5> :call UncommentLine()<CR>
0
Flo

:% s/^/\/\// g

supprimer les espaces entre les caractères et Utilisez cette commande pour commenter des fichiers .C ou CPP

0

La solution de @ CMS est le moyen le plus "natif de vim" de commenter les lignes in/out. Dans la seconde étape de @ CMS, après CtrlV, vous pouvez aussi utiliser r# ajouter des commentaires ou x pour les supprimer. Drew Neil's Practical Vim , page 46, explique bien cette technique.

Une autre bonne option consiste à utiliser une commande en mode ex. :[intervalle]normali##. Évidemment, pour enregistrer des frappes au clavier avec celui-ci, vous devrez commenter plus de 15 lignes.

0
jfmercer
"comment (cc) and uncomment (cu) code 
noremap   <silent> cc      :s,^\(\s*\)[^# \t]\@=,\1# ,e<CR>:nohls<CR>zvj
noremap   <silent> cu      :s,^\(\s*\)# \s\@!,\1,e<CR>:nohls<CR>zvj

Vous pouvez commenter/supprimer les commentaires sur une ou plusieurs lignes avec #. Pour créer plusieurs lignes, sélectionnez-les, puis tapez le raccourci cc/cu ou tapez un nombre puis cc/cu, par ex. 7cc commentera 7 lignes du curseur. 

J'ai reçu le code original de la personne sur Quelle est la manière la plus élégante de commenter/de supprimer les commentaires de blocs de code Ruby dans Vim? et fait quelques petites modifications (touches de raccourci modifiées et ajout d'un espace après le #).

0
konyak

Personnellement, je voulais commenter à la Visual Studio. Je me suis tellement habitué à ce travail qu'il a pris le dessus sur ma mémoire musculaire (en utilisant vsvim). Utilisation shift+v sélectionnez les lignes de votre choix, puis appuyez sur ctrl+kctrl+c commenter ou Ctrl+kCtrl+u décommenter.

:vnoremap <C-k><C-c> :norm i//<Cr>
:vnoremap <C-k><C-u> :s/\/\///g<Cr>:noh<Cr>
0
scx

Pour décommenter tout le fichier:

  1. Esc quitte le mode insertion
  2. gg va au premier caractère sur la première ligne
  3. ctrl+V ou ctrl+shift+v sélectionne le caractère actuel
  4. G ou shift+g va à la dernière ligne
  5. x supprime la sélection
0
JSON C11

Il existe plusieurs plugins vim comme Tcomment et nerdcommenter disponibles. 

J'utilise tcomment à des fins de commentaires.

gcc: Il basculera les commentaires sur la ligne en cours . v {motion} gc: Il basculera les commentaires sur une plage de lignes sélectionnées visuellement 

Exemple: v3jgc basculera la région de 3 lignes.

Ces commandes peuvent fonctionner avec des commentaires dans n’importe quelle langue.

0
dvk317960

Cette solution mappe/à commenter et? décommenter (le basculement de commentaire à l'aide du mappage unique est trop complexe pour être correctement implémenté). Il faut des chaînes de commentaires issues de l'option commentstring intégrée de VIM, qui est renseignée à partir de fichiers tels que /usr/share/vim/vim*/ftplugin/*.vim si filetype plugin on est déclaré.

filetype plugin on
autocmd FileType * let b:comment = split(&commentstring, '%s', 1)
autocmd FileType * execute "map <silent> <Leader>/ :normal 0i" . b:comment[0] . "<C-O>$" . b:comment[1] . "<C-O>0<CR>"
autocmd FileType * execute "map <silent> <Leader>? :normal $" . repeat('x', strlen(b:comment[1])) . "0" . strlen(b:comment[0]) . "x<CR>"
0
sgtpep