ไฮไลต์ข้อความบรรทัดที่เหมือนกันโดยอัตโนมัติ


13

ฉันเห็นนินจาที่มีฝีมือทำในขณะนี้กลับมา แต่ฉันก็ไม่รู้จะเริ่ม

A) มีวิธีการตั้งค่าสีพื้นหลังของขอบเพื่อให้เส้นที่ต่อเนื่องกันที่มีเนื้อหาเหมือนกันถูกเน้น

B) หากใครบางคนรู้วิธีการทำเช่นนี้การปรับแต่งที่ดีสำหรับสิ่งนี้จะเกิดขึ้นหากการไฮไลต์เกิดขึ้นในบรรทัดที่ต่อเนื่องกัน แต่ให้พิจารณาเฉพาะคำแรก (ไม่ใช่ทั้งบรรทัด)

การปรับแต่งครั้งที่สองหากการไฮไลต์สามารถกำหนดค่าให้กับสีที่แตกต่างกันนั้นขึ้นอยู่กับจำนวนบรรทัดที่ตรงกัน (หรือคำที่ขึ้นอยู่กับ AB นั้นทำงานอยู่) ดังนั้นเราจึงมีเพียงสองบรรทัดติดต่อกันที่ตรงกับสีเขียว, 3-5 บรรทัดติดต่อกันแล้วสีส้ม, 6+ แล้วสีแดง


คำตอบ:


10

matchชุดต่อไปนี้ดูเหมือนจะใช้งานได้สำหรับ (A):

:syn match Low /\v(.+)\n(\1\n)/
:syn match Medium /\v(.+)\n(\1\n){2,4}/
:syn match Critical /\v(.+)\n(\1\n){5,}/
:hi Critical  ctermfg=red
:hi Medium  ctermfg=yellow
:hi Low  ctermfg=green

ดูเหมือนว่าคำสั่งมีความสำคัญที่นี่ หากLowหรือMediumแมตช์มาหลังจากที่Criticalมันได้รับวิทยข้อกำหนดโยกเหล่านี้และในทำนองเดียวกันสำหรับWRTLowMedium

การไฮไลต์จะไม่ปรากฏขึ้นทันทีหลังจากที่คุณเพิ่มพูดเป็นบรรทัดที่ 3 หรือ 6 แต่เมื่อคุณเลื่อนไปรอบ ๆ หลังจากเพิ่มแล้ว ฉันไม่แน่ใจว่าสิ่งใดเป็นต้นเหตุ

สำหรับ B ฉันคิดว่าคุณสามารถแทนที่ regex ด้วย:

/\v(\S+).*\n(\1.*\n)/

โดยทั่วไปแทนที่ทั้งหมด(.*)ด้วย(\S+).*และ\1ด้วย\1.*หรืออะไรก็ตามที่ถือว่าเป็นคำสำหรับคุณ


ฉันให้คำตอบนี้ติ๊กเพราะสำหรับฉันมันเป็นวิธีการทำไฮไลท์ที่ฉันต้องการ (ดังที่แสดงโดยคำถาม) @ รูปแบบการแสดงออกปกติดี แต่ไม่ตอบคำถามจริงที่ฉันถาม (เปลี่ยนการเน้น)
Martin York

8

ในฐานะที่เป็นจุดเริ่มต้นนี่คือรูปแบบการค้นหาที่ตรงกับบรรทัดที่ซ้ำกัน (ไม่สนใจการเปลี่ยนแปลงในพื้นที่ว่างนำหน้า):

              \zs                marks start of the pattern. Everything before here will not be highlighted
 ^                               start of the line
  \s*                            leading whitespace
       .\+                       match 1 or more non-newline characters
     \(   \)                     and use parens to capture this in match group 1

            \n                   match the newline character
                 \(        \)\+  1 or more
                      \1         copies of what was in the match group 1
                   \s*  \n       with leading whitespace followed by a newline
/^\s*\(.\+\)\n\zs\(\s*\1\n\)\+   the full regex

:help pattern จะให้ข้อมูลเพิ่มเติมเกี่ยวกับวิธีสร้าง regexes เช่นนี้

:help syntax จะแสดงวิธีใช้การแสดงออกปกตินี้และเปลี่ยนเป็นสิ่งที่ไฮไลต์สำหรับคุณ

การเรียนรู้ที่จะเขียนสคริปต์ไวยากรณ์อาจเป็นเรื่องยากดังนั้นวิธีแก้ปัญหาระยะสั้นที่ดีคือการทำสิ่งนี้ในทันทีโดยตรวจสอบให้แน่ใจว่า'incsearch'ได้ตั้งค่าไว้เพื่อให้การค้นหามีการเน้นและทำแผนที่กุญแจเพื่อทำการค้นหาด้านบนnnoremap <F5> /^\s*\(.\+\)\n\zs\(\s*\1\n\)\+<CR>


มีวิธีการกระจาย regex แบบอัตโนมัติหรือไม่? มันให้ภาพที่ชัดเจน
muru

1
ฉันทำมันด้วยมือ วิธีที่รวดเร็วง่ายที่สุดในกลุ่มที่จะทำสิ่งที่ชอบyy10pในสายกับ regex r<space>เต็มรูปแบบจากนั้นเลือกชิ้นส่วนที่คุณต้องการที่จะลบและตี บางทีฉันจะเพิ่มคำสั่งสำหรับ 'แทนที่ทุกอย่างยกเว้นการเลือกในบรรทัดนี้ด้วยช่องว่าง' เพื่อเร่งความเร็วของสิ่งต่าง ๆ
Matt Boehm

ว้าว! นั่นคือความพยายามบางอย่าง!
muru

1
ฉันทำ (น่าเกลียดจริงๆ) ฟังก์ชั่นที่เป็นกลุ่มที่จะทำให้การนี้บิตเร็วขึ้น: gist.github.com/mattboehm/da63a48eedf6f14375aa เลือกบรรทัด,rจากนั้นกดแล้วเข้าร่วมสายพร้อมกับ<space>ในโหมดปกติ / ภาพ
Matt Boehm
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.