podkreśl bieżący błąd w oknie * kompilacji *

12

Po uruchomieniu polecenia kompilacji i przejściu do „następnego błędu” emacs rozpoznaje linię bieżącego błędu, umieszczając mały czarny trójkąt skierowany w prawo w lewym skraju bufora * kompilacji * . To miłe, ale moje stare oczy chciałyby odważniejszego wskaźnika. Podstawowym celem jest tutaj możliwość szybkiego wizualnego zidentyfikowania, który emacs linii identyfikuje jako aktualny błąd kompilatora. Niektóre rozwiązania, które przychodzą na myśl:

  1. inna twarz dla obecnego błędu (na przykład większa).
  2. inny kolor tła dla bieżącego błędu (coś w stylu trybu linii-hl).
  3. większy trójkąt.

ale jestem też otwarty na inne pomysły.

Czy ktoś może mi pomóc?

Spacemoose
źródło

Odpowiedzi:

2

Chciałem osiągnąć to samo, ponieważ często bolesne było znalezienie bieżącego komunikatu o błędzie w buforze kompilacji. To rozwiązanie jest oparte na sugestii Drew, aby użyć a next-error-hookdo podświetlenia komunikatu o błędzie. Obecnie podświetla tylko pierwszą linię w komunikacie o błędzie, ale uważam, że to wystarczy.

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

Stosowanie:

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

Próbny:

próbny

erjoalgo
źródło
1

Oto przykład, jak zmodyfikować obraz bitmapy, który pojawia się w lewej części *compilation*bufora (np. *grep*Bufor wyników):

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

Oto przykład ustawiania kolorów prążkowych bitmap:

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

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

Oto przykład, jak utworzyć własną bitmapę z marginesami:

;; 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)
lista prawnicza
źródło
To wygląda bardzo obiecująco. Wypróbuję to jutro (tutaj przed snem).
Spacemoose
1

Nie next-errorprzewija bufora błędów kompilacji, więc bieżący błąd jest wyświetlany jako pierwszy wiersz okna?

Jeśli nie, to czy przynajmniej nie umieszcza kursora w bieżącym wierszu błędu? Jeśli tak, a kursor nie jest dla Ciebie wystarczająco widoczny, rozważ użycie przycisku hl-line-modedo podświetlenia bieżącej linii. Lub rozważ użycie biblioteki crosshairsdo podświetlenia bieżącej linii i bieżącej kolumny.


Zaktualizuj po swoim komentarzu

Myślałem, że inwokujesz next-errorw buforze *compilation*. Jeśli to zrobisz, linia zostanie przewinięta do góry, jak opisałem.

Ale jeśli powołując się next-errorna zewnątrz bufor *compilation*następnie trzeba użyć next-error-hook, aby, w buforze*compilation* , podświetlenie aktualnej linii lub frędzli lub cokolwiek, w jakikolwiek sposób chcesz.

Oto szybki i brudny przykład:

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

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

(Oczywiście, tak naprawdę wystarczy włączyć hl-line-moderaz w tym buforze. Robi to w sposób pokazany powyżej jest przesadą, ale to nie boli. Można by pomyśleć, że można po prostu dodać foodo grep-mode-hooklub compilation-mode-hook. Ale kiedy te haki są wywoływane jest nie next-error-last-buffer.)

Uwaga:

  1. Istnieją dwie opcje użytkownika, które kontrolują sposoby wskazywania trafienia w buforze źródłowym (nie w buforze kompilacji): next-error-highlighti next-error-highlight-no-select. Oferują te same możliwości, ale są używane przez różne polecenia. Możliwości obejmują użycie strzałki frędzlowej lub podświetlanie meczu na określony czas.

  2. Ale nie ma takiej opcji kontrolującej wskazanie bieżącego trafienia w buforze *compilation*. Dlatego Emacs oferuje dwie opcje (gdzie prawdopodobnie wystarczyłaby) dla bufora źródłowego, ale nie ma opcji dla bufora kompilacji.

