किसी इंडेंट ब्लॉक से पहले कोड जोड़ने या हटाने पर स्वचालित रूप से पुन: इंडेंटिंग कोड


18

कहो मेरे पास एक विशिष्ट कोड है:

(+ 2 3▮(+ 3
          4))

क्या कर्सर के बाद लिंग को स्वचालित रूप से फिर से इंडेंट करने का एक तरीका है, जब मैं प्रतीकों को जोड़ता या हटाता हूं?

इसलिए दबाने के बाद SPC 4 SPC, मैं स्वतः प्राप्त करूंगा:

(+ 2 3 4 ▮(+ 3
             4))

मैं mark-sexpबाद में कॉल करके इस मैनुअल को कर सकता हूं indent-region। क्या ऐसा करने के बेहतर तरीके हैं?


मुझे नहीं लगता कि कोई सुविधाजनक डिफ़ॉल्ट कीबाइंडिंग हैं, लेकिन आप आसानी से कुछ स्वयं बना सकते हैं।
22

मुझे पता है लेकिन मैं विशेष रूप से सोच रहा हूं कि क्या ऐसा करने के कोई बेहतर तरीके हैं। उदाहरण के लिए कैसे electric-indent-modeज्यादा मानचित्रण से बेहतर है <return>के लिएnewline-and-indent
मेसिएज Goszczycki

जवाबों:


14

mark-sexp+ के बजाय indent-region, आप दबा सकते हैं C-M-q। यह कॉल करेगा indent-pp-sexp। स्वचालित नहीं है, लेकिन दो आदेशों को लागू करने की तुलना में थोड़ा बेहतर है।

या यदि आप उपयोग कर रहे हैं paredit-mode, तो दबाएँ M-q। आप जिस संपूर्ण फ़ंक्शन परिभाषा में हैं, उस पर निर्भर करेगा।


1
(add-hook 'post-self-insert-hook 'indent-pp-sexp)आश्चर्यजनक रूप से अच्छा काम करता है।
मैकीज गोस्ज़ेस्की

अछा लगता है। यह कुछ मोड में महंगा हो सकता है, लेकिन यह एक अच्छा तरीका है।
दिमित्री

स्मार्टप्रेनर्स उपयोगकर्ताओं के लिए, आप वर्तमान डीफ़न के साथ फिर से जुड़ सकते हैं M-x sp-indent-defun। मैं इसे बांधता हूं C-M-q
रेडॉन रोसबरो

15

आक्रामक इंडेंट मोड

चूंकि कुछ लोगों ने इसके लिए कहा, मैंने इस जवाब को एक पैकेज में बदल दिया ।

यदि आपके पास मेलपा कॉन्फ़िगर है, तो आप इसे स्थापित कर सकते हैं

M-x package-install RET aggressive-indent

सभी विकल्पों के लिए रीडमी देखें , लेकिन इसे चालू करने का सबसे सरल तरीका है:

(add-hook 'emacs-lisp-mode-hook #'aggressive-indent-mode)

पुराना उत्तर

निम्नलिखित केवल ऑटो-इंडेंटेशन करता है, जो कि अपरिहार्य बफ़र्स पर होता है। यह तब भी काम करता है जब आप सामान को मिटा देते हैं (या केवल टाइप करने के बजाय)। अन्य मोड में भी इसे जोड़ना आसान है।

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

(require 'cl-lib)

(defun endless/indent-defun ()
  "Indent current defun.
Do nothing if mark is active (to avoid deactivating it), or if
buffer is not modified (to avoid creating accidental
modifications)."
  (interactive)
  (ignore-errors
    (unless (or (region-active-p)
                buffer-read-only
                (null (buffer-modified-p)))
      (let ((l (save-excursion (beginning-of-defun 1) (point)))
            (r (save-excursion (end-of-defun 1) (point))))
        (cl-letf (((symbol-function 'message) #'ignore))
          (indent-region l r))))))

यह हुक ऐसा बना देगा कि यह फ़ंक्शन आपके द्वारा कुछ भी टाइप करने के बाद चलाया जाएगा, लेकिन केवल क्विक बफ़र्स में। यह सब कुछ हमेशा प्रेरित रखना चाहिए।

(add-hook
 'emacs-lisp-mode-hook
 (lambda ()
   (add-hook 'post-command-hook
             #'endless/indent-defun nil 'local)))

कोशिश करो! यह उल्लेखनीय रूप से अच्छी तरह से काम करता है।

इसके अलावा, टिप्पणियों में @ holocronweaver के सुझाव के बाद, आप सी जैसी भाषाओं के लिए कुछ का उपयोग कर सकते हैं:

(define-key c++-mode-map ";"
  (lambda () (interactive)
    (insert ";")
    (endless/indent-defun)))

उत्कृष्ट होगा यदि यह ऑटो-इंडेंट संदेशों और अर्धचालकों के साथ लाइनों को समाप्त करने वाली भाषाओं को बेहतर तरीके से संभाले।
होलोक्रोनवाइवर

@holocronweaver यकीन है, मैं कोशिश कर सकते हैं कि। किस प्रमुख मोड में इंडेंट संदेश हैं? और अर्ध कॉलों के साथ क्या समस्या है?
मालाबार

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

@holocronweaver संदेशों को सिल दिया। इस पर ध्यान दिलाने के लिए धन्यवाद।
मालाबार

ठीक करने के लिए धन्यवाद! अर्धविराम समस्या का एक समाधान केवल सी-मोड भाषाओं में इंडेंट करना है जब एक अर्धविराम टाइप किया जाता है।
होलोक्रोनवाइवर

3

मुझे पहले से मौजूद समाधान का पता नहीं है, लेकिन आप post-self-insert-hookइसे स्वयं पूरा करने के लिए उपयोग कर सकते हैं :

(defun my-indent-next-sexp ()
  (interactive)
  (mark-sexp)
  (indent-region))

(add-hook 'post-self-insert-hook 'my-indent-next-sexp)

मैं हालांकि संभावित प्रदर्शन समस्याओं के बारे में चिंता करूंगा।


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