* derleme * penceresindeki geçerli hatayı vurgulama


12

Derleme komutunu çalıştırıp 'sonraki hataya' atlarken emacs, * derleme * arabelleğinin sol kenarına sağa bakacak şekilde küçük bir siyah üçgen yerleştirerek mevcut hatanın çizgisini tanımlar . Bu güzel, ama yaşlı gözlerim daha cesur bir gösterge istiyor. Buradaki temel amaç, hangi satır emaklarının geçerli derleyici hatası olarak tanımlandığını hızla görsel olarak tanımlayabilmektir. Akla gelen bazı çözümler:

  1. geçerli hata için farklı bir yüz (örneğin daha büyük).
  2. geçerli hata için farklı bir arka plan rengi (hl-line-mode gibi bir şey).
  3. daha büyük bir üçgen.

ama ben başka fikirlere de açığım.

Birisi bana yardım edebilir mi?

Yanıtlar:


2

Derleme arabelleğinde geçerli hata mesajını bulmak genellikle acı verici olduğu gibi aynı şeyi elde etmek istedim. Bu çözüm, Drew'un next-error-hookhata mesajını vurgulamak için a kullanma önerisine dayanmaktadır . Şu anda sadece hata mesajındaki ilk satırı vurgular, ancak bunun yeterince iyi olduğunu düşünüyorum.

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

Kullanımı:

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

Demo:

gösteri


1

*compilation*Tamponun sol tarafında (örneğin, *grep*sonuç arabelleği) görünen bitmap görüntüsünün nasıl değiştirileceğine ilişkin bir örnek :

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

Saçak bitmaplerinin renklerinin nasıl ayarlanacağına dair bir örnek:

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

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

İşte kendi saçak bitmap'inizi nasıl oluşturacağınıza dair bir örnek:

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

Bu çok umut verici görünüyor. Yarın deneyeceğim (burada yatmadan).
Spacemoose

1

Does not next-errorderleme-hatalar tampon ilerleyin, böylece pencerenin ilk satırı olarak geçerli hata gösterileri mı?

Değilse, en azından imleci geçerli hata satırına koymaz mı? Görünüyorsa ve imleç sizin için yeterince görünmüyorsa hl-line-mode, geçerli satırı vurgulamak için kullanmayı düşünün . Veya crosshairsgeçerli satırı ve geçerli sütunu vurgulamak için kitaplık kullanmayı düşünün .


Yorumunuzdan sonra güncelleyin

next-errorArabelleğe çağırdığını sanıyordum *compilation*. Bunu yaparsanız, açıkladığım gibi çizgi en üste kaydırılır.

Eğer yürütmesini Ama eğer next-errortampon dışında *compilation*kullanmak gerekir sonra next-error-hook, hiç tampon içerisinde*compilation* , sizin gibi ne olursa olsun bir şekilde geçerli satırı veya saçak ya da her türlü, vurgulayın.

İşte hızlı ve kirli bir örnek:

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

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

(Elbette, eğer gerçekten sadece açmak gerek hl-line-modeyukarıda gösterilen overkill gibi yapmak. O tamponunda bir kez, ancak zarar vermez. Sen sadece genel düşünebilir fooiçin grep-mode-hookya compilation-mode-hook. Ama bu kancalar çağrıldığında orada hayır next-error-last-buffer.)

Not:

  1. Kaynak arabellekteki (derleme arabellekte değil) isabetin gösterilme yollarını kontrol eden iki kullanıcı seçeneği vardır : next-error-highlightve next-error-highlight-no-select. Aynı olasılıkları sunarlar, ancak farklı komutlar tarafından kullanılırlar. Olasılıklar arasında bir saçak oku kullanılması veya belirli bir süre için maçın vurgulanması yer alır.

  2. Ancak tampondaki mevcut isabetin göstergesini kontrol eden böyle bir seçenek yoktur *compilation*. Bu nedenle Emacs, kaynak arabelleği için iki seçenek (muhtemelen yeterli olacaktır) sunar, ancak derleme arabelleği için seçenek yoktur.

