ทำให้ Vim แสดงช่องว่างสีขาวทั้งหมดเป็นอักขระ


772

ฉันไม่สามารถหาวิธีทำให้ Vim แสดงช่องว่างสีขาวทั้งหมดเป็นตัวละครได้ ทั้งหมดที่ฉันพบคือเกี่ยวกับแท็บช่องว่างต่อท้าย ฯลฯ


14
ฉันยังพยายามแก้ไขปัญหานี้อย่างแน่นอน :set listกรุณาถ้าคุณเจอนี้ละเว้นจากการทำเลยการตอบสนองที่เกี่ยวข้องอีก ไม่ตอบคำถามของเรา (สำหรับผู้มาอื่น: การตอบสนองของmrucciด้านล่างมีประโยชน์แม้ว่าจะไม่ใช่วิธีการแก้ปัญหาที่แท้จริง)
ELLIOTTCABLE

1
สำหรับทุกคนที่บอกว่าสามารถมองเห็นช่องว่างได้listและlistcharsพิจารณาว่าช่องว่างนั้นติดตามแท็บโดยตรง มันจะมองไม่เห็นเกือบในสถานการณ์นี้ ฉันยอมรับว่าคุณสามารถจับสถานการณ์ส่วนใหญ่ได้ แต่ถ้าดีที่จะมีการเน้นที่เหมาะสมของพื้นที่ทั้งหมด
Kevin Cox

11
สำหรับผู้เยี่ยมชมใหม่: สิ่งนี้ได้รับการแก้ไขในเวอร์ชั่นใหม่กว่า ดูbrettanomyces 's คำตอบด้านล่าง
ELLIOTTCABLE

1
ที่เกี่ยวข้อง (แต่สแต็กต่างกัน): vi.stackexchange.com/questions/422/…
Pureferret

คำตอบ:


693

อย่างที่คนอื่นพูดคุณสามารถใช้

:set list

ซึ่งจะรวมกับ

:set listchars=...

แสดงตัวอักษรที่มองไม่เห็น
ตอนนี้ไม่มีตัวเลือกที่ชัดเจนที่คุณสามารถใช้เพื่อแสดงช่องว่าง แต่ใน listchars คุณสามารถตั้งค่าตัวละครที่จะแสดงสำหรับทุกอย่าง แต่ช่องว่าง ตัวอย่างเช่นฉันดูเหมือนว่านี้

:set listchars=eol:$,tab:>-,trail:~,extends:>,precedes:<

ดังนั้นตอนนี้หลังจากที่คุณใช้

:set list

ทุกสิ่งที่ไม่ได้แสดงให้เห็นอย่างชัดเจนว่าเป็นอย่างอื่นนั้นจริงๆแล้วเป็นช่องว่างเก่าที่ธรรมดา

ตามปกติเพื่อทำความเข้าใจวิธีการlistcharsทำงานใช้ความช่วยเหลือ มันให้ข้อมูลที่ยอดเยี่ยมเกี่ยวกับตัวอักษรที่สามารถแสดง (เช่นพื้นที่ต่อท้ายเป็นต้น) และวิธีการ:

:help listchars

มันอาจจะมีประโยชน์ในการเพิ่ม toggle เพื่อให้คุณสามารถเห็นการเปลี่ยนแปลงกลางการแก้ไขได้อย่างง่ายดาย (ที่มา: VIM: set list! as toggle in .vimrc ):

noremap <F5> :set list!<CR>
inoremap <F5> <C-o>:set list!<CR>
cnoremap <F5> <C-c>:set list!<CR>

4
“ ทุกสิ่งที่ไม่ได้แสดงอย่างชัดเจนเป็นอย่างอื่น”? ลองใช้ช่องว่าง Unicode จากช่วง U + 2000 .. U + 200A หากฟอนต์ที่มีความกว้างคงที่จะสนับสนุนพวกเขาจะปรากฏเช่นเดียวกับช่องว่างปกติ 0x20
ZyX

2
@ZyX - ฉันไม่ได้ใช้ Unicode ทั้งหมด แต่เป็นชุดอักขระที่ใช้บ่อย หากคุณไม่พอใจคำตอบอย่าลังเลที่จะแนะนำการปรับปรุง
โกง

20
@ckarbass -: set Invlist
Rook

สุดยอดเคล็ดลับ! ฉันขอแนะนำให้วางบรรทัดlistcharsลงใน.vimrcไฟล์ดังนั้นวิธีการแสดงตัวอักษรที่มองไม่เห็นนั้นสามารถเปิดใช้งานได้อย่างง่ายดาย:set listในเวลาใดก็ได้ (โดยไม่ต้องไปที่หน้านี้อีกครั้ง)
Melebius

