*コンパイル*ウィンドウで現在のエラーを強調する


12

コンパイルコマンドを実行して「次のエラー」にジャンプするとき、emacsは* compilation *バッファーの左側の縁に右向きの小さな黒い三角形を配置することにより、現在のエラーの行を識別します。これはいいですが、私の古い目はより大胆な指標を望んでいます。ここでの基本的な目標は、emacsが現在のコンパイラエラーとして識別している行を視覚的にすばやく識別できるようにすることです。頭に浮かぶいくつかの解決策:

  1. 現在のエラーの別の面(たとえば、より大きい)。
  2. 現在のエラーの別の背景色(hl-line-modeなど)。
  3. より大きな三角形。

しかし、私は他のアイデアにもオープンです。

誰かが私を助けてくれますか?

回答:


2

コンパイルバッファーで現在のエラーメッセージを見つけるのは面倒だったので、私は同じことを実現したかったのです。このソリューションはnext-error-hook、エラーメッセージを強調するためにを使用するという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現在のエラーがウィンドウの最初の行として表示されるように、compilation-errorsバッファーをスクロールしませんか?

そうでなければ、少なくとも現在のエラー行にカーソルを置いていませんか?表示され、カーソルが十分に見えない場合は、を使用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-hookcompilation-mode-hooknext-error-last-buffer

注意:

  1. そこヒットを示すための方法を制御する2つのユーザーオプションあるソースバッファ内(ないコンパイルバッファでは):next-error-highlightnext-error-highlight-no-select。それらは同じ可能性を提供しますが、異なるコマンドで使用されます。可能性としては、フリンジ矢印を使用したり、一致を特定の時間ハイライトしたりすることが挙げられます。

  2. しかし、バッファ内の現在のヒットの表示を制御するそのようなオプションはありません*compilation*。したがって、Emacsはソースバッファーに2つのオプション(おそらく1つで十分です)を提供しますが、コンパイルバッファーにはオプションを提供しません。

コンパイル(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)。
ドリュー

エラーのあるemacsでコンパイルする場合は、next-errorを実行します。ソースバッファーでは、カーソルがエラーのソースにあり、コンパイルバッファー内の現在のコンパイラエラーメッセージを示す小さな黒い三角形があります。現在のエラーは通常、バッファーの一番上の行ではありません(24.5.1で実験を行ったところです)。黒い三角形を探すのは視覚的に大変だと思います。hl-line-mode は、ソースバッファーであるアクティブバッファーの行のみを強調表示します。行を見つけるためだけにコンパイルバッファにジャンプしたくありません。
Spacemoose 2015年

バッファで次のエラーを呼び出していると思いました*compilation*。そうでない場合は、あなたは上の機能を配置する必要がありnext-error-hookハイライト(または何でも)を行うためにバッファに*compilation*。例を挙げて回答を更新しました。
ドリュー

あなたの素早い汚い例は、OPのポイント2に答えるものです。アクティブな行が上になるようにコンパイルバッファーをスクロールすると(左フリンジのサイズが0の場合にのみ有効)、コンテキストが失われるため(エラーより上の行は意味があるため)、を設定する必要がありましたcompilation-context-lines。その結果、現在選択されているエラーを見つけるのは困難でした。あなたの解決策は私を救った。
Gauthier 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.