souligner l'erreur actuelle dans la fenêtre * compilation *

12

Lors de l'exécution de la commande de compilation et du passage à la `` prochaine erreur '', emacs identifie la ligne de l'erreur actuelle en plaçant un petit triangle noir, pointant vers la droite, dans la frange gauche du tampon * compilation * . C'est bien, mais mes vieux yeux aimeraient un indicateur plus audacieux. Le but fondamental ici est de pouvoir identifier visuellement rapidement quelle ligne emacs identifie comme l'erreur de compilation actuelle. Quelques solutions qui me viennent à l'esprit:

  1. un visage différent pour l'erreur actuelle (plus gros par exemple).
  2. une couleur d'arrière-plan différente pour l'erreur actuelle (quelque chose comme hl-line-mode).
  3. un plus grand triangle.

mais je suis ouvert à d'autres idées aussi.

Est-ce que quelqu'un peut m'aider?

Spacemoose
la source

Réponses:

2

Je voulais réaliser la même chose car il était souvent difficile de trouver le message d'erreur actuel dans le tampon de compilation. Cette solution est basée sur la suggestion de Drew d'utiliser un next-error-hookpour mettre en surbrillance le message d'erreur. Actuellement, cela ne met en évidence que la première ligne du message d'erreur, mais je trouve que c'est assez bon.

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

Usage:

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

Démo:

démo

erjoalgo
la source
1

Voici un exemple de modification de l'image bitmap qui apparaît dans la frange gauche du *compilation*tampon (par exemple, le *grep*tampon de résultats):

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

Voici un exemple de définition des couleurs des bitmaps de franges:

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

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

Voici un exemple de création de votre propre bitmap de frange:

;; 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)
liste des lois
la source
Cela semble très prometteur. Je vais l'essayer demain (en me couchant ici).
Spacemoose
1

Ne fait pas next-errordéfiler le tampon des erreurs de compilation, de sorte que l'erreur actuelle s'affiche comme la première ligne de la fenêtre?

Sinon, ne place-t-il pas au moins le curseur sur la ligne d'erreur actuelle? Si c'est le cas, et si le curseur n'est pas suffisamment visible pour vous, pensez à utiliser hl-line-modepour mettre en surbrillance la ligne actuelle. Ou envisagez d'utiliser la bibliothèque crosshairspour mettre en surbrillance la ligne et la colonne actuelles.


Mettre à jour après votre commentaire

Je pensais que tu invoquais next-errordans le tampon *compilation*. Si vous faites cela, la ligne défile vers le haut, comme je l'ai décrit.

Mais si vous invoquez un next-errortampon extérieur, *compilation*vous devez utiliser next-error-hookpour, dans le tampon*compilation* , mettre en surbrillance la ligne ou la frange actuelle ou autre, comme vous le souhaitez.

Voici un exemple rapide et sale:

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

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

(Bien sûr, vous n'avez vraiment besoin d'activer hl-line-modequ'une seule fois dans ce tampon. Le faire comme indiqué ci-dessus est exagéré, mais cela ne fait pas de mal. Vous pourriez penser que vous pouvez simplement ajouter fooà grep-mode-hookou compilation-mode-hook. Mais lorsque ces crochets sont invoqués, il y a non next-error-last-buffer.)

Remarque:

  1. Il existe deux options utilisateur qui contrôlent les façons d'indiquer le hit dans le tampon source (et non dans le tampon de compilation): next-error-highlightet next-error-highlight-no-select. Ils offrent les mêmes possibilités, mais ils sont utilisés par différentes commandes. Les possibilités incluent l'utilisation d'une flèche à franges ou la mise en évidence du match pendant un certain temps.

  2. Mais il n'y a pas une telle option contrôlant l'indication du hit actuel dans le tampon *compilation*. Emacs propose donc deux options (où une serait probablement suffisante) pour le tampon source mais aucune option pour le tampon de compilation.

Vous pourriez envisager de déposer une demande d'amélioration, pour obtenir une option similaire pour la compilation (y compris grep) tampon: M-x report-emacs-bug. L'utilisation d'un crochet avec votre propre fonction pour effectuer la mise en évidence est OK, mais cela ne devrait pas être nécessaire.


Et si vous voulez simplement changer l'indicateur de frange, vous pouvez le faire (utilisez le bitmap de frange que vous voulez, au lieu de filled-rectangle- voir (elisp) Fringe Bitmaps pour une liste des prédéfinis):

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

Mise à jour # 2:

Je viens de découvrir que si vous désactivez l'affichage de la frange gauche, vous verrez le comportement que j'ai décrit au début: la fenêtre défile pour mettre l'erreur actuelle en haut. Voilà donc une autre possibilité. (C'est le comportement que je vois dans ma configuration, car je ne montre pas de franges.)

Il y a un bug dans ce comportement, que je viens de signaler ( # 20829 ). Ce qui compte (actuellement, jusqu'à ce que le bug soit corrigé) est de savoir si la frange gauche apparaît dans la fenêtre sélectionnée lorsque vous le faites C-x `( next-error). Il ne suffit (actuellement) pas que la fenêtre affichant le tampon de compilation ne montre pas la frange gauche.

A dessiné
la source
Le défilement du tampon de compilation semble fonctionner comme le reste d'emacs - lorsque le «point» (dans le cas du tampon de compilation, l'erreur actuelle) dépasse un certain point, l'écran défile. pour un grand écran de données, cela crée une erreur difficile à trouver. Le comportement de hl-line-mode serait génial, mais il ne fait que mettre en surbrillance le tampon actuel (puis-je remplacer cela?) - donc la ligne de code où l'erreur se produit est mise en surbrillance, mais les données d'erreur ne le sont pas. réticule semble faire la même chose avec la colonne et la ligne, dont je n'ai pas besoin.
Spacemoose
Toujours pas clair, du moins pour moi. Pour moi, next-errorplace la ligne d'erreur actuelle sur la ligne supérieure de la fenêtre du tampon *compilation*. Il y en a bien sûr global-hl-line-mode, mais votre plainte / question concernait le *compilation*tampon. La question devient moins claire, pas plus (à mon humble avis).
Drew
Lorsque vous compilez dans emacs avec des erreurs, exécutez next-error. Dans le tampon source, votre curseur sera à la source de l'erreur, et il y a un petit triangle noir indiquant le message d'erreur de compilation actuel dans le tampon de compilation . L'erreur actuelle n'est généralement pas la ligne la plus haute du tampon (je viens de faire l'expérience en 24.5.1). Je trouve qu'il est visuellement difficile de rechercher le triangle noir. hl-line-mode met uniquement en surbrillance la ligne du tampon actif , qui est le tampon source. Je ne veux pas sauter au tampon de compilation juste pour trouver la ligne.
Spacemoose
Je pensais que vous invoquiez l'erreur suivante dans le tampon *compilation*. Sinon, vous devez mettre une fonction next-error-hookpour faire la mise en évidence (ou autre) dans le tampon*compilation* . J'ai mis à jour la réponse avec un exemple.
Drew
Votre exemple rapide et sale répond au point 2 d'OP, qui est exactement ce que je cherchais. Le tampon de compilation défilant pour que la ligne active soit en haut (ce qui n'est valable que si les franges gauches sont de taille 0) m'a fait perdre le contexte (car les lignes au-dessus de l'erreur sont significatives), j'ai donc dû définir compilation-context-lines. Par conséquent, l'erreur actuellement sélectionnée était difficile à trouver. Votre solution m'a sauvé.
Gauthier