texto reemplazar por pegar linea ejemplos dentro copiar buscar search vim replace ack

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.