2009-07-12 7 views
1

Je voudrais obtenir un ET -operator à la commande suivante VimQu'est-ce que AND logique dans Sed/Vim?

:command! -nargs=1 GrepSource :! grep <args> `sed -n 's/^source \(.*\)/\1/p' %` 

telle que je peux utiliser la commande pour trouver des sources à

# source <path> 
# . <path> 
source <path> 
. <path> 

Je ne suis pas sûr que ce soit possible ou ne pas obtenir AND -operator à SED ou Vim.

Comment pouvez-vous ajouter un opérateur ET à la commande SED?

Répondre

1

Vous pouvez simplement utiliser des expressions régulières Vim pour trouver le nom <path>, au lieu d'utiliser sed:

:command! -nargs=1 GrepSource :exe printf("!grep '<args>' '%s'", matchstr(getline('.'), '^#\=\s*\%(source\|\.\)\s*\zs\f\+')) 

Je pense que la commande devrait faire ce que vous voulez. Vous pouvez utiliser la commande suivante pour tester ce qui se passe (« exe » est remplacée par « écho »):

:command! -nargs=1 GrepSourceTest :echo printf("!grep '<args>' '%s'", matchstr(getline('.'), '^#\=\s*\%(source\|\.\)\s*\zs\f\+')) 

La commande doit être utilisé sur une ligne dans l'une des formes suivantes:

# source <somefile> 
# . <somefile> 
source <somefile> 
. <somefile> 
+0

Je n'ai pas réussi à faire fonctionner vos commandes. S'il vous plaît, dites si vos commandes fonctionnent dans votre machine. --- J'utilise Vim 7.2, OS X Leopard. –

+1

J'utilise aussi 7.2 sur OS X 10.5. Quel résultat avez-vous obtenu en utilisant la deuxième commande (GrepSourceTest)? Assurez-vous que votre curseur est sur une ligne quelque chose comme «source » ou «. 'ou' #. ' –

+0

Votre commande est excellente! --- Je n'avais pas en tête une telle commande. --- Je cherchais une commande qui greps tous les PATHs sources. Pour obtenir cela, nous devons filtrer les lignes voulues et les donner à Grep. --- Je ne sais pas comment nous pouvons filtrer/rechercher de telles lignes dans un one-liner. –

2

Je ne suis pas sûr de ce que vous essayez d'atteindre/rechercher. Peut-être que si vous développez ce que vous essayez exactement de faire et ce que l'ET est censé faire, nous pourrions vous aider davantage.

Cette solution exécute de commande vim:

grep PATTERN /some/path/* 

Si vous êtes à la recherche des fichiers dans un répertoire que vous souhaitez utiliser:

ls /some/path | grep PATTERN 

Vous pouvez mettre à jour les éléments pertinents de la commande.

Quoi qu'il en soit ...

À partir de votre script, je suppose que vous avez un chemin spécifiant la ligne à un répertoire que vous voulez grep pour quelque chose, par exemple vous voulez rechercher chemin pour MOTIF, vous positionnez le curseur sur la ligne avec le chemin, alors vous voulez extraire le chemin et grep pour le modèle avec votre commande, ligne d'exemple dans le fichier:

source /some/path 

Cette commande devrait faire ce que vous attendez:

:command! -nargs=1 GrepSource :exe printf("!grep '<args>' '%s'/*", substitute(
getline('.'), "\\%(source\\s*\\)\\(.*\\)$", "\\1","")) 

avec le curseur sur la ligne avec un chemin commençant source de mot, vous pouvez exécuter la commande ci-dessus:

:GrepSource PATTERN 

Ceci recherche les fichiers «/so moi/chemin/'pour le mot MOTIF.

Je suppose chemins d'accès dans votre fichier ne se terminent pas avec slash «/» et je suppose que vous voulez rechercher dans les fichiers, donc j'APPEND «/* » à la fin du chemin de recherche, se terminant par commande:

grep PATTER /some/path/* 

J'ai utilisé la commande substitute qui remplace

source /some/path 

avec

/some/path 

Qui est ensuite utilisé dans printf pour créer la commande actuelle.

+0

@stefanB: Je cours sans succès votre commande. --- Son but semble être le même que "trop ​​de php". La différence est l'utilisation de 'substitute' et de regex. –