menekankan kesalahan saat ini di jendela * kompilasi *


12

Saat menjalankan perintah kompilasi dan melompat ke 'kesalahan berikutnya', emacs mengidentifikasi garis kesalahan saat ini dengan menempatkan segitiga hitam kecil, menunjuk ke kanan, di pinggiran kiri buffer * compilation * . Ini bagus, tetapi mata lama saya ingin indikator yang lebih berani. Tujuan mendasar di sini adalah untuk dapat dengan cepat mengidentifikasi secara visual baris mana yang diidentifikasi sebagai kesalahan kompilator saat ini. Beberapa solusi yang muncul di pikiran:

  1. wajah yang berbeda untuk kesalahan saat ini (lebih besar misalnya).
  2. warna latar belakang yang berbeda untuk kesalahan saat ini (sesuatu seperti hl-line-mode).
  3. segitiga yang lebih besar.

tapi saya juga terbuka untuk ide-ide lain.

Adakah yang bisa membantu saya?

Jawaban:


2

Saya ingin mencapai hal yang sama karena seringkali menyakitkan untuk menemukan pesan kesalahan saat ini di buffer kompilasi. Solusi ini didasarkan pada saran Drew untuk menggunakan next-error-hookuntuk menyoroti pesan kesalahan. Saat ini hanya menyoroti baris pertama dalam pesan kesalahan, tetapi saya menemukan ini cukup baik.

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

Pemakaian:

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

Demo:

demo


1

Berikut adalah contoh cara memodifikasi gambar bitmap yang muncul di pinggiran kiri *compilation*buffer (mis. *grep*Buffer hasil):

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

Berikut adalah contoh cara mengatur warna bitmap pinggiran:

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

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

Berikut adalah contoh cara membuat bitmap fringe Anda sendiri:

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

Ini terlihat sangat menjanjikan. Saya akan mencobanya besok (tidur di sini).
Spacemoose

1

Tidak next-errormenggulir buffer kompilasi-kesalahan, sehingga kesalahan saat ini ditampilkan sebagai baris pertama jendela?

Jika tidak, bukankah itu setidaknya menempatkan kursor pada baris kesalahan saat ini? Jika ya, dan jika kursor tidak cukup terlihat untuk Anda, coba gunakan hl-line-modeuntuk menyorot garis saat ini. Atau pertimbangkan untuk menggunakan perpustakaan crosshairsuntuk menyorot baris saat ini dan kolom saat ini.


Perbarui setelah komentar Anda

Saya pikir Anda meminta next-errorbuffer *compilation*. Jika Anda melakukan itu, maka baris akan digulir ke atas, seperti yang saya jelaskan.

Tetapi jika Anda menggunakan next-errorbuffer luar *compilation*maka Anda perlu menggunakan next-error-hook, dalam buffer*compilation* , menyorot garis saat ini atau pinggiran atau apa pun, dengan cara apa pun yang Anda suka.

Ini adalah contoh cepat dan kotor:

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

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

(Tentu saja, Anda benar-benar hanya perlu mengaktifkan hl-line-modesekali dalam buffer yang. Melakukan hal itu seperti yang ditunjukkan di atas adalah berlebihan, tapi tidak ada salahnya. Anda mungkin berpikir bahwa Anda hanya bisa menambahkan foountuk grep-mode-hookatau compilation-mode-hook. Tapi ketika mereka kait dipanggil ada tidak next-error-last-buffer.)

catatan:

  1. Ada dua opsi pengguna yang mengontrol cara untuk menunjukkan klik di buffer sumber (bukan di buffer kompilasi): next-error-highlightdan next-error-highlight-no-select. Mereka menawarkan kemungkinan yang sama, tetapi mereka digunakan oleh perintah yang berbeda. Kemungkinannya termasuk menggunakan panah pinggiran atau menyoroti pertandingan untuk waktu tertentu.

  2. Tetapi tidak ada opsi untuk mengendalikan indikasi hit saat ini dalam buffer *compilation*. Jadi Emacs menawarkan dua opsi (di mana satu mungkin akan cukup) untuk buffer sumber tetapi tidak ada opsi untuk buffer kompilasi.

