Comment commenter un bloc de code Python dans Vim

188

Je me demandais s'il y avait un mappage de touches dans Vim pour me permettre d'indenter certaines lignes de code (si ces lignes ont été sélectionnées en mode visuel, ou n lignes au-dessus / en dessous de la position actuelle du curseur).

Donc, fondamentalement, quelque chose qui convertit ce qui suit

def my_fun(x, y):
    return x + y

à

#def my_fun(x, y):
#    return x + y

Je suis d'accord pour utiliser l'un #ou l' autre ou """pour commenter les lignes pertinentes. Idéalement, je voudrais également le même keymapping pour décommenter les lignes si les lignes données ont été commentées.

Rishabh Manocha
la source
Inutile de réinventer la roue, il existe un plugin: tComment for you, qui prend en charge le ( ) commentaire de code pour plusieurs langues.
Meow

Réponses:

416

Étape 1: Accédez à la première colonne de la première ligne que vous souhaitez commenter.

Etat initial

Étape 2: Appuyez sur: Ctrl+ vet sélectionnez les lignes que vous souhaitez commenter:

Sélectionnez des lignes

Étape 3: Shift - I#space(Entrez en mode Insertion à gauche, tapez les caractères à insérer. La sélection disparaîtra, mais toutes les lignes qu'elle contient seront modifiées après l'étape 4.)

Commentaire

Étape 4: Esc

<Échap>

theosp
la source
4
Commenter les lignes de cette façon fonctionne très bien. Existe-t-il un moyen de décommenter ces lignes? Shift-I # <ESC>n'a pas fonctionné (peut-être que je le fais mal).
Rishabh Manocha
42
@ rishabh-manocha: utilisez le bloc visuel (Ctrl-V) pour sélectionner tous les # ajoutés et tapez x pour les supprimer.
theosp
3
Vous devez vous rappeler que Shift-I signifie "insérer au premier non-vide de la ligne", donc il ne peut pas être utilisé pour supprimer. Faire une sélection visuelle avec Ctrl-V marque les caractères à modifier, puis "x" supprime un caractère dans la zone sélectionnée, finissant par supprimer les caractères "#". Voir «: h I» et «: h CTRL-V» dans vim pour plus d'informations.
the Tin Man
5
@Samaursa Ctrl-V ne fonctionne probablement pas sous Windows. Essayez plutôt Ctrl-Q.
AZ.
1
Pour supprimer 2 caractères (si vous avez inséré '#'), localisez le curseur sur la ligne supérieure que vous souhaitez modifier, appuyez sur ctrl-v pour passer en mode bloc visuel, appuyez sur j (ou sur la flèche vers le bas) pour mettre en surbrillance toutes les lignes à modifier, appuyez sur l (ou flèche droite) pour mettre en surbrillance une largeur de 2 caractères (appuyez une fois par colonne pour mettre en surbrillance), puis appuyez sur d pour supprimer le texte en surbrillance.
thinkmassive
73

un sens manuellement

:set number
:10,12s/^/#
ghostdog74
la source
4
comment les supprimez-vous?
Charlie Parker
16
@CharlieParker::10,12s/^#//
bstpierre
1
Thumbs up for ex answer (old school :)
mlv
50

Vous pouvez ajouter le mappage suivant à votre .vimrc

vnoremap <silent> # :s/^/#/<cr>:noh<cr>
vnoremap <silent> -# :s/^#//<cr>:noh<cr>

Mettez en valeur votre bloc avec:

Shift+v

# pour commenter vos lignes de la première colonne.

-# pour décommenter de la même manière.

daté
la source
5
Le simple est génial! Merci!
I159
1
@architectonic cela n'a d'effet que si vous êtes en mode visuel, et '#' n'est pas lié en mode visuel vimdoc.sourceforge.net/htmldoc/visual.html#visual-operators
daté du
1
J'ai modifié un peu: Ctrl + k pour le commentaire "vnoremap <silent> <Ck>: s # ^ # \ ## <cr>: noh <cr>"> Ctrl + u pour décommenter: "vnoremap <silent> <Cu >: s # ^ \ ### <cr>: noh <cr> "
Pradip Das
1
@JonathanHartley vous n'avez pas à utiliser '/' dans ce cas '#' est le délimiteur. Donc: s / ^ / # / et: s / ^ # // sont les substitutions équivalentes. Remplacez donc le début de la ligne par «#» et remplacez «#» à la première colonne par «». <cr>: noh <cr> efface simplement la chaîne de recherche afin que rien ne soit laissé en surbrillance lorsque vous avez terminé.
cdu
1
@JonathanHartley honnêtement, je pense que je viens de suivre un modèle sans y penser. Maintenant, je suis surpris que # vs / ne soit pas venu plus tôt. Changé la réponse basée sur le bon sens. Merci!
2016
27

Mettez en valeur votre bloc avec: ShiftV

Commentez le bloc sélectionné avec: :norm i#(i minuscule)

Pour décommenter, mettez à nouveau votre blocage en surbrillance et supprimez les commentaires avec: :norm ^x

La :normcommande exécute une action pour chaque ligne sélectionnée. Commenter insérera un #au début de chaque ligne, et décommenter le supprimera #.

