यदि वर्तमान चरित्र उस प्रमुख विधा के लिए एक टिप्पणी चरित्र है तो मैं कैसे पता लगा सकता हूं?


12

मैं इस छोटे से कार्य पर काम कर रहा हूं जो अगली पंक्ति को वर्तमान रेखा तक खींचता है। मैं एक कार्यक्षमता जोड़ना चाहता हूं ताकि यदि वर्तमान लाइन एक लाइन टिप्पणी है और अगली पंक्ति भी एक लाइन टिप्पणी है, तो "पुल-अप" कार्रवाई के बाद टिप्पणी अक्षर हटा दिए जाते हैं।

उदाहरण:

इससे पहले

;; comment 1▮
;; comment 2

कॉलिंग M-x modi/pull-up-line

उपरांत

;; comment 1▮comment 2

ध्यान दें कि ;;वर्ण पहले हटा दिए गए हैं comment 2

(defun modi/pull-up-line ()
  "Join the following line onto the current one (analogous to `C-e', `C-d') or
`C-u M-^' or `C-u M-x join-line'.

If the current line is a comment and the pulled-up line is also a comment,
remove the comment characters from that line."
  (interactive)
  (join-line -1)
  ;; If the current line is a comment
  (when (nth 4 (syntax-ppss))
    ;; Remove the comment prefix chars from the pulled-up line if present
    (save-excursion
      (forward-char)
      (while (looking-at "/\\|;\\|#")
        (delete-forward-char 1))
      (when (looking-at "\\s-")
        (delete-forward-char 1)))))

ऊपर समारोह काम करता है, लेकिन अब के लिए, प्रमुख-मोड की परवाह किए बिना, यह विचार करेंगे /या ;या #एक टिप्पणी चरित्र के रूप में: (looking-at "/\\|;\\|#")

मैं इस लाइन को और अधिक बुद्धिमान बनाना चाहता हूं; प्रमुख-मोड विशिष्ट।

उपाय

@Ericstokes समाधान के लिए धन्यवाद, मेरा मानना ​​है कि नीचे अब मेरे सभी उपयोग मामलों को शामिल किया गया है :)

