Emacs टिप्पणी/वर्तमान लाइन की नकल




elisp (5)

इस सवाल का पहले से ही यहाँ एक जवाब है:

मुझे पता है कि इस पर पहले से ही एक Emacs सवाल है, और यह बंद हो गया था, लेकिन मुझे यह काफी प्रासंगिक और महत्वपूर्ण लगता है।

मूल रूप से, मैं वर्तमान लाइन पर टिप्पणी / अनसुना करना चाहता हूं। मैं एक मैक्रो के साथ काफी आसान होने की उम्मीद कर रहा था, लेकिन मैंने पाया कि यह वास्तव में नहीं है।

यदि वर्तमान लाइन पर टिप्पणी की जाती है, तो असहजता। यदि यह असंगत है, तो टिप्पणी करें। और मैं कर्सर की स्थिति से ही नहीं, बल्कि पूरी लाइन पर टिप्पणी करना चाहूंगा।

मैंने इस तरह एक मैक्रो की कोशिश की:

सीए

'comment-dwim

लेकिन यह केवल एक पंक्ति पर टिप्पणी करने के लिए काम करता है, इसे अनसुना करने के लिए नहीं, अगर यह पहले से ही टिप्पणी की गई है।

मुझे यकीन नहीं है कि यह कितना आसान है, लेकिन अगर कोई रास्ता है, तो मैं वास्तव में इसे पसंद करूंगा।

इसके अलावा, मुझे यह विचार बहुत पसंद है, इसका कारण यह है कि जब मैंने Geany का उपयोग किया, मैंने सिर्फ Ce का उपयोग किया और यह एकदम सही था।


मुझे लगता है कि आपको गलतफहमी है कि कीबोर्ड-मैक्रोज़ कैसे काम करते हैं। @ ट्रे प्रदान की गई एक Emacs-Lisp कमांड है। आप Emacs-Lisp को समझे बिना अपने लिए इसे पूरा कर सकते थे।

पहले कुंजियों के अनुक्रम का पता लगाएं जो आप चाहते हैं और फिर उस क्रम को एक मैक्रो के रूप में रिकॉर्ड करें।

आपने इसे प्रस्तावित किया: सीए एम-; (एम-; comment-dwim )। क्या यह वही करता है जो आपके मन में था? यदि नहीं, तो जब आप इसे कीबोर्ड मैक्रो के रूप में खेलते हैं तो यह जादुई रूप से काम नहीं करेगा।


ट्रे का कार्य पूरी तरह से काम करता है, लेकिन यह बहुत लचीला नहीं है।

इसके बजाय यह प्रयास करें:

(defun comment-or-uncomment-region-or-line ()
    "Comments or uncomments the region or the current line if there's no active region."
    (interactive)
    (let (beg end)
        (if (region-active-p)
            (setq beg (region-beginning) end (region-end))
            (setq beg (line-beginning-position) end (line-end-position)))
        (comment-or-uncomment-region beg end)))

यदि कोई सक्रिय है, तो यह वर्तमान लाइन या क्षेत्र को टिप्पणी / अनसुना करता है।

यदि आप पसंद करते हैं, तो आप इस तरह की वर्तमान लाइन पर टिप्पणी करने के बाद फ़ंक्शन को अगली पंक्ति में जाने के लिए संशोधित कर सकते हैं:

(defun comment-or-uncomment-region-or-line ()
    "Comments or uncomments the region or the current line if there's no active region."
    (interactive)
    (let (beg end)
        (if (region-active-p)
            (setq beg (region-beginning) end (region-end))
            (setq beg (line-beginning-position) end (line-end-position)))
        (comment-or-uncomment-region beg end)
        (next-line)))

ध्यान दें कि केवल एक चीज जो बदल गई है वह फ़ंक्शन के अंत में जोड़ा गया next-line कमांड है।


इस फ़ंक्शन को आज़माएँ, और अपनी पसंदीदा कुंजी से बाँधें:

(defun toggle-comment-on-line ()
  "comment or uncomment current line"
  (interactive)
  (comment-or-uncomment-region (line-beginning-position) (line-end-position)))

यह उत्तर यहां लागू होता है। यह कमांड comment-region-lines को परिभाषित करता है जो सक्रिय होने पर कमेंट या वर्तमान लाइन या रीजन को अनफॉलो कर देता है।

यह comment-or-uncomment-region , लेकिन यह आपको निर्णय लेने देता है कि क्या असहजता या टिप्पणी करना है। यदि आप पहले ही टिप्पणी कर चुके हैं तो यह क्षेत्र को स्वचालित रूप से असहज करने के बजाय, आपको घोंसले की टिप्पणी देता है।

एक संख्यात्मक उपसर्ग arg के साथ यह कई टिप्पणी-प्रारंभ वर्ण (जैसे, ;; ;;; ... लिस्प में) का उपयोग करता है। एक सादे Cu उपसर्ग के साथ यह असुविधाजनक है। मैं इसे Cx C-; से बांधता हूं Cx C-;


मैंने ट्रे का उत्तर लिया और इसे परिष्कृत किया, ताकि यह तब भी काम करे जब कोई क्षेत्र सक्रिय हो, लेकिन फिर उस क्षेत्र पर काम करता है:

(defun comment-or-uncomment-line-or-region ()
  "Comments or uncomments the current line or region."
  (interactive)
  (if (region-active-p)
      (comment-or-uncomment-region (region-beginning) (region-end))
    (comment-or-uncomment-region (line-beginning-position) (line-end-position))
    )
  )

(define-key c-mode-base-map (kbd "C-/") 'comment-or-uncomment-line-or-region)






elisp