จะเน้นย่อหน้ายาว ๆ ได้อย่างไร?

ฉันรู้วิธีเน้นเส้นยาวๆ ทั้ง :

:match ErrorMsg '\%>140v.\+'

ซึ่งฉันชอบมากกว่า "วิธีคอลัมน์สี" :

:set colorcolumn=140

เช่น ข้อความ :

Vim เป็นโปรแกรมแก้ไขข้อความที่เขียนโดย B. Moolenaar และเผยแพร่ครั้งแรกสู่สาธารณะในปี 1991 โดยมีพื้นฐานมาจากโปรแกรมแก้ไข vi ทั่วไปในระบบที่คล้าย Unix Vim เป็นซอฟต์แวร์โอเพ่นซอร์สฟรี

ได้รับการเน้นเริ่มต้นด้วย "Vim ฟรี ฯลฯ ..."

แต่ฉันจะบรรลุผลลัพธ์เดียวกันสำหรับย่อหน้าได้อย่างไร (ในตัวอย่างนี้ 3 บรรทัด) เช่น:

[Empty line]
Vim is a text editor written by B. Moolenaar and first released publicly in 1991. 
It is based on the vi editor common to Unix-like systems. 
Vim is free and open source software
[Empty line]

ขอบคุณล่วงหน้า


person ThG    schedule 28.03.2014    source แหล่งที่มา
comment
แล้วเอกสารทั้งหมดก็จะแสดงเป็นสีเดียวกัน (ไฮไลต์) ใช่ไหม? เพราะเอกสารของคุณประกอบด้วยย่อหน้าและบรรทัดว่าง หรือฉันเข้าใจคำถามผิด?   -  person Kent    schedule 28.03.2014
comment
@Kent: แค่นั้นแหละ เป๊ะเลย และย่อหน้าเหล่านั้นอาจเป็น (นี่คือข้อความล้วน ไม่ใช่โค้ด) ที่สร้างจาก 1 หรือ 2 หรือ 3 ฯลฯ... บรรทัด ย่อหน้าเหล่านั้นถูกคั่นด้วยบรรทัดเดียว ความปรารถนาของฉันคือการเห็น - ในตัวอย่างนี้ - ย่อหน้าทั้งหมดที่มีอักขระ > 140 ตัว   -  person ThG    schedule 28.03.2014


คำตอบ (1)


นี่เป็นเรื่องยาก เนื่องจากคุณต้องระบุ (ในนิพจน์ทั่วไปเดียว)

  1. เงื่อนไขของ ย่อหน้า (ซึ่งฉันถือว่าเป็นบรรทัดที่คั่นด้วยการขึ้นบรรทัดใหม่สูงสุดบรรทัดเดียว เช่น บรรทัดว่างจะสร้างย่อหน้าใหม่)
  2. การนับตัวอักษร (เน้นหลัง 140 ตัวอักษร)

นี่คือสิ่งที่ดีที่สุดที่ฉันทำสำเร็จ มันยังคงจับคู่ "เป็น" ย่อหน้าต่อไปนี้หากย่อหน้าปัจจุบันเล็กเกินไป:

:match ColorColumn /\%(\%^\|\n\n\)\%(\%(.\+\n\)*.*\)\&\_.\{140}\%(\zs.\|\n\zs.\)/

คำอธิบาย:

  • ทอดสมออยู่ที่จุดเริ่มต้นของบัฟเฟอร์หรือบรรทัดว่าง
  • จับคู่บรรทัดที่ไม่ว่าง
  • และอักขระเพิ่มเติม AND
  • จับคู่อักขระ 140 ตัวและ/หรือขึ้นบรรทัดใหม่
  • จากนั้นเริ่มการแข่งขันด้วยอักขระต่อไปนี้ หรือหากเป็นการขึ้นบรรทัดใหม่ (ซึ่งแสดงไม่ถูกต้อง) อักขระถัดไปหลังจากนั้น

ฉันจะดีใจถ้ามีคนปรับปรุงเรื่องนี้

person Ingo Karkat    schedule 28.03.2014
comment
ขอบคุณมากสำหรับคำตอบของคุณ. อย่างไรก็ตาม ดูเหมือนว่าจะมีข้อผิดพลาดเล็กน้อย: ใช้งานได้กับย่อหน้าที่มี 3 บรรทัดเท่านั้น อาจเนื่องมาจากข้อเท็จจริงที่ว่ามันยังคงตรงกับย่อหน้าต่อไปนี้หากย่อหน้าปัจจุบันมีขนาดเล็กเกินไป แต่อย่างที่ฉันเพิ่งแสดงความคิดเห็น @Kent (ฉันควรจะแม่นยำกว่านี้) ย่อหน้าเหล่านั้นอาจประกอบด้วย 1 หรือ 2 หรือ 3 ฯลฯ ... บรรทัด ย่อหน้าเหล่านั้นถูกคั่นด้วยบรรทัดเดียว ย่อหน้า ‹ 140 ตัวอักษรควรถือว่าถูกต้อง สิ่งนี้ทำให้ฉันต้องถามคุณ - หากคุณมีเวลาเพียงพอ - เพื่ออธิบาย regex ของคุณ ยังไงก็ขอบคุณอีกครั้งครับ - person ThG; 28.03.2014
comment
ขอบคุณ ฉันได้เพิ่มคำอธิบายแล้ว ตามทฤษฎีแล้ว regexp ควรใช้งานได้ (ฉันคิดว่า); บางทีข้อ จำกัด ในการใช้งาน Vim บางอย่างอาจขัดขวางการใช้งาน - person Ingo Karkat; 28.03.2014
comment
ลองอีกครั้งและมันก็ทำงานได้ดี ขอบคุณสำหรับคำตอบและคำอธิบายของคุณ (แต่ regex นี้ไม่เหมาะสำหรับผู้เริ่มต้นที่ใจไม่สู้เช่นฉัน ... ) - person ThG; 29.03.2014