Można rozważyć złożenie wniosku powiększenia, aby uzyskać podobną opcję kompilacji (w tym grep) Bufor: M-x report-emacs-bug. Użycie haka z własną funkcją do wykonania podświetlenia jest w porządku, ale nie powinno być konieczne.


A jeśli chcesz tylko zmienić wskaźnik grzywki, możesz to zrobić (użyj dowolnej bitmapy z frędzlami, a nie filled-rectangle- patrz (elisp) Bitmapy z grzywką, aby uzyskać listę predefiniowanych):

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

Aktualizacja nr 2:

Właśnie odkryłem, że jeśli wyłączysz wyświetlanie lewej grzywki, zobaczysz zachowanie, które opisałem na początku: okno jest przewijane, aby umieścić bieżący błąd na górze. To kolejna możliwość. (Jest to zachowanie, które widzę w mojej konfiguracji, ponieważ nie pokazuję grzywki.)

W tym zachowaniu jest błąd, który właśnie zgłosiłem ( # 20829 ). Liczy się (obecnie, dopóki błąd nie zostanie naprawiony) to, czy lewy margines pojawia się w wybranym oknie, kiedy to robisz C-x `( next-error). (Obecnie) nie wystarczy, że okno pokazujące bufor kompilacji nie pokazuje lewej krawędzi.

Rysował
źródło
Przewijanie bufora kompilacji wydaje się działać podobnie jak reszta emacsa - kiedy „punkt” (w przypadku bufora kompilacji bieżący błąd) przesuwa się poza określony punkt, ekran przewija się. dla dużego ekranu danych sprawia to, że trudno jest znaleźć błąd. Tryb hl-line byłby świetny, ale podkreśla tylko bieżący bufor (czy mogę to zastąpić?) - więc wiersz kodu, w którym występuje błąd, jest podświetlony, ale nie ma danych o błędzie. celownik wydaje się robić to samo z kolumną i linią, czego nie potrzebuję.
Spacemoose
Nadal niejasne, przynajmniej dla mnie. Dla mnie next-errorumieszcza bieżącą linię błędu w górnej linii okna bufora *compilation*. Oczywiście global-hl-line-mode, ale twoja skarga / pytanie dotyczyło *compilation*bufora. Pytanie staje się coraz mniej jasne, a nie więcej (IMHO).
Drew
Kiedy kompilujesz w emacsie z błędami, wykonaj next-error. W buforze źródłowym kursor znajdzie się u źródła błędu, a mały bufor w trójkącie wskazuje bieżący komunikat o błędzie kompilatora w buforze kompilacji . Bieżący błąd nie jest zazwyczaj najwyższą linią bufora (właśnie wykonałem eksperyment w 24.5.1). Uważam, że zadaniem jest poszukiwanie czarnego trójkąta. Tryb linii-hl podświetla tylko linię aktywnego bufora, który jest buforem źródłowym. Nie chcę przeskakiwać do bufora kompilacji tylko po to, by znaleźć linię.
Spacemoose
Myślałem, że wywołujesz bufor następnego błędu *compilation*. Jeśli nie, musisz włączyć funkcję next-error-hookpodświetlania (lub cokolwiek) w buforze*compilation* . Zaktualizowałem odpowiedź za pomocą przykładu.
Drew
Twój szybki i brudny przykład odpowiada punktowi 2 OP, czyli dokładnie tego szukałem. Bufor kompilacji przewijany tak, że aktywna linia jest na górze (która jest poprawna tylko wtedy, gdy lewe prążki mają rozmiar 0) spowodował, że straciłem kontekst (ponieważ linie powyżej błędu są znaczące), więc musiałem ustawić compilation-context-lines. W rezultacie trudno było znaleźć aktualnie wybrany błąd. Twoje rozwiązanie mnie uratowało.
Gauthier