підкресліть поточну помилку у вікні * компіляції *


12

Під час виконання команди компіляції та переходу до 'наступної помилки', emacs ідентифікує лінію поточної помилки, розміщуючи маленький чорний трикутник, вказуючи праворуч, у лівій окантовці буфера * компіляції * . Це приємно, але мої старі очі хотіли б сміливішого показника. Основна мета тут - можливість швидко візуально визначити, який рядок emacs ідентифікує як поточну помилку компілятора. Деякі рішення, які вам спадають на думку:

  1. інше обличчя для поточної помилки (наприклад, більша).
  2. інший колір фону для поточної помилки (щось на зразок hl-line-mode).
  3. більший трикутник.

але я відкритий і для інших ідей.

Може хтось допоможе мені?

Відповіді:


2

Я хотів досягти того ж, що часто було боляче знаходити поточне повідомлення про помилку в буфері компіляції. Це рішення засноване на пропозиції Дрю використовувати а, next-error-hookщоб виділити повідомлення про помилку. Наразі він виділяє лише перший рядок у повідомленні про помилку, але я вважаю, що це досить добре.

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

Використання:

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

Демонстрація:

демонстрація


1

Ось приклад того, як змінити растрове зображення, яке з’являється у лівій бахроні *compilation*буфера (наприклад, *grep*буфер результатів):

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

Ось приклад того, як встановити кольори бітових зображень бахроми:

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

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

Ось приклад того, як створити власну біт-карту бахроми:

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

Це виглядає дуже перспективно. Я спробую це завтра (перебуваю тут перед сном).
Spacemoose

1

Чи не next-errorпрокручує буфер помилок компіляції, так що поточна помилка відображається як перший рядок вікна?

Якщо ні, то не принаймні кладе курсор у поточну лінію помилки? Якщо це так, і якщо курсор недостатньо видимий для вас, спробуйте hl-line-modeвиділити поточний рядок. Або розглянути можливість використання бібліотеки crosshairsдля виділення поточного рядка та поточного стовпця.


Оновіть після Вашого коментаря

Я думав, ти викликаєш next-errorу буфер *compilation*. Якщо ви це зробите, то рядок прокручується до верху, як я описав.

Але якщо ви викликаєте next-errorзовнішній буфер, *compilation*тоді вам потрібно використовувати, next-error-hookщоб у буфері*compilation* виділити поточну лінію чи бахрому чи будь-що іншим способом.

Ось швидкий і брудний приклад:

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

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

(Звичайно, ви на самому справі потрібно всього лише включити hl-line-modeодин раз в цьому буфері. Роблячи це , як показано вище , є зайвим, але це не боляче. Ви можете подумати , що ви могли б просто додати fooдо grep-mode-hookабо compilation-mode-hook. Але коли ці гачки викликаються там ні next-error-last-buffer.)

Примітка:

  1. Є два параметри користувача, які керують способами вказівки звернення у вихідний буфер (а не в буфер компіляції): next-error-highlightі next-error-highlight-no-select. Вони пропонують однакові можливості, але їх використовують різні команди. Можливості включають використання стрілки бахроми або виділення матчу протягом певного часу.

  2. Але немає такої опції, що контролює індикацію поточного звернення в буфері *compilation*. Таким чином, Emacs пропонує два варіанти (де, мабуть, буде достатньо) для вихідного буфера, але немає можливості для буфера компіляції.

Ви могли б розглянути питання про подання запиту на покращувати, щоб отримати подібний варіант для компіляції (включаючи Grep) буфер: M-x report-emacs-bug. Використовувати гачок із власною функцією для підсвічування, це добре, але це не повинно бути необхідним.


І якщо ви просто хочете змінити індикатор бахроми, ви можете це зробити (використовуйте будь-яку растрову бахрому бахроми, замість filled-rectangle- дивіться (elisp) Растрові бірки для списку попередньо визначених):

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

Оновлення №2:

Я щойно виявив, що якщо ви вимкнете показ лівої бахроми, ви побачите поведінку, яку я описав на початку: вікно прокручується, щоб покласти поточну помилку вгорі. Тож це ще одна можливість. (Це поведінка, яку я бачу в налаштуваннях, оскільки я не показую бахрому.)

У цій поведінці є помилка, про яку я щойно повідомляв ( # 20829 ). Що враховується (наразі, поки помилка не виправлена), чи з’являється ліва бахрома у вибраному вікні, коли ви це робите C-x `( next-error). Наразі недостатньо, щоб у вікні, що відображає буфер компіляції, не було лівої межі.


Прокрутка буфера компіляції, здається, працює як і решта emacs - коли 'точка' (у випадку буфера компіляції, поточна помилка) проходить повз певну точку, екран прокручується. для великого екрану даних це спричинює важку помилку. Поведінка режиму hl-line буде чудовим, але він лише підкреслює поточний буфер (чи можу я це замінити?) - тому рядок коду, де виникає помилка, виділяється, але там даних про помилки немає. перехрестя, здається, робить те саме, що біт із стовпцем та рядком, які мені не потрібні.
Spacemoose

Досі незрозуміло, щонайменше, для мене. Для мене next-errorставить поточну лінію помилки у верхній рядок вікна для буфера *compilation*. Звичайно global-hl-line-mode, але ваша скарга / запитання нібито стосується *compilation*буфера. Питання стає менш зрозумілим, не більше (ІМХО).
Дрю

Коли ви компілюєте в emacs з помилками, виконайте наступну помилку. У буфері джерела ваш курсор буде біля джерела помилки, і є невеликий чорний трикутник, що вказує на поточний компілятор-повідомлення про помилку в буфері компіляції . Поточна помилка, як правило, не є найвищою лінією буфера (я щойно робив експеримент у 24.5.1). Мені візуально задається пошук чорного трикутника. hl-line-mode лише виділяють рядок активного буфера, який є вихідним буфером. Я не хочу переходити до буфера компіляції лише для того, щоб знайти рядок.
Spacemoose

Я думав, ви викликаєте наступну помилку в буфері *compilation*. Якщо ні, то вам потрібно поставити функцію, next-error-hookщоб зробити виділення (або що завгодно) в буфері*compilation* . Я оновив відповідь прикладом.
Дрю

Ваш швидкий і брудний приклад відповідає точці 2 ОП, саме це я шукав. Прокрутка буфера компіляції таким чином, що активна лінія знаходиться вгорі (що справедливо лише в тому випадку, якщо ліві бахроми мають розмір 0) змусило втратити контекст (оскільки рядки над помилкою мають значення), тому мені довелося встановити compilation-context-lines. Як результат, наразі вибрану помилку було важко знайти. Ваше рішення врятувало мене.
Готьє
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.