Una cosa que hago a menudo (pero confío en la línea de comando para hacer) es buscar / grepping en múltiples archivos.
¿Hay alguna forma de mostrar los resultados de búsqueda para todos los búferes abiertos?
Idealmente, me gustaría tener un nuevo búfer dividido que contenga la ubicación del resultado y el fragmento como lo grep
hace. Por ejemplo ( /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();
Como beneficio adicional, me gustaría poder buscar el término debajo del cursor, más o menos como lo gd
hace.
search
multiple-files
Roflo
fuente
fuente
Respuestas:
Puede usar
:vimgrep /pattern/ {files}
para completar la lista de soluciones rápidas con patrones coincidentes. El problema es que la:vimgrep
opción de archivos no permite directamente buffers. Puedes usar:Otra opción es escribir un script que genere una lista de archivos
:buffers
. Por esta publicación SO con un ligero tweek obtenemos:Ahora puede llamar
:GrepBufs <expression>
y obtener la:vimgrep
salida estándar pero utilizando los buffers en su lugar.Actualización Si usted quiere llamar
GrepBuffers
usando el valor bajo el cursor agregar esta nueva asignación.Cuando esté en el tipo de modo normal
<leader>z
y usted:vimgrep
la palabra cursor sobre sus buffers abiertos.fuente
command! -bang -nargs=+ Bufgrep execute 'vimgrep<bang><args> ' . join(map(filter(range(1, bufnr('$')), 'buflisted(v:val)'), '"#".v:val'), ' ')
. Uso::Bufgrep/foo/
Buscar solo en buffers abiertos es bueno, pero puede llegar un momento en el que desee buscar en todo un proyecto. ¡Puede ser más rápido y más fácil de lo que piensas!
Buscando en un proyecto
grep
es la herramienta de búsqueda estándar de Unix. Vale la pena mencionar debido a su ubicuidad. Ya integrado en Vim a través del:grep
comando. por ej:grep -r 'foo'
. Ver:h :grep
.--perl
. Para la integración de Vim, consulte Ack.vimgit grep
busca en un repositorio muy rápidamente. Fugitive.vim proporciona:Ggrep
.git grep
. Se puede usar con:grep
también.Recomiendo tanto ripgrep, Ag,
git grep
como todos son súper rápidos. He buscado más de 4700+ en menos de 1 segundo. Es bastante difícil vencer a ripgrep.Para probar una de estas alternativas sin un complemento o simplemente no desea un complemento, puede configurar su
'grepprg'
opción en consecuencia. por ejemploset grepprg=ag\ --vimgrep
oset grepprg=rg\ --vimgrep
. Ver:h 'grepprg'
y:h 'grepformat'
para más información. Ahora puedes buscar a través de:grep
. por ej:grep 'foo'
.Como alternativa final, puede usarla
:vimgrep
ya que está disponible en todos los sistemas que Vim está disponible. Ver:h :vimg
para más ayuda.Lista QuickFix
Como la mayoría de estas opciones usan la lista de soluciones rápidas, le sugiero que use algunas asignaciones más amigables para atravesar la lista de soluciones rápidas. Uso el complemento intacto de Tim Pope que usa
]q
y[q
para:cnext
y:cprev
respectivamente. Algunas personas, como el quickfix a abrir después de una búsqueda se realiza a continuación, añadir lo siguiente a su~/.vimrc
archivo:autocmd QuickFixCmdPost *grep* cwindow
. También puede abrir manualmente la lista QuickFix mediante:copen
.¿Quieres "búsquedas" aún más rápidas?
Necesitará usar alguna herramienta que use índices preconstruidos como ctags , cscope o GNU global .
:tag
,<c-]>
y muchos otros comandos y opciones. Ver:h tags
. También es posible que desee leer Ctags sin esfuerzo con Git o buscar en el complemento Gutentags:cscope
comando. Ver:h cscope
Más ayuda
Comenzaría con este bonito episodio de Vimcast : busca en varios archivos
:vimgrep
.Para obtener más ayuda de Vim, consulte la documentación:
fuente
El complemento My GrepCommands define variantes del
:vimgrep
comando incorporado que se dirigen a todos los argumentos, buffers listados, ventanas en la página de pestañas actual o todas las páginas de pestañas para su búsqueda. Básicamente, una implementación robusta del complemento de la respuesta de @ jecxjo.fuente
Comandos
:bufdo
y:vimgrepadd
Esta respuesta se basa en /programming//a/11976158/1057593 .
Sin embargo, quería agregar algunos bits. De nuevo, el comando básico es
Si su lista de soluciones rápidas no está vacía, probablemente quiera borrarla primero (consulte /programming//q/27385970/1057593 ). Esto se puede hacer con
vim-unimpaired proporciona las asignaciones
]q
y[q
para recorrer las coincidencias.cmdline-history
Es un buen flujo de trabajo ingresar el patrón de búsqueda por separado
/pattern
. Esto le permite utilizar un comando genérico de su historial de línea de comandos utilizando el patrón de búsqueda actual. Esto se vería comoUna nueva búsqueda típica de todo el búfer sería
He agregado las siguientes asignaciones a mi vimrc para usar
<C-N>
y en<C-P>
lugar de las teclas de flechaPara buscar en el historial de comandos
q:
, utilice/bufdo<CR>
e invoque un comando con<CR>
. Para obtener más detalles, consulte https://vim.fandom.com/wiki/Using_command-line_history y las páginas de ayuda:h history
y:h cmdline-window
.Puede agregar al comando reutilizable
:copen
para ver inmediatamente la lista de soluciones rápidas de la siguiente manera:La propuesta de stackoverflow
:bufdo vimgrepadd // % | copen
abrió varias ventanas no deseadas en mi caso.fuente