2009-09-25 5 views
38

Comment faites-vous passer toutes les lignes correspondantes dans un tampon?Comment supprimer toutes les lignes correspondantes dans un seul tampon?

Suivant un fichier comme:

match 1 
skip 
skip 
match 2 
match 3 
skip 

Je veux être question capable d'une commande Yank toutes les lignes qui correspondent à un modèle (/^verserons/pour cet exemple) dans un seul tampon afin que je puisse mettre dans un autre document, ou dans un résumé ou quoi que ce soit.

La commande devrait vent avec ceci dans un tampon:

match 1 
match 2 
match 3 

Ma première pensée était d'essayer:

:g/^match/y 

Mais je reçois juste le dernier match. Cela est logique, car la commande: g répète effectivement le y pour chaque ligne correspondante.

Peut-être il est un moyen pour ajouter un coup sec au tampon, au lieu de l'écraser. Je ne pouvais pas le trouver.

+1

je fais ce genre de choses toute la journée et trouver la solution à moins que je voudrais. Je '' qaq' suivi par: g/modèle/normal « AY' (n'a pas remarqué la commande: coup sec avant) puis aller à mon tampon et collez-le est-il pas aller de l'avant droit de rediriger directement dans un tampon.? (Auparavant, je faisais ': redir @ a' ': g/pattern /' ': redir END', donc c'est certainement un pas dans la bonne direction, mais je veux juste un. More ... step ...) :-) Je suppose que je pourrais écrire une fonction assez facilement ... –

+0

et je l'ai upvoted cette question parce qu'il m'a été utile et a voté pour le fermer parce que c'est la seule façon que je vois de dire « cela devrait être sur superuser.com "C'est une bonne question, mais je pense que c'est le bon endroit pour cela Désolé, un vote" proche "est la seule façon de voter pour se déplacer –

+0

@NathanLong, je crois que cette question est antérieure au super utilisateur. – daotoad

Répondre

14
:help registers 
:help quote_alpha 

Spécifiez une lettre majuscule comme nom de registre afin d'y ajouter du contenu, comme :yank A.

67

:g/^match/yank A

Cette exécute la commande globale pour tirer sur une ligne qui correspond ^match et le mettre dans le registre a. Parce que a est en majuscules, au lieu de simplement définir le registre à la valeur, il y ajoutera. Étant donné que la commande globale exécute la commande sur toutes les lignes correspondantes, toutes les lignes seront ajoutées l'une à l'autre.

Ce que cela signifie est que vous voulez probablement réinitialiser le registre à une chaîne vide avant de commencer: :let @a="".

Et naturellement, vous pouvez utiliser la même chose avec un registre nommé.

+22

Ce qui est implicite ici est qu'on ne peut pas ajouter au tampon sans nom, du moins pas dans une seule commande. Vous devrez peut-être d'abord effacer le tampon: : let @ a = "" –

+8

Juste un conseil si vous optimisez pour les frappes de touches. L'effacement du registre peut être effectué plus rapidement, en enregistrant une macro qaq vide. – slawek

+0

@ J.A.Faucett sans nom * registre *, pas de tampon. En outre, vous pouvez le faire (basé sur cette réponse) (http://stackoverflow.com/a/18536633/210945)): ':% g/regexp/let @" = @ ". Getline ('. ') '. Il unit les lignes, bien qu'il puisse y avoir un moyen de contourner cela. – naught101

7

Oh, je viens de réaliser après des commentaires ci-dessus qu'il est facile de tirer sur les lignes correspondant dans une mémoire tampon temporaire ...

:r !grep "pattern" file.txt

Les solutions les plus simples viennent une fois que vous avez renoncé à les trouver. :)

+1

': appelez setreg ('a', system ('grep' pattern 'file.txt'))' ou simplement ': let @ a = systeme ('grep' pattern" fichier.txt ') 'si vous le voulez dans un registre. – sabgenton

+2

Une solution plus générale peut utiliser 'expand ('%')' pour le nom de fichier du tampon courant, par ex. ': let @ a = systeme ('grep' pattern '' .expand ('%'))' –

Questions connexes