7
votes

Greping de Vim (avec un tuyau)

Je souhaite créer une liste 'Quickfix' (voir : Aide QuickFix ) avec tous les fichiers contenant des lignes avec "ABC" mais non "XYZ". J'espérais pouvoir exécuter la commande Vim Ex suivante: XXX

Malheureusement, Vim n'aime pas le "tuyau" et la commande échoue. Quelle est la meilleure façon de faire cela de Vim?


2 commentaires

Êtes-vous sûr de ne pas vouloir dire :! ... ? (point d'exclamation)


Oui. Si vous utilisez le "!", Il ne revient pas comme une liste "Quickfix".


5 Réponses :


-1
votes

Vous pouvez définir grepprg , qui définit la commande Vim utilise pour exécuter : grep . Cela peut prendre un tuyau, bien que je ne l'ai pas essayé.

Bien sûr, cela affecterait tous votre : grep s


1 commentaires

Il ne semble pas prendre un tuyau. Ou du moins, cela ne fonctionne pas pour moi: "SET GREPPRG = GRPPRG = GRP \ -N \ $ * \ | \ \ CUT \ -C \ 1- $ colonnes" (également essayé avec un "\ 'avant le" |'. Il donne "non une commande d'éditeur: CUT -C 1- $ Colonnes". Peut-être] il doit être échappé correctement, mais je n'ai pas encore compris comment.



4
votes

Pour une raison quelconque, je ne peux pas laisser celui-ci seul!

Que diriez-vous d'utiliser :! grep ...> Nom de fichier suivi de : nom de fichier , qui ouvrira la sortie comme une liste Quickfix.


0 commentaires

1
votes

Vous pouvez le faire en deux étapes:

:call Mygrep("abc", "xyz")


1 commentaires

J'aime le | coupon partie. Je ne savais pas que tu pouvais faire ça! Il n'apparaît pas que les parenthèses sont nécessaires pour la commande externe Grep.



1
votes

Je viens de comprendre comment échapper : greppprg code> pour utiliser un tuyau.

Dans mon cas, mon : greppprg code> est basé sur l'utilitaire couvercle code> de gnu idutils. Je souhaite que la sortie du programme code> Lid code> soit triée. C'est parce que lorsque j'utilise un motif, couvercle code> trouve des correspondances en dehors de la commande. Je veux rechercher un motif comme, disons, pthread. * Verrouillage code> et traverser les correspondances afin de suivre la nicheur de verrouillage et de ne pas sauter entre les fichiers d'une manière qui suit l'ordre interne de la ID code> de base de données générée par mkid code>, qui entremende les correspondances de différents fichiers. P> BlockQuote>

Le tuyau nécessite une double échappée. Il semble que VIM finit par traiter la valeur de greppprg code> comme matériau de commande. Si vous échappez à la pipe juste une fois, elle est interprétée comme syntaxe Vim. P>

donc ce que j'ai maintenant dans mon .vimrc code> est-ce: p>

 :g/xyz/d


0 commentaires

2
votes

C'est de nombreuses années plus tard, mais j'ai trouvé une alternative plus directe. CEXPR code> commande dans VIM. Il implémente à peu près les réponses de @jwd et @skeetpt, et est un peu plus flexible car elle accepte une liste.

ci-dessous est un exemple d'utilisation de mien qui utilise des pipes. Je préfixe toutes mes questions dans mes notes de travail avec q: code> pour les trouver rapidement. Je voulais utiliser Quickfix List and Vim pour parcourir des questions, affiché le premier premier. P> xxx pré>

extrait pertinent de l'aide VIM. P>

:cex[pr][!] {expr}  Create a quickfix list using the result of {expr} and
            jump to the first error.
            If {expr} is a String, then each new-line terminated
            line in the String is processed using the global value
            of 'errorformat' and the result is added to the
            quickfix list.
            If {expr} is a List, then each String item in the list
            is processed and added to the quickfix list.  Non
            String items in the List are ignored.
            See |:cc| for [!].
            Examples: >
                :cexpr system('grep -n xyz *')


0 commentaires