user2437225
la source
Avec un Vim à jour et une configuration simple, la sélection de lignes en mode visuel (avec Shift+v) puis l'utilisation :norm i#ne modifie que la première ligne sélectionnée. Cela fonctionne pour moi de commenter les lignes 389 à 391::389,391norm i #
mmell
22

Je balaie généralement un bloc visuel ( <C-V>), puis recherche et remplace le premier caractère par:

:'<,'>s/^/#

(L'entrée en mode commande avec un bloc visuel sélectionné place automatiquement '<,'> sur la ligne de commande) Je peux ensuite décommenter le bloc en balayant le même bloc visuel et:

:'<,'>s/^#//

la source
19

Il existe de bons plugins pour aider à commenter / décommenter les lignes. Par exemple, The NERD Commenter .

Geoff Reedy
la source
9

J'ai les lignes suivantes dans mon .vimrc:

" comment line, selection with Ctrl-N,Ctrl-N
au BufEnter *.py nnoremap  <C-N><C-N>    mn:s/^\(\s*\)#*\(.*\)/\1#\2/ge<CR>:noh<CR>`n
au BufEnter *.py inoremap  <C-N><C-N>    <C-O>mn<C-O>:s/^\(\s*\)#*\(.*\)/\1#\2/ge<CR><C-O>:noh<CR><C-O>`n
au BufEnter *.py vnoremap  <C-N><C-N>    mn:s/^\(\s*\)#*\(.*\)/\1#\2/ge<CR>:noh<CR>gv`n

" uncomment line, selection with Ctrl-N,N
au BufEnter *.py nnoremap  <C-N>n     mn:s/^\(\s*\)#\([^ ]\)/\1\2/ge<CR>:s/^#$//ge<CR>:noh<CR>`n
au BufEnter *.py inoremap  <C-N>n     <C-O>mn<C-O>:s/^\(\s*\)#\([^ ]\)/\1\2/ge<CR><C-O>:s/^#$//ge<CR><C-O>:noh<CR><C-O>`n
au BufEnter *.py vnoremap  <C-N>n     mn:s/^\(\s*\)#\([^ ]\)/\1\2/ge<CR>gv:s/#\n/\r/ge<CR>:noh<CR>gv`n

Les raccourcis conservent la position de votre curseur et vos commentaires tant qu'ils commencent par #(il y a un espace après #). Par exemple:

# variable x
x = 0

Après avoir commenté:

# variable x
#x = 0

Après avoir décroché:

# variable x
x = 0
Lukas Cenovsky
la source
Bien, mais je pense que vous feriez mieux d'utiliser une s/^/#/expression régulière plus simple . Je préfère que le caractère de commentaire apparaisse au début de la ligne ... mais bien plus important encore, «commenter les commentaires» est vraiment assez important. Je laisserais également tomber le au BufEnter *.py, car les #commentaires sont suffisamment généraux pour que les commandes soient utilisées par défaut dans tous les tampons.
travc
5

Franchement, j'utilise un plugin tcomment pour ce lien . Il peut gérer presque toutes les syntaxes. Il définit de jolis mouvements, son utilisation avec des adaptateurs de blocs de texte spécifiques à python en fait un outil puissant.

Darek
la source
5

NERDcommenter est un excellent plugin pour commenter qui détecte automatiquement un certain nombre de types de fichiers et leurs caractères de commentaire associés. Ridiculement facile à installer avec Pathogen .

Commentez avec <leader>cc. Décommentez avec <leader>cu. Et basculez les commentaires avec <leader>c<space>.

(La <leader>clé par défaut dans vim est \)

Abid H. Mujtaba
la source
3

Il existe de nombreux plugins de commentaires pour vim - dont certains sont multilingues - pas seulement python. Si vous utilisez un gestionnaire de plugins comme Vundle, vous pouvez les rechercher (une fois que vous avez installé Vundle) en utilisant par exemple:

:PluginSearch comment

Et vous obtiendrez une fenêtre de résultats. Sinon, vous pouvez simplement rechercher des scripts vim pour les plugins de commentaires .

Pierz
la source
3

Aucun plug-in ou mappage requis. Essayez la commande "norm" intégrée, qui exécute littéralement tout ce que vous voulez sur chaque ligne sélectionnée.

Ajoutez des commentaires

1. shift V to visually select lines
2. :norm i#

Supprimer # commentaires

1. visually select region as before
2. :norm x

Ou si vos commentaires sont en retrait, vous pouvez le faire :norm ^x

Notez que ce ne sont que des commandes vim ordinaires précédées de ": norm" pour les exécuter sur chaque ligne.

Réponse plus détaillée pour l'utilisation de la commande "norm" dans l'une des réponses ici

Quel est le moyen rapide de commenter / décommenter des lignes dans Vim?

Magnus
la source
1

Un plugin léger très minimal : vim-commentary.

gccpour commenter une ligne
gcgcà décommenter. consultez la page du plugin pour en savoir plus.

v+k/jmettez le bloc en surbrillance puis gccpour commenter ce bloc.

yantaq
la source
0

CtrlK pour commentaire (mode visuel):

vnoremap <silent> <C-k> :s#^#\##<cr>:noh<cr>

CtrlU pour décommenter (mode visuel):

vnoremap <silent> <C-u> :s#^\###<cr>:noh<cr>
Pradip Das
la source