ความกังวลเกี่ยวกับเค้าโครงคอลัมน์ Vim 80


417

วิธีที่ฉันทำบ่งชี้ 80 คอลัมน์ใน Vim นั้นดูเหมือนไม่ถูกต้อง: set columns=80. บางครั้งฉันก็set textwidthเหมือนกัน แต่ฉันต้องการที่จะเห็นและคาดการณ์ว่ามีset columnsทางเลือกอื่น ๆ

นี่เป็นผลข้างเคียงที่โชคร้าย :

  1. ฉันไม่สามารถset numberกลัวการแยกไฟล์ที่มีคำสั่งของหมายเลขบรรทัดที่แตกต่างกัน เช่น <100 ไฟล์บรรทัดและ> = 100 ไฟล์บรรทัดจะต้องมีสองset columnsค่าที่แตกต่างกันเนื่องจากคอลัมน์พิเศษที่ใช้สำหรับการแสดงผลหลักเพิ่มเติม
  2. ฉันยังเริ่มต้นเซสชัน (g) Vim ใหม่แทนการแบ่ง windows ตามแนวตั้ง เนื่องจากvsplitบังคับให้ฉันไปset columnsทุกครั้งที่ฉันเปิดหรือปิดบานหน้าต่างดังนั้นการเริ่มเซสชันใหม่จึงไม่ยุ่งยาก

คุณจะจัดการกับตัวบ่งชี้ 80 ตัวได้อย่างไรเมื่อคุณต้องการset numbersแยกแนวตั้ง ฯลฯ


60
ถือว่าเป็นรูปแบบรหัสที่ดีในหลาย ๆ วง ตัวอย่างเช่น Python Style Guide (PEP8) แนะนำบรรทัดอักขระ 79 ตัว: python.org/dev/peps/pep-0008
cdleary

4
ไม่ใช่ "แน่นอนคุณต้องมี 80 ตัวอักษรบรรทัด" แต่มันทำให้ดีกว่าที่จะอ่านในบางระบบเช่นโปรแกรมใด ๆ ที่ใช้คอนโซลที่ไม่ทำงานภายในหน้าต่างคอนโซล GUI ที่สามารถปรับขนาดได้
Matthew Scharley

47
@davr: ก่อนอื่นอ่านได้ง่ายกว่า การศึกษาบางคนแนะนำความยาวบรรทัดสั้น (76 ตัวอักษรต่อบรรทัด) เป็นที่ยอมรับมากที่สุดและเร็วที่สุดที่จะอ่านออนไลน์ คุณรู้ไหมว่า: ทันใดนั้นดวงตาของคุณอยู่ผิดเส้นเมื่ออ่าน? สิ่งนี้ไม่ค่อยเกิดขึ้นกับ 80 ตัวอักษร ประการที่สองฉันมักจะแก้ไขหรือกระจายภาพด้วยไฟล์สองไฟล์แบบคู่ขนานบนจอกว้าง 1600 พิกเซล วิธีนี้ใช้งานได้ดีหากไฟล์ไม่มีบรรทัดมากกว่า 80 อักขระ ดังนั้นฉันมักจะฟอร์แมตสายยาวก่อนที่ฉันจะสามารถทำงานได้อย่างมีประสิทธิภาพ
nalply

25
@davr มันมีประโยชน์อย่างมากสำหรับการแก้ไขไฟล์หลายไฟล์แบบเคียงข้างกัน
aehlke

2
ฉันทำข้อบกพร่องน้อยกว่าทั้งใน C / C ++ และรหัส JS ตั้งแต่ฉันนำความกว้าง 80 บรรทัดถ่าน (จากรูปแบบการเข้ารหัสเคอร์เนล) บางครั้งฉันก็ล้นด้วยคู่ แต่ไม่ค่อย ...
Mark K Cowan

คำตอบ:


586

ฉันได้ตั้งค่านี้ใน. vimrc ของฉัน:

