วิธีที่คุณสามารถลบช่องว่างต่อท้ายในกลุ่มโดยอัตโนมัติ


197

ฉันได้รับข้อผิดพลาด 'trailing whitespace' พยายามส่งไฟล์บางไฟล์ในคอมไพล์

ฉันต้องการลบอักขระช่องว่างต่อท้ายเหล่านี้โดยอัตโนมัติก่อนที่ฉันจะบันทึกไฟล์หลาม

คุณสามารถกำหนดค่ากลุ่มให้ทำเช่นนี้ได้หรือไม่? ถ้าเป็นเช่นนั้นได้อย่างไร


3
สิ่งนี้ไม่เกี่ยวกับหลามเพียงอย่างเดียว

2
ใช้ปลั๊กอินDeleteTrailingWhitespaceของฉัน
Ingo Karkat

คำตอบ:


208

ผมพบคำตอบที่นี่

การเพิ่มสิ่งต่อไปนี้ในไฟล์. vimrc ของฉันทำได้

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

1
! ที่น่าสนใจ พื้นที่สีขาวต่อท้ายเป็นการต่อสู้ในที่ทำงาน ฉันเกลียดมันคนอื่นไม่เข้าใจว่าทำไม เราใช้ vi มากที่สุดเป็น vim (ฉันใช้ vim พวกเขาไม่ได้เพราะพวกเขาจะต้องติดตั้ง) ฉันมีโปรแกรมที่ฉันเรียกว่า stb ไปยัง Strip Trailing Blanks และฉันใช้มันเป็นตัวกรอง ทำงานใน vi ด้วย มันดีกว่า
Jonathan Leffler

16
สิ่งนี้จะเปลี่ยนตำแหน่งเคอร์เซอร์ของการบันทึกแต่ละครั้ง เป็นไปได้ที่จะหลีกเลี่ยงหรือไม่
stepancheg

3
เนื่องจากนี่คือคำตอบที่แท้จริงสำหรับคำถามนี้อาจจะมีการปรับปรุงเพื่อรักษาตำแหน่งเคอร์เซอร์
Edu Felipe

2
วิธีนี้จะลบช่องว่างต่อท้ายในสตริงหลายบรรทัดซึ่งอาจไม่ต้องการในบางกรณี แต่ฉันเดาว่าไม่มีวิธีที่ง่ายในการหลีกเลี่ยงปัญหานี้หรือไม่?
ยืม

3
บางทีคุณอาจชัดเจนว่าeในตอนท้ายหมายถึงถ้าเราไม่พบรูปแบบ vi ไม่ถือว่าคำสั่งทดแทนเป็นความล้มเหลว
LLenain

169

การรวบรวมด้านบนพร้อมตำแหน่งเคอร์เซอร์ประหยัด:

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()

9
คุณสามารถปรับปรุงการทำงานของคุณให้ดีขึ้นด้วยการบันทึกการค้นหาล่าสุดและกู้คืน let _s = @ / let @ / = _ s
xApple

3
ฉันลบautocmd FileType c,cpp,java,php,ruby,python ส่วนเพื่อให้ใช้ได้กับไฟล์ทั้งหมด
swt83

8
@xApple: ไม่จำเป็นต้องใช้ฟังก์ชั่นด้านในการบันทึกและกู้คืนการค้นหาครั้งล่าสุดการทิ้งบริบทของฟังก์ชันจะช่วยได้
โทเบียส

3
@ swt83 คุณจำเป็นต้องแทนที่<buffer>ด้วย*หากคุณต้องการให้มันทำงานกับไฟล์ทั้งหมดได้
cadlac

3
หากคุณนำหน้าคำสั่งทดแทนด้วย / keeppจะไม่เปลี่ยนประวัติการค้นหาของคุณเช่นkeepp %s/\s\+$//e
jeberle

68

ฉันมักจะมี:

match Todo /\s\+$/

ใน.vimrcไฟล์ของฉันดังนั้นช่องว่างจุดสิ้นสุดของบรรทัดนั้นจะถูกเปล่งประกาย

สิ่งที่ต้องทำเป็นไวยากรณ์ hilighting ชื่อกลุ่มที่ใช้สำหรับการ hilighting คำหลักเช่นTODO, หรือFIXME XXXมันมีสีพื้นหลังสีเหลืองอมเหลืองที่น่ารำคาญและฉันคิดว่ามันเป็นวิธีที่ดีที่สุดสำหรับสิ่งที่คุณไม่ต้องการในรหัสของคุณ :-)


7
หรือคุณสามารถตั้งค่า list และ set listchars + = trail:
Oli

ยอดเยี่ยม - มันเป็นพื้นที่กลางที่สมบูรณ์แบบระหว่างการลบช่องว่างต่อท้ายอัตโนมัติ (แม้ว่าฉันอาจจะไม่ได้รู้ตัวหรือเมื่อมันเป็นรหัสของคนอื่นที่ฉันเพิ่งจะทำงานในไฟล์เดียวกัน) เพื่อไม่ทำอะไรกับมัน . ขอบคุณ
Daniel Hershcovich

2
น่าเสียดายที่ชุดรูปแบบสีที่ฉันโปรดปรานเซนเน้นไม่เน้น
ปีเตอร์ลอง

@ PeterLong ไม่ทำงานในชุดรูปแบบ railscasts เช่นกัน :hi Todoตรวจสอบกับ ดังนั้นผมจึงอ่านข้อมูลและ:hi <Tab> :help hiผมถือว่าCursorและแต่ฉันคิดว่าฉันจะพยายามError match VisualNOS /\s\+$/ ฉันอาจรวมสิ่งนี้กับautocmdคำตอบบางส่วนจากที่นี่
Brady Trainor

