क्या Emacs के लिए एक ऑटो-संरेखित पैकेज या मोड है?


15

ऐसे समय होते हैं जब मैं फ़ाइलों को संपादित कर रहा होता हूं (उदाहरण के लिए कठपुतली मैनिफ़ेस्ट्स), जहां मैं मक्खी पर बफर सामग्री संरेखित करना चाहता हूं। उदाहरण के लिए, मुझे पता है कि मैं इस तरह कोड का उपयोग align-regexpया alignसंरेखित कर सकता हूं , जब तक कि मैंने इसे चुना है:

# M-x align-regexp "=>" will line everything up nicely 
file { "/etc/foo":
  ensure => present,
  mode => "0666",
  source => "puppet:///modules/example/foo",
}

लेकिन मैं वास्तव में चाहता हूं कि यह मक्खी पर हो - एक क्षेत्र या पूरे बफर का चयन किए बिना। क्या कोई ऐसा पैकेज या मोड है जो ऐसा करेगा, या यह कोई ऐसी चीज है जिसे मैं अपनी रुचि के अनुसार मोड में बनाना होगा?

संपादित करें: मैंने कठपुतली और CFEngine के बारे में पूछा, क्योंकि इन दिनों मैं सबसे अधिक कोड है और मेरे पास संरेखित पाठ के लिए एक मजबूत प्राथमिकता है। हालाँकि, मैं यह जानने के लिए उत्सुक था (और यह अच्छी तरह से व्यक्त नहीं किया है) कि क्या ऑन-द-फ्लाई अलाइनमेंट एक ऐसी विशेषता है, जो एमएसीएस मोड्स में मुख्य है (मुख्यतः प्रोग्रामिंग भाषाओं के लिए मोड में), या यदि बचत करते समय या कुछ पर ज्यादातर लोग संरेखित होते हैं अन्य बिंदु।


नहीं है का विस्तार क्षेत्र है, जो बारी-बारी से बड़ा स्कोप के चयन के लिए उपयोगी है।
बस्तीबाई

1
क्या आप आमतौर पर जो आप संरेखित करेंगे उस पर अधिक वर्णन कर सकते हैं? क्या यह सिर्फ समान संकेत और कठपुतली-विधा में है? आप जो चाहते हैं उसे पाने के लिए @Malabarba द्वारा ऑटो-इंडेंटेशन के लिए इस Emacs SE उत्तर में कोड को संशोधित कर सकते हैं। बस के indent-regionसाथ बदलें align-to-equalsऔर इस फ़ंक्शन को परिभाषित करें (defun align-to-equals (begin end) (interactive "r") (align-regexp begin end "\\(\\s-*\\)=" 1 1 nil)); और emacs-lisp-mode-hookसाथ puppet-mode-hook
कौशल मोदी

जवाबों:


5

यदि आप स्वतः संरेखण के लिए एक क्षेत्र चिह्नित करना चाहते हैं, तो शायद ऐसा करना बहुत मुश्किल नहीं है:

