* compilation * 창에서 현재 오류를 강조


12

컴파일 명령을 실행하고 '다음 오류'로 건너 뛸 때, emacs는 * compilation * 버퍼 의 왼쪽 프린지에 오른쪽을 가리키는 작은 검은 색 삼각형을 배치하여 현재 오류의 행을 식별합니다 . 이것은 좋지만 내 오래된 눈은 더 대담한 지표를 원합니다. 여기서 기본적인 목표는 현재 컴파일러 오류로 식별되는 라인 이맥스를 시각적으로 빠르게 식별 할 수 있도록하는 것입니다. 떠오르는 몇 가지 솔루션 :

  1. 현재 오류의 다른면 (예 : 더 큼).
  2. 현재 오류에 대한 다른 배경색 (hl-line-mode와 같은 것).
  3. 더 큰 삼각형.

하지만 다른 아이디어에도 열려 있습니다.

누군가 나를 도울 수 있습니까?

답변:


2

컴파일 버퍼에서 현재 오류 메시지를 찾는 것이 종종 고통스러운 것과 동일한 것을 달성하고 싶었습니다. 이 솔루션은 next-error-hook오류 메시지를 강조 표시 하기 위해 a 를 사용하는 Drew의 제안을 기반으로 합니다. 현재 오류 메시지의 첫 번째 줄만 강조 표시하지만 충분하다고 생각합니다.

(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위 잔인한로 수행. 그 버퍼에 한 번,하지만 다치게하지 않습니다. 당신은 방금 추가 할 수 있다는 생각 foogrep-mode-hookcompilation-mode-hook.하지만 그 후크가 호출되는 경우가있다 아니요 next-error-last-buffer.)

노트 :

  1. 컴파일 버퍼가 아닌 소스 버퍼에서 적중을 표시하는 방법을 제어하는 ​​두 가지 사용자 옵션이 있습니다 : next-error-highlightnext-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-mode의 동작은 훌륭하지만 현재 버퍼 만 강조 표시합니다 (이를 무시할 수 있습니까?). 따라서 오류가 발생한 코드 줄이 강조 표시되지만 오류 데이터는 표시되지 않습니다. 십자선은 열과 선으로 같은 일을하는 것처럼 보입니다. 필요하지 않습니다.
Spacemoose

적어도 나에게는 여전히 불분명하다. 나를 next-error위해 현재 오류 줄을 buffer 창 상단 줄에 넣습니다 *compilation*. 물론 있습니다 만 global-hl-line-mode, 귀하의 불만 / 질문은 *compilation*버퍼 에 관한 것 입니다. 문제는 덜 명확 해지지 만 더 이상은 아닙니다 (IMHO).
Drew

오류가있는 emacs에서 컴파일 할 때 다음 오류를 실행하십시오. 소스 버퍼에서 커서는 오류의 소스에 있으며 컴파일 버퍼 의 현재 컴파일러 오류 메시지를 나타내는 작은 검은 색 삼각형이 있습니다. 현재 오류는 일반적으로 버퍼의 최상위 줄 이 아닙니다 (24.5.1에서 실험을 마쳤습니다). 나는 검은 삼각형을 찾는 것이 시각적으로 과제임을 알게되었습니다. hl-line-mode 는 소스 버퍼 인 활성 버퍼 의 라인 만 강조 표시합니다 . 라인을 찾기 위해 컴파일 버퍼로 점프하고 싶지 않습니다.
Spacemoose

buffer에서 next-error를 호출한다고 생각했습니다 *compilation*. 그렇지 않으면 buffer에서next-error-hook 강조 표시 (또는 무엇이든)를 수행 하는 기능을 켜야*compilation* 합니다. 예를 들어 답변을 업데이트했습니다.
Drew

빠르고 더러운 예제는 OP의 포인트 2에 답합니다. 활성 버퍼가 맨 위에 오도록 컴파일 버퍼를 스크롤합니다 (왼쪽 프린지 크기가 0 인 경우에만 유효합니다) compilation-context-lines. 결과적으로 현재 선택된 오류를 찾기가 어려웠습니다. 당신의 솔루션은 저를 구했습니다.
Gauthier
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.