51

ฉันทั้งสองเน้นช่องว่างที่มีอยู่ต่อท้ายและยังตัดช่องว่างต่อท้าย

ฉันกำหนดค่าโปรแกรมแก้ไข (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()

13

ต่อไปนี้เป็นวิธีกรอง FileType มากกว่าหนึ่งรายการ

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

ทุกไฟล์: autocmd FileType * autocmd BufWritePre <buffer>:% s / \ s \ + $ // e
JREAM

7

คัดลอกและวางจาก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\+$/

1
ดูเหมือนว่าลิงก์บล็อกจะเสียชีวิต
โทเบียส

พบโซลูชันเดียวกันได้ที่ลิงค์นี้ภายใต้ "การใช้คำสั่งจับคู่"
ryanjdillon

6

ฉันเห็นโซลูชันนี้ในความคิดเห็นที่ 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()

5

นี่คือสิ่งที่ฉันทำ ฉันจำไม่ได้ว่าขโมยมาจากที่ไหน

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

2
เป็นเรื่องที่ค่อนข้างอันตรายหากคุณเปิดไฟล์ "*" ในที่สุดหากคุณเปิดไฟล์ไบนารี่ไฟล์เหล่านั้นอาจลงเอยในรูปแบบที่ไม่ดี
เสื่อ

ใช่อาจไม่ใช่สิ่งที่ฉลาดที่สุดแล้วฉันก็ไม่ได้ใช้เสียงเรียกเข้าสำหรับโปรแกรมแก้ไข hex ด้วยเช่นกัน สิ่งนั้นจะไม่ทำงานจนกว่าคุณจะบันทึก
gregf

ฉันคิดว่าสิ่งนี้จะเป็นทางเลือกในการแสดงรายชื่อไฟล์ทุกประเภทที่คุณอาจใช้งานได้ใช่ไหม ฉันทำงานกับ rb, php, cs, html, sass, css, js, กาแฟ, xml, xslt, pl, ฯลฯ และอื่น ๆ ฯลฯ มีความสุขไหม?
ดีเร็กก่อน

4
นอกจากว่าคุณกำลังเขียนไปยังไฟล์ไบนารีในกลุ่มนี้อาจจะไม่เป็นปัญหา
gregf

มันจะปรากฏขึ้นในครั้งแรก%sที่ธงทั่วโลก (g) เป็นไร้ประโยชน์เช่นเดียวกับช่องว่างที่ EOL :-)
Jens

3

วิธีการแก้ปัญหาที่เพียงแค่ตัดช่องว่างต่อท้ายจากไฟล์ไม่เป็นที่ยอมรับในทุกสถานการณ์ มันจะทำงานในโครงการที่มีนโยบายนี้ตั้งแต่เริ่มต้นดังนั้นจึงไม่มีช่องว่างดังกล่าวที่คุณไม่เพียงเพิ่มตัวเองในการกระทำที่จะเกิดขึ้น

สมมติว่าคุณต้องการเพียงไม่เพิ่มอินสแตนซ์ใหม่ของช่องว่างต่อท้ายโดยไม่กระทบกับช่องว่างที่มีอยู่ในบรรทัดที่คุณไม่ได้แก้ไขเพื่อให้คอมมิชชันของคุณปราศจากการเปลี่ยนแปลงที่ไม่เกี่ยวข้องกับงานของคุณ

ในกรณีนั้นด้วย git คุณสามารถใช้สคริปต์ดังนี้:

#!/bin/sh

set -e # bail on errors

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

กล่าวคือเราซ่อนการเปลี่ยนแปลงจากนั้นกรอง+บรรทัดทั้งหมดในส่วนต่างเพื่อลบช่องว่างต่อท้ายเมื่อเรานำการเปลี่ยนแปลงไปใช้กับไดเรกทอรีการทำงานอีกครั้ง หากไพพ์ของคำสั่งนี้สำเร็จเราจะวางที่ซ่อน


1

วิธีอื่นที่นี่ไม่ได้ผลสำหรับฉันใน MacVim เมื่อใช้ใน.vimrcไฟล์ ดังนั้นนี่คือสิ่งที่ทำและเน้นช่องว่างต่อท้าย:

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

การดำเนินการพูดว่า:set listchars=trail:· E474: Invalid argument: listchars=trail:·คุณสามารถตรวจสอบตัวอย่างของคุณได้หรือไม่?
kenorb



0

สำหรับผู้ที่ต้องการเรียกใช้สำหรับประเภทไฟล์เฉพาะ (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

0

หากคุณตัดพื้นที่ว่างคุณควรทำเฉพาะไฟล์ที่สะอาดแล้วเท่านั้น "เมื่ออยู่ในโรม ... " นี่เป็นมารยาทที่ดีเมื่อทำงานกับโค้ดโค๊บที่การเปลี่ยนแปลงปลอมจะไม่เป็นที่พอใจ

ฟังก์ชั่นนี้ตรวจจับช่องว่างต่อท้ายและเปิดการตัดแต่งเฉพาะเมื่อทำความสะอาดแล้ว

เครดิตสำหรับแนวคิดนี้ไปที่อัญมณีแห่งความคิดเห็นที่นี่: 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` ในกรณีนี้เรากำลังใช้การลงทะเบียนหลุมดำ
SergioAraujo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.