Hay varias formas de hacerlo.
Directorio actual interno
Si desea realizar la búsqueda / reemplazo en un árbol de proyecto, puede usar la lista de argumentos de Vim .
Simplemente abra Vim y luego use el :args
comando para completar la lista de argumentos. Puede pasar varios nombres de archivo o incluso globos.
Por ejemplo, :args **/*.rb
buscará de forma recursiva el directorio actual en busca de archivos ruby. Tenga en cuenta que esto también es como abrir Vim con vim **/*.rb
. Incluso puede usar el find
comando del shell para obtener una lista de todos los archivos en el directorio actual ejecutando:
:args `find . -type f`
Puede ver la lista de argumentos actuales ejecutándose :args
solo. Si desea agregar o eliminar archivos de la lista, puede usar :argadd
los :argdelete
comandos o respectivamente.
Una vez que esté satisfecho con la lista, ahora puede usar el poderoso :argdo
comando de Vim que ejecuta un comando para cada archivo en la lista de argumentos::argdo %s/search/replace/g
Aquí hay algunos consejos para buscar (basados en algunos de los comentarios):
- Use un límite de palabra si desea buscar "foo" pero no "foo_bar". Use las construcciones
\<
y \>
alrededor del patrón de búsqueda de la siguiente manera::argdo %s/\<search\>/foobar/g
- Use una
/c
marca de búsqueda si desea que Vim solicite confirmación antes de reemplazar un término de búsqueda.
- Use una
/e
marca de búsqueda si desea omitir los errores de "patrón no encontrado".
- También puede optar por guardar el archivo después de realizar la búsqueda:
:argdo %s/search/replace/g | update
. Aquí, :update
se usa porque solo guardará el archivo si ha cambiado.
Tampones abiertos
Si ya tiene búferes abiertos en los que desea realizar la búsqueda / reemplazo, puede usar :bufdo
, que ejecuta un comando para cada archivo en su lista de búferes ( :ls
).
El comando es muy similar a :argdo
: :bufdo %s/search/replace/g
Similar a :argdo
y :bufdo
, hay :windo
y :tabdo
que actúan en ventanas y pestañas respectivamente. Se usan con menos frecuencia pero aún son útiles para saber.
/c
bandera para confirmar las sustituciones.\<
y\>
alrededorsearch
para evitar reemplazos parciales de palabras.:cd %:p:h
. Otras opciones de directorio de trabajo se enumeran en vim.wikia.com/wiki/Set_working_directory_to_the_current_file .Digamos que tenemos una estructura de proyecto simple como esta:
greeting.txt se parece a
e info / age.txt parece
Digamos que queremos reemplazar todas las ocurrencias de Sam con Bob. Esto es lo que haríamos:
Establecer directorio de trabajo
Asegúrese de que el directorio de trabajo actual de Vim sea la raíz del proyecto (no le mostrará cómo hacerlo aquí).
Buscar archivos que contienen 'Sam'
Use el comando vimgrep de Vim para buscar todas las ocurrencias de Sam dentro del proyecto (nota: las
**/*
búsquedas en todos los archivos de forma recursiva)Esto llenará la lista de soluciones rápidas con todas las instancias de Sam. Si desea ver la lista de soluciones rápidas, puede usar el comando Vim
:copen
Sustituir dentro de todos los archivos que contienen 'Sam'
Ahora queremos ejecutar el comando sustituto de Vim dentro de cada archivo en la lista de soluciones rápidas. Podemos hacer esto usando el
:cfdo {cmd}
comando que ejecuta {cmd} en cada archivo en la lista de soluciones rápidas. El {cmd} específico que queremos usar essubstitute
os
para abreviar. La línea completa se vería así:Puede agregar la bandera c para confirmar todos los reemplazos si lo desea:
Guardar todos los archivos
fuente
cfdo %s/Sam/Bob/g | update
fijo que para míhidden
opción:set hidden
si aún no lo ha hecho.Aunque no es una solución VIM, si está utilizando VI / VIM puede que le resulte más fácil usar una solución CLI. Para cambiar todos los archivos en el directorio actual, use
perl
como se hizo para situaciones como esta:Si necesita hacerlo también en subdirectorios, generalmente emparejo
perl
confind
:Lo bueno de esto es que puede refinar fácilmente la lista a tipos de archivos específicos. Por ejemplo, para restringir a archivos python:
fuente
Para reemplazar la frase con otra, puede usar el modo Vim Ex.
Por ejemplo (
ex
es alias paravim -E
):Recursivamente en bash / zsh (con
globstar
set, por ejemploshopt -s globstar
):Recursivamente (usando
find
e ignorando archivos ocultos como.git
archivos):Nota: El
:bufdo
comando no es POSIX .Nota: La sintaxis
-not -path '*/\.*'
se usa para ignorar los archivos ocultos (como.git
).fuente
Aquí está el comando de shell usando
find
yex
editor (sin usar:bufdo
):Esto editará en el lugar todos los
*.rb
archivos en la carpeta actual (recursivamente) y los reemplazaráfoo
conbar
.fuente