เน้นข้อผิดพลาดปัจจุบันในหน้าต่าง * การรวบรวม *


12

เมื่อรันคำสั่งการคอมไพล์และข้ามไปที่ 'ข้อผิดพลาดถัดไป' emacs จะระบุบรรทัดของข้อผิดพลาดปัจจุบันโดยการวางสามเหลี่ยมสีดำเล็ก ๆ ชี้ไปทางขวาในขอบด้านซ้ายของบัฟเฟอร์การคอมไพล์ * นี่เป็นสิ่งที่ดี แต่ดวงตาเก่าของฉันต้องการตัวบ่งชี้ที่โดดเด่นยิ่งขึ้น เป้าหมายพื้นฐานที่นี่คือสามารถระบุด้วยสายตาว่า emacs บรรทัดใดที่ระบุว่าเป็นข้อผิดพลาดของคอมไพเลอร์ในปัจจุบัน วิธีแก้ปัญหาบางอย่างที่อยู่ในใจ:

  1. ใบหน้าที่แตกต่างกันสำหรับข้อผิดพลาดปัจจุบัน (ใหญ่กว่าตัวอย่าง)
  2. สีพื้นหลังที่แตกต่างกันสำหรับข้อผิดพลาดปัจจุบัน (บางอย่างเช่นโหมด hl-line)
  3. สามเหลี่ยมที่ใหญ่กว่า

แต่ฉันก็เปิดรับความคิดอื่น ๆ ด้วย

มีคนช่วยฉันได้ไหม

คำตอบ:


2

ฉันต้องการบรรลุสิ่งเดียวกันเนื่องจากบ่อยครั้งที่เจ็บปวดในการค้นหาข้อความแสดงข้อผิดพลาดในบัฟเฟอร์การรวบรวม วิธีนี้เป็นไปตามข้อเสนอแนะของ Drew เพื่อใช้next-error-hookเพื่อเน้นข้อความแสดงข้อผิดพลาด ขณะนี้มันเน้นเฉพาะบรรทัดแรกในข้อความแสดงข้อผิดพลาด แต่ฉันพบว่านี่ดีพอ

(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นอก buffer *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ครั้งเดียวในบัฟเฟอร์ที่. ทำมันที่แสดงข้างต้นเป็น overkill แต่มันไม่เจ็บ. คุณอาจจะคิดว่าคุณก็สามารถเพิ่มfooการgrep-mode-hookหรือcompilation-mode-hook. แต่เมื่อตะขอเหล่านั้นจะถูกเรียกมี ไม่next-error-last-buffer)

บันทึก:

  1. มีสองตัวเลือกของผู้ใช้ที่มีการควบคุมวิธีการที่จะบ่งชี้ถึงการตีที่มีในบัฟเฟอร์แหล่งที่มา (ไม่ได้อยู่ในบัฟเฟอร์รวบรวม) และnext-error-highlight next-error-highlight-no-selectพวกมันมีความเป็นไปได้เหมือนกัน แต่ถูกใช้โดยคำสั่งต่าง ๆ ความเป็นไปได้รวมถึงการใช้ลูกศรขอบหรือเน้นการแข่งขันในช่วงเวลาหนึ่ง

  2. *compilation*แต่ไม่มีตัวเลือกดังกล่าวบ่งชี้ของการควบคุมการตีปัจจุบันในบัฟเฟอร์ ดังนั้น Emacs เสนอสองตัวเลือก (ที่หนึ่งอาจจะเพียงพอ) สำหรับบัฟเฟอร์แหล่งที่มา แต่ไม่มีตัวเลือกสำหรับการรวบรวมบัฟเฟอร์

คุณอาจพิจารณาการยื่นคำขอเพิ่มประสิทธิภาพเพื่อให้ได้ตัวเลือกที่คล้ายกันสำหรับการรวบรวม (รวม grep) M-x report-emacs-bugบัฟเฟอร์: การใช้เบ็ดกับฟังก์ชั่นของคุณเองเพื่อทำการไฮไลต์ก็โอเค แต่ก็ไม่จำเป็น


และถ้าคุณเพียงต้องการที่จะเปลี่ยนแปลงตัวบ่งชี้ที่ขอบคุณสามารถทำเช่นนี้ (ใช้สิ่งที่ขอบบิตแมปที่คุณต้องการแทนfilled-rectangle- ดู (Elisp) Fringe บิตแมปสำหรับรายการที่กำหนดไว้ล่วงหน้าได้):

(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 *compilation*มีแน่นอนglobal-hl-line-modeแต่การร้องเรียน / คำถามของคุณเกี่ยวกับ*compilation*บัฟเฟอร์ คำถามมีความชัดเจนน้อยลงไม่ใช่มากขึ้น (IMHO)
ดึง

เมื่อคุณคอมไพล์ใน emacs ที่มีข้อผิดพลาดให้เรียกใช้งานข้อผิดพลาดถัดไป ในแหล่งที่มา buffer เคอร์เซอร์ของคุณจะเป็นที่มาของข้อผิดพลาดและมีสามเหลี่ยมสีดำขนาดเล็กชี้ไปที่คอมไพเลอร์ข้อผิดพลาดข้อความในปัจจุบันในการรวบรวมบัฟเฟอร์ ข้อผิดพลาดในปัจจุบันไม่ใช่เส้นบนสุดของบัฟเฟอร์ (ฉันเพิ่งทำการทดลองใน 24.5.1) ฉันเห็นว่ามอบหมายให้มองหาสามเหลี่ยมสีดำ hl-line-mode เน้นเฉพาะบรรทัดของบัฟเฟอร์ที่ใช้งานอยู่ซึ่งเป็นบัฟเฟอร์ต้นทาง ฉันไม่ต้องการข้ามไปยังบัฟเฟอร์รวบรวมเพื่อค้นหาบรรทัด
Spacemoose

*compilation*ฉันคิดว่าคุณได้รับการกล่าวอ้างต่อไปข้อผิดพลาดในบัฟเฟอร์ ถ้าไม่ได้แล้วคุณจะต้องใส่ฟังก์ชั่นในการnext-error-hookที่จะทำไฮไลต์ (หรืออะไรก็ตาม) ในบัฟเฟอร์ *compilation*ฉันอัพเดตคำตอบด้วยตัวอย่าง
Drew

ตัวอย่างรวดเร็วและสกปรกของคุณตอบจุดที่ 2 ของ OP ซึ่งเป็นสิ่งที่ฉันกำลังมองหา รวบรวมบัฟเฟอร์เลื่อนเพื่อให้โฆษณาที่ใช้งานอยู่ด้านบน (ซึ่งเป็นที่ถูกต้องถ้าขอบซ้ายมีขนาด 0) ทำให้ผมสูญเสียบริบท (ตั้งแต่บรรทัดข้างต้นข้อผิดพลาดที่มีความหมาย) compilation-context-linesเพื่อให้ฉันได้ชุด ดังนั้นข้อผิดพลาดที่เลือกในปัจจุบันจึงหายาก ทางออกของคุณช่วยฉัน
Gauthier
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.