2008-11-01 7 views
9

Mientras uso Vim (en casa y en el trabajo), a menudo me encuentro haciendo cosas similares repetidamente. Por ejemplo, puedo convertir un montón de texto CSV en una serie de inserciones SQL. He estado usando Vim durante años, pero solo recientemente he tratado de pensar seriamente sobre cómo puedo mejorar mi productividad mientras lo uso.Tarea de tareas comunes en Vim

Mi pregunta es ... ¿Hay una buena forma (o correcta) de almacenar comandos o secuencias de comandos comúnmente utilizados? ¿Y cómo es la mejor forma de ejecutarlos? Sería bueno poder usar el mismo script en una sesión en vivo y también sobre la línea de comando en contra de algún archivo.

Espero que pueda almacenarlos en un archivo .vim para poderlos entregar a mis compañeros de trabajo (que no son tan hábiles con vim) para que lo usen.

Respuesta

13

Puede almacenar sus macros de tareas comunes en los archivos .vim, como this por ejemplo, y entonces se puede cargar con el comando : por lo file.vim

Here se puede encontrar un montón de prácticas macros , también le recomiendo que para aprender bien la utilidad q macro recording de comandos, es muy muy potente ...

las macros creadas con el comando q están almacenados en un registro, tiendas qq la macro en el registro q , así que cuando termines t En la grabación puede simplemente pegar la macro, con "qp y guárdelo, luego puede cargarlo simplemente tirando de la macro en un registro, por ejemplo: " qY, las macros son solo texto y recuerde que puede usar cualquier registro en lugar de q. Hay un script de Vim para almacenar q macros:

marvim : Macro Persistent Storage and Shareable Repository for VIM

también echar un vistazo a la Vim Scripting Language.

+0

Esto se puede responder en uno de sus enlaces, pero ¿se pueden almacenar las macros de qq una vez grabadas? Siempre los he usado, pero no sabía si podrían persistir en todas las sesiones. –

+0

Las macros creadas con el comando q se almacenan en un registro, qq almacena la macro en el registro q, de modo que cuando termine la grabación simplemente puede pegar la macro, con "qp y guardarlo, luego puede cargarlo simplemente tirando del macro texto, por "qY recuerda que puedes usar cualquier registro en lugar de q ... – CMS

2

Puede almacenar secuencias de comandos en su .vimrc y asignarles un enlace de clave con el comando :map. Por ejemplo:

echo >>~/.vimrc ":map ,c :%s/,/','/g<CR>:%s/^/('/g<CR>:%s/$/'),/g<CR>" 

Al presionar ",c" en una sesión en vivo esto será convertir el archivo CSV en una parte de una instrucción INSERT.

En la línea de comando de esa misma pieza de edición se puede aplicar a un archivo a través de (esto sobrescribir, asegúrese de copia de seguridad en primer lugar):

vim file.txt -c ':normal ,c | :x' 

Puede haber una manera mejor, pero esto funciona.

1

Personalmente, y tal vez en parte porque estaba usando Unix mucho antes de que existiera vim (diablos, la primera versión de Unix que usé tampoco tenía "vi", pero esa es otra historia), normalmente usaría un ' script de shell '(o, más probablemente, un script de Perl) para hacer la transformación. Para convertir los datos CSV a INSERT, tratar las comillas/no comillas y las comas incrustadas con total generalidad es complicado: probablemente pretendo utilizar un script Perl con Text :: CSV_XS para garantizar un análisis correcto. Luego, ejecutaba ese script en el rango de texto que necesitaba conversión.

Una ventaja de esto es el enfoque de la herramienta enfocada: una herramienta hace un trabajo correcto. Mi directorio bin privado tiene 300 o más scripts y programas; el directorio RCS tiene más de 500 scripts en él.

Esto no quiere decir que los scripts en vim sean malos. Utilizo (más o menos) comandos de mapas complejos para escribir manipulaciones complejas, a menudo cuando estoy a punto de tener que hacer el mismo cambio en un conjunto de archivos, y cuando no creo que valdrá la pena crear un script para el trabajo. Sin embargo, si creo que podría necesitar los cambios más de una vez, lo guiaré. Por ejemplo, GCC comenzó a mostrarse optimista (circa 2005) sobre no incrustar cadenas estáticas no utilizadas en archivos de objeto, lo que significaba que mi información de control de versión no era visible. Entonces, durante un período de años, mientras edito los archivos fuente, he convertido de un nombre estático (fijo) a un nombre público: de mala gana, pero necesariamente AFAIAC. Tengo un script que hace eso para mí, así que cuando necesito hacer el cambio en un archivo, ejecuto ese script para hacerlo. Tengo otra secuencia de comandos que actualiza la información de copyright; Lo necesito cada vez que modifico un archivo en un año determinado. Sí, probablemente podría esconderlo como algo en vim: crecí pensando que el guión separado es mejor, sobre todo porque si cambio a otro editor, aún puedo usar el guión.

+1

En general, estoy de acuerdo. Tengo toneladas de scripts bash, zsh y python por la misma razón. Mi objetivo con esta pregunta, por otro lado, es encontrar la técnica adecuada para llenar este vacío particular en mi productividad, que son las tareas más pequeñas que hago repetidamente dentro de Vim. –

3

Uso q/@ para grabar/reproducir una macro con bastante frecuencia.

El siguiente paso es intentar escribir algo así como 3 o menos comandos ex.

Si algo tan complejo que ni una macro ni una breve ex secuencia no serán suficientes, tiendo a escribirlo como un script Perl en su lugar. El lenguaje de la secuencia de comandos de vim es demasiado limitado para tratar de hacer grandes cosas, para mi gusto. (Aunque vim 7 ha dado grandes pasos en ese sentido, tomando prestadas muchas cosas de Python.)

Tenga en cuenta que @ hace algo muy simple: toma los contenidos de un registro y los reproduce como si los hubiera tipeado en modo normal. Del mismo modo, q simplemente registra la secuencia que está escribiendo en el registro que nombre. Estos son los mismos registros que utiliza para tirar/poner - lo que significa que puede pegar directamente una secuencia grabada en un archivo (.vimrc ¿alguien?) O tirar de una secuencia de comandos de un archivo y reproducirlo (para poder mantener un montón de ellos en ~/my-vim-macros.txt o algo así).

Cuestiones relacionadas