2011-11-29 7 views
12

tôi đã bổ sung thêm chức năng sau đây trong vimrc của tôi để loại bỏ dấu không gian trắng chỉ trước khi lưuLoại bỏ dấu không gian trắng chỉ dành cho dòng chỉnh sửa

fun! <SID>StripTrailingWhitespaces()            
    let l = line(".")               
    let c = col(".")                
    %s/\s\+$//e                 
    call cursor(l, c)               
endfun                   

autocmd BufWritePre *.h :call <SID>StripTrailingWhitespaces() 
autocmd BufWritePre *.cpp :call <SID>StripTrailingWhitespaces() 
autocmd BufWritePre *.c :call <SID>StripTrailingWhitespaces() 

Nó hoạt động thực sự tốt. Tuy nhiên, trong một số trường hợp nhất định, tôi chỉ muốn xóa dấu cách trắng sau các dòng mà tôi đã chỉnh sửa. Điều này là để đảm bảo rằng đầu ra diff của tôi trông lành mạnh như đối với một số tệp mã cũ nhất gần như tất cả các dòng có dấu cách quay lại và tôi không muốn gây gánh nặng cho trình đánh giá mã của tôi với sự khác biệt không cần thiết.

diff -b không phải là giải pháp ngay bây giờ vì nó cũng bỏ qua các khoảng trắng từ bất kỳ đâu trong một dòng và đôi khi thay đổi đó đủ quan trọng để bao gồm trong đầu ra diff.

Vì vậy, câu hỏi của tôi là - có thể tách các dấu cách trắng theo sau chỉ từ các dòng đã được chỉnh sửa trong phiên này trong một tệp trong vim không?

+1

Tôi có một quy tắc làm nổi bật làm nổi bật (theo một cách rất khó chịu) dấu cách khoảng trắng, vì vậy rất dễ dàng để tôi xem không gian nào cần được loại bỏ; nhưng 1 vì nó sẽ là tốt đẹp để tự động hóa hầu hết trong số đó. – SingleNegationElimination

+1

Tại sao không, như một nhiệm vụ một lần, loại bỏ tất cả khoảng trống cuối của tất cả các tệp cũ của bạn? –

+1

@MatthewStrawbridge Làm điều đó che khuất người đã viết (hoặc thay đổi lần cuối) các dòng khi bạn chạy một cái gì đó như git chú thích. (Nó vẫn có thể được tìm thấy, nhưng nó có các bước bổ sung.) –

Trả lời

2

mMontu's answer có ý tưởng đúng, nhưng nó không xử lý một trường hợp cạnh. Cụ thể là, nếu tôi di chuyển con trỏ xuống, sau đó sao lưu, tất cả trong chế độ chỉnh sửa, nó sẽ không nhận các thay đổi đối với các dòng đó. Nếu chúng ta muốn xử lý điều này, thì chúng ta cần lưu trữ các dòng trên cùng và dưới cùng mà người dùng truy cập. Dưới đây là một số mã mạnh mẽ hơn, với tất cả mọi thứ chia thành các nhóm chức năng:

fun! <SID>SetupTrailingWhitespaces() 
    let curline = line('.') 
    let b:insert_top = curline 
    let b:insert_bottom = curline 
endfun 

fun! <SID>UpdateTrailingWhitespace() 
    let curline = line('.') 
    if b:insert_top > curline 
     let b:insert_top = curline 
    elseif b:insert_bottom < curline 
     let b:insert_bottom = curline 
    endif 
endfun 

fun! <SID>StripTrailingWhitespaces() 
    let original_cursor = getpos('.') 
    exe b:insert_top ',' b:insert_bottom 's/\s\+$//e' 
    call setpos('.', original_cursor) 
endfun 

Bây giờ chúng ta chỉ cần gọi các chức năng này vào đúng thời điểm:

autocmd InsertEnter * :call <SID>SetupTrailingWhitespaces() 
autocmd InsertLeave * :call <SID>StripTrailingWhitespaces() 
autocmd CursorMovedI * :call <SID>UpdateTrailingWhitespace() 

Ngoài ra, tôi đã viết rằng a plugin cung cấp chức năng cập nhật này , với một số tính năng bổ sung như tước ở chế độ bình thường là tốt.

4

Một khả năng sẽ được sử dụng autocmd InsertLeave dải không gian trắng từ dòng hiện mỗi khi bạn rời khỏi chế độ chèn:

autocmd InsertLeave *.[ch] :call <SID>StripTrailingWhitespaces() 

, và thay đổi lệnh thay thế của StripTrailingWhitespaces() chức năng thay đổi để

s/\s\+$//e 

Nó sẽ hoạt động nếu tất cả các dòng mà bạn đưa vào không kết thúc bằng các khoảng trắng , chỉ các dòng cuối cùng. Có thể thay đổi các dòng mà bạn đã không thay đổi , nếu bạn vào và thoát chế độ chèn (i, tiếp theo là ESC).

Giải pháp này có thể được thay đổi để làm việc nếu bạn bao gồm dây chuyền mà không kết thúc trong không gian trắng (đường dán từ mã di sản, ví dụ):

autocmd InsertEnter *.[ch] :let b:insert_start = line('.') 
autocmd InsertLeave *.[ch] :call <SID>StripTrailingWhitespaces() 

fun! StripTrailingWhitespaces() 
    let original_cursor = getpos('.') 
    exe b:insert_start . ',.s/\s\+$//e' 
    call setpos('.', original_cursor) 
endfun  

Nếu thay thế trên dây chuyền do nhập và thoát chèn chế độ (i theo sau là ESC) là một vấn đề sau đó giải pháp có thể tiết kiệm b:changedtick-variable khi vào chế độ chèn và kiểm tra khi rời khỏi chế độ chèn để phát hiện thay đổi.

0

Tôi viết một plugin có tên 'vim-scavenger' để dọn sạch nhiều dòng trống và dấu cách.

Chỉ cần thêm cấu hình sau vào trong của bạn.vimrc:

let g:scavenger_auto_clean_up_on_write = 1 

Để biết thêm chi tiết, bạn có thể truy cập vào số Github repo để tìm hiểu thêm. Vui lòng cho tôi lời khuyên để cải thiện plugin.

+0

Plugin này đã được đổi tên thành 'vim-janitor'. Vui lòng truy cập [tại đây] (https://github.com/KuoE0/vim-janitor). – KuoE0