Làm thế nào bạn có thể tự động xóa khoảng trắng theo dõi trong vim


197

Tôi đang gặp lỗi 'dấu vết khoảng trắng' khi cố gắng thực hiện một số tệp trong git.

Tôi muốn tự động xóa các ký tự khoảng trắng theo dõi này ngay trước khi tôi lưu tệp python.

Bạn có thể cấu hình vim để làm điều này? Nếu vậy thì thế nào?


3
điều này không liên quan đến một mình python

2
Sử dụng plugin DeleteTrailingWhitespace của tôi .
Ingo Karkat

Câu trả lời:


208

Tôi tìm thấy câu trả lời ở đây .

Thêm phần sau vào tệp .vimrc của tôi đã thực hiện thủ thuật.

autocmd BufWritePre *.py :%s/\s\+$//e

1
Hấp dẫn! Trailing trắng là một trận chiến tại nơi làm việc. Tôi ghét nó, những người khác không hiểu tại sao. Chúng tôi sử dụng nhiều vi như vim (tôi sử dụng vim; họ không vì họ phải cài đặt nó). Tôi có một chương trình tôi gọi stb đến Dải Trailing Blanks và tôi sử dụng nó làm bộ lọc; làm việc trong vi quá. Điều này tốt hơn.
Jonathan Leffler

16
Điều này thay đổi vị trí con trỏ trên mỗi lần lưu. Có thể tránh được không?
stepancheg

3
Vì đây là câu trả lời thực tế cho câu hỏi này, có lẽ nó nên được cập nhật để duy trì vị trí con trỏ.
Edu Felipe

2
Điều này cũng sẽ xóa các dấu cách trong các chuỗi nhiều dòng, có thể không mong muốn trong một số trường hợp. Nhưng tôi đoán không có cách dễ dàng để tránh điều này?
luator

3
Có lẽ bạn có thể nói rõ rằng eở cuối có nghĩa là, nếu chúng ta không tìm thấy mẫu, vi không coi lệnh thay thế là thất bại
LLenain

169

Tổng hợp ở trên cộng với lưu vị trí con trỏ:

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

autocmd FileType c,cpp,java,php,ruby,python autocmd BufWritePre <buffer> :call <SID>StripTrailingWhitespaces()

Nếu bạn muốn áp dụng điều này khi lưu vào bất kỳ tệp nào, hãy bỏ qua phần thứ hai autocmdvà sử dụng ký tự đại diện *:

autocmd BufWritePre * :call <SID>StripTrailingWhitespaces()

9
Bạn có thể cải thiện chức năng của mình bằng cách lưu lại tìm kiếm cuối cùng và khôi phục nó. let _s = @ / let @ / = _ s
xApple

3
Tôi loại bỏ autocmd FileType c,cpp,java,php,ruby,python một phần để làm cho nó áp dụng cho tất cả các tập tin.
swt83

8
@xApple: Bên trong các chức năng, việc lưu và khôi phục tìm kiếm cuối cùng là không cần thiết - rời khỏi bối cảnh chức năng sẽ đảm nhiệm việc đó.
Tobias

3
@ swt83 bạn cũng cần thay thế <buffer>bằng *nếu bạn muốn nó hoạt động trên tất cả các tệp
cadlac

3
Nếu bạn thêm tiền tố vào lệnh thay thế w / keepp, nó sẽ không thay đổi lịch sử tìm kiếm của bạn, tức làkeepp %s/\s\+$//e
jeberle

68

Tôi cũng thường có một:

match Todo /\s\+$/

trong .vimrctập tin của tôi , để khoảng trắng cuối dòng bị mờ.

Todo là một tên nhóm cú pháp được sử dụng cho các từ khóa hilighting như TODO, FIXMEhoặc XXX. Nó có màu nền vàng hơi xấu xí khó chịu và tôi thấy đó là thứ tốt nhất để làm mờ những thứ bạn không muốn trong mã của mình :-)


7
Hoặc bạn có thể đặt danh sách và đặt listchars + = trail :.
Oli

Tuyệt vời - đó là nền tảng hoàn hảo giữa việc tự động xóa khoảng trắng theo dõi (ngay cả khi tôi có thể không biết về nó hoặc khi đó là mã của người khác mà tôi chỉ tình cờ làm việc trong cùng một tệp), để không làm gì với nó . Cảm ơn.
Daniel Hershcovich