highlight OverLength ctermbg=red ctermfg=white guibg=#592929
match OverLength /\%81v.\+/

สิ่งนี้จะเน้นพื้นหลังเป็นสีแดงอ่อน ๆ สำหรับข้อความที่เกินขีด จำกัด 80 คอลัมน์ (สีสันในโหมด GUI ต่อไป - ในโหมดเทอร์มินัลน้อยกว่านั้น)


3
ความคิดที่ดี! ฉันเปลี่ยนเป็น "ctermbg = darkred" และ "guibg = # FFD9D9" เพื่อให้เหมาะกับความต้องการของฉันดีกว่า (พื้นหลังแสงใน gvim และมืดในโหมด cterm)
HS

10
ฉันคิดว่าการแก้ไขที่ละเอียดอ่อนคือ /\%81v.\+/ - ด้วยเหตุผลบางอย่าง. * เน้นที่ที่ไม่มีตัวอักษร
cdleary

14
ฉันคิดว่าบรรทัดนี้จะดีกว่าสำหรับ regex ของการจับคู่เล็กน้อย: match OverLength /\%>80v.\+/ นี่ไม่ได้เน้นตัวอักษร 'end of line' และยังใช้งานง่ายกว่าเมื่อคุณตั้งค่าตัวเลขเป็นสิ่งที่คุณต้องการ ความยาวของบรรทัดไม่ใช่ +1
David Terei

8
ด้วยเหตุผลบางอย่างมันจะทำงานเฉพาะในบัฟเฟอร์แรกที่เปิดสำหรับฉัน (หน้าต่างแรกของแท็บแรก) ในกลุ่มของฉัน ...
lajarre

3
ลองดูstackoverflow.com/a/10993757/9822หากโซลูชันนี้ใช้งานได้กับบัฟเฟอร์แรกของคุณเท่านั้น
Jesse Vogt

769

ในฐานะของกลุ่ม 7.3 คุณสามารถใช้set colorcolumn=80( set cc=80สั้น ๆ )

เนื่องจากรุ่นก่อนหน้านี้ไม่รองรับสิ่งนี้การ.vimrcใช้ของฉันแทน:

if exists('+colorcolumn')
  set colorcolumn=80
else
  au BufWinEnter * let w:m2=matchadd('ErrorMsg', '\%>80v.\+', -1)
endif

ดูเพิ่มเติมเอกสารออนไลน์ในcolorcolumnตัวเลือก


26
คุณสามารถตั้งค่า 'colorcolumn' ให้กับ 'textwidth' โดยอัตโนมัติด้วยสิ่งที่ชอบ: set cc = + 1
graywh

1
มี ("colorcolumn") ไม่ทำงานสำหรับฉัน ฉันต้องใช้อยู่ ("& colorcolumn") แทน
SpoonMeiser

5
ดีมากยกเว้น vim <7.1.40 ไม่รองรับ matchadd
Greg Jandl

19
คุณสามารถเปลี่ยนสีของคอลัมน์ด้วยhighlight ColorColumn ctermbg=7
null_radix

2
เอกสารสำหรับตัวเลือกนี้อยู่ที่vimdoc.sourceforge.net/htmldoc/options.html#%27colorcolumn%27
JohnTESlade

54

วิธีที่สั้นกว่า:

match ErrorMsg '\%>80v.\+'

8
ฉันชอบสิ่งนี้เพราะมันไม่ทำให้บัฟเฟอร์ของฉันสกปรกด้วยเส้นแนวตั้งที่ยาว! (Y)
IonicăBizău

ErrorMsghighlight-groupเป็น มีกลุ่มไฮไลต์เริ่มต้นจำนวนมากในกลุ่มซึ่งคุณสามารถใช้ตามการเข้ารหัสสีที่คุณต้องการสำหรับกรณีนี้
crisron

49

ฉันชอบ:

highlight ColorColumn ctermbg=gray
set colorcolumn=80

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

30

