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