web-dev-qa-db-fra.com

Commentant plusieurs lignes de code, spécifiées par des numéros de ligne, en utilisant VI ou VIM

J'ai appris de cette question de débordement de pile qu'il est possible d'utiliser vi/vim pour commenter une gamme spécifiée de numéros de ligne. Par exemple, supposons que j'ai le script Bash suivant:

#!/bin/bash

This
is
my
very
very
great
script

Supposons maintenant que je souhaite commenter les numéros de ligne 6 à 8 (qui contiennent les mots very, very et great) en utilisant le # caractère de commentaire. Dans vi/vim, je peux simplement taper :6,8s/^/# Pour obtenir ce qui suit:

#!/bin/bash

This
is
my
#very
#very
#great
script

qui commente les lignes 6 à 8.

Ma question est qu'il est possible de taper une doublure similaire qui sera Supprimer Le # caractère de commentaire des lignes 6 à 8 (mais pas d'autres lignes commentées dans le fichier)?

Cela dit, je me rends compte qu'il y a un débat sur si j'utilise réellement vi ou vim. En pratique, j'ouvre un fichier script.sh avec la commande vi script.sh. Aussi, quand je tape la commande which vi, J'obtiens /usr/bin/vi. Néanmoins, quand je tape simplement vi et appuyez sur Enter, J'obtiens ceci:

~                              VIM - Vi IMproved
~
~                               version 7.2.330
~                           by Bram Moolenaar et al.
~                 Vim is open source and freely distributable
~
~                           Sponsor Vim development!
~                type  :help sponsor<Enter>    for information
~
~                type  :q<Enter>               to exit
~                type  :help<Enter>  or  <F1>  for on-line help
~                type  :help version7<Enter>   for version info

ce qui semble suggérer que j'utilise réellement vim. J'accède à un cluster ubuntu linux distant à l'aide de SSH de mon PC. Je n'utilise pas une interface graphique Ubuntu Linux.

21
Andrew

Vous pouvez utiliser:

:6,8s/^#//

Mais beaucoup plus facile est d'utiliser le mode de sélection visuel du bloc: aller au début de la ligne 6, appuyez sur Ctrl-v, descendre à la ligne 8 et appuyez sur x.

Il y a aussi "le commentateur NERD" Plugin.

22
jofel

Je connais votre question spécifie à l'aide de vi ou vim mais voici quelques autres options pour ce faire sans avoir à ouvrir manuellement le fichier:

  • Perl

    Perl -ne 'if($. <=8 && $. >= 6){s/^\s*#//;}print' foo.sh 
    
  • Version Perl> = 5.10

    Perl -ne '$. ~~ [6..8] && s/^\s*#//;print' foo.sh 
    

    Cela imprimera le contenu du fichier, vous pouvez soit rediriger vers un autre (> new_file.sh) ou utiliser i pour éditer le fichier en place:

    Perl -i -ne '$. ~~ [6..8] && s/^\s*#//;print' foo.sh 
    
  • sed

    sed '6,8 s/^ *#//' foo.sh
    

    Encore une fois, pour modifier le fichier d'origine en place, utilisez i:

    sed -i '6,8 s/^ *#//' foo.sh
    
  • awk/gawk etc:

    gawk '(NR<=8 && NR>= 6){sub("^ *#","")}{print}' foo.sh
    
  • Pure bash:

    c=1; while read line; do 
      if [ $c -ge 6 ] && [ $c -le 8 ]; then 
         echo "${line/\#/}"
      else 
         echo $line 
      fi
      let c++; done < foo.sh
    
7
terdon

vi est un lien symbolique à vim dans la plus grande distribution GNU/Linux, donc vous utilisez effectivement vim lorsque vous tapez vi.

Pour supprimer les commentaires, vous pouvez taper: :6,8s/^#// ou :6,8s/^\s*#// Pour supprimer un espace de pointe avant le # symbole.

4
lgeorget

Vous utilisez probablement vim.tiny. En tout cas, vous pouvez supprimer les commentaires initiaux avec:

:6,8s/^#//

Bien sûr, si vous les insérez d'une manière différente (par exemple, avec un espace supplémentaire), vous devrez peut-être supprimer tout autre. Avec Vim complet, la sélection visuelle de colonnes et d'insertion/suppression de caractères est un moyen plus facile de faire la même chose.

3
Paulo Almeida

Personnellement, ma manière préférée utilise le mode Visual Block

ctrlv Pour entrer en mode bloc visuel, utilisez les touches fléchées ou HJKL pour sélectionner les lignes et appuyez sur x ou del.

Veux-y retourner?

ctrlv faire la sélection, alors I (capitale I) #Esc

3
exussum

Les réponses ci-dessus, en utilisant

:6,8s/^#//

sont une solution parfaite, mais un peu encombrant à taper. Cela peut être simplifié en définissant de nouvelles commandes dans ~/.vimrc.

command -range=% C :<line1>,<line2>s/^/#/
command -range=% D :<line1>,<line2>s/^#//

Et vous pouvez simplement taper

:6,8C
:6,8D

placer/supprimer la commande.

Si vous aimez le mode Visual, vous pouvez définir des cartes

map <F7> :s/^/#/<CR>
map <F8> :s/^#//<CR>

De sorte que vous devez seulement sélectionner une plage de ligne en mode visuel et appuyez sur F7 et F8 mettre et supprimer des commentaires respectivement.

2
Bernhard

Il y a ce plugin à changement de vie par tpope appelé vim-commentary

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

Ce plugin fournit :

  • Santé mentale
  • Commentaires correctement indentés
  • Ne commente pas les lignes vides/inutiles

Utilisation :

  • Installez via vundle (ou pathogène je suppose).
  • Mettez en surbrillance votre texte et appuyez sur : qui montrera comme :<,'>
  • Tapez le commentaire ici :<,'>Commentary et appuyez sur Entrée.
  • Bom. Votre bourgeon fait.
1
Weston Ganger