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
Supposons que je souhaite décommenter toutes les lignes de la première def ... end
section. Quel est un moyen efficace de le faire dans Vim?
En général, je recherche un moyen simple et fluide de commenter et de commenter les lignes. Ici, je traite du code Ruby, mais il peut s'agir de JavaScript ( //
) ou Haml ( -#
).
Réponses:
J'utilise le script NERD Commenter . Il vous permet de commenter, de décommenter ou de basculer facilement les commentaires dans votre code.
Comme mentionné dans les commentaires :
la source
=begin
et=end
pour commenter plusieurs lignes au lieu de balises de hachage.Pour ces tâches, j'utilise la plupart de la sélection de bloc de temps .
Placez votre curseur sur le premier
#
caractère, appuyez sur CtrlV(ou CtrlQpour gVim), descendez jusqu'à la dernière ligne commentée et appuyez sur x, cela supprimera tous les#
caractères verticalement.Pour commenter un bloc de texte c'est presque pareil:
VISUAL BLOCK
mode.INSERT
mode, puis appuyez sur #. Cela ajoutera un hachage à la première ligne.#
caractère sur toutes les autres lignes sélectionnées.Pour la version allégée de vim fournie avec debian / ubuntu par défaut, saisissez
: s/^/#
plutôt la troisième étape (toute surbrillance restante du premier caractère de chaque ligne peut être supprimée avec:nohl
).Voici deux petits enregistrements d'écran pour référence visuelle.
Commentaire:
Décommenter:
la source
n
(où n est num lignes - 1), j,n
(où n num nombre de longueur de séquence de caractères de commentaire - 1), l, x.Pour commenter des blocs dans vim:
%
Pour décommenter des blocs dans vim:
Si vous souhaitez sélectionner plusieurs caractères, utilisez-en un ou combinez ces méthodes:
la source
Parfois, je suis bombardé 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é à HTML).
Dans ces cas, une alternative low-tech est la
norm
commande intégrée , qui exécute simplement toutes les commandes vim arbitraires sur chaque ligne de votre plage spécifiée. Par exemple:Commentant avec
#
:Cela insère "#" au début de chaque ligne. Notez que lorsque vous tapez: la plage sera remplie, donc elle ressemblera vraiment à
:'<,'>norm i#
Sans commentaires
#
:Cela supprime le premier caractère de chaque ligne. Si j'avais utilisé un commentaire à 2 caractères tel que // alors 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 ancrer votre suppression comme ceci:
ce qui signifie "aller au premier caractère non 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!
Remarque : comme il ne
norm
s'agit que d'exécuter des commandes vim régulières, vous n'êtes pas limité aux commentaires, vous pouvez également effectuer 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 (ou encore plus simple, enregistrez simplement une macro rapide et utilisez la norme pour exécuter cette macro sur chaque ligne).Remarque 2 : Vous pouvez bien sûr également ajouter une cartographie si vous vous en servez
norm
beaucoup. Par exemple, mettre la ligne suivante dans ~ / .vimrc vous permet de taperctrl-n
plutôt:norm
qu'après avoir fait votre sélection visuelleNote 3 : la
norm
commande Bim est parfois compilée, donc assurez-vous d'utiliser la version renforcée, c'est-à-dire généralement / usr / bin / vim, pas / bin / vi(Merci à @Manbroski et @rakslice pour les améliorations intégrées à cette réponse)
la source
:norm ^x
. Cette méthode a en général l'avantage de travailler avec des sélections de régions (par exemplevi{
, sélectionnera à l'intérieur des accolades). Ces sélecteurs d'objets texte ne fonctionnent pasVisual Block
./bin/vi
c'est vim 7.2, mais c'est une construction différente de/usr/bin/vim
, et il a des fonctionnalités comme celle-ci désactivées.vip
pour sélectionner un paragraphe entier.J'ai les éléments suivants dans mon
.vimrc
:Vous pouvez maintenant taper
,cc
pour 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 Web il y a plusieurs années, je ne peux plus expliquer comment cela fonctionne :). Il y a un commentaire où il est expliqué.)
la source
Spécifiez les lignes à commenter dans vim:
Révélez les numéros de ligne:
puis
ou ca:
la source
:%s/^/#/g
commentera toutes les lignes? Je me demandais le signe du pourcentage%
va{
ou avecvar
pour rubis.Voici comment je le fais:
Accédez au premier caractère de la première ligne à commenter.
Appuyez sur Ctrl+ qdans GVIM ou Ctrl+ vdans VIM, puis descendez pour sélectionner le premier caractère sur les lignes à commenter.
Appuyez ensuite sur cet ajoutez le caractère de commentaire.
La décommentation fonctionne de la même manière, il suffit de taper un espace au lieu du caractère de commentaire.
la source
c
supprime également le premier caractère. La réponse de CMS a raison, c'est-à-dire en appuyant surI
puis en tapant le (s) caractère (s) de commentaire, puisEsc
(c'est sur windows vim)ESC
deux fois après avoir appuyéc
et cela devrait faire l'affaireJ'ai trouvé un simple ajout à mon fichier .vimrc qui fonctionne assez bien et peut être étendu facilement. Vous ajoutez simplement un nouveau type de fichier à la comment_map et à son leader de commentaire.
J'ai ajouté un mappage aux modes normal et visuel, mais vous pouvez remapper à tout ce que vous aimez. Je préfère seulement avoir une fonction de style «bascule». On porte plusieurs mappages, etc.
Remarque:
Je n'utilise aucun rappel ou crochet dans les types de fichiers / chargement, car je trouve qu'ils ralentissent le démarrage de Vim plus que la
.vimrc
fonction / carte statique, mais c'est juste ma préférence. J'ai également essayé de rester simple et performant. Si vous utilisez des commandes automatiques, 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 considérable des performances.la source
<leader><Space>
déclaration au fond?\zs
et\ze
astuce regex, le code est devenu un peu plus petit. vous pouvez le voir iciBasculer les commentaires
Si tout ce dont vous avez besoin est de basculer les commentaires, je préfère utiliser commentary.vim de tpope .
Installation
Agent pathogène:
vim-plug:
Vundle:
Personnalisation supplémentaire
Ajoutez ceci à votre fichier .vimrc:
noremap <leader>/ :Commentary<cr>
Vous pouvez désormais basculer les commentaires en appuyant sur
Leader
+/
, tout comme Sublime et Atom.la source
Utilisez Control-V pour sélectionner des rectangles de texte: allez au premier
#
caractère, tapez Ctrl+ V, déplacez-vous une fois vers la droite, puis vers le bas, jusqu'à la fin des commentaires. Tapez maintenantx
: vous supprimez tous les#
caractères suivis d'un espace.la source
Voici une section de mon
.vimrc
:En mode normal et en mode visuel, cela me permet d'appuyer sur ,icpour insérer des commentaires et ,rcpour supprimer des commentaires.
la source
.vimrc
.map
couvre les modes normal et visuel, donc vous n'avez pas besoin desvmap
lignesafter/ftplugin/ruby.vim
.<leader>ic
et<leader>rc
J'utilise vim 7.4 et cela fonctionne pour moi.
En supposant que nous commentons / décommentons 3 lignes.
Commenter:
si la ligne n'a pas de tabulation / espace au début:
ctrl + V
alorsjjj
puisshift + I (cappital i)
alors//
puisesc esc
si la ligne a pas de tabulation / espace au début, vous pouvez toujours faire ce qui précède ou échanger pour
c
:ctrl + V
puisjjj
puisc
puis//
puisesc esc
Pour décommenter:
si les lignes n'ont pas de tabulation / espace au début:
ctrl + V
alorsjjj
alorsll (lower cap L)
puisc
si les lignes ont onglet / espace au début, alors vous un espace sur et
esc
ctrl + V
puisjjj
ensuite ,ll (lower cap L)
puisc
ensuitespace
alorsesc
la source
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 très bien.
la source
Avec 30 réponses devant moi, je vais essayer de donner une solution encore plus simple: insérez un
#
au début de la ligne. Descendez ensuite une ligne et appuyez sur le point (.
). Pour répéter, nej
,.
,j
,.
, etc ... décommenter, supprimez un#
(vous pouvez frapperx
sur#
), et faire l'inverse en utilisantk
,.
, etc ...la source
I#<Esc>j
dans le tampon - disons,c
- puis le faire10@c
, ou le nombre de lignes qui vous convient.Comment décommenter les trois lignes suivantes dans vi:
Placez le curseur sur le
#
symbole supérieur gauche et appuyez sur CtrlV. Cela vous met en mode de blocage visuel. Appuyez sur la flèche vers le bas ou Jtrois fois pour sélectionner les trois lignes. Appuyez ensuite sur D. Tous les commentaires disparaissent. Pour annuler, appuyez sur U.Comment commenter les trois lignes suivantes dans vi:
Placez le curseur sur le caractère supérieur gauche, appuyez sur CtrlV. Cela vous met en mode de blocage visuel. Appuyez sur ↓ouJ trois fois pour sélectionner les trois lignes. Puis appuyez:
I//Esc
C'est un capital I, // et Escape.
Lorsque vous appuyez sur ESC, toutes les lignes sélectionnées obtiendront le symbole de commentaire que vous avez spécifié.
la source
Oui, il y a déjà 33 réponses (pour la plupart répétitives) à cette question.
Voici une autre approche pour commenter les lignes dans Vim: les motions . L'idée de base est de commenter ou de décommenter des lignes en utilisant la même méthode que de tirer un paragraphe en tapant
yip
ou en supprimant 2 lignes en tapantdj
.Cette approche vous permettra de faire des choses comme:
ccj
commenter les 2 lignes suivantes, etcuk
les décommenter;cci{
pour commenter un blocage, etcui{
le décommenter;ccip
commenter un paragraphe entier etcuip
le décommenter.ccG
pour tout commenter jusqu'à la dernière ligne etcugg
pour tout commenter jusqu'à la première ligne.Tout ce dont vous avez besoin est de 2 fonctions qui fonctionnent sur les mouvements et de 2 mappages pour chaque fonction. Tout d'abord, les mappages:
(Voir le manuel de l'
g@
opérateur et duoperatorfunc
variable.)Et maintenant les fonctions:
Modifiez les expressions régulières ci-dessus selon vos goûts quant à l'endroit où elles
#
devraient se trouver:la source
Si vous connaissez déjà les numéros de ligne,
n,ms/# //
cela fonctionnerait.la source
Je marque les première et dernière lignes (ma et mb), puis je fais: 'a', bs / ^ # //
la source
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.
la source
J'ai combiné la réponse de Phil et de jqno et j'ai fait des commentaires décousus avec des espaces:
la source
Il y a ce plugin qui change la vie par
tpope
appelévim-commentary
https://github.com/tpope/vim-commentary
Ce plugin fournit :
Utilisation :
:<,'>
:<,'>Commentary
et appuyez sur Enter.la source
vim-commentary
(comme tous les plugins de tpope) a l'avantage d'être un vim idiomatique.gc
= "aller commenter",gcap
= "aller commenter un paragraphe", etc.Cette réponse est très utile si vous ne parvenez pas à installer les plugins mais que vous souhaitez que vos caractères de commentaire suivent les niveaux d'indentation existants.
Cette réponse est ici à 1) montrer le bon code à coller dans un
.vimrc
pour obtenir levim 7.4+
faire bloc commenter / décommenter tout en gardant le niveau d'indentation avec 1 raccourci en mode visuel et 2) pour l' expliquer. Voici le code:Comment ça fonctionne:
let b:commentChar='//'
: Cela crée une variable dans vim. leb
fait référence ici à la portée, qui dans ce cas est contenu dans la mémoire tampon, ce qui signifie le fichier actuellement ouvert. Vos caractères de commentaire sont des chaînes et doivent être entourés de guillemets, les guillemets ne font pas partie de ce qui sera remplacé lors du basculement des commentaires.autocmd BufNewFile,BufReadPost *...
: Les commandes automatiques se déclenchent sur différentes choses, dans ce cas, elles se déclenchent lorsqu'un nouveau fichier ou le fichier lu se termine par une certaine extension. Une fois déclenchée, exécutez la commande suivante, qui nous permet de changer le typecommentChar
de fichier en fonction. Il existe d'autres façons de le faire, mais elles sont plus déroutantes pour les novices (comme moi).function! Docomment()
: Les fonctions sont déclarées en commençant parfunction
et en terminant parendfunction
. Les fonctions doivent commencer par un capital. le!
garantit que cette fonction écrase toutes les fonctions précédentes définies commeDocomment()
avec cette version deDocomment()
. Sans le!
, j'ai eu des erreurs, mais c'est peut-être parce que je définissais de nouvelles fonctions via la ligne de commande vim.execute '''<,''>s/^\s*/&'.escape(b:commentChar, '\/').' /e'
: Exécuter appelle une commande. Dans ce cas, nous exécutonssubstitute
, ce qui peut prendre une plage (par défaut, c'est la ligne actuelle) comme%
pour tout le tampon ou'<,'>
pour la section en surbrillance.^\s*
est regex pour correspondre au début d'une ligne suivie par n'importe quelle quantité d'espace, qui est ensuite ajoutée à (en raison de&
). L'.
ici est utilisé pour la concaténation de chaînes, carescape()
il ne peut pas être placé entre guillemets.escape()
vous permet d'échapper le caractèrecommentChar
qui correspond aux arguments (dans ce cas,\
et/
) en les ajoutant au début par un\
. Après cela, nous concaténons à nouveau avec la fin de notresubstitute
chaîne, qui a lee
drapeau. Ce drapeau nous permet d'échouer en silence, ce qui signifie que si nous ne trouvons pas de correspondance sur une ligne donnée, nous ne crierons pas à ce sujet. Dans l'ensemble, cette ligne nous permet de mettre un caractère de commentaire suivi d'un espace juste avant le premier texte, ce qui signifie que nous conservons notre niveau d'indentation.execute '''<,''>s/\v(^\s*)'.escape(b:commentChar, '\/').'\v\s*/\1/e'
: Ceci est similaire à notre dernière énorme commande longue. Unique à celui-ci, nous l'avons\v
, ce qui garantit que nous n'avons pas à échapper à notre()
, et1
, qui fait référence au groupe que nous avons fait avec notre()
. Fondamentalement, nous faisons correspondre une ligne qui commence par n'importe quelle quantité d'espace, puis notre caractère de commentaire suivi par n'importe quelle quantité d'espace, et nous ne conservons que le premier ensemble d'espaces. Encore une fois,e
laissez-nous échouer en silence si nous n'avons pas de caractère de commentaire sur cette ligne.let l:line=getpos("'<")[1]
: cela définit une variable un peu comme nous l'avons fait avec notre caractère de commentaire, maisl
fait référence à la portée locale (locale à cette fonction).getpos()
obtient la position, dans ce cas, le début de notre surbrillance, et les[1]
moyens que nous nous soucions uniquement du numéro de ligne, pas d'autres choses comme le numéro de colonne.if match(getline(l:line), '^\s*'.b:commentChar)>-1
: vous savez comment çaif
marche.match()
vérifie si la première chose contient la deuxième chose, nous prenons donc la ligne sur laquelle nous avons commencé notre surbrillance, et vérifions si elle commence par un espace suivi de notre caractère de commentaire.match()
renvoie l'index où cela est vrai et-1
si aucune correspondance n'a été trouvée. Étant donné queif
tous les nombres différents de zéro sont vrais, nous devons comparer notre sortie pour voir si elle est supérieure à -1. La comparaison envim
retourne 0 si faux et 1 si vrai, c'est ceif
que l' on veut voir pour évaluer correctement.vnoremap <silent> <C-r> :<C-u>call Comment()<cr><cr>
:vnoremap
signifie mapper la commande suivante en mode visuel, mais ne la mappez pas récursivement (c'est-à-dire ne changez aucune autre commande qui pourrait être utilisée d'une autre manière). Fondamentalement, si vous êtes un novice vim, utilisez toujoursnoremap
pour vous assurer de ne pas casser les choses.<silent>
signifie "Je ne veux pas de vos mots, juste de vos actions" et lui dit de ne rien imprimer sur la ligne de commande.<C-r>
est la chose que nous mappons, qui est ctrl + r dans ce cas (notez que vous pouvez toujours utiliser Cr normalement pour "refaire" en mode normal avec ce mappage).C-u
est un peu déroutant, mais fondamentalement, il garantit que vous ne perdez pas la trace de votre mise en évidence visuelle (selon cette réponse, cela fait démarrer votre commande avec'<,'>
ce que nous voulons).call
ici juste dit à vim d'exécuter la fonction que nous avons nommée, et<cr>
fait référence au fait d'enter
appuyer sur le bouton. Nous devons le frapper une fois pour appeler la fonction (sinon nous venons de tapercall function()
sur la ligne de commande, et nous devons le frapper à nouveau pour que nos remplaçants passent au travers (pas vraiment pourquoi, mais peu importe).Quoi qu'il en soit, j'espère que cela aide. Cela prendra tout ce qui est mis en surbrillance avec
v
,V
ouC-v
, vérifiez si la première ligne est commentée, si oui, essayez de décommenter toutes les lignes en surbrillance et sinon, ajoutez une couche supplémentaire de caractères de commentaire à chaque ligne. C'est mon comportement souhaité; Je ne voulais pas simplement qu'il permute si chaque ligne du bloc était commentée ou non, donc cela fonctionne parfaitement pour moi après avoir posé plusieurs questions sur le sujet.la source
J'utilise le plugin vim-commentary de Tim Pope .
la source
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
Puis appuyez
Maintenant, tout ce que vous avez à faire avec la sélection est d'entrer les touches:
Cela mettra en commentaire toute la sélection, pour décommenter les touches de relecture:
la source
Voici une doublure de base basée sur la méthode
C-v
suivieI
décrite ci-dessus.Cette commande (
:Comment
) ajoute une chaîne choisie au début de toutes les lignes sélectionnées.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 dans la sélection actuelle.Par exemple, si le texte suivant est sélectionné:
et vous exécutez ceci:,
:Comment //
le résultat sera:la source
En commençant par les idées dans les réponses ici, j'ai commencé ma propre fonction de commentaire. Il active et désactive les commentaires. Il peut gérer des choses comme
//print('blue'); //this thing is blue
et basculer simplement le premier commentaire. De plus, il ajoute des commentaires et un seul espace juste là où se trouve le premier espace non blanc et pas au tout début de la ligne. De plus, il ne copie pas inutilement les espaces blancs, mais utilise des zooms (: h \ zs pour l'aide) pour éviter ce travail supplémentaire, lors du commentaire et de la ligne en retrait. J'espère que cela aide certains minimalistes. Les suggestions sont les bienvenues.la source
J'utilise comments.vim de Jasmeet Singh Anand (trouvé sur vim.org),
Il fonctionne avec 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 et fichiers normaux
Il commente et dé-commente les lignes dans différents fichiers source en mode normal et visuel
Usage:
la source
La méthode la plus rapide et la plus intuitive de toutes consiste à remapper
)
pour commenter les lignes en descendant, puis(
pour décommenter en marchant. Essayez-le et vous ne reviendrez pas.En Ruby ou Bash , avec des retraits à 2 espaces:
En C / C ++ ou PHP , avec des retraits à 4 espaces:
Les inconvénients sont que vous perdez
(
et)
pour le déplacement de la phrase (mais vousdas
pouvez le remplir), et vous aurez parfois recours à la sélection et au remplacement ou CtrlVà la gestion de longues sections. Mais c'est assez rare.Et pour le style C, les longs commentaires sont mieux gérés avec:
... Ce qui se combine bien avec l'utilisation
V[move]gq
pour refaire le retour à la ligne.la source
Ce simple extrait est de mon .vimrc:
C'est pour // - Commentaires, mais vous pouvez l'adapter facilement pour d'autres personnages. Vous pouvez utiliser autocmd pour définir un leader comme l'a suggéré jqno.
C'est une manière très simple et efficace de travailler avec les plages et le mode visuel naturellement.
la source
J'aime
/* ... */
(commentaires C ansi), alors voici mon truc pour vous. Vous pouvez bien sûr l'adapter pour l'utiliser dans différents cas.Commentaire avec / * ... * /
Sélectionnez le texte (allez au début, démarrez le bloc visuel, sautez avec
}
):Tapez la commande à appliquer dans la sélection
La commande ressemblera à:
:'<,'>norm i /* ^[$a */
Voir (i *) pour plus de détails.
Décommentez le / * ... * /
Sélectionnez le texte (comme précédemment, ou d'une autre manière que vous aimez):
Tapez la commande à appliquer dans la sélection
La commande ressemblera à:
:'<,'>norm :s-\s*/\*\s*-^M$bbld$
Voir (ii *) pour plus de détails.
Résultat
L'effet est des commentaires ligne par ligne:
Devient (et vice-versa):
Il vaut mieux l'enregistrer en tant que certains
map
ou@reg
dans votre.vimrc
, car c'est beaucoup à taper. Si vous préférez un seul/*
et*/
au bloc entier, utilisez:Commentaire avec un seul / * * / tout le bloc
Enregistrez-le dans un registre en enregistrant avec, disons
qc
, puis, au début d'un paragraphe pour commenter:et n'oubliez pas
q
, pour finir le record.Voir (iii *) pour plus de détails.
Décommenter un seul / * * / d'un bloc
Enregistrez-le dans le registre, par exemple
@u
. Placez votre curseur n'importe où dans le bloc et:Enregistrez le registre en terminant
q
commande.Voir (iv *) pour plus de détails.
Résultat
L'effet est un seul commentaire pour plusieurs lignes:
Devient (et vice-versa):
Explications
(i *) Il fonctionne en utilisant
norm
qui applique la même commande à plusieurs reprises sur chaque ligne sélectionnée. La commande insère simplement un/*
, trouve la fin de cette ligne et termine en insérant un*/
(ii *) Il permet également
norm
de répéter la recherche / remplacement sur chaque ligne. Recherchezspaces /* spaces
et remplacez par rien. Après cela, trouve la fin de la ligne, deux mots en arrière, une lettre à droite, supprimer jusqu'à la fin.(iii *) Sélectionne le paragraphe par
v}
, supprimez-le, insérez un commentaire ouvert et fermé, déplacez-vous au milieu et collez le bloc supprimé.(iv *) N'importe où au milieu, trouve en arrière a
/*
, le supprime; trouve un avant*/
, le supprime.la source