8
@ckarbass เช่นเดียวกับที่คุณสลับอะไรเป็นกลุ่ม - เพิ่ม! ไปยังจุดสิ้นสุด ดังนั้นมันจะกลายเป็น: รายการชุด!

275

ในฐานะของแพทช์7.4.710ตอนนี้คุณสามารถตั้งค่าตัวละครเพื่อแสดงในพื้นที่โดยใช้ listchars!

:set listchars+=space:␣

ดังนั้นเพื่อแสดงอักขระช่องว่างทั้งหมดเป็นอักขระคุณสามารถทำสิ่งต่อไปนี้:

:set listchars=eol:¬,tab:>·,trail:~,extends:>,precedes:<,space:␣
:set list

การสนทนาเกี่ยวกับรายชื่อผู้รับจดหมาย: https://groups.google.com/forum/?fromgroups#!topic/vim_dev/pjmW6wOZW_Q


2
นี่มันเจ๋งมาก แต่ฉันสงสัยว่าทำไมตัวละคร eol ไม่ได้รับการเปลี่ยนสีแตกต่างจากคนอื่น
CMCDragonkai

3
ฉันลองสิ่งนี้และพบข้อผิดพลาดในตอนแรก ปรากฎว่า "ช่องว่าง" ไม่ใช่ตัวเลือกที่ถูกต้องใน gvim รุ่นเก่ากว่าที่ฉันใช้อยู่ การอัพเกรด gvim ของฉันแก้ปัญหาของฉันได้ สำหรับผู้อื่นที่ได้รับข้อผิดพลาดพิมพ์:help listcharsเพื่อตรวจสอบว่า "ช่องว่าง" เป็นตัวเลือกที่ถูกต้องสำหรับ "listchars" หากไม่ใช่ให้อัพเกรด vim ของคุณเป็น patch @brettanomyces ที่ระบุ หรือปล่อย "เว้นวรรค" ออกจากคำสั่ง set หากคุณไม่สนใจที่จะเห็นช่องว่าง
Niko Bellic

4
ผมใช้ Unicode ของกลาง Dot (U + 00B7) สำหรับอักขระช่องว่าง ( space:·) เป็นลักษณะเช่น MS Word, Notepad ++ ฯลฯ
Dinei

1
@ user5359531 ลอง <ctrl-v> u2334 เพื่อป้อนอักขระช่องเปิด Unicode (␣) ดูsanctum.geek.nz/arabesque/special-characters-in-vimสำหรับรายละเอียดเพิ่มเติม
Brett Y

3
พิมพ์ในกลุ่มสำหรับ<C-K>.M ·ดู:h digraphรายละเอียดที่
johnchen902

252

:set list การเปิดใช้งาน.

:set nolist เพื่อปิดการใช้งาน


11
ขอขอบคุณที่แสดงวิธีสลับระหว่างโหมด คุณคิดว่าคำตอบขั้นสูงอื่น ๆ จะสอนสิ่งนั้น
Jonathan Komar

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

8
: set list!ดีกว่า :)
skippr

@Skippr โดยวัดอะไร? มันเป็นหมายเลขเดียวกันของการกดปุ่มยกเว้นว่าShiftและมีทั้งยากที่จะพิมพ์กว่า! noหากคุณใส่ไว้ใน. vimrc ของคุณฉันยอมรับว่ารูปแบบ exclam นั้นง่ายต่อการอ่าน
Dan Bechard

7
@Dan หากคุณกำลังมองหาที่จะสลับออกนี้และในระยะเวลาอันสั้นจะทำโดยที่คุณไม่จำเป็นที่จะเข้าสู่:set list! nolistสิ่ง!ที่ตรงกันข้ามกับสิ่งที่ตั้งไว้ในปัจจุบัน :set paste!ผมใช้นี้ตลอดเวลาโดยเฉพาะอย่างยิ่งเมื่อมี ฉันเกลียดการกดแป้นลูกศรเพื่อค้นหา:set pasteหรือ:set nopasteฮ่า ๆ ๆ
skippr

187

ฉันคิดว่าคำตอบอื่น ๆ ที่นี่มีความครอบคลุมมากขึ้น แต่ฉันคิดว่าฉันจะแบ่งปันเคล็ดลับที่ฉันมักใช้เพื่อแยกความแตกต่างระหว่างแท็บและช่องว่างด้วยสายตา:

