2012-02-08 19 views
5

Sto provando a fare un codice piuttosto che il filtro della stampante (ad esempio perltidy) accetta opzioni arbitrarie a seconda delle variabili vim. Il mio obiettivo è passare le opzioni specifiche del progetto a un comando esterno utilizzato come filtro (:!) In modalità visiva.Come utilizzare le variabili vim in un comando di filtro esterno in modalità visiva?

Di seguito esprime la mia intenzione (l'ultima riga è problematica):

" 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> 

Tuttavia, l'ultima riga (vnoremap) è un errore in vim, perché si espande a:

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

e il comando execute non può accettare un intervallo. Ma mi piacerebbe avere questo:

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

Come posso fare questo?

p.s. Il mio perltidy è configurato per agire come un filtro unix e io uso vim 7.3.

risposta

2

È possibile utilizzare <C-\>e e getcmdline() per preservare il contenuto della riga di comando:

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

, ma in questo caso vorrei suggerire semplice <C-r>=, che elimina la necessità di :execute:

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

Se si desidera eliminare un intervallo in modalità di comando (ex), CRL farà proprio questo.

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

diventa

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

: h c_CTRL-u

vimming Felice,

-Luke

Problemi correlati