2010-02-26 32 views
13

Tại công việc hiện tại của tôi, chúng tôi có các tiêu chuẩn kiểu mã hóa khác với các tiêu chuẩn tôi thường làm theo. May mắn thay, chúng tôi có một tập tin RC đóng hộp cho perltidy mà tôi có thể áp dụng cho các tệp định dạng lại trước khi tôi gửi chúng đến quy trình xem xét của chúng tôi.Làm thế nào tôi có thể script vim để chạy perltidy trên một bộ đệm?

Tôi có mã cho các emacs mà tôi sử dụng để chạy lệnh trên bộ đệm và thay thế bộ đệm bằng đầu ra, mà tôi đã điều chỉnh cho điều này. Nhưng đôi khi tôi thay thế giữa emacs và vim, và muốn có cùng khả năng ở đó. Tôi chắc chắn rằng điều này hoặc một cái gì đó tương tự là đơn giản và đã được thực hiện và tái thực hiện nhiều lần hơn. Nhưng tôi đã không có nhiều may mắn tìm thấy bất kỳ ví dụ về vim-script mà dường như làm những gì tôi cần. Đó là, trong bản chất, để có thể nhấn một tổ hợp phím (như Ctrl-F6, những gì tôi sử dụng trong emacs) và có bộ đệm được định dạng lại tại chỗ bởi perltidy. Trong khi tôi là một người sử dụng vim thoải mái, tôi hoàn toàn không biết gì khi viết loại điều này cho vim.

+3

Mặc dù nó không liên quan đến câu hỏi này, Damian Conway đã được hiển thị tất cả các loại vim thú vị trong một loạt bài cho developerWorks: http://www.ibm.com/developerworks/linux/library/l-vim-script-1/index.html –

Trả lời

8

Lệnh để lọc toàn bộ đệm thông qua một chương trình bên ngoài là:

:%!command 

Đặt sau trong ~/.vimrc để ràng buộc nó vào Ctrl-F6 trong chế độ bình thường:

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

Đối với niềm vui thêm :

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

Điều này sẽ chỉ ánh xạ bộ lọc nếu chỉnh sửa tệp Perl.

+1

Loại bỏ phần đầu: nếu đặt nó vào .vimrc. Nó chỉ cần thiết để bắt đầu một dòng lệnh trong trình soạn thảo. –

8

lệnh gọn gàng của tôi:

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

Nếu bạn sử dụng một lựa chọn hình ảnh hoặc cung cấp một loạt sau đó nó sẽ dọn phạm vi lựa chọn, nếu không nó sẽ sử dụng toàn bộ tập tin. Bạn có thể đặt một tập hợp các tùy chọn mặc định (nếu bạn có) vào thời điểm tôi viết (your default options go here), nhưng bất kỳ đối số nào bạn cung cấp cho :Tidy sẽ được thêm vào dòng lệnh perltidy, ghi đè các giá trị mặc định của bạn. (Nếu bạn sử dụng .perltidyrc bạn có thể không có mặc định arg - đó là tốt - nhưng sau đó một lần nữa bạn có thể muốn có một mặc định như --profile=vim mà thiết lập mặc định chỉ cho khi bạn đang làm việc trong vim. Dù hoạt động.)

0

tôi đang sử dụng để chọn văn bản sử dụng dòng theo định hướng thị giác phím Shift +V và sau đó tôi nhấn : I có !perltidy -pbp -et4 nơi nào đó trong lịch sử vì vậy tôi nhấn một lần hoặc nhiều mũi tên lên .

4

Lấy câu trả lời Hobbs' một bước xa hơn, bạn có thể lập bản đồ lệnh đó vào một phím tắt:

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

Và một bước xa hơn: Chỉ có bản đồ lệnh khi bạn đang ở trong một bộ đệm Perl (kể từ khi bạn có thể sẽ không muốn chạy perltidy trên bất kỳ ngôn ngữ khác):

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> 

Bây giờ bạn có thể nhấn Ctrl-F6 mà không có một lựa chọn tích cực để định dạng toàn bộ tập tin, hoặc với một lựa chọn tích cực để định dạng chỉ phần đó.

10

Sau khi thử câu trả lời @hobbs tôi nhận thấy rằng khi lọc toàn bộ bộ đệm qua perltidy con trỏ trở về byte 1 và tôi phải lưu ý về số dòng ban đầu để có thể quay lại sau khi hoàn tất :Tidy.

Vì vậy, xây dựng trên @hobbs' và @ câu trả lời Ignacio, tôi thêm vào phần sau đây để .vimrc tôi:

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

(đóng " thêm vào ý kiến ​​cho SO mục đích nổi bật cú pháp (không bắt buộc, nhưng cú pháp vim hợp lệ))

DoTidy() sẽ trả về con trỏ về vị trí ban đầu cộng hoặc trừ tối đa X byte, trong đó X là số byte được thêm/xóa bởi perltidy liên quan đến vị trí con trỏ ban đầu. Nhưng điều này là khá tầm thường miễn là bạn giữ mọi thứ gọn gàng :).

[phiên bản Vim: 7.2]

EDIT: Cập nhật DoTidy() để kết hợp @ bình luận mikew cho dễ đọc và để tương thích với Vim 7.0

+0

Cảm ơn! Vấn đề con trỏ đó đã khiến tôi phát điên và tôi quá lười biếng để tìm ra. Đây là câu trả lời hay nhất. –

+0

Tôi không biết tại sao mã lưu con trỏ không hoạt động đối với tôi. Tôi thay thế 'let Pos = line2byte (dòng (". "))' Với 'let l = line (". ")' Và 'let c = col (". ")' Rồi 'con trỏ gọi (l, c)' và nó hoạt động. Có lẽ vim là quá cũ? sử dụng v7.0 – mikew

+0

@mikew Tôi nghĩ rằng phiên bản của bạn có ý nghĩa hơn anyway :) – hobbs

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