nhấn mạnh lỗi hiện tại trong cửa sổ * biên dịch *


12

Khi chạy lệnh biên dịch và nhảy đến 'lỗi tiếp theo', emacs xác định dòng lỗi hiện tại bằng cách đặt một hình tam giác nhỏ màu đen, chỉ sang phải, ở rìa bên trái của bộ đệm * biên dịch * . Điều này là tốt, nhưng đôi mắt cũ của tôi muốn một chỉ số táo bạo hơn. Mục tiêu cơ bản ở đây là có thể nhanh chóng xác định trực quan các emacs dòng nào được xác định là lỗi trình biên dịch hiện tại. Một số giải pháp mà tôi nghĩ đến:

  1. một khuôn mặt khác cho lỗi hiện tại (ví dụ lớn hơn).
  2. một màu nền khác nhau cho lỗi hiện tại (giống như chế độ hl-line-mode).
  3. một tam giác lớn hơn.

nhưng tôi cũng mở cho những ý tưởng khác

Ai đó có thể giúp tôi không?

Câu trả lời:


2

Tôi muốn đạt được điều tương tự như thường đau đớn khi tìm thấy thông báo lỗi hiện tại trong bộ đệm biên dịch. Giải pháp này dựa trên đề xuất của Drew để sử dụng một next-error-hookđể làm nổi bật thông báo lỗi. Hiện tại nó chỉ làm nổi bật dòng đầu tiên trong thông báo lỗi, nhưng tôi thấy điều này là đủ tốt.

(defcustom next-error-message-highlight-p nil
  "If non-nil, highlight the current error message in the ‘next-error’ buffer"
  :type 'boolean
  :group 'next-error
  :version "??")

(defface next-error-message
  '((t (:inherit highlight)))
  "Face used to highlight the current error message in the ‘next-error’ buffer"
  :group 'next-error
  :version "??")

(defvar next-error-message-highlight-overlay
  nil
  "Overlay highlighting the current error message in the ‘next-error’ buffer")