2
thật không may, phối màu yêu thích của tôi zenburn không làm nổi bật
Peter Long

@PeterLong, cũng không hoạt động trong chủ đề railscasts. Kiểm tra nó với :hi Todo. Vì vậy, tôi đã đọc :hi <Tab>:help hi. Tôi đã xem xét CursorError, nhưng tôi nghĩ tôi sẽ thử match VisualNOS /\s\+$/ . Tôi có thể kết hợp điều này với một số autocmdcâu trả lời khác ở đây.
Brady Trainor

51

Cả hai tôi đều làm nổi bật khoảng trắng trailing hiện tại và cả dải khoảng trắng trailing.

Tôi định cấu hình trình soạn thảo của mình (vim) để hiển thị khoảng trắng ở cuối, ví dụ:

nhập mô tả hình ảnh ở đây

với cái này ở dưới cùng .vimrc của tôi:

highlight ExtraWhitespace ctermbg=red guibg=red
match ExtraWhitespace /\s\+$/
autocmd BufWinEnter * match ExtraWhitespace /\s\+$/
autocmd InsertEnter * match ExtraWhitespace /\s\+\%#\@<!$/
autocmd InsertLeave * match ExtraWhitespace /\s\+$/
autocmd BufWinLeave * call clearmatches()

và tôi 'tự động tước' nó khỏi các tệp khi lưu chúng, trong trường hợp của tôi * .rb cho các tệp ruby, một lần nữa trong ~ / .vimrc của tôi

function! TrimWhiteSpace()
    %s/\s\+$//e
endfunction
autocmd BufWritePre     *.rb :call TrimWhiteSpace()

13

Đây là một cách để lọc theo nhiều FileType.

autocmd FileType c,cpp,python,ruby,java autocmd BufWritePre <buffer> :%s/\s\+$//e

Mỗi tệp: autocmd FileType * autocmd BufWritePre <buffer>:% s / \ s \ + $ // e
JREAM

7

Sao chép và dán từ http://blog.kamil.dworakowski.name/2009/09/unazedrusive-highlighting-of-trailing.html (liên kết không còn hoạt động, nhưng bit bạn cần ở bên dưới)

"Điều này có lợi thế là không làm nổi bật từng khoảng trống bạn nhập ở cuối dòng, chỉ khi bạn mở tệp hoặc để chế độ chèn. Rất gọn gàng."

highlight ExtraWhitespace ctermbg=red guibg=red
au ColorScheme * highlight ExtraWhitespace guibg=red
au BufEnter * match ExtraWhitespace /\s\+$/
au InsertEnter * match ExtraWhitespace /\s\+\%#\@<!$/
au InsertLeave * match ExtraWhiteSpace /\s\+$/

1
Các liên kết blog dường như đã chết.
Tobias

Giải pháp tương tự được tìm thấy tại liên kết này trong phần "Sử dụng lệnh khớp".
ryanjdillon

6

Tôi đã thấy giải pháp này trong một nhận xét tại VIM Wikia - Xóa các khoảng trống không mong muốn

Tôi thực sự thích nó. Thêm một .khoảng trắng không mong muốn.

nhập mô tả hình ảnh ở đây

Đặt cái này vào .vimrc

" Removes trailing spaces
function TrimWhiteSpace()
  %s/\s*$//
  ''
endfunction

set list listchars=trail:.,extends:>
autocmd FileWritePre * call TrimWhiteSpace()
autocmd FileAppendPre * call TrimWhiteSpace()
autocmd FilterWritePre * call TrimWhiteSpace()
autocmd BufWritePre * call TrimWhiteSpace()

5

Đây là cách tôi đang làm nó. Tôi không thể nhớ nơi tôi đã đánh cắp nó từ tbh.

autocmd BufWritePre * :call <SID>StripWhite()
fun! <SID>StripWhite()
    %s/[ \t]\+$//ge
    %s!^\( \+\)\t!\=StrRepeat("\t", 1 + strlen(submatch(1)) / 8)!ge
endfun

2
Hum, thật nguy hiểm khi làm điều đó trên "*" nếu cuối cùng bạn mở tệp nhị phân, chúng có thể có hình dạng khá xấu.
chiếu

Có lẽ không phải là thông minh nhất, một lần nữa tôi cũng không sử dụng vim cho trình soạn thảo hex. Điều đó sẽ không thực hiện trừ khi bạn tiết kiệm.
gregf