คำตอบของ Simon Howard นั้นยอดเยี่ยม แต่/\%81v.\+/ล้มเหลวในการไฮไลต์แท็บที่เกินคอลัมน์ 81 ดังนั้นฉันจึงปรับแต่งเล็กน้อยตามสิ่งที่ฉันพบในVIM wikiและ HS ให้เลือกสีด้านบน:

highlight OverLength ctermbg=darkred ctermfg=white guibg=#FFD9D9
match OverLength /\%>80v.\+/

และตอนนี้ VIM จะเน้นสิ่งที่เกินกว่าคอลัมน์ 80


2
อาจต้องการเพิ่มguifg=whiteในตอนท้าย
Dan Bechard

17

ป้อนคำอธิบายรูปภาพที่นี่

มินิมัลลิสต์วิธีการที่ไม่ซับซ้อน เฉพาะอักขระที่บรรทัดที่ 79 ที่ยาวเกินไปเท่านั้นที่จะถูกเน้นสี มันเอาชนะปัญหาที่พบบ่อยสองสามประการ: ทำงานบนหน้าต่างใหม่มีการเน้นคำที่ล้นออกมาอย่างเหมาะสม

augroup collumnLimit
  autocmd!
  autocmd BufEnter,WinEnter,FileType scala,java
        \ highlight CollumnLimit ctermbg=DarkGrey guibg=DarkGrey
  let collumnLimit = 79 " feel free to customize
  let pattern =
        \ '\%<' . (collumnLimit+1) . 'v.\%>' . collumnLimit . 'v'
  autocmd BufEnter,WinEnter,FileType scala,java
        \ let w:m1=matchadd('CollumnLimit', pattern, -1)
augroup END

หมายเหตุ: โปรดสังเกตว่าFileType scala,javaการ จำกัด นี้สำหรับไฟล์ต้นฉบับ Scala และ Java คุณอาจต้องการปรับแต่งสิ่งนี้ หากคุณไม่ต้องการใช้งานมันจะทำงานกับไฟล์ทุกประเภท


คุณไม่เพิ่มทำไมFileType scala,java? (ไม่ทำงานสำหรับฉัน)
Dorian

1
@Dorian มัน จำกัด เฉพาะไฟล์ประเภท Scala และ Java เพราะไฟล์เหล่านั้นเป็นไฟล์ประเภทที่ฉันกำลังทำงานอยู่ในขณะนั้น ฉันละเลยที่จะพูดถึงว่า กำลังอัปเดตคำตอบ
Dominykas Mostauskis

คุณใช้แบบอักษรอะไรในภาพหน้าจอ ฉันคิดว่ามันน่าพอใจมาก
โกง

@Idigas: ตกลงและฉันรู้สึกเหมือนบางที Sans การ์ตูนอาจจะเป็นทางเลือกที่ดีเมื่อฉันเดิมตั้งค่าฉาบ :)
มาร์ค K แวนส์

ฉันไม่สามารถรับตัวอย่างในคำตอบนี้เพื่อทำงานใน Vim 7.4 (ฉันลบตัวกรอง FileType ด้วย)
Mnebuerquo

13

คุณยังสามารถวาดเส้นเพื่อดูขีด จำกัด 80:

let &colorcolumn=join(range(81,999),",")
let &colorcolumn="80,".join(range(400,999),",")

ผลลัพธ์:

ป้อนคำอธิบายรูปภาพที่นี่


13

วิธีที่ดีในการทำเครื่องหมายเฉพาะอักขระตัวแรกที่ออกนอกขอบเขตที่ระบุ

highlight ColorColumn ctermbg=magenta "set to whatever you like
call matchadd('ColorColumn', '\%81v', 100) "set column nr

จากเดเมียนคอนเวย์พูดคุย


7

