2010-03-02 7 views
10

Estoy cambiando de un editor específico de Windows PHP a VIM, con la filosofía de "usar un editor para todo y aprenderlo muy bien".¿Excelentes herramientas para encontrar y reemplazar archivos?

Sin embargo, una característica que me gustó en mi editor PHP fue su capacidad de "buscar y reemplazar". Podría enfocar las cosas de dos maneras:

  • acaba de encontrar. Busque todos los archivos en un proyecto por una cadena, vea todas las ocurrencias enumeradas y haga clic para sumergirse en ese archivo en esa línea.
  • Ciego reemplazar todas las apariciones de "foo" con "barra".

Y por supuesto que podría utilizar la GUI para decir qué tipos de archivos, si mirar en subcarpetas, si se trataba de mayúsculas y minúsculas, etc.

Estoy tratando de aproximar esta facultad ahora, y tratar de reconstruirlo con bash es bastante tedioso. Doable, pero tedioso.

¿Alguien conoce alguna herramienta excelente para cosas como esta, para Linux y/o Windows? (Preferiría una GUI si fuera posible.) ¿O en su defecto, una secuencia de comandos bash que hace bien el trabajo? (Si aparece una lista de nombres de archivos y números de línea y muestra fragmentos de código, sería genial)

+0

Si desea usar GUI, consideraría seriamente no usar vim, ya que es una herramienta muy orientada a la línea de comandos. Algo como eclipse o visual studio probablemente se ajuste mejor a tu caso de uso. –

+0

@Seamus - Ya me gusta vim - poder trabajar rápidamente usando solo el teclado es genial. Pero la mayoría de los comandos que uso son una o dos teclas. Si puedo hacer esto en bash o vim con un comando corto y fácil de recordar, estaría bien. Simplemente no quiero escribir un programa bash largo cada vez que quiero encontrar 'foo_function()' en todos mis archivos. –

+0

¿Estaría bien ejecutar algunos comandos fuera de vim o está buscando algo así como un complemento que funcione dentro de vim? –

Respuesta

7

Vim tiene una búsqueda de múltiples archivos integrada usando el comando :vimgrep (o :grep para usar un programa grep externo; esta es la única opción antes de Vim 7).

:vimgrep será buscar a través de archivos para una expresión regular y cargar una lista de coincidencias en un buffer - A continuación, puede navegar por la lista de los resultados visuales en la memoria intermedia o con los comandos y :cnext:cprev. También es compatible con la búsqueda a través de árboles de directorios con el comodín **. p.ej.