Sen tampon (grep dahil) derleme için benzer bir seçeneği almak için, bir geliştirme isteğini doldurmak düşünebilirsiniz: M-x report-emacs-bug. Vurgulamayı gerçekleştirmek için kendi işlevinizle bir kanca kullanmak tamamdır, ancak gerekli olmamalıdır.


Ve sadece saçak göstergesini değiştirmek istiyorsanız, bunu yapabilirsiniz (yerine istediğiniz saçak bitmapini kullanın filled-rectangle- önceden tanımlanmış olanların bir listesi için bkz. (Elisp) Saçak Bitmapleri ):

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

Güncelleme # 2:

Sadece sol saçak göstermeyi kapatırsanız, başlangıçta tarif ettiğim davranışı göreceğinizi keşfettim: mevcut hatayı en üste koymak için pencere kaydırılır. Yani bu başka bir olasılık. (Saçak göstermediğim için kurulumumda gördüğüm davranış.)

Bu davranışta, sadece bildirdiğim bir hata var ( # 20829 ). Önemli olan (şu anda, hata düzeltilene kadar), C-x `( next-error) yaptığınızda sol saçağın seçilen pencerede görünüp görünmediğidir . Derleme arabelleğini gösteren pencerenin sol saçak göstermemesi (şu anda) yeterli değildir.


Derleme arabelleğinin kaydırılması emacs'ın geri kalanı gibi çalışır - 'nokta' (derleme arabelleği durumunda, geçerli hata) belirli bir noktayı geçtiğinde, ekran kayar. büyük bir veri ekranı için bu, bulmak zor bir hata yapar. Hl-line-mode davranışı harika olurdu, ancak sadece geçerli arabelleği vurgular (bunu geçersiz kılabilir miyim?) - böylece hatanın oluştuğu kod satırı vurgulanır, ancak hata verileri yoktur. crosshairs, sütun ve çizgi ile aynı şeyi biraz yapıyor gibi görünüyor, buna ihtiyacım yok.
Spacemoose

En azından benim için hala belirsiz. Benim için, next-errorgeçerli hata satırını arabellek için pencerenin üst satırına yerleştirir *compilation*. Tabii ki global-hl-line-mode, ama şikayet / soru sözde *compilation*tampon hakkındaydı. Soru daha az netleşiyor, daha fazla değil (IMHO).
Drew

Hatalı emac'larda derlediğinizde sonraki hatayı yürütün. Kaynak arabelleğinde imleciniz hatanın kaynağında olacaktır ve derleme arabelleğinde geçerli derleyici hata mesajını gösteren küçük siyah üçgen vardır . Şu anki hata genellikle tamponun en üst çizgisi değildir (24.5.1'de deneyi yeni yaptım). Siyah üçgeni aramak için görsel olarak görevli buluyorum. hl-line-mode sadece kaynak arabellek olan aktif arabellek satırını vurgular . Sadece hattı bulmak için derleme arabelleğine atlamak istemiyorum.
Spacemoose

Arabellekte bir sonraki hatayı çağırdığınızı sanıyordum *compilation*. Değilse , arabellektekinext-error-hook vurgulamayı (veya herhangi bir şeyi) yapmak için bir işlev eklemeniz gerekir*compilation* . Cevabı bir örnekle güncelledim.
Drew

Hızlı ve kirli örneğiniz OP'nin 2. noktasına cevap veriyor, tam da aradığım şey bu. Derleme arabellek etkin satır üstte olacak şekilde kaydırma (sadece sol saçaklar 0 boyutu ise geçerlidir) beni bağlamı kaybetti (hata üstündeki satırlar anlamlı olduğundan), ben ayarlamak zorunda kaldı compilation-context-lines. Sonuç olarak, seçili olan hatayı bulmak zordu. Çözümün beni kurtardı.
Gauthier
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.