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.