Comment puis-je tirer toutes les lignes correspondants dans un tampon?
Comment vous tirez-vous de toutes les lignes correspondants dans un tampon?
Donné un fichier comme:
match 1
skip
skip
match 2
match 3
skip
Je veux être capable d'une commande pour copier toutes les lignes qui correspondent à un modèle (/^/match pour cet exemple) en un seul tampon, de sorte que je puisse le mettre dans un autre doc, ou pour en faire un résumé ou quoi que ce soit.
La commande doit le vent jusqu'à présent dans une mémoire tampon:
match 1
match 2
match 3
Ma première pensée a été d'essayer:
:g/^match/y
Mais je viens d'obtenir le dernier match. Cela est logique, car l' :g commande est effectivement de répéter le y
pour chaque correspondance ligne.
Peut-être il ya un moyen d'ajouter d'un coup sec de la mémoire tampon, plutôt que de l'écraser. Je ne pouvais pas le trouver.
- J'ai été faire ce genre de chose tous les jours et de trouver la solution à moins que je le voudrais. Je ne
qaq
suivie par:g/pattern/normal "AY
(n'a pas remarqué l' :yank commande avant), puis aller à mon tampon et le coller. N'est-il pas directement rediriger directement dans un tampon? (Auparavant, j'avais été faire:redir @a
:g/pattern/
:redir END
, donc c'est certainement un pas dans la bonne direction, mais je veux juste un. plus. étape...) 🙂 je suppose que je pourrais écrire une fonction assez facilement... - J'ai à la fois upvoted cette question parce qu'elle a été utile pour moi et a voté pour la fermer parce que c'est le seul moyen que je vois pour dire "ce doit être sur superuser.com". C'est une bonne question, mais je pense que c'est le bon endroit pour cela. Désolé qu'une "près" le vote est le seul moyen de voter pour se déplacer.
- Je crois que cette question est antérieure de super-utilisateur. Devrait probablement être migré, cependant.
Vous devez vous connecter pour publier un commentaire.
Spécifier une lettre majuscule, comme le registre de nom afin d'y ajouter, comme
:yank A
.:g/^match/"Ay
(comme je l'ai dit) ce que vous devez faire .e.g:g/^match/normal "Ayy
ou:g/^match/yank A
.:g/^match/yank A
Cela exécute la commande globale pour tirer toute la ligne qui correspond à
^match
et le mettre dans le registrea
. Parce quea
est en majuscules, au lieu de juste mettre le registre à la valeur, il va s'y ajouter. Depuis le mondial de commande, exécutez la commande sur toutes les lignes correspondants, comme un résultat que vous obtiendrez toutes les lignes ajoutées les unes aux autres.Ce que cela signifie, c'est probablement que vous souhaitez réinitialiser le registre à une chaîne vide avant de commencer:
:let @a=""
.Et naturellement, vous pouvez utiliser le même avec un nom de registre.
:%g/regexp/let @"=@".getline('.')
. Il rejoint les lignes ensemble, même s'il peut être un moyen de contourner cela.Oh je viens de réaliser après avoir commenté plus haut, il est facile de tirer en correspondance des lignes dans une mémoire tampon temporaire...
:r !grep "pattern" file.txt
Solutions les plus simples une fois que vous avez renoncé à les trouver. 🙂
:call setreg('a', system('grep "pattern" file.txt'))
ou tout simplement:let @a=system('grep "pattern" file.txt')
si vous le souhaitez, dans un registre.expand('%')
pour le tampon courant du nom de fichier, par exemple:let @a=system('grep "pattern" '.expand('%'))