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


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.