enfatizar el error actual en la ventana * compilación *

12

Al ejecutar el comando de compilación y saltar al 'siguiente error', emacs identifica la línea del error actual colocando un pequeño triángulo negro, apuntando hacia la derecha, en la franja izquierda del búfer * compilación * . Esto es bueno, pero a mis viejos ojos les gustaría un indicador más audaz. El objetivo fundamental aquí es poder identificar rápidamente visualmente qué línea emacs está identificando como el error actual del compilador. Algunas soluciones que vienen a la mente:

  1. una cara diferente para el error actual (más grande, por ejemplo).
  2. un color de fondo diferente para el error actual (algo así como hl-line-mode).
  3. Un triángulo más grande.

pero también estoy abierto a otras ideas.

¿Alguien me puede ayudar?

Spacemoose
fuente

Respuestas:

2

Quería lograr lo mismo, ya que a menudo era doloroso encontrar el mensaje de error actual en el búfer de compilación. Esta solución se basa en la sugerencia de Drew de utilizar a next-error-hookpara resaltar el mensaje de error. Actualmente solo resalta la primera línea en el mensaje de error, pero creo que esto es lo suficientemente bueno.

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

Uso:

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

Manifestación:

manifestación

erjoalgo
fuente
1

Aquí hay un ejemplo de cómo modificar la imagen de mapa de bits que aparece en el margen izquierdo del *compilation*búfer (por ejemplo, el *grep*búfer de resultados):

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

Aquí hay un ejemplo de cómo configurar los colores de los mapas de bits marginales:

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

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

Aquí hay un ejemplo de cómo crear su propio mapa de bits marginal:

;; 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 de leyes
fuente
Esto se ve muy prometedor. Lo intentaré mañana (antes de acostarse aquí).
Spacemoose
1

¿No se next-errordesplaza el búfer de errores de compilación, de modo que el error actual aparece como la primera línea de la ventana?

Si no, ¿al menos no coloca el cursor en la línea de error actual? Si lo hace, y si el cursor no es lo suficientemente visible para usted, considere usar hl-line-modepara resaltar la línea actual. O considere usar la biblioteca crosshairspara resaltar la línea actual y la columna actual.


Actualiza después de tu comentario

Pensé que estabas invocando next-erroren buffer *compilation*. Si haces eso, entonces la línea se desplaza hacia arriba, como describí.

Pero si está invocando el next-errorbúfer externo, *compilation*entonces debe usar next-error-hookpara, en el búfer*compilation* , resaltar la línea actual o franja o lo que sea, de la manera que desee.

Aquí hay un ejemplo rápido y sucio:

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

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

(Por supuesto, sólo se necesita para encender hl-line-modeuna vez en ese búfer. Hacerlo como se muestra arriba es una exageración, pero no hace daño. Se podría pensar que usted podría añadir fooa grep-mode-hooko compilation-mode-hook. Pero cuando se invocan los ganchos hay no next-error-last-buffer)

Nota:

  1. Hay dos opciones de usuario que controlan las formas de indicar el golpe en el búfer de origen (no en el búfer de compilación): next-error-highlighty next-error-highlight-no-select. Ofrecen las mismas posibilidades, pero son utilizados por diferentes comandos. Las posibilidades incluyen el uso de una flecha de flecos o resaltar el partido por un tiempo determinado.

  2. Pero no existe tal opción que controle la indicación del golpe actual en el búfer *compilation*. Entonces, Emacs ofrece dos opciones (donde una probablemente sería suficiente) para el búfer de origen, pero ninguna opción para el búfer de compilación.

Se podría considerar la presentación de una solicitud de mejora, para obtener una opción similar para la compilación (incluyendo grep) Tampón: M-x report-emacs-bug. Está bien usar un gancho con su propia función para realizar el resaltado, pero no debería ser necesario.


Y si solo desea cambiar el indicador de margen, puede hacer esto (use el mapa de bits de margen que desee, en lugar de filled-rectangle- vea (elisp) Mapas de bits de margen para obtener una lista de los predefinidos):

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

Actualización n. ° 2:

Acabo de descubrir que si apagas mostrar la franja izquierda, verás el comportamiento que describí al principio: la ventana se desplaza para colocar el error actual en la parte superior. Entonces esa es otra posibilidad. (Es el comportamiento que veo en mi configuración, ya que no muestro flecos).

Hay un error en este comportamiento, que acabo de informar ( # 20829 ). Lo que cuenta (actualmente, hasta que se solucione el error) es si la franja izquierda se muestra en la ventana seleccionada cuando lo hace C-x `( next-error). (Actualmente) no es suficiente que la ventana que muestra el búfer de compilación no muestre el margen izquierdo.

Dibujó
fuente
El desplazamiento del búfer de compilación parece funcionar como el resto de emacs: cuando el 'punto' (en el caso del búfer de compilación, el error actual) se mueve más allá de cierto punto, la pantalla se desplaza. para una gran pantalla de datos, esto hace que sea un error difícil de encontrar. El comportamiento del modo hl-line-mode sería excelente, pero solo resalta el búfer actual (¿puedo anular esto?), Por lo que la línea de código donde se produce el error se resalta, pero no hay datos de error. El punto de mira parece hacer lo mismo con la columna y la línea, que no necesito.
Spacemoose
Todavía no está claro, al menos para mí. Para mí, next-errorcoloca la línea de error actual en la línea superior de la ventana para el búfer *compilation*. Por supuesto global-hl-line-mode, existe , pero su queja / pregunta supuestamente fue sobre el *compilation*búfer. La pregunta es cada vez menos clara, no más (en mi humilde opinión).
Dibujó
Cuando compila en emacs con errores, ejecute el siguiente error. En el búfer de origen, el cursor estará en el origen del error, y hay un pequeño triángulo negro que indica el mensaje de error del compilador actual en el búfer de compilación . El error actual no es generalmente la línea superior del búfer (acabo de hacer el experimento en 24.5.1). Encuentro visualmente la tarea de buscar el triángulo negro. hl-line-mode solo resalta la línea del búfer activo , que es el búfer de origen. No quiero saltar al búfer de compilación solo para encontrar la línea.
Spacemoose
Pensé que estabas invocando el siguiente error en el búfer *compilation*. Si no es así, debe activar una función next-error-hookpara resaltar (o lo que sea) en el búfer*compilation* . Actualicé la respuesta con un ejemplo.
Dibujó
Su ejemplo rápido y sucio responde al punto 2 de OP, que es exactamente lo que estaba buscando. El desplazamiento del búfer de compilación para que la línea activa esté en la parte superior (que solo es válida si las franjas izquierdas son de tamaño 0) me hizo perder el contexto (ya que las líneas sobre el error son significativas), así que tuve que configurarlo compilation-context-lines. Como resultado, el error seleccionado actualmente fue difícil de encontrar. Tu solución me salvó.
Gauthier