Anda mungkin mempertimbangkan pengajuan permintaan tambahan, untuk mendapatkan pilihan yang sama untuk kompilasi (termasuk grep) penyangga: M-x report-emacs-bug. Menggunakan kait dengan fungsi Anda sendiri untuk melakukan penyorotan adalah OK, tetapi seharusnya tidak perlu.


Dan jika Anda hanya ingin mengubah indikator pinggiran, Anda dapat melakukan ini (gunakan bitmap pinggiran apa pun yang Anda inginkan, alih-alih filled-rectangle- lihat (elisp) Fringe Bitmaps untuk daftar yang sudah ditentukan sebelumnya):

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

Perbarui # 2:

Saya baru saja menemukan bahwa jika Anda mematikan menampilkan pinggiran kiri maka Anda akan melihat perilaku yang saya jelaskan di awal: jendela digulir untuk menempatkan kesalahan saat ini di bagian atas. Jadi itu kemungkinan lain. (Ini adalah perilaku yang saya lihat di pengaturan saya, karena saya tidak menunjukkan pinggiran.)

Ada bug dalam perilaku ini, yang baru saja saya laporkan ( # 20829 ). Yang penting (saat ini, sampai bug diperbaiki) adalah apakah pinggiran kiri ditampilkan di jendela yang dipilih saat Anda melakukannya C-x `( next-error). Ini (saat ini) tidak cukup bahwa jendela yang menunjukkan buffer kompilasi tidak menunjukkan pinggiran kiri.


Pengguliran buffer kompilasi tampaknya berfungsi seperti sisa emacs - ketika 'point' (dalam hal buffer kompilasi, kesalahan saat ini) bergerak melewati titik tertentu, layar akan bergulir. untuk layar besar data, ini membuat sulit untuk menemukan kesalahan. Perilaku hl-line-mode akan menjadi besar, tetapi hanya menyoroti buffer saat ini (dapatkah saya mengesampingkan ini?) - jadi baris kode tempat kesalahan terjadi disorot, tetapi ada data kesalahan tidak. garis bidik tampaknya melakukan hal yang sama dengan kolom dan garis, yang saya tidak perlu.
Spacemoose

Masih belum jelas, setidaknya bagi saya. Bagi saya, next-errorletakkan garis kesalahan saat ini di baris atas jendela untuk buffer *compilation*. Tentu saja ada global-hl-line-mode, tetapi keluhan / pertanyaan Anda seharusnya tentang *compilation*buffer. Pertanyaannya semakin tidak jelas, tidak lebih (IMHO).
Drew

Ketika Anda mengkompilasi di emacs dengan kesalahan, jalankan kesalahan berikutnya. Di buffer sumber, kursor Anda akan berada di sumber kesalahan, dan ada segitiga hitam kecil yang menunjukkan pesan kesalahan-kompiler saat ini di buffer kompilasi . Kesalahan saat ini umumnya bukan garis paling atas dari buffer (saya baru saja melakukan percobaan di 24.5.1). Saya menemukan tugas secara visual untuk mencari segitiga hitam. mode hl-line-mode hanya menyorot garis buffer aktif , yang merupakan buffer sumber. Saya tidak ingin melompat ke buffer kompilasi hanya untuk menemukan garis.
Spacemoose

Saya pikir Anda meminta kesalahan berikutnya dalam buffer *compilation*. Jika tidak, maka Anda perlu mengaktifkan fungsi next-error-hookuntuk melakukan penyorotan (atau apa pun) di buffer*compilation* . Saya memperbarui jawabannya dengan sebuah contoh.
Drew

Contoh cepat dan kotor Anda menjawab poin 2 OP, yang persis seperti yang saya cari. Pengguliran buffer kompilasi sehingga garis aktif di atas (yang hanya valid jika fring kiri berukuran 0) membuat saya kehilangan konteks (karena garis di atas kesalahan bermakna), jadi saya harus mengatur compilation-context-lines. Akibatnya, kesalahan yang dipilih saat ini sulit ditemukan. Solusi Anda menyelamatkan saya.
Gauthier
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.