* संकलन * विंडो में वर्तमान त्रुटि पर जोर दें


12

संकलित कमांड चलाने और 'अगली त्रुटि' पर कूदने पर, emacs * संकलन * बफर के बाएँ हाथ के फ्रिंज में, थोड़ा इंगित करते हुए, थोड़ा काला त्रिकोण रखकर वर्तमान त्रुटि की रेखा को पहचानता है । यह अच्छा है, लेकिन मेरी बूढ़ी आँखें एक फ़ोल्डर संकेतक चाहेंगे। यहां मूल लक्ष्य यह है कि वर्तमान संकलक त्रुटि के रूप में पहचानने वाली रेखा को कौन सी रेखाएं पहचानती हैं। कुछ समाधान जो मन में आते हैं:

  1. वर्तमान त्रुटि के लिए एक अलग चेहरा (उदाहरण के लिए बड़ा)।
  2. वर्तमान त्रुटि के लिए एक अलग पृष्ठभूमि का रंग (एचएल-लाइन-मोड जैसा कुछ)।
  3. एक बड़ा त्रिकोण।

लेकिन मैं अन्य विचारों के लिए भी खुला हूँ।

क्या कोई मेरी मदद कर सकता है?

जवाबों:


2

मैं उसी चीज को हासिल करना चाहता था क्योंकि संकलन बफर में वर्तमान त्रुटि संदेश को खोजने के लिए अक्सर दर्दनाक था। यह समाधान ड्रू के सुझाव पर आधारित है 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)

यह बहुत ही आशाजनक लग रहा है। मैं कल इसे आजमाऊँगा (यहाँ पर सोते समय)।
स्पेसमोज़

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है कि बफर में एक बार के रूप में ऊपर दिखाए गए 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हैं ( पूर्वनिर्धारित लोगों की सूची के लिए फ्रिंज बिटमैप देखें - इसके बजाय - जो भी फ्रिंज बिटमैप चाहते हैं, उसका उपयोग करें):

(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) चयनित विंडो में दिखाई दे रही है । यह (वर्तमान में) पर्याप्त नहीं है कि संकलन बफ़र को दिखाने वाली विंडो बाईं फ्रिंज नहीं दिखाती है।


संकलन बफ़र की स्क्रॉलिंग शेष एमएसीएस की तरह काम करती है - जब 'बिंदु' (संकलन बफर के मामले में, वर्तमान त्रुटि) एक निश्चित बिंदु से आगे बढ़ता है, तो स्क्रीन स्क्रॉल करता है। डेटा की एक बड़ी स्क्रीन के लिए, यह त्रुटि खोजने के लिए कठिन बनाता है। Hl-line-mode का व्यवहार बहुत अच्छा होगा, लेकिन यह केवल वर्तमान बफ़र को हाइलाइट कर सकता है (क्या मैं इसे ओवरराइड कर सकता हूं?) - इसलिए कोड की लाइन जहां त्रुटि होती है, हाइलाइट किया गया है, लेकिन त्रुटि डेटा नहीं है। क्रॉसहेयर कॉलम और लाइन के साथ एक ही चीज़ को करने के लिए लगता है, जिसकी मुझे आवश्यकता नहीं है।
स्पेसमोसे

अभी भी अस्पष्ट है, मेरे लिए कम से कम। मेरे लिए, next-errorबफर के लिए विंडो के शीर्ष लाइन पर वर्तमान त्रुटि रेखा रखता है *compilation*। बेशक है global-hl-line-mode, लेकिन आपकी शिकायत / सवाल *compilation*बफर के बारे में थी । प्रश्न कम स्पष्ट हो रहा है, अधिक (IMHO) नहीं।
आकर्षित किया

जब आप त्रुटियों के साथ emacs में संकलित करते हैं, तो अगली-त्रुटि निष्पादित करें। स्रोत बफर में आपका कर्सर त्रुटि के स्रोत पर होगा, और संकलन बफर में वर्तमान संकलक-त्रुटि-संदेश का संकेत देने वाला छोटा काला त्रिकोण है । वर्तमान त्रुटि आम तौर पर बफर की सबसे ऊपरी पंक्ति नहीं है (मैंने सिर्फ 24.5.1 में प्रयोग किया है)। मुझे यह काला त्रिभुज देखने के लिए दृष्टिगोचर होता है। hl-line-mode केवल सक्रिय बफर की रेखा को उजागर करता है , जो स्रोत बफर है। मैं सिर्फ लाइन खोजने के लिए संकलन बफर में कूदना नहीं चाहता।
स्पेसमोसे

मुझे लगा कि आप अगली त्रुटि बफर में शामिल कर रहे हैं *compilation*। यदि नहीं, तो आपको बफ़रिंग मेंnext-error-hook हाइलाइटिंग (या जो भी) करने के लिए एक फ़ंक्शन डालना होगा । मैंने एक उदाहरण के साथ उत्तर को अपडेट किया। *compilation*
आकर्षित किया

आपके त्वरित और गंदे उदाहरण ओपी के बिंदु 2 का जवाब देते हैं, जो वास्तव में मैं देख रहा था। संकलन बफर स्क्रॉलिंग ताकि सक्रिय रेखा शीर्ष पर हो (जो कि केवल तभी मान्य है जब बायां किनारा आकार 0 का हो) ने मुझे संदर्भ खो दिया (चूंकि त्रुटि के ऊपर की रेखाएं सार्थक हैं), इसलिए मुझे सेट करना पड़ा compilation-context-lines। नतीजतन, वर्तमान में चयनित त्रुटि को ढूंढना मुश्किल था। आपके समाधान ने मुझे बचा लिया।
गौथियर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.