0
votes

Vim copie et collez des caractères de longueur différents sur plusieurs lignes

J'ai le script shell suivant: xxx

et j'aimerais qu'il devienne: xxx

existe un moyen élégant dans Vim pour faire ça? (sans avoir à copier de la pâte individuellement toutes les variables)

vim

0 commentaires

4 Réponses :


0
votes

Vous pouvez copier tout le bloc, puis remplacer la deuxième partie avec une regex: xxx pré>

mais vous pouvez également utiliser une macro sous différentes formes p>


code> ggycgp code> est un ensemble de commandes qu'un utilisateur VIM utilise parfaitement, le commentaire de Peter sous la réponse de Ingo m'a fait me rappeler que c'est aussi une façon de le faire (hey je l'apprends encore Ça va bien). p>

:% t0 code> est peut-être plus élégant, il t code> est un synonyme de copie, % code> signifie que chaque ligne et 0 code> signifie ligne zéro. Donc, ma solution de regex ressemblerait à celle-là: P>

:%t0<cr>o<esc><cr>:,$s/^\v(.*)\=.*/\1:\1/g


1 commentaires

Je ne savais pas environ% T, merci! Ne cherche pas particulièrement les solutions de golf ici.



0
votes

Vous pouvez utiliser : global code> à itérer sur toutes les lignes (qui commencent par la variable; nous pouvons ensuite réutiliser la suite du modèle de recherche pour capture via la commande gn code>), et appendez em> à un registre (majuscule) que nous pré-initialiser avec une nouvelle ligne, le registre est donc ligne em> et chaque variable ajoutée est séparée avec un caractère de nouvelle ligne:

:let @a="\n"|g/^/norm! "Ayt=
:put a


6 commentaires

Tandis que toujours une approche intéressante et une sorte de réponse à la question dans le titre, je dois vous informer qu'il ne produira pas la production souhaitée. Cependant, il s'agit d'une première étape valide à la sortie souhaitée et j'aime tout à fait l'idée avec le enregistrez et logique pour ajouter à la fin du fichier, vous devez vous en rappeler un ! Merci de vous pour ça!


@Doktoroswaldo: Vous avez raison, ça ne va pas tout le chemin. J'ai traité le doublement de la variable et du séparateur différent en tant que pécularités de l'exemple, pas dans le cadre de la généralisation.


Plus Golf: :% T0 O :, $ NORM YWWC: 0


@Peterrincker c'est une solution vraiment belle, j'ai essayé quelque chose de similaire, mais je ne me souvenais pas du , ce n'était pas une bonne journée hier ... mais il n'y a pas d'excuse pour superviser le < Code>: t commande tête -> table . Merci, maintenant ma réponse ne ressemble pas à quelqu'un avec de gros doigts en putrodi le g clé!


Unkie semble avoir un golf encore plus court: GGQQYWJJO PA: P-KQ @ Q @ QO


Je pense que je vais réutiliser la technique que vous avez décrite assez souvent, merci!



0
votes

Bien que j'aime vraiment les méthodes compactes décrites dans d'autres réponses, voici une explication plus étape par étape.

copiez d'abord les 3 lignes au nouvel emplacement.

puis sélectionnez-les. Allez à la première ligne et appuyez sur vjj . V Démarrer la langue visuelle, puis descendez deux lignes.

Appuyez sur : . Le curseur passe à la ligne de commande, qui est pérencée avec '<,'> . Cela signifie que la commande ne sera exécutée que sur les lignes sélectionnées visuellement (voir : help v _: ). Ensuite, entrez la commande xxx

ceci correspond au nom de la variable du début de la ligne ( ^ ) jusqu'à ce que le = Char et stocke comme "groupe 1" ( \ (... \ \) désigne un groupe). Il correspond également à la fin de la ligne (. * $ ). Le remplacement remplace la ligne entière avec "Groupe 1" ( \ 1 ) suivi de : et ensuite "groupe 1".


3 commentaires

C'est mieux expliqué que ma réponse, mais presque identique. GGYGGP Copie les lignes vers le bas. :., $ est une plage qui se trouve dans ce cas la même plage que votre '<,'> et votre regex fait exactement la même chose que la mienne. Alors que l'explication supplémentaire peut être une jolie réponse AH, je dois m'opposer au mot "cryptique".


Pourquoi ne pas le changer en "compact"?


Le mien est aussi plus court :) Non, tout va bien, pas de mauvais sentiments. Comme je l'ai dit, vos informations supplémentaires peuvent aider la personne à demander. Je voulais juste souligner, qu'il y a beaucoup de façons de faire exactement la même chose et que vous devez vérifier d'autres réponses à cela, sinon nous aurions 300 modèles de regex différents (bien sûr, si vous pensez que le vôtre est meilleur et expliquez pourquoi c'est mieux, c'est parfaitement bien). Bonne journée!



1
votes

Je placerais le curseur sur la première ligne xxx

puis commence à enregistrer une macro xxx

alors faites la première ligne manuellement < / p> xxx

et arrêter l'enregistrement de la macro xxx

puis répétez la macro deux fois, ou autant que nécessaire xxx


2 commentaires

GG est suffisant, il n'y a pas besoin de gg0 . Sinon c'est une belle solution.


0k peut probablement être remplacé par - . Voir : H - . Je trouve - , + et très utile créer de belles macros reproductibles