:syntax on
:set syntax=whitespace

นี่คือกฎการเน้นไวยากรณ์สำหรับภาษาโปรแกรมช่องว่าง - แท็บแสดงเป็นสีเขียวและเว้นวรรคเป็นสีแดง :)

สามารถใช้ร่วมกับ:set listคำตอบอื่น ๆ ได้หลายอย่างแม้ว่าแท็บจะแสดงเป็น ^ I โดยไม่ต้องใช้ไฟเขียว แต่พื้นที่จะแสดงเป็นสีแดง


7
ฉันชอบอันนี้ค่อนข้างฉลาดและรู้สึกดีกว่าคำตอบอื่น ๆ ส่วนใหญ่ ไม่ใช่วิธีการแก้ปัญหาที่ใช้งานได้ตลอดเวลา
ComputerDruid

4
ฉันชอบวิธีการทั่วไปมากกว่า แต่ฉันกำลัง +1 สิ่งนี้เพื่อความคิดสร้างสรรค์
Sietse van der Molen

27
ผมรู้ว่าภาษาจะเป็นประโยชน์สำหรับบางสิ่งบางอย่าง
Dan Bechard

1
คุณสนใจที่จะเชื่อมโยงไปยังไฟล์ไวยากรณ์. vim ที่คุณใช้เพื่อไฮไลต์หรือไม่
SeldomNeedy

2
@Seldom จำเป็นต้องมีคุณไม่จำเป็นต้องดาวน์โหลดอะไรเลยกฎการไฮไลต์ช่องว่างได้รับการจัดส่งกับ Vim เป็นเวลาหลายปีแล้ว พวกมันควรจะติดตั้งในตัวเว้นแต่ว่าคุณจะใช้ Vim ที่แปลกหรือเก่า
เอเลียต

91

:set listจะแสดงช่องว่างทั้งหมดเป็นอักขระ ทุกอย่างยกเว้นช่องว่างจะดูแตกต่างจากสภาวะปกติซึ่งหมายความว่าถ้าคุณยังเห็นพื้นที่เก่าธรรมดามันเป็นพื้นที่เก่าธรรมดาจริงๆ :)


35
ปิดแบ็คไลท์ด้วย:set nolist
Greg K

6
ถ้าคุณต้องการเห็นอักขระเว้นวรรคเช่นใน Sublime Text 2 ด้วย "show whitespace" ฉันพบว่ามันมีประโยชน์จริงๆ
Olical

ไม่ใช่สิ่งที่ฉันมาที่นี่ แต่มีประโยชน์มาก ขอบคุณ
harperville

4
ตัวเลือกที่ไม่มีสามารถสลับได้!ในตอนท้าย:set list!
baldrs

ฉันใช้สายการบินเดียว:se hls | /\_sสำหรับสิ่งนี้ รับทุกสิ่งโดยset listไม่สนใจช่องว่าง :se nohlsปิดอีกครั้งกับ รายละเอียดเกี่ยวกับเรื่องนี้ในโพสต์นี้: albertech.blogspot.com/2015/02/…
jar

73

หากคุณตั้งค่า:

:highlight Search cterm=underline gui=underline ctermbg=none guibg=none ctermfg=none guifg=none

จากนั้นทำการค้นหาช่องว่างอักขระเว้นวรรคทุกตัวจะแสดงเป็นอักขระขีดเส้นใต้

คุณสามารถใช้คำสั่งนี้ในฟังก์ชั่นที่ใช้งานง่ายซึ่งจะสลับ "underscoring" ของช่องว่าง

set hls
let g:HLSpace = 1
let g:HLColorScheme = g:colors_name
function ToggleSpaceUnderscoring()
    if g:HLSpace
        highlight Search cterm=underline gui=underline ctermbg=none guibg=none ctermfg=none guifg=none
        let @/ = " "
    else
        highlight clear
        silent colorscheme "".g:HLColorScheme
        let @/ = ""
    endif
    let g:HLSpace = !g:HLSpace
endfunction

แม็พฟังก์ชันกับคีย์ลัดด้วย:

nmap <silent> <F3> <Esc>:call ToggleSpaceUnderscoring()<CR>

หมายเหตุ:กำหนดฟังก์ชั่นใน vimrc หลังจากตั้งค่าสีของ colorcheme


1
มันแฮ็คอยู่นิดหน่อย แต่มันใกล้กว่าที่อื่น รับรางวัลโปรดปราน! : D
ELLIOTTCABLE