(make-variable-buffer-local 'next-error-message-highlight-overlay)

(defun next-error-message-highlight ()
  "Highlight the current error message in the ‘next-error’ buffer."
  (when next-error-message-highlight-p
    (with-current-buffer next-error-last-buffer
      (when next-error-message-highlight-overlay
        (delete-overlay next-error-message-highlight-overlay))
      (save-excursion
        (goto-char (point))
        (let ((ol (make-overlay (line-beginning-position) (line-end-position))))
          ;; do not override region highlighting
          (overlay-put ol 'priority -50)
          (overlay-put ol 'face 'next-error-message)
          (overlay-put ol 'window (get-buffer-window))
          (setf next-error-message-highlight-overlay ol))))))

(add-hook 'next-error-hook 'next-error-message-highlight)

Sử dụng:

(setq next-error-message-highlight-p t)

Bản giới thiệu:

bản giới thiệu


1

Dưới đây là một ví dụ về cách sửa đổi hình ảnh bitmap xuất hiện ở rìa bên trái của *compilation*bộ đệm (ví dụ: *grep*bộ đệm kết quả):

(define-fringe-bitmap 'custom-right-arrow [128 192 96 48 24 48 96 192 128] 9 8 'center)

(put 'overlay-arrow-position 'overlay-arrow-bitmap 'custom-right-arrow)

Dưới đây là một ví dụ về cách đặt màu của bitmap fringe:

(defface right-triangle-face
  '((t (:background "red" :foreground "yellow")))
  "Face for `right-triangle-face`.")

(set-fringe-bitmap-face 'right-triangle 'right-triangle-face)

Dưới đây là một ví dụ về cách tạo bitmap rìa của riêng bạn:

;; AUTHOR:  Nikolaj Schumacher -- https://github.com/nschum/fringe-helper.el
;;
(defun fringe-helper-convert (&rest strings)
"Convert STRINGS into a vector usable for `define-fringe-bitmap'.
Each string in STRINGS represents a line of the fringe bitmap.
Periods (.) are background-colored pixel; Xs are foreground-colored. The
fringe bitmap always is aligned to the right. If the fringe has half
width, only the left 4 pixels of an 8 pixel bitmap will be shown.
For example, the following code defines a diagonal line.
\(fringe-helper-convert
\"XX......\"
\"..XX....\"
\"....XX..\"
\"......XX\"\)"
  (unless (cdr strings)
  ;; only one string, probably with newlines
    (setq strings (split-string (car strings) "\n")))
  (apply 'vector
    (mapcar
      (lambda (str)
        (let ((num 0))
          (dolist (c (string-to-list str))
            (setq num (+ (* num 2) (if (eq c ?.) 0 1))))
          num))
      strings)))

(define-fringe-bitmap 'backslash (fringe-helper-convert
  "XX......"
  "XX......"
  " XX....."
  ".XX....."
  "..XX...."
  "..XX...."
  "...XX..."
  "...XX..."
  "....XX.."
  "....XX.."
  ".....XX."
  ".....XX.") nil nil 'center)

Điều này có vẻ rất hứa hẹn. Tôi sẽ thử nó vào ngày mai (đi ngủ ở đây).
Spacemoose

1

Không next-errorcuộn bộ đệm biên dịch lỗi, để lỗi hiện tại hiển thị là dòng đầu tiên của cửa sổ?

Nếu không, ít nhất nó có đặt con trỏ lên dòng lỗi hiện tại không? Nếu có, và nếu con trỏ không đủ hiển thị cho bạn, hãy xem xét sử dụng hl-line-modeđể làm nổi bật dòng hiện tại. Hoặc xem xét sử dụng thư viện crosshairsđể làm nổi bật dòng hiện tại và cột hiện tại.


Cập nhật sau bình luận của bạn

Tôi nghĩ rằng bạn đang gọi next-errortrong bộ đệm *compilation*. Nếu bạn làm điều đó thì dòng được cuộn lên trên cùng, như tôi đã mô tả.

Nhưng nếu bạn đang gọi next-errorbộ đệm bên ngoài *compilation*thì bạn cần sử dụng next-error-hookđể, trong bộ đệm*compilation* , làm nổi bật dòng hoặc rìa hiện tại hoặc bất cứ thứ gì, theo bất cứ cách nào bạn thích.

Đây là một ví dụ nhanh và bẩn:

(defun foo ()
  "..."
  (with-current-buffer next-error-last-buffer
    (hl-line-mode 1)))

(add-hook 'next-error-hook 'foo)

(Tất nhiên, bạn thực sự chỉ cần bật hl-line-modemột lần trong bộ đệm đó. Làm như thể trình bày ở trên là quá mức cần thiết, nhưng nó không gây hại. Bạn có thể nghĩ rằng bạn chỉ có thể thêm foovào grep-mode-hookhoặc compilation-mode-hook. Nhưng khi những cái móc đó được gọi thì có không next-error-last-buffer.)

Ghi chú:

  1. Có hai tùy chọn người dùng kiểm soát các cách để chỉ ra lần truy cập trong bộ đệm nguồn (không phải trong bộ đệm biên dịch): next-error-highlightnext-error-highlight-no-select. Chúng cung cấp các khả năng giống nhau, nhưng chúng được sử dụng bởi các lệnh khác nhau. Các khả năng bao gồm sử dụng một mũi tên tua hoặc làm nổi bật trận đấu trong một thời gian nhất định.

  2. Nhưng không có tùy chọn kiểm soát như vậy của lần truy cập hiện tại trong bộ đệm *compilation*. Vì vậy, Emacs cung cấp hai tùy chọn (trong đó một tùy chọn có thể là đủ) cho bộ đệm nguồn nhưng không có tùy chọn nào cho bộ đệm biên dịch.

Bạn có thể xem xét việc gửi yêu cầu nâng cao, để có được một tùy chọn tương tự cho bộ đệm biên dịch (bao gồm grep) : M-x report-emacs-bug. Sử dụng một cái móc với chức năng của riêng bạn để thực hiện tô sáng là OK, nhưng không cần thiết.


Và nếu bạn chỉ muốn thay đổi chỉ báo rìa, bạn có thể thực hiện việc này (sử dụng bất kỳ bitmap rìa nào bạn muốn, thay vì filled-rectangle- xem (elisp) Bitmap Fringe cho danh sách các bitmap được xác định trước):

(defun bar ()
  (with-current-buffer next-error-last-buffer
    (unless (eq 'filled-rectangle (cdr (assq 'overlay-arrow fringe-indicator-alist)))
      (setq fringe-indicator-alist
            (cons '(overlay-arrow . filled-rectangle) fringe-indicator-alist)))))

(add-hook 'next-error-hook 'bar)

Cập nhật số 2:

Tôi chỉ phát hiện ra rằng nếu bạn tắt hiển thị rìa bên trái thì bạn sẽ thấy hành vi tôi đã mô tả ở đầu: cửa sổ được cuộn để đặt lỗi hiện tại ở trên cùng. Vì vậy, đó là một khả năng khác. (Đó là hành vi tôi thấy trong thiết lập của mình, vì tôi không hiển thị rìa.)

Có một lỗi trong hành vi này, mà tôi vừa báo cáo ( # 20829 ). Số đếm (hiện tại, cho đến khi lỗi được sửa) là liệu rìa bên trái có hiển thị trong cửa sổ đã chọn khi bạn thực hiện C-x `( next-error) hay không. (Hiện tại) không đủ để cửa sổ hiển thị bộ đệm biên dịch không hiển thị rìa bên trái.


Việc cuộn bộ đệm biên dịch dường như hoạt động giống như phần còn lại của emacs - khi 'điểm' (trong trường hợp bộ đệm biên dịch, lỗi hiện tại) di chuyển qua một điểm nhất định, màn hình sẽ cuộn. đối với một màn hình lớn của dữ liệu, điều này gây ra lỗi khó tìm. Hành vi của chế độ hl-line sẽ rất tuyệt, nhưng nó chỉ làm nổi bật bộ đệm hiện tại (tôi có thể ghi đè lên điều này không?) - vì vậy dòng mã nơi xảy ra lỗi được tô sáng, nhưng không có dữ liệu lỗi. crosshairs dường như làm điều tương tự một chút với cột và dòng mà tôi không cần.
Spacemoose

Vẫn chưa rõ ràng, với tôi ít nhất. Đối với tôi, next-errorđặt dòng lỗi hiện tại ở dòng trên cùng của cửa sổ cho bộ đệm *compilation*. Tất nhiên là có global-hl-line-mode, nhưng khiếu nại / câu hỏi của bạn được cho là về *compilation*bộ đệm. Câu hỏi ngày càng ít rõ ràng hơn, không nhiều hơn (IMHO).
vẽ

Khi bạn biên dịch trong emacs có lỗi, hãy thực hiện lỗi tiếp theo. Trong bộ đệm nguồn, con trỏ của bạn sẽ ở nguồn lỗi và có một hình tam giác nhỏ màu đen biểu thị thông báo lỗi trình biên dịch hiện tại trong bộ đệm biên dịch . Lỗi hiện tại nói chung không phải là dòng trên cùng của bộ đệm (Tôi vừa thực hiện thử nghiệm trong 24.5.1). Tôi thấy nó có nhiệm vụ trực quan để tìm kiếm tam giác đen. hl-line-mode chỉ làm nổi bật dòng của bộ đệm hoạt động , đó là bộ đệm nguồn. Tôi không muốn nhảy vào bộ đệm biên dịch chỉ để tìm dòng.
Spacemoose

Tôi nghĩ rằng bạn đang gọi lỗi tiếp theo trong bộ đệm *compilation*. Nếu không thì bạn cần phải đặt một chức năng next-error-hookđể làm nổi bật (hoặc bất cứ điều gì) trong bộ đệm*compilation* . Tôi đã cập nhật câu trả lời với một ví dụ.
vẽ

Ví dụ nhanh và bẩn của bạn trả lời điểm 2 của OP, đó chính xác là những gì tôi đang tìm kiếm. Cuộn bộ đệm biên dịch sao cho dòng hoạt động ở trên cùng (chỉ hợp lệ nếu các rìa bên trái có kích thước 0) làm tôi mất ngữ cảnh (vì các dòng trên lỗi có ý nghĩa), vì vậy tôi phải đặt compilation-context-lines. Kết quả là, lỗi hiện đang được chọn là khó tìm. Giải pháp của bạn đã cứu tôi.
Gauthier
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.