search - por - ¿Cómo buscar y reemplazar con ack en vim?
vi editor buscar texto (5)
Estoy usando el complemento Ack en Vim, que me ayuda a buscar rápidamente cadenas en mi proyecto. Sin embargo, a veces deseo reemplazar todas o algunas ocurrencias de las cadenas encontradas. Puede hacer algún tipo de búsqueda global y reemplazar utilizando el arquetista de Vim como este ( source ):
:args app/views/*/*
:argdo %s/, :expire.*)/)/ge | update
Pero en lugar de usar args
, preferiría hacer una búsqueda a través de Ack y luego hacer el reemplazo en todos los archivos que se han encontrado. ¿Hay alguna manera de hacerlo similar al comando argdo
?
Ahora, Vim tiene este nuevo comando cdo
que ejecutará el comando dado en cada línea de la lista de soluciones rápidas.
Entonces puedes usar
:Ack pattern
:cdo s/pattern/newpattern/g
Decidí usar ack y Perl para resolver este problema fuera de Vim para poder usar las expresiones regulares Perl más potentes en lugar del subconjunto GNU. Puede asignar esto a un golpe clave en su vimrc.
ack -l ''pattern'' | xargs perl -pi -E ''s/pattern/replacement/g''
Explicación
ack
ack es una increíble herramienta de línea de comandos que es una mezcla de grep
, find
y expresiones regulares completas de Perl (no solo el subconjunto GNU). Está escrito en Perl puro, es rápido, tiene resaltado de coincidencia, funciona en Windows y es más amigable para los programadores que las herramientas tradicionales de línea de comandos. Instálalo en Ubuntu con sudo apt-get install ack-grep
.
xargs
Xargs es una antigua herramienta de línea de comandos de Unix. Lee los elementos de la entrada estándar y ejecuta el comando especificado seguido de los elementos leídos para la entrada estándar. Entonces, básicamente, la lista de archivos generados por ack se agrega al final del comando perl -pi -E ''s/pattern/replacemnt/g''
.
perl -pi
Perl es un lenguaje de programación. La opción -p hace que Perl cree un bucle alrededor de su programa que itera sobre los argumentos del nombre de archivo. La opción -i hace que Perl edite el archivo en su lugar. Puede modificar esto para crear copias de seguridad. La opción -E hace que Perl ejecute una línea de código especificada como el programa. En nuestro caso, el programa es solo una sustitución de expresiones regulares de Perl. Para obtener más información sobre las opciones de línea de comandos de Perl perldoc perlrun
. Para obtener más información sobre Perl, consulte http://www.perl.org/ .
No creo que haya una manera integrada de hacer esto, pero debería ser fácil hacer uno.
Lo que necesita hacer es crear un comando que llame a una función personalizada. La función debería usar la función getqflist()
para obtener todas las entradas en la lista de soluciones rápidas y exe
para hacer el trabajo sucio. ¡Ten cuidado con lo que pasas como argumento!
" Define a command to make it easier to use
command! -nargs=+ QFDo call QFDo(<q-args>)
" Function that does the work
function! QFDo(command)
" Create a dictionary so that we can
" get the list of buffers rather than the
" list of lines in buffers (easy way
" to get unique entries)
let buffer_numbers = {}
" For each entry, use the buffer number as
" a dictionary key (won''t get repeats)
for fixlist_entry in getqflist()
let buffer_numbers[fixlist_entry[''bufnr'']] = 1
endfor
" Make it into a list as it seems cleaner
let buffer_number_list = keys(buffer_numbers)
" For each buffer
for num in buffer_number_list
" Select the buffer
exe ''buffer'' num
" Run the command that''s passed as an argument
exe a:command
" Save if necessary
update
endfor
endfunction
Podrías usar ack por este camino
:args `ack -l User app/`
:argdo %s/, :expire.*)/)/ge | update
O usa ag
:args `ag -l User app/`
:argdo %s/, :expire.*)/)/gec | w
Uso MacVim (activado con mvim
en un shell). mvim
los resultados de ack
a mvim
:
mvim -f $(ack -l $@)
Luego en MacVim, busco / reemplazo usando bufdo
:
:bufdo %s/SEARCH/REPLACE/gce | update
Omita la opción c
si la confirmación no es necesaria.