Làm cách nào tôi có thể điền vào toàn bộ thanh số dòng bằng màu nền tùy chỉnh?


9

Trong ảnh chụp màn hình bên dưới, tôi chỉ đơn giản đặt nền của linumkhuôn mặt thành một số màu, tuy nhiên có một vùng trống ở cuối bộ đệm và có các khoảng trống giữa các dòng khi bật dòng quấn ( global-visual-line-mode):

Nền linum bị hỏng với dòng bọc.

Lý tưởng nhất là toàn bộ mặt trái phải có màu đồng nhất. Điều này có thể không? Tôi biết một số Elisp, vì vậy nếu có thể, tôi có thể tự viết một bản sửa lỗi với một số hướng dẫn.


Tôi đã nhận thấy điều này khi chuyển đổi chủ đề. Công việc xung quanh tôi là quay trở lại chủ đề mặc định và sau đó kích hoạt lại chủ đề cụ thể. Điều đó thường đặt lại màu nền. Có thể đáng để xem các cài đặt chủ đề mặc định để xem liệu nó có siêng năng hơn với các khuôn mặt cụ thể có thể cho mượn manh mối về cách viết một hàm để sửa nó không.
elarson

Sửa màu "ở giữa" có thể khả thi (Tôi sẽ thử). Sửa màu sau khi kết thúc bộ đệm là, đáng tiếc, không --- không có gì để được tô màu.
Malabarba

Trên thực tế, tôi đã thấy điều này được hỏi xung quanh thường xuyên đến mức nó có thể là một yêu cầu tính năng đáng giá.
Malabarba

@Malabarba Tại sao không thể mở rộng nó vào khu vực bên dưới bộ đệm? Rìa cũng làm điều này sau khi tất cả.
Lenar Hoyt

1
@mcb Tôi hiểu rõ hơn một chút về ý của bạn bây giờ. Rìa có mặt riêng của nó (có nền được mở rộng xuống dưới cùng của màn hình), lề không (nó chỉ mượn khuôn mặt mặc định).
Malabarba

Câu trả lời:


6

Vấn đề

Vấn đề ở đây là không có mặt để kiểm soát sự xuất hiện của lề. Bạn có thể hiển thị văn bản trong lề bằng cách sử dụng lớp phủ (đó là những gì linum-mode) nhưng, giống như bất kỳ văn bản nào trong Emacs, nó bị giới hạn bởi các giới hạn của bộ đệm. Vì vậy, bạn không thể có bất kỳ quyền kiểm soát nào đối với màn hình lề ngoài dòng cuối cùng của bộ đệm.

Những gì bạn có thể làm, là sửa những dòng bị lỗi ở giữa.

Đặt gì ở đó

Biến này điều khiển những gì bạn muốn hiển thị trên các dòng hình ảnh đó giữa hai dòng logic. Phần quan trọng là 'face 'linum, đảm bảo các dòng này sẽ theo sự xuất hiện của linum-mode. Phần "-----"này là minh họa, bạn có thể thay đổi nó thành không gian hoặc bất cứ điều gì bạn muốn.

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

Làm thế nào để làm nó

Đoạn mã sau đi qua bộ đệm và đặt các lớp phủ (tương tự như các mã được linum-modesử dụng) trên mỗi dòng không phải là Real real.

(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)))

Và chúng tôi muốn nó chạy bất cứ khi nào linum-modecập nhật số dòng.

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

Tôi vừa mới thử nghiệm org-modevà nó dường như giới thiệu một số độ trễ trong quá trình cuộn và nó bỏ lỡ các khoảng trống mà không có lý do rõ ràng với tính năng thích ứng được bật. Ảnh chụp màn hình.
Lenar Hoyt

@mcb Vâng, hiệu suất là một vấn đề ở đây, nhưng cải thiện đó sẽ là một vấn đề dài và phức tạp. Đối với vấn đề chế độ org, org sử dụng nhiều lớp phủ, do đó, sẽ có xung đột. Tôi không biết cách nào để sửa nó, nhưng tôi sẽ suy nghĩ kỹ.
Malabarba

-1

Bạn có thể đặt cái này trong cấu hình của bạn:

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

... rõ ràng là thay đổi mã màu thành màu bạn muốn.


2
Điều này sẽ thay đổi màu rìa, số dòng không được hiển thị trên rìa. (hãy thử và bạn sẽ thấy sự khác biệt)
Malabarba

1
Nó cũng hiển thị trên ảnh chụp màn hình trong câu hỏi: "cột số dòng" có cùng màu nền với bộ đệm, trong khi rìa là khu vực nhỏ giữa cột số dòng và bộ đệm, màu xám.
T. Verron

Vâng bạn đã đúng. Tôi nghi ngờ bạn sẽ phải giới thiệu một lớp phủ mới trong một lần chạy functon tại móc nối số trước và đánh số mặt mà bạn có thể đặt.
tealeg
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.