2010-04-29 7 views
4

Par exemple, j'ai du code et j'utilise "*" pour chercher quelque chose dans ce code. Ne trouvant pas ce que je veux dans ce fichier, je voudrais utiliser quelque chose comme ack ou grep pour le chercher dans le répertoire local. Je sais que je peux faire :! ack whatever pour faire la recherche depuis vim, mais ce que je voudrais savoir, c'est s'il y a un moyen de remplacer whatever par le mot actuellement recherché dans vim.Comment récupérer le texte actuellement recherché dans vim?

Répondre

1

Riffing hors de Tim Henigan's answer, mettez dans votre .vimrc

cmap <C-R>/ <C-R>=substitute(substitute(@/, '^\\<', '', ''), '\\>$', '', '') 

Maintenant, lorsque vous appuyez sur CTRL-R / en mode ligne de commande, il baissera le mot marqueurs Boundry, de sorte que vous devriez être en mesure d'utiliser

:!grep CTRL-R / file-list
+0

Génial, c'est exactement ce que je cherchais.J'ai modifié un peu le mappage pour éviter d'avoir à appuyer deux fois sur la touche Entrée: 'cmap / = substitut (substitue (@ /, '^ \\', '', ''), '\\ > $ ',' ',' ') ' –

+0

Une autre option consiste à utiliser la commande de recherche' g * 'plutôt que' * '. Voir ma réponse mise à jour pour plus de détails: http://stackoverflow.com/questions/2739135/how-to-retrieve-the-currently-searched-for-text-in-vim/2739223#2739223 –

+0

'ctrl-r' suivi de '/' insère le texte du registre de recherche, mais si vous deviez faire 'ctrl-r' suivi de n'importe quelle lettre sur le clavier, cela insèrerait le contenu du registre correspondant. Outre les lettres, il existe d'autres registres spéciaux, tels que '.' (le dernier texte entré),'% '(le nom de fichier actuel), etc. En remappant' ctrl-r', vous verrouillez tous les raccourcis utiles possibles être construit à partir de ces différents registres. – nelstrom

0

Vous pouvez tirer sur le mot dans un registre et utiliser le @regnum dans la ligne de mode commande

« 1YW : grep @ 1

+0

La dernière chaîne de recherche est déjà dans le/registre –

1

Je ne l'ai pas trouvé un moyen de (facilement) passe le contenu d'une recherche inscrivez-vous un programme externe, sans avoir recours à applications clés et statmements eval

Cependant, vous pouvez utiliser <cword> pour passer le mot actuellement sous le curseur sur un programme externe.

:!echo <cword> 

ou

:!ack <cword> 
+0

Cela n'a pas fonctionné pour moi en utilisant vim 7.2 sur windows. –

+0

oui, probablement parce que ack et grep ne gèrent pas le '\ <' et le '\>' le même .. –

+0

vous pouvez faire: ':! echo @/'pour voir ce que vous devez travailler. –

4

Vous pouvez utiliser les touches Ctrl-r suivi de/pour insérer le registre dernière recherche.

:!grep <Ctrl-r>/file_list 

Voir cette entrée Vim Tips Wiki pour plus d'informations.

Mise à jour:
La commande de commande de recherche * inclut toujours les limites de mots. Cependant, la commande de recherche g* se comporte de la même manière que *, mais sans les limites de mots.

Cela peut être utilisé pour contourner votre problème plutôt que d'utiliser la macro personnalisée dans rampion's answer.

+0

Cela fonctionne, bien que lorsqu'il est utilisé en conjonction avec '*' il a également le mot frontières. Est-il possible d'obtenir le texte sans eux? –

+0

La recherche '*' configure le motif de recherche pour inclure les limites de mots. Donc vous ne pouvez pas utiliser '*' pour obtenir le modèle sans eux. –

+0

@Paul Wicks: Voir ma mise à jour concernant la commande de recherche 'g *'. –

Questions connexes