(require 'cl-lib)

(defvar my--auto-align-overlays nil)
(make-variable-buffer-local 'my--auto-align-overlays)

(defun my-auto-align (beg end regexp)
  (interactive "r\nsRegexp: ")
  (let ((ol (make-overlay beg end)))
    (overlay-put ol 'evaporate t)
    (overlay-put ol 'my--auto-align-regexp regexp)
    (overlay-put ol 'modification-hooks '(my--auto-align-function))
    (push ol my--auto-align-overlays)
    (add-hook 'post-command-hook 'my--auto-align-pch nil t)))

(defun my--auto-align-function (ol &rest _args)
  (cl-pushnew ol my--auto-align-overlays)
  (add-hook 'post-command-hook 'my--auto-align-pch nil t))

(defun my--auto-align-pch ()
  (dolist (ol my--auto-align-overlays)
    (align-regexp (overlay-start ol) (overlay-end ol)
                  (concat "\\(\\s-*\\)" (overlay-get ol 'my--auto-align-regexp))
                  1 align-default-spacing))
  (setq my--auto-align-overlays nil)
  (remove-hook 'post-command-hook 'my--auto-align-pch))

लेकिन अगर आप चाहते हैं कि यह पूरी तरह से स्वचालित हो, तो आपको यह पता लगाने की ज़रूरत होगी कि आप किन क्षेत्रों को ऑटो-संरेखित करना चाहते हैं (और किस regexp के साथ), जो अधिक कठिन है। मुझे लगता है कि आप कुछ regexps प्रदान कर सकते हैं, और फिर उन लाइनों के लिए बफर को स्कैन कर सकते हैं जो उन regexps में से एक से मेल खाते हैं।


मैंने पहले ओवरले का उपयोग नहीं किया है, लेकिन एलिफ़स मैनुअल को लगता है कि वे उपस्थिति में बदलाव के लिए कह रहे हैं - क्या मुझे यह समझ में आया है? यदि हां, तो क्या इसका अर्थ केवल यह बताता है कि फ़ाइल को सहेजने के बाद बफर वास्तविक कैसे दिखता है, बजाय इसके सहेजे जाने के? (यह बाद मैं देख रहा था, लेकिन उपस्थिति बदलना एक दिलचस्प विकल्प होगा।)
संत अड़वार्क द कारपेटेड

2
@SaintAardvarktheCarpeted ओवरले आमतौर पर उपस्थिति को बदलने के लिए उपयोग किए जाते हैं, लेकिन उनकी प्रयोज्यता इससे परे होती है। इस उत्तर (IIUC) में, ओवरले का उपयोग उन क्षेत्रों को चिह्नित करने के लिए किया जाता है, जिन्हें संरेखित किया जाना है (इसलिए बफर वास्तव में बदल जाता है, न कि केवल उपस्थिति)। फ़ंक्शन my-auto-alignका उपयोग इन ओवरले को परिभाषित करने के लिए किया जाता है (उन क्षेत्रों को चिह्नित करें जिन्हें आप संरेखित करना चाहते हैं)। कारण (मुझे लगता है) स्टीफन यह सब मुसीबत से गुजर रहा है (इंडेंटेशन के विपरीत) यदि आप बस पूरे बफर को संरेखित करने की कोशिश करते हैं, तो आपको अवांछित परिणाम मिलेंगे, इसलिए आपको एक समय में टुकड़ों को संरेखित करने की आवश्यकता है।
मालाबार

3

कठपुतली मोड प्रदान करता है puppet-align-block। आप इस फ़ंक्शन को स्वचालित रूप से कॉल करने की व्यवस्था कर सकते हैं, जैसे कि इसे post-command-hookस्थानीय रूप से जोड़कर (अप्रयुक्त):

(defun puppet-auto-align ()
  (unless (puppet-in-string-or-comment-p)
    (puppet-align-block)))

(define-minor-mode puppet-auto-align-mode
  :init-value nil
  :keymap nil
  :lighter "PAl"
  :group 'puppet-lint
  (if puppet-auto-align-mode
      (add-hook 'post-command-hook #'puppet-auto-align nil 'local)
    (remove-hook 'post-command-hook #'puppet-auto-align 'local)))

(add-hook 'puppet-mode-hook #'puppet-auto-align-mode)

हालाँकि, ध्यान दें कि ऐसा न करने का एक अच्छा कारण है। यह विशेष रूप से चतुर नहीं है, और आप कहीं भी हो सकता है किसी भी मैनुअल संरेखण को अधिलेखित कर देंगे, जो विशेष रूप से बुरी तरह से टूट जाएगा, अगर स्वचालित संरेखण कुछ अधिक जटिल पुपेट कोड के लिए काम नहीं करता है।

इसलिए - पपेट मोड मेंटेनर के रूप में बोलना - मैं इसके खिलाफ सलाह देता हूं, और हम आपकी मदद नहीं करेंगे या बग रिपोर्ट स्वीकार नहीं करेंगे, यदि आप इस कोड का उपयोग कर रहे हैं।

इसके अलावा, बड़े संसाधन ब्लॉक के लिए, यह धीमा हो सकता है, इसलिए आप शायद post-command-hookसीधे के बजाय एक निष्क्रिय टाइमर का उपयोग करना चाहते हैं।

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