let b:commentChar='//'
: Ceci crée une variable dans vim. le b
fait ici référence à la portée, qui dans ce cas est contenue dans le tampon, ce qui signifie le fichier actuellement ouvert. Les caractères de vos commentaires sont des chaînes et doivent être entourés de guillemets. Les guillemets ne font pas partie de ce qui sera substitué 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 avec une certaine extension. Une fois déclenché, exécutez la commande suivante, ce qui nous permet de changer le type commentChar
de fichier en fonction. Il y a d'autres moyens de le faire, mais ils sont plus déroutants pour les novices (comme moi).
function! Docomment()
: Les fonctions sont déclarées en commençant par function
et se terminant par endfunction
. Les fonctions doivent commencer par une capitale. les !
assure que cette fonction écrase toutes les fonctions précédentes définis comme Docomment()
avec cette version de Docomment()
. Sans cela !
, j'avais 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'
: Execute appelle une commande. Dans ce cas, nous sommes en train de nous exécuter substitute
, ce qui peut prendre une plage (par défaut, il s’agit de la ligne courante), par exemple %
pour l’ensemble du tampon ou '<,'>
pour la section en surbrillance. ^\s*
est regex pour correspondre au début d'une ligne suivi de n'importe quelle quantité d'espaces, qui est ensuite ajoutée à (due à &
). Le .
here est utilisé pour la concaténation de chaînes, car escape()
il ne peut pas être placé entre guillemets. escape()
vous permet d'échapper au caractère commentChar
qui correspond aux arguments (dans ce cas, \
et /
) en les préfixant avec un \
. Après cela, nous concaténons à nouveau avec la fin de notre substitute
chaîne, qui a lae
drapeau. Cet indicateur nous laisse échouer en silence, ce qui signifie que si nous ne trouvons pas de correspondance sur une ligne donnée, nous ne crierons pas dessus. 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 commande longue et énorme. Nous avons un système unique en son genre \v
, qui garantit que nous n’avons pas à échapper à notre groupe ()
, et 1
qui fait référence au groupe que nous avons créé avec notre groupe ()
. Fondamentalement, nous faisons correspondre une ligne qui commence par n'importe quelle quantité d’espace, suivie de notre caractère de commentaire suivi de toute quantité d’espace, et nous ne conservons que le premier ensemble d’espace. 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, mais l
fait référence à la portée locale (locale à cette fonction). getpos()
obtient la position de, dans ce cas, le début de notre surbrillance, et les [1]
moyens pour nous ne nous soucions que 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 ça if
marche. match()
vérifie si la première chose contient la deuxième chose, alors nous prenons 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. Etant donné que if
tous les nombres non nuls sont vrais, nous devons comparer notre sortie pour voir si elle est supérieure à -1. La comparaison dans vim
renvoie 0 si faux et 1 si vrai, qui est ce que if
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 mappe pas de manière récursive (autrement dit, ne modifiez aucune autre commande pouvant être utilisée d'une autre manière). En gros, si vous êtes un novice de Vim, noremap
veillez toujours à ne pas casser des 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 ce que nous mappons, ctrl + r dans ce cas (notez que vous pouvez toujours utiliser Cr normalement pour "rétablir" en mode normal avec ce mappage). C-u
C'est un peu déroutant, mais en gros, cela garantit que vous ne perdez pas la trace de votre surbrillance visuelle (selon cette réponse , votre commande commencera par '<,'>
ce que nous voulons).call
Ici, il indique simplement à vim d'exécuter la fonction que nous avons nommée, et <cr>
fait référence à l'appui sur le enter
bouton. Nous devons appuyer une fois pour appeler la fonction (sinon, nous tapons call function()
sur la ligne de commande et nous devons appuyer à nouveau pour que nos remplaçants passent au travers (sans trop savoir pourquoi, mais peu importe).
Quoi qu'il en soit, j'espère que cela aide. Cela prend tout ce qui est en surbrillance avec v
, V
ou C-v
, vérifiez si la première ligne est commentée, si oui, essayez de supprimer le commentaire de toutes les lignes en surbrillance et, dans le cas contraire, ajoutez une couche supplémentaire de caractères de commentaire à chaque ligne. C'est mon comportement souhaité. Je ne voulais pas seulement que chaque ligne du bloc soit commentée ou non. Cela fonctionne donc parfaitement pour moi après avoir posé plusieurs questions sur le sujet.