यदि बिंदु एक टिप्पणी क्षेत्र के भीतर है तो कैसे पता लगाया जाए?


15

यदि बिंदु एक टिप्पणी क्षेत्र के भीतर है तो कैसे पता लगाया जाए?

जवाबों:


19

द्वारा लौटी सूची में चौथे * मान की जाँच करें syntax-ppss:

(nth 4 (syntax-ppss))

nilयदि किसी tगैर-नेस्टेबल टिप्पणी के अंदर, या एक नेस्टेबल टिप्पणी के अंदर एक पूर्णांक (नेस्टिंग की गहराई) है तो यह किसी भी टिप्पणी के बाहर है । parse-partial-sexpअधिक विवरण के लिए डॉकस्ट्रिंग देखें।

* शून्य आधारित।

ध्यान दें कि यह Org- मोड के साथ काम नहीं करता है, आपको इसका उपयोग करना चाहिए:

(defun in-comment-p ()
  "Testy if cursor/point in a commented line?"
  (save-excursion
        (if (derived-mode-p 'org-mode)
                (save-match-data (beginning-of-line) (looking-at "^[ \t]*#"))
          (nth 4 (syntax-ppss)))))

बिल्कुल सही, क्या अन्य सभी जानकारी के लिए एक दस्तावेज है जो syntax-ppssप्रदान करता है?
नाम

2
हां, यह डॉकस्ट्रिंग के लिए है parse-partial-sexp
लेगोस्किया

2
@ नाम: इसके लिए डॉकस्ट्रिंग syntax-ppssआपको इंगित करेगा parse-partial-sexp, जिसके उत्तरार्ध आपको इन कार्यों के लिए दिए गए सभी सामानों का विवरण देगा। उम्मीद है कि एक शुरुआत के लिए मदद करता है।
दान

1
एमएसीएस लिस्प मैनुअल में धारा 34.6 "पार्सिंग एक्सप्रेशंस" भी देखें।
सू। डी। निम्मे जुले

7

फ़ॉन्ट-फेस का उपयोग करें, यह वह चाल है जो मैंने फ्लाईस्पेल से सीखी थी।

मैंने syntax-ppssदो साल पहले कोशिश की थी, यह दो कारणों से काम नहीं करता है:

  • टिप्पणी के किनारे पर काम न करें (टिप्पणी सीमा), उदाहरण के लिए, // this is commentc ++ - मोड जैसी टिप्पणी के लिए , यदि आप /चरित्र पर कर्सर रखते हैं , तो परिणाम (nth 4 (syntax-ppss))शून्य है।

  • वेब-मोड की तरह प्रमुख मोड में बिल्कुल भी काम न करें

यहाँ कोड है जिसे मैंने फ्लाईस्पेल से कॉपी किया है:

(defun evilnc--in-comment-p (&optional pos)
  "Test if character at POS is comment.  If POS is nil, character at `(point)' is tested"
  (interactive)
  (unless pos (setq pos (point)))
  (let* ((fontfaces (get-text-property pos 'face)))
    (when (not (listp fontfaces))
      (setf fontfaces (list fontfaces)))
    (delq nil
          (mapcar #'(lambda (f)
                      ;; learn this trick from flyspell
                      (or (eq f 'font-lock-comment-face)
                          (eq f 'font-lock-comment-delimiter-face)))
                  fontfaces))))

कृपया ध्यान दें कि फेज़ मैचिंग फॉन्ट फेस द्वारा नए प्रमुख मोड को सपोर्ट करने के लिए कोड को बढ़ाया जा सकता है।

मैंने इस ट्रिक को लगभग तीन साल तक बिना किसी असफलता के उपयोग किया है। इसके अलावा, फ्लाईस्पेल पर विचार करना व्यापक रूप से इतने लंबे समय के लिए उपयोग किया जाता है, मैं दावा कर सकता था कि यह विधि विश्वसनीय है।

देखें कौन सा कीबोर्ड शॉर्टकट एक स्ट्रिंग से बाहर नेविगेट करने के लिए उपयोग करने के लिए इसी तरह के प्रश्न के लिए।


1
एक एडिट ने एक और वर्जन प्रस्तावित किया है, जो कोई POSआर्ग नहीं करता है और उपयोग करता है point। ऐसे दो संस्करण होने से बेहतर है कि arg को POSवैकल्पिक बनाया जाए और इसे (point)कब सेट किया जाए nil
ड्रू
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.