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?
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?
Câu trả lời:
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
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
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 autocmd
và sử dụng ký tự đại diện *
:
autocmd BufWritePre * :call <SID>StripTrailingWhitespaces()
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.
<buffer>
bằng *
nếu bạn muốn nó hoạt động trên tất cả các tệp
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
Tôi cũng thường có một:
match Todo /\s\+$/
trong .vimrc
tậ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
, FIXME
hoặ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 :-)
:hi Todo
. Vì vậy, tôi đã đọc :hi <Tab>
và :help hi
. Tôi đã xem xét Cursor
và Error
, 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ố autocmd
câu trả lời khác ở đây.
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ụ:
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()
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\+$/
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.
.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()
Đâ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
%s
lá cờ toàn cầu (g) đầu tiên vô dụng như một khoảng trống tại EOL :-)
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.
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 .vimrc
tệ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
set listchars=trail:·
nói : E474: Invalid argument: listchars=trail:·
. Bạn có thể xác nhận ví dụ của bạn?
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
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