visual results occurrences multiple inside all search vim replace

results - vim search



Buscar y reemplazar usando la lista de arreglos rĂ¡pidos en Vim (6)

Hasta ahora siempre he usado EasyGrep para reemplazar texto en múltiples archivos. Lamentablemente, es bastante lento cuando un proyecto se hace más grande. Una cosa que parece ser increíblemente rápida es Ggrep of fugitive.vim, que solo busca en mi versión los archivos controlados. Todos los resultados también se almacenan en la lista de soluciones rápidas.

¿Cómo puedo usar los resultados de Ggrep para hacer un simple reemplazo sobre todos esos archivos encontrados? ¿Es de alguna manera posible usar %s/foo/bar/cg en todos los archivos en la lista de soluciones rápidas o hay alguna otra manera mejor?


Grep externo

(usa grepprg, grepformat como en makeprg / errorformat; si grepprg == ''internal'' esto es idéntico al grep interno)

:grep fopen *.c :copen :cnext

Grep interno

:vimgrep //<myVimregexp/>/ **/*.c :copen :cnext

etc.

Lista de ubicaciones internas grep

:lvimgrep //<myVimregexp/>/ **/*.c :lopen :lnext

etc.

Bonificación: hacer grep externo para los búferes cargados:

:silent bufdo grepadd fstream % :copen :cnext

etc.

Externo para todos los argumentos:

:silent argdo grepadd fstream % :copen :cnext


Con quickfix-reflector.vim , puede editar los resultados de búsqueda en la ventana de revisión rápida. El comando de write guardará los cambios en sus archivos.

:copen :%s/foo/bar/cg :write


Hay un parche para agregar el comando cdo (Quickfix do) a vim, pero aún no se ha extraído (a partir de 2015-03-25):

https://groups.google.com/forum/#!topic/vim_dev/dfyt-G6SMec

Es posible que desee parche vim usted mismo para obtener este parche:

brew install hg # install mercurial, e.g. with homebrew hg clone https://vim.googlecode.com/hg/ vim cd vim # copy/download patch to . folder patch -b -p1 < cdo.diff ./configure make && make install


La respuesta de nelstrom es bastante completa y refleja sus brillantes contribuciones al vimdom. También va un poco más allá de lo estrictamente necesario aquí; el paso quickfix se puede omitir a favor de llenar args con el resultado de un comando de shell:

:args `git grep -l findme` :argdo %s/findme/replacement/gc :argdo update

debería ser todo lo que necesitas

Editar: como dice Domon: ¡el conjunto oculto debe hacerse primero si no está ya configurado!


cdo comando cdo ahora ha sido agregado! Después de grep, puede usar cdo para ejecutar el comando dado para cada término en su lista de quickfix:

cdo %s/<search term>/<replace term>/cg

(Eche un vistazo a este commit de git y a este debate de grupo de desarrolladores de google vim para obtener más información sobre cdo y las motivaciones detrás de agregarlo).


Actualización: Vim ahora tiene cdo , mira la respuesta de Sid .

Respuesta Original:

Vim tiene bufdo , windo , tabdo y argdo , que le permiten realizar el mismo comando en todos los búferes, ventanas o archivos abiertos en la lista de argumentos. Lo que realmente necesitamos es algo como quickfixdo , que invocaría un comando en cada archivo en la lista de soluciones rápidas. Lamentablemente, esa funcionalidad le falta a Vim, pero aquí hay una solución de Al que proporciona una solución de laminado en el hogar. Usando esto, sería posible ejecutar:

:QFDo %s/foo/bar/gc

Y eso ejecutaría la sustitución foo / bar en todos los archivos de la lista de soluciones rápidas.

Los bufdo , windo , tabdo y argdo tienen un comportamiento común. Por ejemplo, si el archivo actual no puede abandonarse, todos estos comandos fallarán. No estoy seguro de si el comando QFDo al que se QFDo referencia anteriormente sigue las mismas convenciones.

He adaptado la solución de Al para crear un comando llamado Qargs . Al ejecutar este comando, se completa la lista de argumentos con todos los archivos enumerados en la lista de soluciones rápidas:

command! -nargs=0 -bar Qargs execute ''args '' . QuickfixFilenames() function! QuickfixFilenames() " Building a hash ensures we get each buffer only once let buffer_numbers = {} for quickfix_item in getqflist() let buffer_numbers[quickfix_item[''bufnr'']] = bufname(quickfix_item[''bufnr'']) endfor return join(values(buffer_numbers)) endfunction

Al usar esto, puede seguir estos pasos para realizar una búsqueda en todo el proyecto y reemplazar:

:Ggrep findme :Qargs :argdo %s/findme/replacement/gc :argdo update

Editar: (con una punta de sombrero a Peter Rincker)

O puede unir los últimos 3 comandos en una sola línea:

:Ggrep findme :Qargs | argdo %s/findme/replacement/gc | update