hl-line-mode ẩn nền, làm thế nào để tránh điều này?


10

Với:

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

dòng hiện tại được tô sáng bởi nền màu vàng, nhưng nếu văn bản có thuộc tính nền thì nó cũng bị ghi đè (như chế độ khác, chế độ cầu vồng).

Có thể chỉ đặt nền cho các phần không có thuộc tính phù hợp?

CẬP NHẬT Tôi bắt đầu thử nghiệm, có vẻ như điều đó không mâu thuẫn với nền:

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

Nhưng không may làm hỏng sự xuất hiện của văn bản ...


1
Một khả năng khác bạn có thể muốn xem xét là một hàm loại bỏ được đặt ở cuối đuôi của mỗi vòng lệnh hl-line, sao cho việc tìm kiếm được thực hiện từ đầu dòng hiện tại đến cuối dòng hiện tại (hoặc đến cuối dòng đường trực quan hiện tại, nếu có thể) và mặt lớp phủ hl-line có thể được xóa khỏi bất kỳ nơi nào có văn bản khác có màu nền khác. Bạn có thể sẽ tìm kiếm đánh dấu được đặt bằng khóa phông chữ, mặc dù bạn cũng có thể đánh dấu được đặt với các lớp phủ khác (ví dụ: lỗi / trùng lặp flyspell).
luật

@lawlist Tôi quan tâm đến việc thực hiện nó; Bạn có thể vui lòng thêm giải pháp đầy đủ dưới đây?
Kaushal Modi

@kaushalmodi - Tôi biết cách thực hiện điều này đối với các lớp phủ cụ thể hoặc văn bản thô tại điểm, nhưng không phải để làm nổi bật các thuộc tính văn bản / phông chữ khóa cụ thể tại điểm. Bởi vì tôi sẽ cần nghiên cứu cách kiểm tra hai lần xuất hiện sau để trả lời đúng câu hỏi này, tôi đã chọn đưa ra nhận xét thay thế. Đây là đoạn trích [mượn từ một trong các thư viện của Drew] để kiểm tra các lớp phủ cụ thể tại điểm: (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))
luật

Câu trả lời:


5

Vấn đề là đôi khi thuộc tính văn bản faceđược sử dụng để làm nổi bật và hl-line-modesử dụng lớp phủ. Và lớp phủ luôn xuất hiện "trên đầu trang" facetô sáng thuộc tính văn bản .

diff-mode, ví dụ, sử dụng thuộc tính văn bản, không phải lớp phủ. Vì vậy, đối với những trường hợp như thế này, bạn đã hết may mắn.

Nhưng để làm nổi bật được tạo bởi lớp phủ, bạn chỉ có thể giảm mức độ ưu tiên của lớp phủ hl-line: hl-line-overlayhoặc global-hl-line-overlay, để lớp phủ đó dường như "bên dưới" lớp tô sáng khác.

Nếu bạn sử dụng thư viện hl-line+.elthì bạn có thể sử dụng tùy chọn hl-line-overlay-priorityđể đặt mức độ ưu tiên của lớp phủ. Xem thêm Trang Wiki Emacs Đánh dấu Dòng hiện tại . (Nhưng một lần nữa, việc thay đổi mức ưu tiên của lớp phủ không có hiệu lực nếu phần tô sáng khác không phải từ lớp phủ.)


Cảm ơn về câu trả lời. Tôi không bận tâm về sự khác biệt giữa các khuôn mặt và lớp phủ ... +1
gavenkoa

Làm thế nào để tôi truy cập vào hl-line-overlaytài sản đó ? Nó ví dụ như không xuất hiện trong customize-variable.
9000

@ 9000: Như câu trả lời đã nói, nếu bạn sử dụng thư viện hl-line+.elthì bạn chỉ cần tùy chỉnh tùy chọn hl-line-overlay-priority. Mặt khác, bạn không thể (ngoại trừ bằng cách xác định lại hoặc tư vấn các chức năng được cung cấp trước). Đó là điểm cung cấp tùy chọn người dùng này.
vẽ

3

Tôi kết thúc với giải pháp một phần - chỉ đánh dấu từ cuối dòng:

(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

Tình cờ gặp phải câu hỏi này khi cố gắng không hl-lineghi đè nền (mặc dù đó là hướng dẫn thụt lề trong trường hợp này):

Tôi giải quyết vấn đề này, nó bắt đầu vẽ đường tô sáng sau khi thụt lề:

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

Thay thế (+ (line-beginning-position 1) (current-indentation))bằng (point)các công việc quá, (bắt đầu từ con trỏ).

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.