45

ขึ้นอยู่กับกฎไวยากรณ์ของคุณสำหรับบัฟเฟอร์ปัจจุบันสิ่งนี้สามารถใช้งานได้:

:syn match WhiteSpace / / containedin=ALL conceal cchar=Æ
:setl conceallevel=2 concealcursor=nv

สิ่งนี้ต้องการกลุ่ม 7.3 พร้อมด้วยคุณสมบัติปกปิด

อัปเดต 10/24/2014 เพื่อขยายตัวเล็กน้อย แน่นอนว่ามันเป็นไปได้ที่จะกำหนดไฮไลต์สำหรับอักขระที่มีลักษณะโค้ง

  • คุณสามารถกำหนดค่าวิธีการดูตัวอักษรที่ซ่อนอยู่ สำหรับการไฮไลต์คุณจะต้องกำหนดค่ากลุ่มการไฮไลต์ 'ปกปิด' อย่างน้อยหนึ่งครั้ง (ดูวิธีใช้ที่:h hl-Concealสิ่งนี้สามารถทำได้ใน colorcheme ของคุณแล้วคุณไม่จำเป็นต้องกำหนดค่าใหม่อีกครั้ง สคริปต์ไวยากรณ์ปิดบังรายการเพิ่มเติมบางรายการจะปรากฏเป็นตัวอักษร white space ของคุณ) ซึ่งอาจมีลักษณะเช่นนี้:

    :hi Conceal ctermfg=7 ctermbg=NONE guifg=LightGrey guibg=NONE

  • ดูเหมือนว่าจะมีลักษณะพิเศษที่ Vim จะไม่เน้นช่องว่างหากสคริปต์ไวยากรณ์ใช้skipwhiteคำหลัก จะไม่มีทางแก้ไข (อาจจะได้รับการแก้ไขฉันโพสต์แพทช์ )

  • ดูเหมือนจะมีแพทช์ลอยอยู่รอบ ๆ ซึ่งจะช่วยให้สามารถปรับแต่งการเว้นวรรคในlistโหมด คนล่าสุดในเวลาเขียนดูเหมือนจะเป็นคนนี้ (ซึ่งหมายความว่าคุณต้องสร้าง Vim ของคุณเองเพื่อใช้งาน)
  • conceallevelและconcealcursorมีหน้าต่างตัวเลือกในท้องถิ่น ซึ่งหมายความว่าพวกเขาสามารถแตกต่างกันใน windows ที่แตกต่างกัน (และอาจจะถูกกำหนดโดยปลั๊กอินชนิดไฟล์หรือสคริปต์ปลั๊กอินอื่น ๆ )
  • กลุ่มการเน้นไวยากรณ์จะต้องดำเนินการทุกครั้งที่มีการโหลดไฟล์คำจำกัดความของไวยากรณ์ใหม่ สิ่งนี้สามารถทำได้โดยใช้BufWinEnterหรืออาจจะเป็นSyntaxหรือแม้กระทั่งFileTypeautocommand (ฉันยังไม่ได้ทดสอบว่าอันไหนใช้งานได้จริง)

สองรายการสุดท้ายหมายความว่าคุณจะต้องตั้งค่า AutoCommands ที่รีเซ็ตกฎไวยากรณ์และตัวเลือกการแก้ไขที่สอดคล้องกัน สำหรับคนแรกคนหนึ่งอาจต้องการตั้งค่าการเน้นโดยใช้ข้อความอัตโนมัติColorScheme(เพื่อให้ตัวอักษรที่ปกปิดอยู่เสมอเหมือนกันโดยไม่ขึ้นอยู่กับชุดรูปแบบสีจริง) สำหรับวิธีการแก้ปัญหาที่สมบูรณ์ดูคำตอบ romainl ที่ควรให้คุณเริ่มต้น หากคุณตั้งค่าฟังก์ชั่นคุณสามารถตั้งค่าคำสั่งสลับเพื่อสลับการแสดงหรือปิดการเน้นพิเศษ

อัปเดต 10/26/2014ฉันสร้างปลั๊กอินจากคำถามนี้

Update 04/22/2015มีการรวมโปรแกรมแก้ไขใน Vim ซึ่งทำให้สามารถใช้listตัวเลือกนี้ได้ เพียงตั้งค่าใช้set list listchars+=space:␣ งานได้ตั้งแต่Vim 7.4.711


มันใช้งานได้ดี! วิธีนี้สามารถเพิ่มไปยัง.vimrc?
Eric Martindale

