Comment insérer du texte au début d'une sélection multiligne dans vi / Vim

423

Dans Vim , comment insérer des caractères au début de chaque ligne d'une sélection?

Par exemple, je veux commenter un bloc de code en ajoutant //au début de chaque ligne en supposant que le système de commentaires de ma langue ne permet pas de commenter les blocs comme /* */. Comment pourrais-je faire ça?

Jordan Parmer
la source

Réponses:

748
  • Appuyez Escpour entrer dans le «mode de commande»
  • Utilisez Ctrl+ Vpour entrer en mode de blocage visuel
  • Déplacez Up/ Downpour sélectionner les colonnes de texte dans les lignes que vous souhaitez commenter.
  • Appuyez ensuite sur Shift+ iet tapez le texte que vous souhaitez insérer.
  • Appuyez ensuite sur Esc, attendez 1 seconde et le texte inséré apparaîtra sur chaque ligne.

Pour plus d'informations et de lecture, consultez " Insérer du texte sur plusieurs lignes " dans le wiki Vim Tips.

pixelbeat
la source
6
Le seul problème avec cela est qu'il semble que Ctrl + V est remplacé dans GVIM.
Jordan Parmer
14
Pas pour moi (sous Linux) ce n'est pas
pixelbeat
23
Vous pouvez utiliser Ctrl-Q comme remplacement dans gVim (comme: l'aide Ctrl-V explique) mais vous devez utiliser hjkl pour naviguer dans ce mode plutôt que les touches fléchées
Gareth
9
Si votre ctrl-v est remplacé dans windows gvim, vous devez modifier le vimrc global pour arrêter d'inclure mswin.vim.
graywh
18
Une idée pourquoi cela ne ferait rien après avoir poussé esc? J'ai attendu environ 10 secondes pour que quelque chose se passe sur moins d'une centaine de lignes - Peu importe, je ne poussais Shift + vpas CTRL + v. @ vkaul11 Probablement la même chose que ce que vous avez fait lol
Tek
186

Cela remplace le début de chaque ligne par "//":

:%s!^!//!

Cela remplace le début de chaque ligne sélectionnée (utilisez le mode visuel pour sélectionner) par "//":

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

Notez que gv(en mode normal) restaure la dernière sélection visuelle, cela est pratique de temps en temps.

Tomalak
la source
3
Merci! Est parfaitement logique. Et la suppression du texte se déroule comme suit: '<,'> s! ^ // !!
Jordan Parmer
4
Quelle est la signification des points d'exclamation dans la réponse ci-dessus? (:% s! ^! //!)
Henrik K
19
@HKK, normalement on utilise le caractère barre oblique / comme délimiteur pour la commande de recherche et remplacement. Dans ce cas, nous insérons une barre oblique dans le cadre de la recherche et remplaçons donc nous utilisons un délimiteur alternatif, à savoir le caractère d'exclamation!
cyber-moine
+1 Cela fonctionne dans VsVim où (Ctrl + V) (Shiift + I) Esc ne fonctionne pas.
Seth Reno
4
+1, ne savait pas que vous pouviez utiliser autre chose comme délimiteur d'expression régulière (ici j'utilisais /et je devais échapper à l' //:s/^/\/\/:s!^!//
intérieur
83

Le schéma général de recherche et de remplacement est le suivant:

:s/search/replace/

Remplace la première occurrence de «recherche» par «remplacer» pour la ligne actuelle

:s/search/replace/g

Remplace toutes les occurrences de «recherche» par «remplacer» pour la ligne actuelle, «g» est l'abréviation de «global»

Cette commande remplacera chaque occurrence de «recherche» par «remplacer» pour la ligne actuelle uniquement. Le% est utilisé pour rechercher dans tout le fichier. Pour confirmer chaque remplacement, ajoutez de manière interactive un «c» pour confirmation:

:%s/search/replace/c

Interactive confirme le remplacement de «recherche» par «remplacer» pour l'ensemble du fichier

Au lieu du caractère%, vous pouvez utiliser une plage de numéros de ligne (notez que le caractère '^' est un caractère de recherche spécial pour le début de la ligne) :

:14,20s/^/#/

Insère un caractère '#' au début des lignes 14-20

Si vous souhaitez utiliser un autre caractère de commentaire (comme //), modifiez le délimiteur de commande:

:14,20s!^!//!

Insère une séquence de caractères '//' au début des lignes 14-20

Ou vous pouvez toujours simplement échapper les caractères // comme:

:14,20s/^/\/\//

Insère une séquence de caractères '//' au début des lignes 14-20

Si vous ne voyez pas les numéros de ligne dans votre éditeur, tapez simplement ce qui suit

:set nu
cyber-moine
la source
pour supprimer le début #: au lieu de: 14,20s / # / ^ /, vous devez utiliser: 14,20s / # //
cn1h
1
@ cn1h Je pense que cela remplacera également les autres #dans la ligne. Vous devez utiliser à la ^#place.
ankush981
Merci d'avoir expliqué les bases. C'est bon de savoir pourquoi quelque chose se passe.
didierCH
38

Une autre façon qui pourrait être plus simple pour les nouveaux arrivants:

 some█
 code
 here

Placez le curseur sur la première ligne, par exemple en

gg

et tapez ce qui suit pour passer en mode insertion et ajouter votre texte:

I / / Space

 // █some
 code
 here

Appuyez Escsur pour revenir en mode commande et utilisez le digraphe:

j . j .

 // some
 // code
 //█here

jest une commande de mouvement pour descendre d'une ligne et .répète la dernière commande d'édition que vous avez faite.

ninegrid
la source
3
C'est vraiment simple :). Si vous rencontrez des problèmes, c'est peut-être parce que vous tapez une barre (l'autre symbole avec votre \) |au lieu d'une majuscule I. Je pensais que c'était un |premier.
cokedude le
1
Si je fais "5." il supprime 5 caractères de la même ligne. Comment puis-je lui faire supprimer 5 caractères à la fois de chaque ligne?
Rahul Prasad
1
@RahulPrasad Supposons que vous ayez 25 lignes, puis en commençant à l'avant de la première ligne, enregistrez simplement 5xj dans un registre et jouez ce registre 24 fois, par exemple: qa5xjq25 @ a Mais ce serait mieux si vous posiez ceci comme une question s'il n'existe pas déjà ...
ninegrid
26

Et encore une autre façon:

  • Se déplacer au début d'une ligne
  • entrer en mode Visual Block ( CTRL- v)
  • sélectionnez les lignes que vous souhaitez (monter / descendre avec j/ k, ou passer à une ligne avec [ligne] G)
  • presse I(c'est le capital i)
  • tapez le (s) caractère (s) de commentaire
  • presse ESC
Yewge
la source
20

Cela ajoute #au début de chaque ligne:

:%s/^/#/

Et les gens cesseront de se plaindre de votre manque de scripts correctement commentés.

Jar-jarhead
la source
2
Que faire si vous souhaitez ajouter # sur seulement (ou quelques) lignes sélectionnées
Rahul Prasad
15

Si vous voulez être super chic, mettez ceci dans votre .vimrc:

vmap \c :s!^!//!<CR>
vmap \u :s!^//!!<CR>

Ensuite, chaque fois en mode visuel, vous pouvez frapper \cà c omment le bloc et \uà u ncomment il. Bien sûr, vous pouvez changer ces raccourcis clavier en quoi que ce soit.

Lucas Oman
la source
A voté parce qu'il a introduit quelque chose de nouveau - vmap!
ankush981
11

Encore une autre façon:

:'<,'>g/^/norm I//

/^/est juste un modèle factice pour correspondre à chaque ligne. normvous permet d'exécuter les commandes en mode normal qui suivent. I//dit d'entrer en mode insertion tout en déplaçant le curseur au début de la ligne, puis insérez le texte suivant (deux barres obliques).

:g est souvent pratique pour faire quelque chose de complexe sur plusieurs lignes, où vous pouvez sauter entre plusieurs modes, supprimer ou ajouter des lignes, déplacer le curseur, exécuter un tas de macros, etc. Et vous pouvez lui dire de fonctionner uniquement sur des lignes qui correspondre à un modèle.

Brian Carper
la source
1
en fait, la commande: g n'est pas nécessaire. Cela fera: '<,'> norme I //
Cyber ​​Oliveira
1
Et: s est également préférable dans ce cas.
graywh
C'est la réponse la plus utile.
pacifique
3

Pour commenter des blocs de code, j'aime le plugin NERD Commenter .

Sélectionnez du texte:

Shift-V
...select the lines of text you want to comment....

Commentaire:

,cc

Décommenter:

,cu

Ou basculez simplement l'état de commentaire d'une ligne ou d'un bloc:

,c<space>
Kevin
la source
2

Je peux recommander le plugin EnhCommentify .

par exemple. mettez ceci à votre vimrc:

let maplocalleader=','
vmap <silent> <LocalLeader>c <Plug>VisualTraditional
nmap <silent> <LocalLeader>c <Plug>Traditional
let g:EnhCommentifyBindInInsert = 'No'
let g:EnhCommentifyMultiPartBlocks = 'Yes'
let g:EnhCommentifyPretty = 'Yes'
let g:EnhCommentifyRespectIndent = 'Yes'
let g:EnhCommentifyUseBlockIndent = 'Yes'

vous pouvez ensuite commenter / décommenter les lignes (sélectionnées) avec ', c'

Benedikt Waldvogel
la source
3
Vous pouvez également utiliser Nerd Commenter sur vim.org/scripts/script.php?script_id=1218
Nathan Fellman
1

Marquer la zone à commenter comme un bloc visuel ( <C-V)

et fait c#<ESC>p

  1. cle suspendre à "#"
  2. remettre

Si vous le faites souvent, définissez un raccourci (exemple \q) dans votre .vimrc

:vmap \q c#<ESC>p
JJoao
la source
1

Dans le cas où la sélection multi-lignes de quelqu'un est en fait un paragraphe, il n'est pas nécessaire de sélectionner manuellement les lignes. vim peut le faire pour vous:

  1. vip: sélectionnez et marquez le paragraphe entier
  2. shift-i: insérer du texte au début de la ligne
  3. escape: quitter le mode insertion / entrer en mode normal [débuts de ligne toujours sélectionnés]
  4. escape: désélectionner les débuts de ligne
L'invisible
la source
0

Pour insérer "ABC" au début de chaque ligne:

1) Passez en mode commande

2):% norme I ABC

Mac
la source
Cela ajoute le texte à gauche du premier caractère non espace de la ligne.
Kingsley