ฉันได้รับข้อผิดพลาด 'trailing whitespace' พยายามส่งไฟล์บางไฟล์ในคอมไพล์
ฉันต้องการลบอักขระช่องว่างต่อท้ายเหล่านี้โดยอัตโนมัติก่อนที่ฉันจะบันทึกไฟล์หลาม
คุณสามารถกำหนดค่ากลุ่มให้ทำเช่นนี้ได้หรือไม่? ถ้าเป็นเช่นนั้นได้อย่างไร
ฉันได้รับข้อผิดพลาด 'trailing whitespace' พยายามส่งไฟล์บางไฟล์ในคอมไพล์
ฉันต้องการลบอักขระช่องว่างต่อท้ายเหล่านี้โดยอัตโนมัติก่อนที่ฉันจะบันทึกไฟล์หลาม
คุณสามารถกำหนดค่ากลุ่มให้ทำเช่นนี้ได้หรือไม่? ถ้าเป็นเช่นนั้นได้อย่างไร
คำตอบ:
e
ในตอนท้ายหมายถึงถ้าเราไม่พบรูปแบบ vi ไม่ถือว่าคำสั่งทดแทนเป็นความล้มเหลว
การรวบรวมด้านบนพร้อมตำแหน่งเคอร์เซอร์ประหยัด:
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()
หากคุณต้องการนำสิ่งนี้ไปใช้ในการบันทึกไปยังไฟล์ใด ๆ ให้เว้นไว้ที่สองautocmd
และใช้ไวด์การ์ด*
:
autocmd BufWritePre * :call <SID>StripTrailingWhitespaces()
autocmd FileType c,cpp,java,php,ruby,python
ส่วนเพื่อให้ใช้ได้กับไฟล์ทั้งหมด
<buffer>
ด้วย*
หากคุณต้องการให้มันทำงานกับไฟล์ทั้งหมดได้
keepp
จะไม่เปลี่ยนประวัติการค้นหาของคุณเช่นkeepp %s/\s\+$//e
ฉันมักจะมี:
match Todo /\s\+$/
ใน.vimrc
ไฟล์ของฉันดังนั้นช่องว่างจุดสิ้นสุดของบรรทัดนั้นจะถูกเปล่งประกาย
สิ่งที่ต้องทำเป็นไวยากรณ์ hilighting ชื่อกลุ่มที่ใช้สำหรับการ hilighting คำหลักเช่นTODO
, หรือFIXME
XXX
มันมีสีพื้นหลังสีเหลืองอมเหลืองที่น่ารำคาญและฉันคิดว่ามันเป็นวิธีที่ดีที่สุดสำหรับสิ่งที่คุณไม่ต้องการในรหัสของคุณ :-)
:hi Todo
ตรวจสอบกับ ดังนั้นผมจึงอ่านข้อมูลและ:hi <Tab>
:help hi
ผมถือว่าCursor
และแต่ฉันคิดว่าฉันจะพยายามError
match VisualNOS /\s\+$/
ฉันอาจรวมสิ่งนี้กับautocmd
คำตอบบางส่วนจากที่นี่
ฉันทั้งสองเน้นช่องว่างที่มีอยู่ต่อท้ายและยังตัดช่องว่างต่อท้าย
ฉันกำหนดค่าโปรแกรมแก้ไข (vim) เพื่อแสดง white space ในตอนท้ายเช่น
ด้วยวิธีนี้ที่ด้านล่างของ. vimrc ของฉัน:
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()
และฉัน 'ตัดอัตโนมัติ' จากไฟล์เมื่อบันทึกไว้ในกรณีของฉัน * .rb สำหรับไฟล์ทับทิมอีกครั้งใน ~ / .vimrc ของฉัน
function! TrimWhiteSpace()
%s/\s\+$//e
endfunction
autocmd BufWritePre *.rb :call TrimWhiteSpace()
ต่อไปนี้เป็นวิธีกรอง FileType มากกว่าหนึ่งรายการ
autocmd FileType c,cpp,python,ruby,java autocmd BufWritePre <buffer> :%s/\s\+$//e
คัดลอกและวางจากhttp://blog.kamil.dworakowski.name/2009/09/unobtrusive-highlighting-of-trailing.htmlลิงก์ (ใช้งานไม่ได้อีกต่อไป แต่บิตที่คุณต้องการอยู่ด้านล่าง)
"นี่เป็นข้อดีของการไม่เน้นพื้นที่ที่คุณพิมพ์ในตอนท้ายของบรรทัดเฉพาะเมื่อคุณเปิดไฟล์หรือออกจากโหมดแทรกเท่านั้นเรียบร้อยมาก"
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\+$/
ฉันเห็นโซลูชันนี้ในความคิดเห็นที่ VIM Wikia - ลบช่องว่างที่ไม่ต้องการ
ฉันชอบมันจริงๆ. เพิ่ม a .
ในช่องว่างสีขาวที่ไม่พึงประสงค์
.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()
นี่คือสิ่งที่ฉันทำ ฉันจำไม่ได้ว่าขโมยมาจากที่ไหน
autocmd BufWritePre * :call <SID>StripWhite()
fun! <SID>StripWhite()
%s/[ \t]\+$//ge
%s!^\( \+\)\t!\=StrRepeat("\t", 1 + strlen(submatch(1)) / 8)!ge
endfun
%s
ที่ธงทั่วโลก (g) เป็นไร้ประโยชน์เช่นเดียวกับช่องว่างที่ EOL :-)
วิธีการแก้ปัญหาที่เพียงแค่ตัดช่องว่างต่อท้ายจากไฟล์ไม่เป็นที่ยอมรับในทุกสถานการณ์ มันจะทำงานในโครงการที่มีนโยบายนี้ตั้งแต่เริ่มต้นดังนั้นจึงไม่มีช่องว่างดังกล่าวที่คุณไม่เพียงเพิ่มตัวเองในการกระทำที่จะเกิดขึ้น
สมมติว่าคุณต้องการเพียงไม่เพิ่มอินสแตนซ์ใหม่ของช่องว่างต่อท้ายโดยไม่กระทบกับช่องว่างที่มีอยู่ในบรรทัดที่คุณไม่ได้แก้ไขเพื่อให้คอมมิชชันของคุณปราศจากการเปลี่ยนแปลงที่ไม่เกี่ยวข้องกับงานของคุณ
ในกรณีนั้นด้วย git คุณสามารถใช้สคริปต์ดังนี้:
#!/bin/sh
set -e # bail on errors
git stash save commit-cleanup
git stash show -p | sed '/^\+/s/ *$//' | git apply
git stash drop
กล่าวคือเราซ่อนการเปลี่ยนแปลงจากนั้นกรอง+
บรรทัดทั้งหมดในส่วนต่างเพื่อลบช่องว่างต่อท้ายเมื่อเรานำการเปลี่ยนแปลงไปใช้กับไดเรกทอรีการทำงานอีกครั้ง หากไพพ์ของคำสั่งนี้สำเร็จเราจะวางที่ซ่อน
วิธีอื่นที่นี่ไม่ได้ผลสำหรับฉันใน MacVim เมื่อใช้ใน.vimrc
ไฟล์ ดังนั้นนี่คือสิ่งที่ทำและเน้นช่องว่างต่อท้าย:
set encoding=utf-8
set listchars=trail:·
set list
set listchars=trail:·
E474: Invalid argument: listchars=trail:·
คุณสามารถตรวจสอบตัวอย่างของคุณได้หรือไม่?
autocmd BufWritePre * :%s/\s\+$//<CR>:let @/=''<CR>
สำหรับผู้ที่ต้องการเรียกใช้สำหรับประเภทไฟล์เฉพาะ (FileTypes ไม่น่าเชื่อถือเสมอไป):
autocmd BufWritePre *.c,*.cpp,*.cc,*.h,*.hpp,*.py,*.m,*.mm :%s/\s\+$//e
หรือด้วย vim7:
autocmd BufWritePre *.{c,cpp,cc,h,hpp,py,m,mm} :%s/\s\+$//e
หากคุณตัดพื้นที่ว่างคุณควรทำเฉพาะไฟล์ที่สะอาดแล้วเท่านั้น "เมื่ออยู่ในโรม ... " นี่เป็นมารยาทที่ดีเมื่อทำงานกับโค้ดโค๊บที่การเปลี่ยนแปลงปลอมจะไม่เป็นที่พอใจ
ฟังก์ชั่นนี้ตรวจจับช่องว่างต่อท้ายและเปิดการตัดแต่งเฉพาะเมื่อทำความสะอาดแล้ว
เครดิตสำหรับแนวคิดนี้ไปที่อัญมณีแห่งความคิดเห็นที่นี่: https://github.com/atom/whitespace/issues/10 (สตรีมความคิดเห็นตั๋วข้อผิดพลาดที่ยาวที่สุดที่เคยมีมา)
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=@/
และเรียกคืนได้ในตอนท้าย `let @ / = _ s` ในกรณีนี้เรากำลังใช้การลงทะเบียนหลุมดำ