1
เนื่องจากสิ่งนี้สามารถใช้งานได้กับบัฟเฟอร์ปัจจุบันคุณอาจจำเป็นต้องตัดสิ่งนี้ลงใน autocommand BufEnter หรือ Syntax autocommand อาจใช้งานได้กับคุณ:
Christian Brabandt

3
Æตัวเลือกแปลก ๆ สำหรับเรื่องนี้ทำไม·ล่ะ?
Marius Gedminas

1
นี่เป็นคำตอบที่ถูกต้องจริงๆ ความคิดใด ๆ เกี่ยวกับวิธีการเพิ่มไวยากรณ์ที่เหมาะสมเน้นไปที่ตัวละครนี้หรือไม่? ฉันจะชอบมันถ้ามันจางมาก·
airstrike

@ChristianBrabandt คุณมีไฟล์ที่เกี่ยวข้องกับ nrrwrgn ต่อท้ายซึ่งส่งผลกระทบต่อ repo ของคุณ
romainl

31

ฉันใช้สิ่งนี้

/\s
:set hlsearch

เพื่อเน้นช่องว่างสีขาว มันค้นหาช่องว่างสีขาวทั้งหมดแล้วเปิดใช้งานไฮไลต์เพื่อให้ปรากฏขึ้น อย่างไรก็ตามมันไม่ได้พิมพ์อักขระพิเศษ


วิธีที่ง่ายที่สุด imho จับคู่ที่ยอดเยี่ยมกับคำสั่งเพื่อล้างการค้นหา (ฉันใช้nnoremap <leader><space> :noh<cr>)
Lenna

24

ถ้าตามช่องว่างคุณหมายถึงอักขระ '' คำแนะนำของฉันจะเป็นการค้นหา / แทนที่ ดังที่คนอื่น ๆ ได้บอกใบ้ไว้set listเปลี่ยนอักขระที่ไม่พิมพ์เป็นอักขระที่มองเห็นได้ซึ่งกำหนดค่าlistcharsไว้

หากต้องการแสดงช่องว่างเป็นอักขระอื่นอย่างชัดเจนสิ่งที่คล้ายกับด้านล่างควรทำเคล็ดลับ:

:%s/ /█/g

จากนั้นเพียงเลิกทำการเปลี่ยนแปลงเพื่อย้อนกลับอีกครั้ง

(เพื่อให้ได้█ฉันกดลำดับคีย์ที่แน่นอน:%s/ /CTRL-KFB/g)


2
ฉันชอบสิ่งนี้ดีกว่าคำตอบอื่น ๆ ดูเหมือนว่า:set listฉันจะเปลี่ยนสิ่งที่มองข้าม ('ช่องว่าง') เป็น _non priting_ (??) อย่างใดอย่างหนึ่ง ฉันสงสัยว่ามีใครสามารถใช้การจับคู่แบบนี้:match MyBlackBlockChar "appropriate_regexได้หรือไม่
Sudhi

คำตอบอื่น ๆ มีประโยชน์ แต่นี่เป็นคำตอบแรกที่ตอบคำถามของ OP 1
Alexx Roche

1
หรือ:%s/\s/█/gสำหรับช่องว่างทั้งหมด นอกจากนี้:set hlsearchบวก:&s/\s//gnอาจจะมีประโยชน์

16

หากต้องการเน้นช่องว่างเพียงค้นหา:

/ <พื้นที่>

