2012-02-08 24 views
5

Tôi đang cố gắng tạo một bộ lọc mã máy in đẹp (ví dụ: perltidy) chấp nhận các tùy chọn tùy ý tùy thuộc vào các biến vim. Mục tiêu của tôi là chuyển các tùy chọn cụ thể của dự án tới một lệnh bên ngoài được sử dụng như một bộ lọc (:!) Trong chế độ trực quan.Làm thế nào để sử dụng các biến vim trong lệnh bộ lọc bên ngoài trong chế độ trực quan?

Sau đây bày tỏ ý định của tôi (dòng cuối cùng là vấn đề):

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

Tuy nhiên, dòng cuối cùng (vnoremap) là một lỗi trong vim, bởi vì nó mở rộng tới:

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

và lệnh thi hành không thể chấp nhận một phạm vi. Nhưng tôi muốn có điều này:

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

Tôi làm cách nào để thực hiện việc này?

p.s. Perltidy của tôi được cấu hình để hoạt động như một bộ lọc unix và tôi sử dụng vim 7.3.

Trả lời

2

Bạn có thể sử dụng <C-\>egetcmdline() để bảo vệ nội dung dòng lệnh:

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

, nhưng trong trường hợp này, tôi sẽ đề nghị đơn giản <C-r>= mà thanh trừng ra sự cần thiết cho :execute:

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

Nếu bạn muốn loại bỏ phạm vi ở chế độ lệnh (cũ), CRL-u sẽ thực hiện điều đó.

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

trở thành

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

: h c_CTRL-u

Chúc mừng vimming,

-Luke

Các vấn đề liên quan