एलीस्प में निशान कैसे सेट करें और चयन का बदलाव करें?


9

जब क्षणिक-चिह्न-मोड सक्रिय होता है तो Emacs का सामान्य व्यवहार यह होता है कि जब आप शिफ्ट-सेलेक्शन करते हैं, तो यदि अगला कमांड एक नॉन-शिफ्ट मूवमेंट है, तो मार्क निष्क्रिय हो जाता है। उदाहरण के लिए, कमांड के बाद M-l(नीचे फ़ंक्शन के साथ वर्तमान लाइन को चिह्नित करने के लिए) और C-f, चिह्न निष्क्रिय है। उस व्यवहार को बाद में कैसे करें (set-mark-command nil)?

उदाहरण के लिए:

(defun my-mark-current-line ()
  (interactive)
  (beginning-of-line)
  (set-mark-command nil)
  (end-of-line)
  (forward-char))

(global-set-key (kbd "M-l") 'my-mark-current-line)

अब Ml Cf करें और क्षेत्र बढ़ेगा, लेकिन इसके बजाय, मैं चाहता हूं कि डिफ़ॉल्ट व्यवहार, अर्थात Cf को निष्क्रिय करने के लिए क्षेत्र, और CSf के साथ बढ़े।

संपादित करें : सेट-मार्क-कमांड के लिए एक फ़ंक्शन का उपयोग करना चाहिए जो इसे अनुमति देता है? मुझे कोई नहीं मिला।


मेरा मानना ​​है कि यह संभव नहीं है (और मैं गलत हो सकता हूं)। जब तक एक क्षेत्र सक्रिय है, तब तक नेविगेशन कमांड चयन को बदल देगा। शिफ्ट-सलेक्शन का उपयोग (किसी क्षेत्र को सक्रिय C-S-fकरने C-SPC) C-f(नेविगेशन) के अनुरूप है । आप संभवतः C-f एक रैपर फ़ंक्शन से बाइंड करके प्राप्त कर सकते हैं जो पहले सक्रिय होने पर एक क्षेत्र को निष्क्रिय करता है और फिर जो C-fकरता है उसे करने के लिए आगे बढ़ता है ( forward-char); और C-S-fसीधे बाँधो forward-char। ध्यान दें कि यदि आप कभी टर्मिनल मोड में emacs का उपयोग करते हैं, C-fऔर C-S-fदोनों व्यवहार करेंगे C-fजैसे टर्मिनल दोनों के बीच अंतर नहीं कर सकता है।
कौशल मोदी

इसके अलावा आपने जो रैपर और बाइंडिंग की थी, C-fवह आपके द्वारा उपयोग किए जाने वाले अन्य सभी नेविगेशन कमांड पर भी लागू होगी।
कौशल मोदी

btw के C-fबाद M-lक्षेत्र का विस्तार नहीं करता है क्योंकि M-l(जो downcase-wordडिफ़ॉल्ट रूप से बाध्य है ) के अंत में कोई सक्रिय क्षेत्र नहीं है ।
कौशल मोदी

1
@ कौशलमोडी मुझे लगता है कि M-lओपी द्वारा संदर्भित डिफ़ॉल्ट बाइंडिंग नहीं है ( downcase-word), लेकिन कस्टम बाइंडिंगmy-mark-current-line
nispio

वास्तव में @nispio।
20

जवाबों:


8

क्योंकि शिफ्ट ट्रांसलेशन और मार्क की अस्थायी सक्रियता कमांड लूप द्वारा नियंत्रित की जाती है, इसलिए आपको उनसे उपयुक्त शिफ्ट चयन व्यवहार प्राप्त करने के लिए आंदोलन कार्यों के इंटरैक्टिव संस्करणों को कॉल करना होगा:

;; (source: http://emacs.stackexchange.com/a/22166/93)
(defun my-mark-current-line ()
  (interactive)
  (beginning-of-line)
  (setq this-command-keys-shift-translated t)
  (call-interactively 'end-of-line)
  (call-interactively 'forward-char))

(global-set-key (kbd "M-l") 'my-mark-current-line)

अपडेट करें:

उपरोक्त उत्तर लिखने के बाद से, मुझे इस बारे में थोड़ा और सीखने में समय लगा कि चयन वास्तव में हुड के तहत कैसे काम करता है। यह transient-mark-modeफॉर्म की एक कॉन्स सेल होने के लिए प्रतीक मूल्य निर्धारित करता है (only . OLDVAL), जहां OLDVALचयन चयन से पहले मूल्य है।

नीचे दिए गए समाधान call-interactivelyनिशान को सक्रिय करने और आवश्यकतानुसार उचित मूल्य निर्धारित करने के उपयोग से बचा जाता है transient-mark-mode। मूल रूप से, मैं इस समाधान को पहले की तुलना में हैक से कम मानता हूं।

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

;; (source: http://emacs.stackexchange.com/a/22166/93)
(defun my-mark-current-line (&optional arg)
  "Uses shift selection to select the current line.
When there is an existing shift selection, extends the selection
in the appropriate direction to include current line."
  (interactive "p")
  (let ((oldval (or (cdr-safe transient-mark-mode) transient-mark-mode))
        (backwards (and mark-active (> (mark) (point))))
        (beg (and mark-active (mark-marker))))
    (unless beg
      (if backwards (end-of-line) (beginning-of-line))
      (setq beg (point-marker)))
    (if backwards (end-of-line (- 1 arg)) (beginning-of-line (+ 1 arg)))
    (unless mark-active
      (push-mark beg nil t))
    (setq transient-mark-mode (cons 'only oldval))))

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