(defun modi/pull-up-line ()
  "Join the following line onto the current one (analogous to `C-e', `C-d') or
`C-u M-^' or `C-u M-x join-line'.

If the current line is a comment and the pulled-up line is also a comment,
remove the comment characters from that line."
  (interactive)
  (join-line -1)
  ;; If the current line is a comment
  (when (nth 4 (syntax-ppss))
    ;; Remove the comment prefix chars from the pulled-up line if present
    (save-excursion
      (forward-char)
      ;; Delete all comment-start or space characters
      (while (looking-at (concat "\\s<" ; comment-start char as per syntax table
                                 "\\|" (substring comment-start 0 1) ; first char of `comment-start'
                                 "\\|" "\\s-")) ; extra spaces
        (delete-forward-char 1)))))

क्या आप चाहते हैं कि यह अलग-अलग कमेंट स्टार्ट और एंड कैरेक्टर और मल्टी-कैरेक्टर कमेंट्स (जैसे C /* ... */) को हैंडल करने के लिए पर्याप्त स्मार्ट हो ?
एरिकास्टोक्स

नहींं, मुझे बस इतना ही चाहिए था। धन्यवाद!
कौशल मोदी

@erikstokes जिज्ञासा से बाहर, आप सी-स्टाइल टिप्पणियों को कैसे संभालेंगे?
प्रधान

यह समाधान मल्टी लाइन टिप्पणियों के साथ बहुत दूर काम करता है, कुछ विशेष करने की आवश्यकता नहीं है क्योंकि हमें बहुस्तरीय टिप्पणियों में शामिल होने पर किसी भी वर्ण को हटाने की आवश्यकता नहीं है।
कौशल मोदी

2
@ प्रधान वहाँ comment-startऔर comment-endतार हैं जो "/ *" और "* /" में c-mode(लेकिन नहीं c++-mode) सेट हैं। और c-comment-start-regexpदोनों शैलियों से मेल खाता है। आप अंत वर्णों को हटा रहे हैं, फिर शुरुआत में शामिल होने के बाद। लेकिन मुझे लगता है मेरी समाधान होगा uncomment-region, और क्या टिप्पणी चरित्र क्या है के बारे में Emacs चिंता करते हैं। join-linecomment-region
erikstokes

जवाबों:


12

आप यह देख सकते हैं कि क्या सिंटैक्स टेबल का उपयोग करके वर्तमान चरित्र एक टिप्पणी चरित्र है (looking-at "\\s<"):। Regexp \\s<"टिप्पणी शुरू" वाक्य रचना के साथ किसी भी चरित्र से मेल खाएगा; \\s>"टिप्पणी अंत" वाक्य रचना के साथ उन लोगों से मेल खाएगा।

एक अन्य विकल्प चर है comment-start, जो कि comment-dwimमित्रों और मित्रों द्वारा डाला गया स्ट्रिंग है । यह आमतौर पर कमेंट स्टार्ट कैरेक्टर और कुछ स्पेस पर सेट होता है।


2

वहाँ एक है बहुत सरल समाधान , पर मेरे कोड का अध्ययन कृपया https://github.com/redguardtoo/evil-nerd-commenter/blob/master/evil-nerd-commenter.el

मैं यहां सभी कोड कॉपी / पेस्ट नहीं करूंगा। लेकिन यहाँ प्रमुख बिंदु हैं:

  • मेरे अपने कोड में टिप्पणी का अपना फ़ॉन्ट चेहरा, खोज फ़ॉन्ट-लॉक-टिप्पणी-चेहरा और फ़ॉन्ट-लॉक-टिप्पणी-सीमांकक-चेहरा है

  • दूसरी लाइन को अनइंस्टॉल करने के लिए Emacs के खुद के API का उपयोग करें, फिर इसे पहली लाइन के साथ जोड़ दें

यह किसी भी समझदार प्रमुख मोड पर काम करना चाहिए।

यह ट्रिक मेरे द्वारा ईजाद नहीं की गई है। यह वास्तव में Emacs के स्वयं के कोड से है, (अधिक विशेष रूप से, फ्लाईस्पेल)। तो समाधान को किसी भी प्रमुख-मोड फ्लाईस्पेल समर्थन का समर्थन करना चाहिए


3
टिप्पणी के रूप में कुछ को उजागर करने के लिए, इसे वाक्यविन्यास तालिका को उचित रूप से सेट करने की आवश्यकता है, इसलिए मुझे संदेह है कि यह वाक्यविन्यास को देखने के विकल्प की तुलना में अधिक स्मार्ट है।
वामासा

इस ट्रिक को मैंने Emacs के खुद के कोड (वास्तव में, यह फ्लाईस्पेल) पढ़कर सीखा है, जैसा कि मैंने अपने कोड में दर्ज़ किया था।
चेंन बिन

0

यदि आप इस सुविधा को लिस्प कोड (Elisp, Clojure, Scheme and Common Lisp) के लिए देख रहे हैं, तो आपको लिस्पी की कोशिश करनी चाहिए , एक फ़ंक्शन जिसे lispy-fillइस तरह की चीज़ कहते हैं।

यदि आप इस सुविधा को अन्य भाषा के लिए देख रहे हैं, तो आपको rebox2 (के लिए सत्यापित Cऔर Python), एक फ़ंक्शन rebox-fillया किसी अन्य फ़ंक्शन को बुलाया जाना चाहिए , जो rebox-dwimइस तरह की चीज़ करता है।

वे दोनों महान पैकेज हैं, और वे एक-दूसरे के साथ संघर्ष नहीं कर रहे हैं क्योंकि वे विभिन्न प्रमुख-मोडों के लिए उपयोग किए जाते हैं, और वे दोनों ( lispy-fillऔर rebox-dwim) M-qबहुत साफ-सुथरे हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.