पायथन के लिए ईमैक बल्क इंडेंट


132

Emacs में Python के साथ काम करना अगर मैं कोड के एक ब्लॉक को छोड़कर / एक कोशिश जोड़ना चाहता / चाहती हूं, तो मुझे अक्सर लगता है कि मुझे पूरे ब्लॉक, लाइन से लाइन इंडेंट करना है। Emacs में, आप एक ही बार में पूरे ब्लॉक को कैसे इंडेंट करते हैं।

मैं एक अनुभवी Emacs उपयोगकर्ता नहीं हूँ, लेकिन बस यह ssh के माध्यम से काम करने के लिए सबसे अच्छा उपकरण है। मैं कमांड लाइन (उबंटू) पर एमएसीएस का उपयोग कर रहा हूं, न कि एक गुई के रूप में, अगर इससे कोई फर्क पड़ता है।


5
C-c >अधिकार के लिए। C-c <बाएं के लिए
थम्मी गौड़ा

जवाबों:


213

यदि आप Emacs का उपयोग करके Python की प्रोग्रामिंग कर रहे हैं, तो आपको संभवतः अजगर-मोड का उपयोग करना चाहिए। अजगर-मोड के साथ, कोड के ब्लॉक को चिह्नित करने के बाद,

C-c >या C-c C-l क्षेत्र 4 रिक्त स्थान को दाईं ओर शिफ्ट करता है

C-c <या C-c C-r क्षेत्र 4 स्थानों को बाईं ओर शिफ्ट करता है

यदि आपको इंडिकेशन के दो स्तरों या कुछ मध्यस्थ राशि से कोड शिफ्ट करने की आवश्यकता है, तो आप कमांड को एक तर्क के साथ उपसर्ग कर सकते हैं:

C-u 8 C-c > 8 स्थानों को दाईं ओर शिफ्ट करता है

C-u 8 C-c < इस क्षेत्र को बाईं ओर 8 स्थान बदलता है

एक अन्य विकल्प का उपयोग करना है M-x indent-rigidlyजो निम्नलिखित के लिए बाध्य है C-x TAB:

C-u 8 C-x TAB 8 स्थानों को दाईं ओर शिफ्ट करता है

C-u -8 C-x TAB इस क्षेत्र को बाईं ओर 8 स्थान बदलता है

इसके अलावा उपयोगी आयत कमांड हैं जो पाठ की पंक्तियों के बजाय पाठ के आयतों पर काम करते हैं।

उदाहरण के लिए, एक आयताकार क्षेत्र को चिह्नित करने के बाद,

C-x r o आयताकार क्षेत्र (दाईं ओर प्रभावी रूप से शिफ्टिंग कोड) भरने के लिए रिक्त स्थान सम्मिलित करता है

C-x r k आयताकार क्षेत्र को मारता है (प्रभावी रूप से बाईं ओर कोड शिफ्ट करता है)

C-x r tआयत को बदलने के लिए स्ट्रिंग के लिए संकेत देता है। दर्ज करने के C-u 8 <space>बाद 8 रिक्त स्थान दर्ज होंगे।

पुनश्च। उबंटू के साथ, सभी .py फाइलों के लिए पाइथन-मोड को डिफ़ॉल्ट मोड बनाने के लिए, बस python-modeपैकेज को स्थापित करें ।


धन्यवाद जो पूरी तरह से काम करता है। Emacs22 के साथ अजगर-मोड स्वचालित रूप से सभी .py फ़ाइलों के साथ सक्षम नहीं है? वैसे भी, Cc> ठीक काम करता है।
वर्नोन

@ वेर्नॉन: C-c >अजगर-मोड में परिभाषित किया गया है। इसलिए, मुझे लगता है कि आपने python-modeपैकेज को रास्ते में कहीं स्थापित किया होगा । खुशी है कि यह आपके लिए काम करता है।
unutbu

1
Cc> काम करता है ठीक है 23.2 Emacs में बिना python- मोड को स्थापित करने के साथ यह दिए गए python.el के साथ काम करता है
Codeasone

@landstatic: जानकारी के लिए धन्यवाद। इससे मुझे लगता है कि शायद ऊपर सूचीबद्ध सभी कमांड अजगर-मोड के लिए समान हैं। python.el?
अनटुबु २ un

2
@redobot: C-c C-lऔर C-c C-rआपके द्वारा खुद को सेट किए जाने वाले कस्टम बाइंडिंग होने चाहिए। यदि आप emacs -q(init फ़ाइल को लोड किए बिना emacs चलाने के लिए) आप देखेंगे कि पायथन मोड में C-c C-lया उसके लिए कोई बंधन नहीं C-c C-rहै।
अनटुब

9

के अतिरिक्त indent-region , जो C-M-\डिफ़ॉल्ट रूप से मैप किया जाता है, आयत संपादित कमांड पाइथन के लिए बहुत उपयोगी होते हैं। क्षेत्र को सामान्य के रूप में चिह्नित करें, फिर:

  • C-x r t( string-rectangle): आपको उन वर्णों के लिए संकेत देगा जिन्हें आप प्रत्येक पंक्ति में सम्मिलित करना चाहते हैं; एक निश्चित संख्या में रिक्त स्थान डालने के लिए बहुत अच्छा है
  • C-x r k( kill-rectangle): एक आयत क्षेत्र को हटा दें; इंडेंटेशन को दूर करने के लिए बहुत अच्छा है

आप भी कर सकते हैं C-x r y( yank-rectangle), लेकिन यह केवल शायद ही कभी उपयोगी है।


4

indent-regionको मैप किया C-M-\चाल करना चाहिए।


