ฉันจะเติมแถบหมายเลขบรรทัดทั้งหมดด้วยสีพื้นหลังแบบกำหนดเองได้อย่างไร


9

ในภาพหน้าจอด้านล่างฉันเพิ่งตั้งพื้นหลังของlinumใบหน้าเป็นสีอย่างไรก็ตามมีพื้นที่ว่างเปล่าที่ท้ายบัฟเฟอร์และมีช่องว่างระหว่างบรรทัดเมื่อglobal-visual-line-modeเปิดใช้การตัดบรรทัด ( ):

พื้นหลัง linum ที่ขาดพร้อมกับการตัดบรรทัด

โดยทางด้านซ้ายของภาพควรเป็นสีสม่ำเสมอ เป็นไปได้ไหม ฉันรู้ว่า Elisp บางตัวดังนั้นถ้าเป็นไปได้ฉันอาจจะเขียนตัวแก้ไขด้วยคำแนะนำ


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

การแก้ไขสี "ระหว่าง" อาจเป็นไปได้ (ฉันจะลอง) การแก้ไขสีหลังจากบัฟเฟอร์สิ้นสุดนั้นน่าเสียดายไม่ใช่ --- ไม่มีสีอะไรที่จะต้องมีสี
Malabarba

ในความเป็นจริงฉันเคยเห็นสิ่งนี้ถามมาบ่อยครั้งจนอาจเป็นคำขอคุณลักษณะที่คุ้มค่า
Malabarba

@ Malabarba เหตุใดจึงไม่สามารถขยายพื้นที่ด้านล่างบัฟเฟอร์ได้ ขอบทำเช่นนี้หลังจากทั้งหมด
Lenar Hoyt

1
@mcb ฉันเข้าใจดีขึ้นเล็กน้อยว่าคุณหมายถึงอะไร ขอบมีใบหน้าของตัวเอง (ซึ่งขยายพื้นหลังไปที่ด้านล่างของหน้าจอ) ระยะขอบไม่ได้ (เพียงยืมใบหน้าเริ่มต้น)
Malabarba

คำตอบ:


6

ปัญหา

ปัญหาตรงนี้คือไม่มีหน้าตาที่จะควบคุมลักษณะที่ปรากฏของระยะขอบ คุณสามารถแสดงข้อความในระยะขอบโดยใช้การวางซ้อน (นั่นคือสิ่งที่linum-modeทำ) แต่เช่นเดียวกับข้อความใด ๆ ใน Emacs มันจะถูก จำกัด ด้วยขีด จำกัด ของบัฟเฟอร์ ดังนั้นคุณไม่สามารถควบคุมการแสดงระยะขอบเกินกว่าบรรทัดสุดท้ายของบัฟเฟอร์ได้

สิ่งที่คุณสามารถทำได้คือแก้ไขบรรทัดที่ผิดพลาดเหล่านั้นในระหว่าง

สิ่งที่จะใส่ที่นั่น

ตัวแปรนี้ควบคุมสิ่งที่คุณต้องการแสดงบนบรรทัดที่มองเห็นเหล่านี้“ ระหว่าง” สองบรรทัดตรรกะ ส่วนที่สำคัญคือซึ่งทำให้เส้นเหล่านี้จะเป็นไปตามลักษณะของ'face 'linum เป็นส่วนหนึ่งชี้คุณสามารถเปลี่ยนเป็นช่องว่างหรือสิ่งที่คุณต้องการlinum-mode"-----"

(defvar endless/margin-display
  `((margin left-margin) ,(propertize "-----" 'face 'linum))
  "String used on the margin.")

ทำอย่างไร

รหัสต่อไปนี้ผ่านบัฟเฟอร์และวางซ้อนทับ (คล้ายกับที่linum-modeใช้) ในแต่ละบรรทัดที่ไม่ใช่ "ของจริง"

(defvar-local endless/margin-overlays nil
  "List of overlays in current buffer.")

(defun endless/setup-margin-overlays ()
  "Put overlays on each line which is visually wrapped."
  (interactive)
  (let ((ww (- (window-width)
               (if (= 0 (or (cdr fringe-mode) 1)) 1 0)))
        ov)
    (mapc #'delete-overlay endless/margin-overlays)
    (save-excursion
      (goto-char (point-min))
      (while (null (eobp))
        ;; On each logical line
        (forward-line 1)
        (save-excursion
          (forward-char -1)
          ;; Check if it has multiple visual lines.
          (while (>= (current-column) ww)
            (endles/make-overlay-at (point))
            (forward-char (- ww))))))))

(defun endles/make-overlay-at (p)
  "Create a margin overlay at position P."
  (push (make-overlay p (1+ p)) endless/margin-overlays)
  (overlay-put
   (car endless/margin-overlays) 'before-string
   (propertize " "  'display endless/margin-display)))

และเราต้องการให้มันรันทุกครั้งที่linum-modeอัพเดทหมายเลขบรรทัด

(add-hook 'linum-before-numbering-hook #'endless/setup-margin-overlays)

ฉันเพิ่งทดสอบorg-modeและดูเหมือนว่าจะมีความล่าช้าในระหว่างการเลื่อนและพลาดช่องว่างโดยไม่มีเหตุผลที่ชัดเจนเมื่อเปิดการปรับแบบพันคำ ภาพหน้าจอ
Lenar Hoyt

@mcb ใช่ประสิทธิภาพเป็นปัญหาที่นี่ แต่การปรับปรุงที่จะเป็นเรื่องยาวและซับซ้อน สำหรับปัญหาโหมด org นั้นองค์กรใช้ประโยชน์อย่างมากจากการซ้อนทับดังนั้นจึงเหมาะสมที่จะเกิดข้อขัดแย้ง ฉันไม่ทราบวิธีการแก้ไข แต่ฉันจะให้ความคิดบางอย่าง
Malabarba

-1

คุณสามารถใส่สิ่งนี้ในการกำหนดค่าของคุณ:

(set-face-background 'fringe "#f4a460")

... เปลี่ยนรหัสสีเป็นสิ่งที่คุณต้องการอย่างชัดเจน


2
สิ่งนี้จะเปลี่ยนสีของเส้นขอบหมายเลขบรรทัดจะไม่ปรากฏบนขอบ (ลองแล้วคุณจะเห็นความแตกต่าง)
Malabarba

1
นอกจากนี้ยังปรากฏบนหน้าจอในคำถาม: คอลัมน์ "หมายเลขบรรทัด" เป็นสีพื้นหลังเดียวกับบัฟเฟอร์ในขณะที่ขอบเป็นพื้นที่เล็ก ๆ ระหว่างคอลัมน์หมายเลขบรรทัดและบัฟเฟอร์เป็นสีเทา
T. Verron

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