Une chose que je fais souvent (mais je me fie à la ligne de commande pour le faire) est la recherche / l'accueil dans plusieurs fichiers.
Existe-t-il un moyen d'afficher les résultats de recherche pour tous les tampons ouverts?
Idéalement, j'aimerais avoir un nouveau tampon fractionné contenant l'emplacement des résultats et un extrait tout comme le grep
fait. Par exemple ( /statistics
):
models/statistics.php: /*! \file statistics.php
controllers/stats.php: $this->load->model('statistics');
controllers/stats.php: // Query statistics...
controllers/stats.php: $num_exams = $this->statistics->countExams();
En prime, j'aimerais pouvoir rechercher le terme sous le curseur, un peu comme le gd
fait.
search
multiple-files
Roflo
la source
la source
Réponses:
Vous pouvez utiliser
:vimgrep /pattern/ {files}
pour remplir la liste de correctifs rapides avec des modèles correspondants. Le problème est que l':vimgrep
option fichiers ne permet pas directement les tampons. Vous pouvez utiliser:Une autre option consiste à écrire un script qui génère une liste de fichiers à partir de
:buffers
. Par ce poste SO avec un léger tweek nous obtenons:Vous pouvez maintenant appeler
:GrepBufs <expression>
et obtenir la:vimgrep
sortie standard mais en utilisant les tampons à la place.Mettre à jour Si vous souhaitez appeler en
GrepBuffers
utilisant la valeur sous le curseur, ajoutez ce nouveau mappage.Lorsque vous êtes en mode normal,
<leader>z
vous passez:vimgrep
le curseur sur vos tampons ouverts.la source
command! -bang -nargs=+ Bufgrep execute 'vimgrep<bang><args> ' . join(map(filter(range(1, bufnr('$')), 'buflisted(v:val)'), '"#".v:val'), ' ')
. Utilisation::Bufgrep/foo/
La recherche dans les tampons ouverts uniquement est agréable, mais il peut arriver un moment où vous souhaitez rechercher dans un projet entier. Cela peut être plus rapide et plus facile que vous ne le pensez!
Recherche dans un projet
grep
est l'outil de recherche standard Unix. Il convient de le mentionner en raison de son omniprésence. Déjà intégré dans Vim via la:grep
commande. par exemple:grep -r 'foo'
. Tu vois:h :grep
.--perl
. Pour l'intégration de Vim, voir Ack.vimgit grep
recherche un référentiel très rapidement. Fugitive.vim fournit:Ggrep
.git grep
. Peut également être utilisé avec:grep
.Je recommande à la fois ripgrep, Ag et
git grep
comme ils sont tous super rapides. J'ai cherché plus de 4700+ en moins d'une seconde. Il est assez difficile de battre ripgrep.Pour tester l'une de ces alternatives sans plugin ou si vous ne voulez tout simplement pas de plugin, vous pouvez définir votre
'grepprg'
option en conséquence. par exempleset grepprg=ag\ --vimgrep
ouset grepprg=rg\ --vimgrep
. Voir:h 'grepprg'
et:h 'grepformat'
pour plus d'informations. Vous pouvez maintenant rechercher via:grep
. par exemple:grep 'foo'
.Comme solution de rechange finale, vous pouvez l'utiliser
:vimgrep
car elle est disponible sur tous les systèmes disponibles sur Vim. Voir:h :vimg
pour plus d'aide.Liste QuickFix
Comme la plupart de ces options utilisent la liste quickfix, je vous suggère d'utiliser des mappages plus conviviaux pour traverser la liste quickfix. J'utilise le plugin intact de Tim Pope qui utilise
]q
et[q
pour:cnext
et:cprev
respectivement. Certaines personnes aiment le quickfix d'ouvrir après une recherche est effectuée , puis ajouter ce qui suit à votre~/.vimrc
fichier:autocmd QuickFixCmdPost *grep* cwindow
. Vous pouvez également ouvrir manuellement la liste QuickFix via:copen
.Vous voulez des "recherches" encore plus rapides?
Vous allez avoir besoin d'utiliser un outil qui utilise des index prédéfinis comme ctags , cscope ou GNU global .
:tag
,<c-]>
et beaucoup d' autres commandes et options. Tu vois:h tags
. Vous pouvez également vouloir lire les Ctags sans effort avec Git ou regarder le plugin Gutentags:cscope
commande. Voir:h cscope
Plus d'aide
Je commencerais par ce bel épisode de Vimcast : Rechercher plusieurs fichiers avec
:vimgrep
.Pour plus d'aide sur Vim, consultez la documentation:
la source
Mon plugin GrepCommands définit des variantes de la
:vimgrep
commande intégrée qui ciblent tous les arguments, les tampons répertoriés, les fenêtres de la page à onglet actuelle ou toutes les pages à onglet pour sa recherche. Fondamentalement, une implémentation de plugin robuste de la réponse de @ jecxjo.la source
Commandes
:bufdo
et:vimgrepadd
Cette réponse est basée sur /programming//a/11976158/1057593 .
Cependant, je voulais ajouter quelques bits. Encore une fois, la commande de base est
Si votre liste de correctifs rapides n'est pas vide, vous souhaiterez probablement la supprimer en premier (voir /programming//q/27385970/1057593 ). Cela peut être fait avec
vim-unimpaired fournit les mappages
]q
et fait[q
défiler les correspondances.cmdline-history
C'est un bon flux de travail pour entrer le modèle de recherche séparément avec
/pattern
. Cela vous permet d'utiliser une commande générique de votre historique de ligne de commande en utilisant le modèle de recherche actuel. Cela ressemblerait àUne nouvelle recherche typique à l’échelle du tampon serait
J'ai ajouté les mappages suivants à mon vimrc à utiliser
<C-N>
et<C-P>
au lieu des touches fléchéesPour rechercher l'historique des commandes
q:
, utilisez , puis/bufdo<CR>
et appelez une commande avec<CR>
. Pour plus de détails, voir https://vim.fandom.com/wiki/Using_command-line_history et les pages d'aide:h history
et:h cmdline-window
.Vous pouvez ajouter à la commande réutilisable
:copen
pour voir immédiatement la liste de correctifs de la manière suivante:La proposition de stackoverflow a
:bufdo vimgrepadd // % | copen
ouvert plusieurs fenêtres involontaires dans mon cas.la source