2013-04-23 41 views
6

Tôi có điều này trong .vimrc tôi để loại bỏ dấu khoảng trắng:VIM: phạm vi dòng tùy chọn cho lệnh/chức năng

function! RemoveTrailingWhitespace() 
    for lineno in range(a:firstline, a:lastline) 
    let line = getline(lineno) 
    let cleanLine = substitute(line, '\(\s\| \)\+$', '', 'e') 
    call setline(lineno, cleanLine) 
    endfor 
endfunction 
command -range RemoveTrailingWhitespace <line1>,<line2>call RemoveTrailingWhitespace() 
command -range RT      <line1>,<line2>call RemoveTrailingWhitespace() 

Điều này cho phép tôi gọi :'<,'>RT để loại bỏ dấu khoảng trắng cho một phạm vi lựa chọn trực quan của dòng. Tuy nhiên, khi tôi chỉ gọi :RT, nó chỉ hoạt động trên dòng hiện tại. Những gì tôi muốn mặc dù, là áp dụng lệnh cho toàn bộ bộ đệm. Làm thế nào điều này có thể đạt được?

+0

FYI: Có một số plugin làm điều đó (và nhiều hơn nữa, như tự động kích hoạt và làm nổi bật khoảng trống cuối). Một trong số đó là [plugin DeleteTrailingWhitespace] của tôi (http://www.vim.org/scripts/script.php?script_id=3967); trang của nó có liên kết đến các lựa chọn thay thế. –

Trả lời

11

nếu bạn không cung cấp cho range, lệnh có range sẽ áp dụng trên dòng hiện tại. Nếu bạn muốn làm điều đó trên toàn bộ đệm, sử dụng :%RT hoặc :1,$RT

gì bạn có thể làm để làm cho toàn bộ đệm như phạm vi mặc định là:

command -range=% RT <line1>,<line2>call RemoveTrailingWhitespace() 

chi tiết:

:h command-range 

sau đó bạn nhìn thấy :

Possible attributes are: 

-range  Range allowed, default is current line 
-range=% Range allowed, default is whole file (1,$) 
-range=N A count (default N) which is specified in the line 
     number position (like |:split|); allows for zero line 
     number. 
-count=N A count (default N) which is specified either in the line 
     number position, or as an initial argument (like |:Next|). 
     Specifying -count (without a default) acts like -count=0 

một bình luận/câu hỏi vào chức năng của bạn

nếu bạn có thông tin phạm vi, tại sao không chỉ gọi vim-build theo lệnh :[range]s để thực hiện thay thế? sau đó bạn có thể lưu các dòng đó getline, setline, cũng là loop.

+0

Điều này dường như đặt vị trí con trỏ ở cuối tệp sau khi chạy ': RT' không có dải ô. Bạn có biết cách này không? Tôi đã thử 'getpos' /' setpos' cũng như 'winsaveview' /' winrestview', nhưng cả hai đều không hoạt động. Cảm ơn một lần nữa! –

+0

Đừng bận tâm, tôi đã theo dõi bình luận của bạn và viết lại toàn bộ điều để sử dụng lệnh ': s'. Đề xuất tuyệt vời! –

+0

@padde bạn gọi getpos/setpos bằng cách nào? hãy thử 'let x = getpos (". ") [công cụ logic của bạn] rồi gọi setpos (". ", x)' – Kent

1

Trong khi kết thúc tôi đã đi với giải pháp đơn giản hơn nhiều này, mà còn giữ vị trí con trỏ:

command -range=% RemoveTrailingWhitespace <line1>,<line2>s/\(\s\| \)\+$// | norm! `` 
command -range=% RT      <line1>,<line2>RemoveTrailingWhitespace 

Cảm ơn những lời đề nghị @Kent!

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