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 (-#
).
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
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:
VISUAL BLOCK
.INSERT
, puis appuyez sur #. Cela ajoutera un hachage à la première ligne.#
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.
%
Si vous souhaitez sélectionner plusieurs caractères, utilisez-en un ou combinez ces méthodes:
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)
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é.)
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
Voici comment je le fais:
Allez au premier caractère de la première ligne que vous voulez commenter.
Frappé Ctrl+q dans GVIM ou Ctrl+v dans VIM, puis sélectionnez le premier caractère sur les lignes à commenter.
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.
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.
Si tout ce dont vous avez besoin est bascule les commentaires, je préfère utiliser commentary.vim by tpope .
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'
Ajoutez ceci à votre fichier .vimrc: noremap <leader>/ :Commentary<cr>
Vous pouvez maintenant basculer les commentaires en appuyant sur Leader
+ /
, comme pour Sublime et Atom.
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.
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.
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é.
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
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.
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:
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>
Je marque les première et dernière lignes (ma et mb), puis fais: 'a,' bs/^ # //
Si vous connaissez déjà les numéros de ligne, alors n,ms/# //
fonctionnerait.
J'utilise le fichier vim-commentary plugin de Tim Pope.
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>
Il y a ce plug-in de changement de vie de tpope
appelé vim-commentary
https://github.com/tpope/vim-commentary
Ce plugin fournit :
Utilisation :
:<,'>
:<,'>Commentary
et appuyez sur Enter.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:
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.
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
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>
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.
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'
J'utilise vim-multiple-cursors pour cela.
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.
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
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>
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>
:% s/^/\/\// g
supprimer les espaces entre les caractères et Utilisez cette commande pour commenter des fichiers .C ou CPP
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.
"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 #).
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+k, ctrl+c commenter ou Ctrl+k, Ctrl+u décommenter.
:vnoremap <C-k><C-c> :norm i//<Cr>
:vnoremap <C-k><C-u> :s/\/\///g<Cr>:noh<Cr>
Pour décommenter tout le fichier:
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.
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>"