3
यह भयानक सलाह है। पायथन इंडेंटेशन का अनुमान नहीं लगाया जा सकता है (क्योंकि यह वाक्यविन्यास है!) इसलिए पहचान-क्षेत्र बेकार है।
सैम क्लियरमैन

1

मैं इस फ़ंक्शन का उपयोग अपने इंडेंटिंग और अनइंडेंटिंग को संभालने के लिए कर रहा हूं:

(defun unindent-dwim (&optional count-arg)
  "Keeps relative spacing in the region.  Unindents to the next multiple of the current tab-width"
  (interactive)
  (let ((deactivate-mark nil)
        (beg (or (and mark-active (region-beginning)) (line-beginning-position)))
        (end (or (and mark-active (region-end)) (line-end-position)))
        (min-indentation)
        (count (or count-arg 1)))
    (save-excursion
      (goto-char beg)
      (while (< (point) end)
        (add-to-list 'min-indentation (current-indentation))
        (forward-line)))
    (if (< 0 count)
        (if (not (< 0 (apply 'min min-indentation)))
            (error "Can't indent any more.  Try `indent-rigidly` with a negative arg.")))
    (if (> 0 count)
        (indent-rigidly beg end (* (- 0 tab-width) count))
      (let (
            (indent-amount
             (apply 'min (mapcar (lambda (x) (- 0 (mod x tab-width))) min-indentation))))
        (indent-rigidly beg end (or
                                 (and (< indent-amount 0) indent-amount)
                                 (* (or count 1) (- 0 tab-width))))))))

और फिर मैं इसे एक कीबोर्ड शॉर्टकट को सौंपता हूं:

(global-set-key (kbd "s-[") 'unindent-dwim)
(global-set-key (kbd "s-]") (lambda () (interactive) (unindent-dwim -1)))

1

मैं एक Emacs newb हूं, इसलिए यह जवाब शायद बेकार की सीमा है।

अब तक उल्लेख किए गए उत्तरों में से कोई भी जैसे dictया शाब्दिक के पुन: इंडेंटेशन को कवर नहीं करता है list। उदाहरण के लिए, यदि आपने निम्नलिखित शाब्दिक को काट-छाँट किया है, तो आपको मदद करने के लिए ईजी M-x indent-regionया M-x python-indent-shift-rightकंपनी मदद नहीं करने वाली है:

    foo = {
  'bar' : [
     1,
    2,
        3 ],
      'baz' : {
     'asdf' : {
        'banana' : 1,
        'apple' : 2 } } }

ऐसा लगता है कि M-x indent-regionसमझदारी से कुछ करना चाहिए python-mode, लेकिन यह मामला अभी तक नहीं है।

उस विशिष्ट मामले के लिए जहां आपके शाब्दिक रूप से ब्रैकेट बनाए गए हैं, प्रश्न में लाइनों पर TAB का उपयोग करने से आपको जो चाहिए वह मिलता है (क्योंकि व्हॉट्सएप एक भूमिका नहीं निभाता है)।

तो मैं ऐसे मामलों में क्या कर रहा हूं, जल्दी से एक कीबोर्ड मैक्रो रिकॉर्ड कर रहा है जैसे <f3> C-n TAB <f4>कि F3, Ctrl-n (या नीचे तीर), TAB, F4, और फिर मैक्रो को लागू करने के लिए F4 का बार-बार उपयोग करने से कीस्ट्रोक्स के एक जोड़े को बचाया जा सकता है। या आप C-u 10 C-x eइसे 10 बार लगाने के लिए कर सकते हैं ।

(मुझे पता है कि यह बहुत अधिक ध्वनि नहीं करता है, लेकिन नीचे-तीर को गायब किए बिना कचरा शाब्दिक की 100 पंक्तियों को फिर से इंडेंट करने की कोशिश करें, और फिर 5 पंक्तियों को ऊपर जाना और चीजों को दोहराना;))।


1

मैं निम्नलिखित स्निपेट का उपयोग करता हूं। टैब पर जब चयन निष्क्रिय होता है, तो यह वर्तमान लाइन को इंडेंट करता है (जैसा कि सामान्य रूप से होता है); जब चयन निष्क्रिय होता है, तो यह पूरे क्षेत्र को दाईं ओर संकेत करता है।

(defun my-python-tab-command (&optional _)
  "If the region is active, shift to the right; otherwise, indent current line."
  (interactive)
  (if (not (region-active-p))
      (indent-for-tab-command)
    (let ((lo (min (region-beginning) (region-end)))
          (hi (max (region-beginning) (region-end))))
      (goto-char lo)
      (beginning-of-line)
      (set-mark (point))
      (goto-char hi)
      (end-of-line)
      (python-indent-shift-right (mark) (point)))))
(define-key python-mode-map [remap indent-for-tab-command] 'my-python-tab-command)

1

अंतःक्रियात्मक रूप से इंडेंटेशन करें।

  1. इंडेंट किए जाने वाले क्षेत्र का चयन करें।
  2. Cx TAB
  3. अंतःक्रियात्मक रूप से इंडेंट करने के लिए तीर ( <-और ->) का उपयोग करें ।
  4. Escतीन बार दबाएं जब आपको आवश्यक इंडेंटेशन के साथ किया जाता है।

मेरे पद से कॉपी किया गया: Emacs में कई पंक्तियों को इंडेंट करें


-2

मैं सार्वभौमिक रूप से ऐसा कुछ करता हूं

;; intent whole buffer 
(defun iwb ()
  "indent whole buffer"
  (interactive)
  ;;(delete-trailing-whitespace)
  (indent-region (point-min) (point-max) nil)
  (untabify (point-min) (point-max)))

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