2010-02-26 24 views
13

En mi trabajo actual, tenemos estándares de estilo de codificación que son diferentes de los que normalmente sigo. Afortunadamente, tenemos un archivo RC enlatado para perltidy que puedo solicitar para reformatear los archivos antes de enviarlos a nuestro proceso de revisión.¿Cómo puedo ejecutar vim para ejecutar perltidy en un buffer?

Tengo código para emacs que utilizo para ejecutar un comando sobre un búfer y reemplazar el búfer con la salida, que he adaptado para esto. Pero a veces altero entre emacs y vim, y me gustaría tener las mismas capacidades allí. Estoy seguro de que esto o algo similar es simple y que se ha hecho y repetido muchas veces. Pero no he tenido mucha suerte en encontrar ejemplos de vim-script que parezcan hacer lo que necesito. Que es, en esencia, poder presionar un combo de tecla (como Ctrl-F6, lo que uso en emacs) y hacer que el buffer se formatee in situ al perltidy. Si bien soy un usuario de vim cómodo, no tengo ni idea de escribir este tipo de cosas para vim.

+3

A pesar de que no está relacionado con esta cuestión, Damian Conway ha estado mostrando todo tipos de cosas vim interesantes en una serie para developerWorks: http://www.ibm.com/developerworks/linux/library/l-vim-script-1/index.html –

Respuesta

8

El comando para filtrar toda la memoria intermedia a través de un programa externo es:

:%!command 

poner lo siguiente en ~/.vimrc para obligar a éste a Ctrl-F6 en modo normal:

:nmap <C-F6> :%!command<CR> 

Para más diversión :

:au Filetype perl nmap <C-F6> :%!command<CR> 

Esto solo asignará el filtro si está editando un archivo Perl.

+1

Eliminar la inicial: si la coloca en .vimrc. Solo es necesario para iniciar una línea de comando dentro del editor. –

8

mi mandamiento ordenado:

command -range=% -nargs=* Tidy <line1>,<line2>! 
    \perltidy (your default options go here) <args> 

Si utiliza una selección visual o proporcionar una gama entonces será poner en orden el rango seleccionado, de lo contrario se usará el archivo completo. Puede poner un conjunto de opciones predeterminadas (si tiene alguna) en el punto donde escribí (your default options go here), pero los argumentos que proporcione a :Tidy se anexarán a la línea de comandos perltidy, anulando los valores predeterminados. (Si usa un .perltidyrc puede que no tenga args predeterminados, está bien, pero de nuevo puede querer tener un valor predeterminado como --profile=vim que configura los valores predeterminados solo para cuando trabaja en vim. Lo que sea que funcione)

0

estoy utilizado para seleccionar texto usando la línea visual orientado Shift +V y luego presione : un I tienen !perltidy -pbp -et4 algún lugar en la historia por lo que llegué a una o más veces la flecha hacia arriba .

4

Tomando un paso más allá respuesta Hobbs, puede asignar ese comando a una tecla de acceso directo:

command -range=% -nargs=* Tidy <line1>,<line2>!perltidy -q 
noremap <C-F6> :Tidy<CR> 

Y otro paso más: Sólo asignar el comando cuando se está en un buffer de Perl (ya que probablemente no querría correr perltidy en cualquier otro idioma):

autocmd BufRead,BufNewFile *.pl,*.plx,*.pm command! -range=% -nargs=* Tidy <line1>,<line2>!perltidy -q 
autocmd BufRead,BufNewFile *.pl,*.plx,*.pm noremap <C-F6> :Tidy<CR> 

Ahora puede pulsar Ctrl-F6 y sin una selección activa para dar formato a todo el archivo, o con una selección activa para formatear solo esa sección.

10

Después de intentar la respuesta de @hobbs noté que al filtrar todo el buffer a través de perltidy el cursor regresó al byte 1, y tuve que anotar mentalmente el número de línea original para poder regresar después de completar :Tidy.

Así partiendo de @hobbs' y @ respuestas de Ignacio, he añadido lo siguiente a mi .vimrc:

"define :Tidy command to run perltidy on visual selection || entire buffer" 
command -range=% -nargs=* Tidy <line1>,<line2>!perltidy 

"run :Tidy on entire buffer and return cursor to (approximate) original position" 
fun DoTidy() 
    let l = line(".") 
    let c = col(".") 
    :Tidy 
    call cursor(l, c) 
endfun 

"shortcut for normal mode to run on entire buffer then return to current line" 
au Filetype perl nmap <F2> :call DoTidy()<CR> 

"shortcut for visual mode to run on the the current visual selection" 
au Filetype perl vmap <F2> :Tidy<CR> 

(cierre " añaden a los comentarios con fines SO resaltado de sintaxis (no es necesario, pero la sintaxis de vim válida))

DoTidy() devolverá el cursor a su posición más o menos original, en la mayoría de X bytes, donde X es el número de bytes añadidos/eliminados por perltidy relación a la posición original del cursor. Pero esto es bastante trivial siempre y cuando mantengas las cosas ordenadas :).

[versión de Vim: 7,2]

EDIT: Actualizado DoTidy() incorporar @ comentario de mikew para facilitar la lectura y para la compatibilidad con Vim 7.0

+0

Gracias! El problema del cursor me ha estado volviendo loco y yo era demasiado flojo para descubrirlo. Esta es la mejor respuesta. –

+0

No sé por qué el código de ahorro del cursor no funcionaba para mí. Reemplacé 'let Pos = line2byte (line (". "))' Con 'let l = line (". ")' Y 'let c = col (". ")' Then 'call cursor (l, c)' y eso funciona Quizás vim es demasiado viejo? usando v7.0 – mikew

+0

@mikew Creo que su versión tiene más sentido de todos modos :) – hobbs

Cuestiones relacionadas