Tôi nghĩ rằng điều này đánh bại sự thay thế của việc liệt kê từng loại tệp mà bạn có thể làm việc, phải không? Tôi làm việc trên rb, php, cs, html, sass, css, js, coffee, xml, xslt, pl, v.v., v.v ... Có phương tiện hạnh phúc không?
Derek Trước

4
Trừ khi bạn viết vào tệp nhị phân trong vim, điều này có lẽ sẽ không bao giờ là vấn đề.
gregf

Nó xuất hiện trong %slá cờ toàn cầu (g) đầu tiên vô dụng như một khoảng trống tại EOL :-)
Jens

3

Một giải pháp chỉ đơn giản là loại bỏ khoảng trắng theo dõi từ tệp không được chấp nhận trong mọi trường hợp. Nó sẽ hoạt động trong một dự án có chính sách này ngay từ đầu, và do đó, không có khoảng trắng nào mà bạn không chỉ thêm mình vào cam kết sắp tới.

Giả sử bạn chỉ muốn không thêm các trường hợp mới của khoảng trắng theo dõi, mà không ảnh hưởng đến khoảng trắng hiện có trong các dòng mà bạn không chỉnh sửa, để giữ cho cam kết của bạn không có thay đổi không liên quan đến công việc của bạn.

Trong trường hợp đó, với git, bạn có thể sử dụng tập lệnh như thế này:

#!/bin/sh

set -e # bail on errors

git stash save commit-cleanup
git stash show -p | sed '/^\+/s/ *$//' | git apply
git stash drop

Điều đó có nghĩa là, chúng ta bỏ qua các thay đổi và sau đó lọc tất cả các +dòng trong diff để xóa khoảng trắng theo sau của chúng khi chúng ta áp dụng lại thay đổi cho thư mục làm việc. Nếu ống lệnh này thành công, chúng ta sẽ bỏ stash.


1

Các cách tiếp cận khác ở đây bằng cách nào đó đã không làm việc cho tôi trong MacVim khi được sử dụng trong .vimrctệp. Vì vậy, đây là một trong đó và làm nổi bật không gian dấu:

set encoding=utf-8
set listchars=trail:·
set list

Thực hiện set listchars=trail:·nói : E474: Invalid argument: listchars=trail:·. Bạn có thể xác nhận ví dụ của bạn?
kenorb 16/2/2015



0

Đối với những người muốn chạy nó cho các loại tệp cụ thể (FileTypes không phải lúc nào cũng đáng tin cậy):

autocmd BufWritePre *.c,*.cpp,*.cc,*.h,*.hpp,*.py,*.m,*.mm :%s/\s\+$//e

Hoặc với vim7:

autocmd BufWritePre *.{c,cpp,cc,h,hpp,py,m,mm} :%s/\s\+$//e

0

Nếu bạn cắt khoảng trắng, bạn chỉ nên thực hiện trên các tệp đã sạch. "Khi ở Rome ...". Đây là nghi thức tốt khi làm việc trên các cơ sở mã hóa, nơi những thay đổi giả không được chào đón.

Chức năng này phát hiện khoảng trắng ở cuối và chỉ bật cắt tỉa nếu nó đã sạch.

Tín dụng cho ý tưởng này thuộc về một bình luận quý giá ở đây: https://github.com/atom/whitespace/issues/10 (luồng nhận xét về vé lỗi dài nhất từ ​​trước đến nay)

autocmd BufNewFile,BufRead *.test call KarlDetectWhitespace()

fun! KarlDetectWhitespace()
python << endpython
import vim
nr_unclean = 0
for line in vim.current.buffer:
    if line.rstrip() != line:
        nr_unclean += 1

print "Unclean Lines: %d" % nr_unclean
print "Name: %s" % vim.current.buffer.name
cmd = "autocmd BufWritePre <buffer> call KarlStripTrailingWhitespace()"
if nr_unclean == 0:
    print "Enabling Whitespace Trimming on Save"
    vim.command(cmd)
else:
    print "Whitespace Trimming Disabled"
endpython
endfun

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

Bạn cũng có thể tiếp tục đăng ký tìm kiếm let _s=@/và khôi phục nó ở cuối `let @ / = _ s`. Trong trường hợp này, chúng tôi đang sử dụng đăng ký lỗ đen
SergioAraujo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.