2012-02-20 22 views
64

¿Hay alguna forma de ejecutar un comando Vim en un archivo desde la línea de comando?Ejecutar un comando dentro de Vim desde la línea de comando

Sé que lo contrario es cierto como esto:

:!python % 

Pero lo que si quería :retab un archivo sin abrirlo en Vim? Por ejemplo:

> vim myfile.c 
:retab | wq 

Esto abrirá miarchivo.c, reemplazará las pestañas con espacios, y luego guardará y cerrará. Me gustaría encadenar esta secuencia a un solo comando de alguna manera.

Sería algo así:

> vim myfile.c retab | wq 

Respuesta

60

Esto funcionó para mí:

gvim -c "set et|retab|wq" foo.txt

set et (= set expandtab) asegura los tab caracteres son reemplazados con el número correcto de espacios (de lo contrario, retab no funcionará).

Normalmente no lo uso, pero funciona también vim -c ...

+0

Eso hace el truco, gracias! – syvex

57

Tiene varias opciones:

  • -c "commands": jugará comandos Ex tal como se introdujeron en la línea de comandos.
    En su ejemplo: vim myfile -c 'retab | wq'. Esto es lo que sugirió Firstrock.

  • -S "vim source file": será determinada fuente script de Vim
    (como correr vim -c "source 'vim source file'"):

    Si usted tiene un archivo script.vim que contiene:

    retab 
    wq 
    

    continuación, puede utilizar vim myfile.c -s script.vim (la extensión no hace realmente materia)

  • -s "scriptin file": reproducirá los contenidos de fi Le ya que contiene modo normal comandos: Si tiene script.txt que contiene:

    :retab 
    ZZ 
    

    con el extremo de las líneas que constan de una sola ^M carácter (por ejemplo guardó el script con el :set fileformat=mac | w), entonces se puede ejecutar: vim myfile.c -S script.txt (ZZ es otra forma de salir de vim y guardar el archivo actual).
    Tenga en cuenta que puede grabar esos scripts con vim my_file -W script.txt, pero es suffers a bug si usa gvim (la GUI).

+0

Si usted, como yo, solo desea ejecutar un puñado de comandos, en algunos shells puede usar 'vim -S <(echo -e" VundleInstall \ n q \ n q ")'. – Minix

2
No

una respuesta directa a su pregunta, pero si desea reemplazar pestañas con espacios (o hacer cualquier otra búsqueda de expresiones regulares/reemplazar) para obtener una lista de archivos, sólo puede utilizar en lugar de sed de búsqueda/reemplazar:

sed -i 's/\t/ /g' foo1.txt foo2.txt 

o

ls *.txt | xargs sed -i 's/\t/ /g' 

(En este ejemplo estoy reemplazando cada ficha personaje con tres espacios.)


NOTA: la bandera -i significa que funciona in situ.

Desde la página sed hombre:

-i[SUFFIX], --in-place[=SUFFIX] 

      edit files in place (makes backup if extension 
      supplied) 
+0

Tiene razón, no se debe usar el microscopio como un abrelatas – oxfn

+0

En mi experiencia, si el archivo es enorme (orden de 100 s de MB) y el número de reemplazos es limitado, entonces sed es muy lento. La opción 'vim -s ' sugerida por @benoit funciona mucho más rápido: orden de segundos. En mi caso, sed tardó unos 3 minutos, mientras que la opción de script vim se completó en aproximadamente 25 segundos para un archivo de 200 MB de ancho y alrededor de 100 reemplazos – Prashant

Cuestiones relacionadas