หมายเหตุ:

  • <space> หมายถึงเพียงพิมพ์อักขระเว้นวรรค
  • เปิดใช้งานการเน้นผลการค้นหาด้วย: set hlsearch

    หากต้องการไฮไลต์ช่องว่าง & แท็บ:

    / [<space> <tab>]

    วิธีที่รวดเร็วในการลบไฮไลต์คือการค้นหาสิ่งอื่น: / asdf

    (เพียงพิมพ์รายการอักขระแบบสุ่มสั้น ๆ )


  • 1
    นี่เป็นเช่นเดียวกับคำตอบที่โพสต์เมื่อ 3 ปีก่อน นอกจากนี้: noh เร็วกว่า / asdf สำหรับข้อความที่ไม่เน้นข้อความ หรือคุณอาจตั้งค่า f1 เป็น: ไม่ได้เพราะคุณอาจจะใช้มันบ่อยๆ

    @DrEval สมมติว่าคุณหมายถึงคำตอบของ Benedikt Köppelจริงๆแล้วมันแตกต่างกันอย่างมาก/<space>เทียบกับ /\sฉันคิดว่ามันไม่ชัดเจนและเร็วกว่าที่จะใช้คำแนะนำที่นี่
    icc97

    14

    รหัสด้านล่างขึ้นอยู่กับคำตอบของ Christian Brabandt และดูเหมือนว่าจะทำในสิ่งที่ OP ต้องการ:

    function! Whitespace()
        if !exists('b:ws')
            highlight Conceal ctermbg=NONE ctermfg=240 cterm=NONE guibg=NONE guifg=#585858 gui=NONE
            highlight link Whitespace Conceal
            let b:ws = 1
        endif
    
        syntax clear Whitespace
        syntax match Whitespace / / containedin=ALL conceal cchar=·
        setlocal conceallevel=2 concealcursor=c
    endfunction
    
    augroup Whitespace
        autocmd!
        autocmd BufEnter,WinEnter * call Whitespace()
    augroup END
    

    ผนวกบรรทัดเหล่านั้นเข้ากับคุณ~/.vimrcและเริ่มเซสชัน Vim ใหม่เพื่อดูว่าเวทมนตร์ยังไม่สมบูรณ์เกิดขึ้นได้อย่างไร

    อย่าลังเลที่จะแก้ไขสีเริ่มต้นและปกปิดตัวละคร


    Caveat: บางอย่างใน*FuncBodyกลุ่มไวยากรณ์ในหลายภาษาป้องกันไม่ให้จุดกลางแสดง ฉันไม่รู้ (ยัง?) จะทำให้โซลูชันนั้นน่าเชื่อถือมากขึ้นได้อย่างไร


    นั่นคือสิ่งที่ฉันหมายถึงด้วย "ขึ้นอยู่กับกลุ่มไวยากรณ์" ฉันสงสัยว่านี่เป็นปัญหากับคำหลักที่ใช้ร่วมกับธง skipwhite
    Christian Brabandt

    @ChristianBrabandt ใช่ฉันไม่สามารถไปได้ไกลกว่าสิ่งที่คุณทำไปแล้วนอกจากจะทำให้มันเป็น "อัตโนมัติ"
    romainl

    1
    ใช่มันเป็นskipwhiteอาร์กิวเมนต์ในกฎไวยากรณ์ที่ป้องกันไม่ให้กลุ่มไวยากรณ์ตรงกัน (แม้ว่าควรได้รับอนุญาตให้มีอยู่ในทุกกลุ่ม)
    Christian Brabandt

    มีวิธีใดที่จะทำให้งานนี้เป็นไปได้อย่างดีกับIndent Guidesซึ่งเพิ่มพื้นหลังให้กับการเยื้อง ฉันสงสัยว่ามันเป็นเรื่องของการทำให้เรื่องนี้ไม่มีการแทนที่สีพื้นหลัง แต่สิ่งนี้ดูเหมือนจะไม่ไร้สาระ
    Mike

    วิธีการปิดการใช้งานเดียวกันเมื่อไม่ต้องการเน้นพื้นที่สีขาว? กำลังมองหาคำสั่งสลับสั้น ๆ
    yuvaeasy

    11

    ฉันรู้สึกหงุดหงิดกับคำตอบอื่น ๆ ทั้งหมดสำหรับคำถามนี้เพราะไม่มีพวกเขาเน้นอักขระช่องว่างในวิธีที่มีประโยชน์ การแสดงช่องว่างเป็นอักขระจะช่วยเป็นพิเศษสำหรับภาษาที่มีรูปแบบช่องว่างซึ่งการผสมแท็บและช่องว่างเป็นอันตราย

    ทางออกของฉันคือการแสดงแท็บและขีดเส้นใต้หลายช่องว่าง มันยืมมาจากคำตอบ mrucciและบทช่วยสอนนี้ เนื่องจากใช้การเน้นไวยากรณ์จึงคงอยู่:

    set list listchars=tab:\|\ 
    highlight Whitespace cterm=underline gui=underline ctermbg=NONE guibg=NONE ctermfg=yellow guifg=yellow
    autocmd ColorScheme * highlight Whitespace gui=underline ctermbg=NONE guibg=NONE ctermfg=yellow guifg=yellow
    match Whitespace /  \+/
    

    เมื่อใช้สิ่งนี้แท็บจะปรากฏเป็น|และเว้นวรรคเป็น_ซึ่งทำให้ง่ายต่อการบอกเมื่อฉันผสมสไตล์โค้ด

    ข้อเสียเดียวที่ฉันพบคือตัวอย่างนี้ไม่ได้ปรับสีพื้นหลังให้ตรงกับบริบท (เช่นในความคิดเห็น)


    8

    คำตอบทั้งหมดข้างต้นพยายามทำให้มองเห็นช่องว่างจากภายในกลุ่ม หากคุณยืนยันที่จะให้มีช่องว่างที่มองเห็นเป็นจุดมีวิธีอื่น ...

    หากไม่สามารถทำได้ในกลุ่มให้เปลี่ยนแบบอักษรทั้งหมด ฉันคัดลอกแบบอักษร Ubuntu One Mono และแก้ไขโดยใช้ FontForge อย่าลืมเปลี่ยนชื่อเต็มครอบครัวครอบครัวที่ต้องการเต็มรูปแบบที่เข้ากันได้ (ใน FontFoge มันอยู่ภายใต้ชื่อ TTF ในข้อมูลตัวอักษร) เพื่อให้มันเป็นแบบอักษรแยกต่างหาก เพียงแก้ไขอักขระเว้นวรรคเพื่อให้มีจุดอยู่ตรงกลางและบันทึกแบบอักษรเป็น ~ / .fonts ตอนนี้คุณสามารถใช้มันสำหรับ gvim หรือเทอร์มินัลทั้งหมดของคุณได้ ... ฉันคัดลอก "!" ตัวละครลบบรรทัดและย้ายจุดไปที่กลาง ใช้เวลาน้อยกว่า 5 นาที ...

    หมายเหตุ: การเปลี่ยนอักขระเว้นวรรค (0x20) ส่งผลให้เกิดความไม่สะดวกในการมีจุดบนหน้าจอกลุ่มทั้งหมด ... (แต่จะแยกช่องว่างออกจากแท็บ ... )


    2
    สิ่งนี้ฟังดูเหมือนเป็นวิธีที่ดีจริงๆจนกระทั่งฉันอ่านโน้ตเกี่ยวกับการเติมจุดเต็มหน้าจอทั้งหน้าจอ : /
    friederbluemle

    3
    คะแนนสำหรับความคิดสร้างสรรค์! :-)
    jpaugh

    7

    ฉันไม่พบสิ่งที่ฉันต้องการจากคำตอบที่มีอยู่ รหัสด้านล่างจะเน้นช่องว่างทั้งหมดต่อท้ายสีแดงสดใส เพียงเพิ่มสิ่งต่อไปนี้ในของคุณ.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()
    

    5
    :match CursorLine /\s\+/
    

    หลีกเลี่ยงการ "คุณต้องค้นหาช่องว่างเพื่อให้ปรากฏขึ้น" บิต แต่ไม่สามารถกำหนดค่า afaict เพื่อทำสิ่งที่ไม่ทำให้รู้สึกเครียดในช่องว่าง CursorLine สามารถเป็นกลุ่ม hilighting และในชุดรูปแบบเริ่มต้นมันขีดเส้นใต้ธรรมดา


    ฉันไม่สามารถบอกความแตกต่างระหว่างแท็บและช่องว่างโดยใช้วิธีนี้ซึ่งแย่มาก แต่ฉันชอบที่มันเป็นซับเดียว
    Rustavore

    5

    ฉันชอบการใช้อักขระพิเศษเพื่อแสดงช่องว่างชัดเจนยิ่งขึ้น แม้แต่แผนที่สลับเป็นคุณสมบัติที่สำคัญสำหรับการตรวจสอบอย่างรวดเร็ว

    คุณสามารถค้นหาฟีเจอร์นี้ในสคริปต์ vim แบบเก่าที่ไม่ได้อัพเดตตั้งแต่ปี 2004:

    vim-scripts/cream-showinvisibles@vim.org

    ขอบคุณโครงการเสียงเรียกเข้าสคริปต์และvundleคุณสามารถกลับมาใช้ชีวิตปลั๊กอินนี้

    เป็นกลุ่มสคริปต์ / ครีม showinvisibles @ GitHub

    ยิ่งไปกว่านั้นสองเซนต์ของฉันในเรื่องนี้คือการเพิ่มทางลัดที่กำหนดค่าได้ (แทนที่จะกำหนดไว้ล่วงหน้าF4)

    ดังนั้นเพิ่มส่วนนี้ลงใน~ / .vimrc

    Plugin 'albfan/cream-invisibles'
    
    let g:creamInvisibleShortCut = "<F5>" "for my F4 goto next error
    

    ติดตั้งปลั๊กอินบนกลุ่ม

    :PluginInstall
    

    และคุณไป


    5

    เพื่อครอบคลุมอักขระช่องว่าง Unicode:

    set list
    set listchars=tab:│\ ,nbsp:·
    highlight StrangeWhitespace guibg=Red ctermbg=Red
    " The list is from https://stackoverflow.com/a/37903645 (with `\t`, `\n`, ` `, `\xa0` removed):
    call matchadd('StrangeWhitespace', '[\x0b\x0c\r\x1c\x1d\x1e\x1f\x85\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u2028\u2029\u202f\u205f\u3000]')
    

    ผลลัพธ์:

    • เฉพาะพื้นที่ตามลำดับ (U + 0020) ดูเหมือนว่ามีช่องว่าง (" ")
    • แท็บ (U + 0009) ดูเหมือนว่า " │ " (ตัวละครสองตัว: ไพพ์ยาวและช่องว่างตามลำดับโดยมีสีเทาในcolorscheme murphy )
    • พื้นที่ว่างแบบไม่แตกหัก (U + 00A0) ดูเหมือนว่า " ·" (ตัวละครตัวหนึ่งและเป็นสีเทาcolorscheme murphy)
    • อักขระช่องว่างอื่น ๆ ดูเหมือนแดง " "

    1
    แก้ไขเพื่อเพิ่ม "ctermbg = Red" เพื่อให้เทอร์มินัลของฉันทำงานสำหรับการระบายสี ส่วนตัวผมใช้set listchars=tab:»\ ,space:·สำหรับการอ้างอิงของคุณ
    Johnny Wong

    @ JohnnyWong ขอบคุณสำหรับการอัพเดท มันถูกปฏิเสธครั้งแรกโดยผู้แสดงความคิดเห็น แต่ผมได้ตรวจสอบรหัสและมัน (แปลกใจ) ทำงานทั้งในและgvim vim
    Kirill Bulygin

    1
    คำตอบที่ยอดเยี่ยมนี่คือสิ่งที่ฉันต้องการในการจับภาพช่องว่างที่ไม่แตก (Hex 202f) ที่ไม่แสดงผลใน Safari และ Firefox
    Chris Kobrzak

    4

    คุณสามารถใช้

    :set list
    

    เพื่อดูโครงสร้างของเส้นจริงๆ คุณจะเห็นแท็บและบรรทัดใหม่อย่างชัดเจน เมื่อคุณเห็นช่องว่างเปล่ามันว่างเปล่าจริงๆ


    3

    เน้นการค้นหา

    :set hlsearch 
    

    ใน.vimrcนั้นคือ

    และค้นหาแท็บช่องว่างและการขึ้นบรรทัดใหม่

    / \|\t\|\r
    

    หรือค้นหาอักขระช่องว่างทั้งหมด

    /\s
    

    ของการค้นหาอักขระที่ไม่ใช่ white space ทั้งหมด (อักขระช่องว่างไม่แสดงดังนั้นคุณจะเห็นอักขระช่องว่างระหว่างคำ แต่ไม่ใช่อักขระช่องว่างที่ต่อท้าย)

    /\S
    

    เพื่อแสดงอักขระช่องว่างสีขาวต่อท้ายทั้งหมด - ที่ท้ายบรรทัด

    /\s$
    

    2

    เก็บแฮ็กเหล่านั้นไว้ใน. vimrc เป็นความคิดเห็นดังนั้นในเชลล์เพียง:

    echo '
      " how-to see the non-visible while spaces
      " :set listchars=eol:¬,tab:>·,trail:~,extends:>,precedes:<,space:␣
      " set listchars=eol:$,tab:>-,trail:~,extends:>,precedes:<
      " :set list
      " but hei how-to unset the visible tabs ?!
      " :set nolist
      ' >> ~/.vimrc
    


    1

    นอกจากนี้คุณยังสามารถเน้นช่องว่าง (แทนที่ช่องว่างด้วยบล็อก):

    :%s/ /█/g
    

    (ก่อนที่จะเขียนเลิกทำ)


    1

    การเพิ่มสิ่งนี้ลงใน. vimrc ของฉันก็ใช้งานได้สำหรับฉัน ตรวจสอบให้แน่ใจว่าคุณไม่มีสิ่งใดขัดแย้งกัน ..

    autocmd VimEnter * :syn match space /\s/
    autocmd VimEnter * :hi space ctermbg=lightgray ctermfg=black guibg=lightgray guifg=black
    
    โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
    Licensed under cc by-sa 3.0 with attribution required.