:vimgrep "^Foo.*Bar" **/*.txt 

para buscar líneas que comienzan con Foo y que contienen Bar en cualquier archivo .txt en el directorio actual.

:vimgrep utiliza el búfer 'quickfix' para almacenar sus resultados. También hay :lvimgrep que usa un buffer local que es específico para la ventana que está usando.

Vim no admite el reemplazo de varios archivos de la caja, pero hay complementos que también lo harán en vim.org.

+1

SÍ - la mejor parte es que una vez que encuentra todas las coincidencias, ** puede escribir: copen para verlas todas en una ventana en la parte inferior, luego resalte una y presione enter para saltar a ese archivo.** (También puede alternar entre las coincidencias en varios archivos utilizando: cn y: cp) –

+0

Además, la lista de resultados muestra los números de línea y los fragmentos de código, tal como solicité. Muévase de los resultados de búsqueda a la ventana de edición como cualquier otra ventana en vim (como cuando se usa: división) - ctl-w y una dirección. ¡Estoy tan entusiasmado con esto! –

8

Try sed. Por ejemplo:

sed -i -e 's/foo/bar/g' myfile.txt 
+0

También: encontrar. -name "* .php" | xargs sed -i -e 's/foo/bar/g' –

+0

maldiciones ... ¡me ganaste! ;) –

+0

Konrad: Hice una pequeña modificación: 'encontrar. -name "* .txt" | xargs sed -i '' -e's/fo0/bar/g''. Proporcioné '''' como el argumento para 'i', que significa" no crear un archivo de copia de seguridad ". No me importa porque mi proyecto está bajo control de versiones, por lo que los archivos de copia de seguridad serían un poco desordenados, y git me mostrará qué ha cambiado. –

0

mirada en ... poderosa herramienta de línea de comando sed que debe lograr la mayor parte de lo que usted está buscando ... sus soportes expresiones regulares, por lo que su búsqueda/reemplazo es bastante fácil. (man sed)

4

Notepad++ me permite buscar y reemplazar en una carpeta completa (y subcarpetas), con soporte de expresiones regulares.

1

Hay una serie de herramientas que puede utilizar para facilitar las cosas. En primer lugar, para buscar todos los archivos en el proyecto de vim puede utilizar :grep así:

:grep 'Function1' myproject/ 

Esto funciona esencialmente un grep y le permite saltar rápidamente de/a lugares en los que se ha encontrado.

Ctags es una herramienta que encuentra declaraciones en su código y luego permite que vim salte a estas declaraciones. Para hacer esto, ejecute ctags y luego coloque el cursor sobre una llamada a función y luego use Ctrl-]. Aquí hay un enlace con algo más de información ctags:

http://www.davedevelopment.co.uk/2006/03/13/vim-ctags-and-php-5/

0

Notepad ++ tiene soporte para resaltado de sintaxis en muchos idiomas y es compatible con buscar y reemplazar en todos los archivos abiertos con regex and basic \n \r \t support.

0

El comando grep -rn "search terms" * buscará los términos especificados en todos los archivos (incluidos los de los subdirectorios) y devolverá las líneas coincidentes, incluidos el nombre del archivo y el número de línea. Armado con esta información, es fácil saltar a un archivo/línea particular en VIM.

Como se mencionó anteriormente, sed es extremadamente potente para hacer buscar y reemplazar.

También puede ejecutar ambas herramientas desde dentro de VIM.

0

Algunos desarrolladores con los que actualmente trabajo juran por Textpad. Tiene una interfaz de usuario y también admite el uso de expresiones regulares, todo lo que estás buscando y más.

+0

¡Sí! Ir a Textpad! – dwo

2

Puede usar perl en el símbolo del sistema para reemplazar texto en archivos.

perl -p -i".backup" -e "s/foo/bar/g" test.txt 
+0

¡Funciona a la perfección! – ereOn

+0

'perl -pi -e 's/foo/bar/g' archivo'. No hay necesidad de los sistemas '' .backup "' on * nix. – Zaid

5

No entiendo por qué no puede hacer esto con VIM.

acaba de encontrar

/Foo 

Destacados todas las instancias de Foo en el archivo y se puede hacer lo que quiera.

A ciegas Reemplazar

:% s/Foo/Bar/g 

Obviamente, esto es sólo la punta del iceberg. Tiene mucha flexibilidad en el alcance de su búsqueda y soporte completo de expresiones regulares para su término. Puede que no funcione exactamente como su antiguo editor, pero creo que su idea original de 'usar un editor' es válida.

+3

Vim puede buscar y reemplazar muy bien, pero no a través de varios archivos. sed es probablemente la herramienta de elección para eso. – Jay

+1

Puede que tenga que hacer ': set hlsearch' para activar el resaltado de todas las instancias. –

+0

@Jay: VIM admite nativamente varios sabores de grep que permiten la búsqueda de múltiples archivos. Ver http://vim.wikia.com/wiki/Find_in_files_within_Vim –

0

Una muy útil herramienta de búsqueda es ack. (Ubuntu se refiere a él como "ack-grep" en los repositorios y las páginas man.)

La versión corta de lo que hace es una combinación de find y grep que es más potente e inteligente que ese par.

2

Como usted está buscando una herramienta de GUI, generalmente utilizo las siguientes 2 herramientas. Ambos tienen una gran funcionalidad, incluida la coincidencia de comodines, regex, filtro de tipo de archivo, etc. Ambos muestran buena información útil sobre el hit en archivos como filename/lines.

  1. Visual Studio: rápido pero potente. Lo uso si el número de archivo es enorme (digamos, decenas de miles ...)

  2. pspad: peso ligero. Y una buena característica sobre find/replace para pspad es que organizará hits en diferentes archivos en una jerarquía de árbol, lo cual es muy claro.

+0

¿por qué downvote este comentario? –

1

No sé si es una opción para usted, pero si se carga todos los archivos en vim con vim *.php de lo que puede

:set hidden

:argdo %s/foo/bar/g => ejecutará el comando de sustitución en todos los búferes abiertos

:wall => escribirá todos los búferes abiertos

O en lugar de cargar todos los archivos en vim tratar :help vimgrep y una cominbation de :help argdo y :help argadd

1

Para Windows, creo que grepWin es difícil de superar - una interfaz gráfica de usuario a una herramienta grep potente y flexible para Windows. Busca y reemplaza, sabe sobre expresiones regulares, ese tipo de cosas.

+0

Para mis propósitos actuales, esto funciona muy bien. –

Cuestiones relacionadas