2012-02-08 11 views
5

Estoy tratando de hacer que un código bonito filtro de impresora (por ejemplo, perltidy) acepte opciones arbitrarias según las variables vim. Mi objetivo es pasar opciones específicas del proyecto a un comando externo utilizado como filtro (:!) En modo visual.¿Cómo usar variables vim en un comando de filtro externo en modo visual?

El siguiente expresa mi intención (la última línea es problemático):

" set b:perltidy_options based on dirname of the currently edited file 
function! SetProjectVars() 
    if match(expand("%:p:h"), "/project-foo/") >= 0 
    let b:perltidy_options = "--profile=$HOME/.perltidyrc-foo --quiet" 
    elseif match(expand("%:p:h"), "/project-bar/") >= 0 
    let b:perltidy_options = "--profile=$HOME/.perltidyrc-bar --quiet" 
    else 
    let b:perltidy_options = "--quiet" 
    endif 
endfunction 

" first set the project specific stuff 
autocmd BufRead,BufNewFile * call SetProjectVars() 

" then use it 
vnoremap ,t :execute "!perltidy " . b:perltidy_options<Enter> 

Sin embargo, la última línea (vnoremap) es un error en vim, porque se expande a:

:'<,'>execute "!perltidy " . b:perltidy_options 

y el comando de ejecución no puede aceptar un rango. Pero me gustaría tener esto:

:execute "'<,'>!perltidy " . b:perltidy_options 

¿Cómo puedo hacer esto?

p.s. Mi perltidy está configurado para actuar como un filtro unix y yo uso vim 7.3.

Respuesta

2

Usted puede utilizar <C-\>e y getcmdline() para preservar el contenido de línea de comandos:

vnoremap ,t :<C-\>e'execute '.string(getcmdline()).'."!perltidy " . b:perltidy_options'<CR><CR> 

, pero en este caso yo sugeriría más simple <C-r>= que purga la necesidad de :execute:

vnoremap ,t :!perltidy <C-r>=b:perltidy_options<CR><CR> 
2

Si alguna vez desea deshacerse de un rango en el modo de comando (ex), CRL-u lo hará.

vnoremap ,t :execute "!perltidy " . b:perltidy_options<Enter> 

convierte

vnoremap ,t :<C-u>execute "!perltidy " . b:perltidy_options<CR> 

: h c_CTRL-u

vimming feliz,

Lucas

Cuestiones relacionadas