พื้นหลังซ่อนโหมด hl-line-mode จะหลีกเลี่ยงได้อย่างไร


10

ด้วย:

(when window-system
  (set-face-background 'hl-line "light yellow")
  (global-hl-line-mode 1))

บรรทัดปัจจุบันเน้นด้วยพื้นหลังสีเหลือง แต่ถ้าข้อความมีคุณสมบัติพื้นหลังก็ยังเขียนทับ (เช่นโหมด diff, โหมดสายรุ้ง)

เป็นไปได้ไหมที่จะตั้งพื้นหลังสำหรับชิ้นส่วนที่ไม่มีคุณสมบัติที่เหมาะสม?

อัปเดตฉันเริ่มทดลองดูเหมือนว่าไม่เป็นระเบียบไม่ได้ขัดแย้งกับพื้นหลัง:

(set-face-stipple 'hl-line '(4 4 "\x01\x00\x00\x00"))
(set-face-attribute 'hl-line nil :inherit nil)

แต่น่าเสียดายที่แต้มน่าเสียดายที่สร้างความเสียหายให้กับข้อความ ...


1
ความเป็นไปได้อีกประการหนึ่งที่คุณอาจต้องการพิจารณาคือฟังก์ชั่นการลบที่วางที่ส่วนท้ายของแต่ละลูปคำสั่ง hl-line เช่นว่าจะทำการค้นหาจากจุดเริ่มต้นของบรรทัดปัจจุบันไปยังจุดสิ้นสุดของบรรทัดปัจจุบัน บรรทัดภาพปัจจุบันถ้ามี) และใบหน้าซ้อนทับ hl-line นั้นจะสามารถลบออกจากที่ใดก็ตามที่มีข้อความอื่นที่มีสีพื้นหลังแตกต่างกัน คุณอาจกำลังค้นหาไฮไลต์ที่วางโดยล็อคแบบอักษรแม้ว่าคุณอาจมีไฮไลต์ที่วางอยู่กับภาพซ้อนทับอื่น ๆ (เช่นข้อผิดพลาด flyspell / ซ้ำกัน)
ฏหมาย

@lawlist ฉันสนใจที่จะนำไปใช้ คุณช่วยเพิ่มโซลูชันแบบเต็มด้านล่างได้ไหม?
Kaushal Modi

@kaushalmodi - ฉันรู้วิธีการทำเช่นนี้สำหรับการซ้อนทับที่เฉพาะเจาะจงหรือข้อความดิบที่จุด แต่ไม่ใช่สำหรับการเน้นข้อความคุณสมบัติ / ล็อคตัวอักษรที่เฉพาะเจาะจงที่จุด เนื่องจากฉันจะต้องวิจัยวิธีการทดสอบสำหรับสองเหตุการณ์หลังนั้นเพื่อตอบคำถามนี้อย่างถูกต้องฉันเลือกที่จะแสดงความคิดเห็นแทน นี่คือตัวอย่าง [ยืมมาจากห้องสมุด Drew หนึ่งแห่ง] เพื่อทดสอบการวางซ้อนที่เฉพาะเจาะจง ณ จุด: (when (memq NAME-OF-FACE (mapcar (function (lambda (ovr) (overlay-get ovr 'face))) (overlays-at (point)))) (remove-overlays BEGINNING-POINT ENDING-POINT 'face hl-line))
ฏหมาย

คำตอบ:


5

ปัญหาคือบางครั้งคุณสมบัติข้อความfaceใช้สำหรับการไฮไลต์และhl-line-modeใช้การซ้อนทับ และการวางซ้อนจะปรากฏ "ด้านบนของ" การfaceเน้นคุณสมบัติข้อความเสมอ

diff-modeตัวอย่างเช่นใช้คุณสมบัติข้อความไม่ใช่ภาพซ้อนทับ ดังนั้นสำหรับกรณีเช่นนี้คุณไม่มีโชค

แต่สำหรับการไฮไลต์ที่เกิดจากการซ้อนทับคุณสามารถลดลำดับความสำคัญของการซ้อนทับของการซ้อนทับ hl-line: อย่างใดอย่างหนึ่งhl-line-overlayหรือglobal-hl-line-overlayเพื่อให้การซ้อนทับปรากฏเป็น "ด้านล่าง" การเน้นซ้อนทับอื่น ๆ

หากคุณใช้ไลบรารีhl-line+.elคุณสามารถใช้ตัวเลือกhl-line-overlay-priorityเพื่อกำหนดลำดับความสำคัญของการซ้อนทับ ดูเพิ่มเติม Emacs วิกิพีเดียหน้าHighlight บรรทัดปัจจุบัน (แต่อีกครั้งการเปลี่ยนลำดับความสำคัญของการซ้อนทับจะไม่มีผลหากการเน้นอื่นไม่ได้มาจากการซ้อนทับ)


ขอบคุณสำหรับคำตอบ. ฉันไม่สนใจความแตกต่างระหว่างใบหน้าและภาพซ้อนทับ ... +1
gavenkoa

ฉันจะเข้าถึงhl-line-overlayคุณสมบัตินั้นได้อย่างไร customize-variableมันเช่นไม่แสดงขึ้นมาใน
9000

@ 9000: ตามคำตอบที่บอกว่าถ้าคุณใช้ไลบรารี่hl-line+.elคุณก็แค่ปรับแต่งตัวเลือก hl-line-overlay-priorityมิฉะนั้นคุณจะไม่สามารถ (ยกเว้นโดยการกำหนดใหม่หรือให้คำแนะนำฟังก์ชั่นที่ให้บริการไว้ล่วงหน้า) นั่นคือจุดที่ให้ตัวเลือกผู้ใช้นี้
ดึง

3

ฉันลงท้ายด้วยโซลูชันบางส่วน - เน้นเฉพาะที่ส่วนท้ายของบรรทัด:

(defun my-hl-line-range-function ()
  (cons (line-end-position) (line-beginning-position 2)))
(setq hl-line-range-function #'my-hl-line-range-function)

(when window-system
  (require 'hl-line)
  (set-face-attribute 'hl-line nil :inherit nil :background "light yellow")
  (setq global-hl-line-sticky-flag t)
  (global-hl-line-mode 1))

2

สะดุดกับคำถามนี้เมื่อพยายามที่จะไม่hl-lineแทนที่พื้นหลัง (แม้ว่าจะเป็นแนวทางการเยื้องในกรณีนี้):

ฉันตัดสินสิ่งนี้ซึ่งเริ่มวาดเส้นไฮไลต์หลังจากการเยื้อง:

(defun my-hl-line-range-function ()
  (cons
   (+ (line-beginning-position 1) (current-indentation))
   (line-beginning-position 2)))
(setq hl-line-range-function #'my-hl-line-range-function)

การแทนที่(+ (line-beginning-position 1) (current-indentation))ด้วย(point)งานก็เช่นกัน (เริ่มที่เคอร์เซอร์)

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