Existe-t-il un moyen d'insérer « » dans la même colonne, car toutes les lignes ne sont pas de même longueur, donc la ligne 1 peut avoir « » dans la 15e colonne, mais la ligne 2 a «*» dans la 25e colonne.
Aman Jain
11
il n'y a qu'un seul EOL par ligne, donc l' gindicateur n'est pas nécessaire.
doubleDown
Je voulais ajouter / au début de chaque ligne: 1, $ s / ^ / \ / g fonctionnait pour moi.
farooqsadiq
@dirkgently Comment puis-je passer une variable de chaîne comme argument à cette commande (vous savez, au lieu du *)?
Matheus Rotta
353
Encore plus court que la commande: search:
:%norm A*
Voilà ce que cela signifie:
%=for every line
norm = type the following commands
A*= append '*' to the endof current line
Man, il n'existe pas de fil vi ou vim dont je n'apprends rien. Aujourd'hui, j'apprends la norme. Et comme on dit à Cheers, "Norm!"
smcameron
4
Pour le préfixe, vous devez simplement utiliser 0i *, 0 vous amène au début de la ligne, i pour le mode d'insertion et * pour le *. D:
Rob
7
En tant que VimGolfer, je ne peux pas m'empêcher d'ajouter que l'utilisation I*plutôt que vous 0i*fera économiser une touche.
Jedidiah Hurt du
24
Une autre astuce: Cela fonctionne également pour les gammes. Mettez simplement en surbrillance les lignes en mode visuel et appuyez sur :, cela pré-remplira la commande avec :'<,'>laquelle vous pourrez ensuite effectuer:'<,'>norm A*
Ahhh ... La seconde peut aussi être utilisée avec une sélection de lignes. Agréable!
Tim Fletcher
Pourriez-vous expliquer le premier exemple?
Cody Poll
@CodyPoll gest une globalcommande qui fait quelque chose avec chaque ligne correspondante. $correspond à chaque ligne. Ce pourrait être aussi ^ou .*. La norme exécute les commandes que vous utilisez normalement en mode commande. A*Signifie donc ajouter *à la fin de la ligne.
defhlt
41
Je pense que l'utilisation du mode bloc visuel est une méthode meilleure et plus polyvalente pour faire face à ce type de chose. Voici un exemple:
Thisis the First line.Thisis the second.The third.
Pour insérer "Bonjour tout le monde". (espace + presse-papiers) à la fin de chacune de ces lignes:
Sur un caractère de la première ligne, appuyez sur Ctrl-V (ou Ctrl-Q si Ctrl-V est collé).
Appuyez sur jj pour étendre le bloc visuel sur trois lignes.
Appuyez sur $ pour étendre le bloc visuel jusqu'à la fin de chaque ligne. Appuyez sur A puis sur Espace puis tapez Hello world. + puis Esc.
Le résultat est:
Thisis the First line.Hello world.Thisis the second.Hello world.The third.Hello world.
Au lieu d'appuyer sur jjon peut frapper Gpour passer à la dernière ligne. Ceci est utile dans les fichiers volumineux, où appuyer jjusqu'à ce que vous atteigniez la dernière ligne n'est pas pratique.
nash
Convenez que le bloc visuel est le plus propre ici, plus extensible aussi
Peter Dolan
Notez que cela ne semble pas fonctionner sur toutes les lignes au début, mais après avoir appuyé sur Echap, il passe et l'ajoute à tous.
Noumenon
Visual Block provoque des problèmes et des erreurs lors de l'utilisation de vim comme extension pour d'autres choses, comme VS Code. Dans ces cas, la recherche et le remplacement demandés par l'utilisateur d'origine constituent l'option fiable.
Brettins
assurez-vous que vous utilisez Capital A, "a" en minuscule ne fonctionne pas.
Jeff Hoye
14
Si vous voulez ajouter Hello world à la fin de chaque ligne:
:%s/$/HelloWorld/
Si vous voulez le faire pour un nombre spécifique de lignes, par exemple de 20 à 30, utilisez:
:20,30s/$/HelloWorld/
Si vous voulez le faire au début de chaque ligne, utilisez:
Cela trouvera chaque ancre de fin de ligne et la remplacera par *. Je dis "substitut" mais, en fait, c'est plus un ajout car l'ancre est une chose spéciale plutôt qu'un caractère régulier. Pour plus d'informations, voir Puissance de g - Exemples .
Que signifie s // dans l'expression régulière? Je connais une commande similaire,: g / / / p, (grep). Je suis presque sûr que votre commandement est proche du mien, du moins dans la structure.
Léo Léopold Hertz
1
Le s est un substitut - il remplace l'ancre de fin de ligne par l'astérisque (enfin, ne le remplace pas réellement car c'est un point d'ancrage).
paxdiablo
3
:% s / \ n / * \ r / g
Votre premier est correct ailleurs, mais Vim doit avoir un traitement de nouvelle ligne différent pour une raison quelconque.
Dans ma version de Vim \ n fonctionne, mais cela remplace simplement la nouvelle ligne par un *, joignant efficacement les lignes.
Nathan Fellman
1
Cette commande est vérifiée pour fonctionner correctement sur toutes les versions de Vim que j'ai essayées. Utilisez-vous la version Windows ou quelque chose?
1
%s/\s*$/\*/g
cela fera l'affaire et garantira que les espaces de tête sont ignorés.
:s///
,\n
correspond à un caractère nul. La section:help sub-replace-special
est pertinente.Réponses:
:%s/$/\*/g
devrait marcher. Il
:%s/$/*/g
en va de même comme MrWiggles le souligne correctement.la source
g
indicateur n'est pas nécessaire.Encore plus court que la commande: search:
Voilà ce que cela signifie:
la source
I*
plutôt que vous0i*
fera économiser une touche.:
, cela pré-remplira la commande avec:'<,'>
laquelle vous pourrez ensuite effectuer:'<,'>norm A*
I
plutôt -:%norm I*
Aussi:
Aussi:
la source
g
est uneglobal
commande qui fait quelque chose avec chaque ligne correspondante.$
correspond à chaque ligne. Ce pourrait être aussi^
ou.*
. La norme exécute les commandes que vous utilisez normalement en mode commande.A*
Signifie donc ajouter*
à la fin de la ligne.Je pense que l'utilisation du mode bloc visuel est une méthode meilleure et plus polyvalente pour faire face à ce type de chose. Voici un exemple:
Pour insérer "Bonjour tout le monde". (espace + presse-papiers) à la fin de chacune de ces lignes:
Le résultat est:
(exemple de Vim.Wikia.com )
la source
jj
on peut frapperG
pour passer à la dernière ligne. Ceci est utile dans les fichiers volumineux, où appuyerj
jusqu'à ce que vous atteigniez la dernière ligne n'est pas pratique.Si vous voulez ajouter Hello world à la fin de chaque ligne:
Si vous voulez le faire pour un nombre spécifique de lignes, par exemple de 20 à 30, utilisez:
Si vous voulez le faire au début de chaque ligne, utilisez:
la source
Vous n'avez pas vraiment besoin du
g
à la fin. Cela devient donc:Ou si vous voulez juste
*
la fin, dites les lignes 14-18:ou
la source
... et ajouter (ajouter le début de) chaque ligne avec *,
la source
Une option est:
Cela trouvera chaque ancre de fin de ligne et la remplacera par
*
. Je dis "substitut" mais, en fait, c'est plus un ajout car l'ancre est une chose spéciale plutôt qu'un caractère régulier. Pour plus d'informations, voir Puissance de g - Exemples .la source
Votre premier est correct ailleurs, mais Vim doit avoir un traitement de nouvelle ligne différent pour une raison quelconque.
la source
cela fera l'affaire et garantira que les espaces de tête sont ignorés.
la source