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 :argscomando para completar la lista de argumentos. Puede pasar varios nombres de archivo o incluso globos.
Por ejemplo, :args **/*.rbbuscará 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 findcomando 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 :argssolo. Si desea agregar o eliminar archivos de la lista, puede usar :argaddlos :argdeletecomandos o respectivamente.
Una vez que esté satisfecho con la lista, ahora puede usar el poderoso :argdocomando 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
/cmarca de búsqueda si desea que Vim solicite confirmación antes de reemplazar un término de búsqueda.
- Use una
/emarca 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í, :updatese 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 :argdoy :bufdo, hay :windoy :tabdoque actúan en ventanas y pestañas respectivamente. Se usan con menos frecuencia pero aún son útiles para saber.
/cbandera para confirmar las sustituciones.\<y\>alrededorsearchpara 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
:copenSustituir 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 essubstituteospara 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 | updatefijo que para míhiddenopción:set hiddensi 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
perlcomo se hizo para situaciones como esta:Si necesita hacerlo también en subdirectorios, generalmente emparejo
perlconfind: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 (
exes alias paravim -E):Recursivamente en bash / zsh (con
globstarset, por ejemploshopt -s globstar):Recursivamente (usando
finde ignorando archivos ocultos como.gitarchivos):Nota: El
:bufdocomando 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
findyexeditor (sin usar:bufdo):Esto editará en el lugar todos los
*.rbarchivos en la carpeta actual (recursivamente) y los reemplazaráfooconbar.fuente