เวอร์ชันที่ใหม่กว่าของ vim อนุญาตให้ใช้:set numberwidth=xค่าซึ่งตั้งค่าความกว้างของการแสดงหมายเลขบรรทัด ฉันไม่ได้ใช้การพับ ฯลฯ ดังนั้นฉันจึงไม่รู้เรื่องนั้น การวาดเส้นแนวตั้งที่บางเกินกว่าความสามารถของแอปพลิเคชั่นคอนโซล GVim อาจอนุญาตสิ่งนี้ (ฉันไม่ได้ใช้งานดังนั้นจึงไม่สามารถแสดงความคิดเห็นได้)


5

ฉันเกรงว่าคุณจะมีข้อ จำกัด ในการแก้ปัญหาที่ทำให้คุณมีค่าว่าง

การใช้:set textwidth=80จะแก้ไขปัญหาทั้งหมดที่คุณกล่าวถึงยกเว้นว่าคุณไม่สามารถเห็นขีด จำกัด บรรทัดที่กำลังจะเกิดขึ้นได้อย่างง่ายดาย หากคุณ:set rulerคุณจะเปิดใช้งานตำแหน่ง x, y ที่แสดงบนแถบสถานะซึ่งคุณสามารถใช้เพื่อดูว่าคุณอยู่ในคอลัมน์ใด

นอกเหนือจากนั้นฉันไม่แน่ใจว่าจะบอกอะไรคุณ :set columns=80มันเป็นความอัปยศที่จะสูญเสียจำนวนคอลัมน์คอลัมน์พับและแยกเพียงเพราะคุณจะต้อง


ใช่ฉันกลัวว่า ... ฉันหวังว่าจะมีวิธีซ่อนเร้นเพื่อวาดเส้นแนวตั้งบาง ๆ เหมือนในบรรณาธิการที่เน้นกราฟิกมากกว่า
cdleary

5

คุณสามารถลองสิ่งนี้:

au BufWinEnter * if &textwidth > 8
\ | let w:m1=matchadd('MatchParen', printf('\%%<%dv.\%%>%dv', &textwidth+1, &textwidth-8), -1)
\ | let w:m2=matchadd('ErrorMsg', printf('\%%>%dv.\+', &textwidth), -1)
\ | endif

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


3

ดูที่คอลัมน์ความช่วยเหลือไม่ใช่การทำเรื่องยุ่ง ๆ

ในคอนโซลมันมักจะถูกกำหนดโดยการตั้งค่าคอนโซล ใน GUI จะเป็นตัวกำหนด (และพิจารณาโดย) ความกว้างของหน้าต่าง gvim

ดังนั้นโดยปกติคุณเพียงแค่ปล่อยให้คอนโซลและผู้จัดการหน้าต่างทำงานโดยแสดงความคิดเห็น set columns

ฉันไม่แน่ใจว่าสิ่งที่คุณหมายถึงโดย "เห็นและคาดหวังล้นบรรทัด" หากคุณต้องการให้ EOL แทรกโดยประมาณคอลัมน์ 80 ให้ใช้อย่างใดอย่างหนึ่งset textwidthหรือset wrapmargin; ถ้าคุณเพียงต้องการห่อนุ่ม (สายคือเป็นห่อ แต่ไม่มี EOL จริง) แล้วเล่นด้วยและset linebreakset showbreak


2

อันนี้อยู่นอกสนาม แต่แผนที่เล็ก ๆ ที่ดีสำหรับการปรับขนาดการแบ่งปัจจุบันของคุณเป็น 80 ตัวอักษรหากคุณมีหมายเลขบรรทัดบน:

" make window 80 + some for numbers wide  
noremap <Leader>w :let @w=float2nr(log10(line("$")))+82\|:vertical resize <c-r>w<cr> 

1

คุณสามารถลองทำสิ่งนี้เพื่อตั้งค่าขนาดหน้าต่างให้อนุญาต 80 ตัวอักษรของข้อความจริง สิ่งนี้ยังไม่สามารถใช้งานได้ในการแยกแนวตั้ง

let &co=80 + &foldcolumn + (&number || &relativenumber ? &numberwidth : 0)

สิ่งนี้จำเป็นต้องมี vim 7+, 7.3 สำหรับ relativenumber

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