Emacs में कोड तह प्रभाव कैसे प्राप्त करें?


123

कोड तह, या ऑर्ग-मोड का उपयोग करने वाले साइकिल के प्रकार को प्राप्त करने का सबसे अच्छा तरीका है। इस प्रकार का व्यवहार बनाने के लिए सबसे अच्छा समाधान क्या होगा?

संपादित करें: मुझे क्षमा करें मैं स्पष्ट नहीं था। मैं elisp में कुछ प्रोग्राम करना चाहता हूं जो चीजों को कोड फोल्डिंग के समान करता है, या वास्तव में सबसे अधिक ओआर-मोड जैसे पदानुक्रम के साथ विस्तारित किया जा सकता है। मैं इस प्रभाव को प्राप्त करने का सबसे अच्छा तरीका सोच रहा हूं। मुझे लगता है कि मैंने सुना है emacs ओवरले एक अच्छा समाधान है, लेकिन मुझे नहीं पता।

जहाँ तक तह मैं सिर्फ बिल्टिन सेट-सेलेक्टिव-डिस्प्ले का उपयोग करता हूँ

संपादित करें नंबर 2:

उत्तर के लिए धन्यवाद, लेकिन मुझे लगता है कि मैं गलत सवाल पूछ रहा हूं, इसलिए मुझे उस पर अधिक स्पष्ट होने की कोशिश करें जो मैं करने की कोशिश कर रहा हूं। मैं निम्नलिखित बनाना चाहूंगा

जब आप किसी फ़ंक्शन पर अपनी बात रखते हैं और इस विशिष्ट फ़ंक्शन को कॉल करते हैं, तो यह फ़ंक्शन की परिभाषा को जहाँ से भी है (मैं इसके लिए खोज-टैग का उपयोग करने के बारे में सोच रहा हूँ) डालूँगा और इसे वर्तमान बफ़र में प्रकट करूँगा। विचार यह है कि यदि आप फ़ंक्शन परिभाषा को पढ़ने के लिए एक अलग बफर पर कूदते हैं, तो मुझे लगता है कि इसके संदर्भ को किसी अन्य फ़ाइल पर स्विच करना है। इसलिए मैं इसे कोड फोल्डिंग की तरह व्यवहार करना चाहूंगा, यह केवल बफर से कोड बाहरी में खींचता है। यह कुछ समस्याओं को प्रस्तुत करता है क्योंकि यह कोड को बफर में एक्यूट पेस्ट नहीं कर सकता है या यदि कोई इसे बचाता है तो यह कोड में खींचे गए को बचाएगा। इसलिए मैं सोच रहा हूं कि क्या बफर के अंदर एक क्षेत्र बनाने का कोई तरीका है जो बफर का हिस्सा भी नहीं है। मुझे लगता है कि समझ में आता है।


आप किसी ऐसी चीज की तलाश कर रहे हैं, जब आप इसे किसी फ़ंक्शन के बिंदु से कॉल करते हैं, तो यह फ़ंक्शन की परिभाषा में कूदता है? एक विशिष्ट समारोह के बारे में सहायता प्राप्त करने की तरह आप को क्विज़ कोड में कूदने देंगे? मुझे नहीं लगता कि आप "द प्रोजेक्ट" की कुछ अवधारणा के बिना ऐसा कर सकते हैं। उदाहरण के लिए, आप यह कैसे जानेंगे कि आप किस "स्वैप" फंक्शन में जाना चाहते हैं?
ब्रायन पोस्टो

1
इसे भी देखें: stackoverflow.com/questions/382781/… जहाँ चयनात्मक-प्रदर्शन को कुछ तह जैसे प्रभावों के लिए थोड़ा मोड़ दिया जाता है।
माइकल पॉलुकोनिस

मेरा सुझाव है कि आप इसे हटा दें EDIT NB 2और इसके लिए एक नया प्रश्न बनाएं।
स्टीफन

जवाबों:


151

तह आम तौर पर emacs के साथ अनावश्यक है, क्योंकि इसमें ऐसे उपकरण हैं जो कोड को तह करते समय लोगों द्वारा मैन्युअल रूप से किए जाने वाले कार्यों को स्पष्ट रूप से लागू करते हैं।

ज्यादातर लोगों को साधारण वृद्धिशील खोजों से अच्छी सफलता मिलती है। देखें "फू" का उल्लेख कहीं? टाइप करें C-sfoo, परिभाषा खोजें, एंटर दबाएं, इसे पढ़ें, और फिर C-x C-xजहां आप थे वहां वापस जाने के लिए दबाएं । सरल और बहुत उपयोगी है।

अधिकांश मोड imenu का समर्थन करते हैंM-ximenuआपको नाम से एक फ़ंक्शन परिभाषा (आदि) में कूदने देगा। आप इसे फ़ंक्शन के एक मेनू को प्राप्त करने के लिए माउस क्लिक पर भी बाँध सकते हैं (या इसे मेनूबार में जोड़ सकते हैं; अधिक विस्तार के लिए जानकारी पृष्ठ देखें)। यह किस फ़ंक्शन-मोड के लिए डेटा प्रदान करता है, जो आपको यह देखने देगा कि आप वर्तमान में कौन से फ़ंक्शन मॉडल में हैं। (आपके कार्य इस समय क्यों हैं, हालांकि?)

वहाँ भी है speedbar जो imenu जानकारी (और अन्य चीजों) रेखांकन प्रदर्शित करता है,।

यदि आप अपनी फ़ाइल का अवलोकन प्राप्त करना चाहते हैं, तो कोशिश करें M-xoccur"। एक रेग्ज को देखते हुए, यह वर्तमान बफ़र में प्रत्येक मैच के साथ एक नया बफर बनाएगा। आप वर्तमान फ़ाइल के फ़ंक्शंस का अवलोकन प्राप्त करने के लिए" (अशुद्ध) खोज सकते हैं। लागू करता है। परिणाम पर क्लिक करने से आप फ़ाइल में उस स्थिति में पहुँच जाएंगे।

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


13
विम इन सभी विशेषताओं को एक या दूसरे रूप में भी प्रदान करता है लेकिन मुझे अभी भी इसकी कोड तह सुविधा अमूल्य लगती है।
intuited

115
मैंने पहले वाक्य के लिए मतदान किया ("तह आम तौर पर एमएसीएस के साथ अनावश्यक है, जैसा कि ...")। अपरिचित कोड की संरचना को स्कैन करने के लिए मैं सरल तह (इंडेंट स्तर पर आधारित) का उपयोग करता हूं।
साइमन माइकल

4
Ms o Mx होने का शॉर्टकट है
यहोशू ओल्सन

3
मैंने मतदान किया क्योंकि उत्तर में कई उपयोगी शॉर्टकट हैं लेकिन साथ ही मतदान @SimonMichael टिप्पणी भी है क्योंकि गुना / अनफिल्ड अभी भी कभी-कभी उपयोगी हो सकता है!
एड्रिएन कोक्वियो

56
जवाब अच्छी तरह से सोचा और बहुत जानकारीपूर्ण था। हालांकि, ओपी ने कोड फोल्डिंग करने का तरीका पूछा। ओपी ने यह नहीं पूछा कि कोड तह से बचने का सभी का पसंदीदा तरीका क्या था। नीचे मतदान हुआ।
११

104

तह ( ) को ट्रिगर करने के लिए hs-minor-modeडिफ़ॉल्ट कीबाइंडिंग के साथ छुपा-शो मोड C-c @ C-M-h( hs-hide-all)


12
यह अच्छा काम करता है। और बुराई-मोड के साथ, यह सामान्य vim आदेशों से शुरू हो रहा है: zR, zM, zo, zc
जस्टिन एम। कीज़

39

बिल्ली की त्वचा का दूसरा तरीका:

जैसा कि होता है, आपको उसके लिए किसी पैकेज या अतिरिक्त कॉन्फ़िगरेशन की आवश्यकता नहीं है। बस किसी भी स्रोत फ़ाइल पर जाएं, टाइप करें

M-1 Cx $ और जादू होता है!

हमेशा की तरह, यह सफेद जादू है: Cx $ आपके कोड को वापस लाएगा।

हम एमएसीएस की सहायता प्रणाली का उपयोग करके पता लगा सकते हैं कि क्या चल रहा है: Ch k Cx $ हमें बताता है कि उपरोक्त कुंजी संयोजन सेट-सेलेक्टिव-डिस्प्ले कह रहा है , एक फ़ंक्शन जो एक संख्यात्मक तर्क लेता है (एम -1 उपसर्ग 1 मान के रूप में 1) उस तर्क के) और, अनजाने में, उस तर्क के मूल्य के लिए चर चयनात्मक-प्रदर्शन सेट करता है।

से नाबालिग Emacs wizardry ब्लॉग

बस पूर्णता के लिए: M-3 Cx $ गहरा नेस्टेड कोड और इतने पर दिखाएगा।

FWIW I ने स्मथ के आधार पर आज एक छोटा सहायक बनाया। यहाँ पाया गया कि वर्तमान कर्सर स्थिति के आधार पर F5 टॉगल कोड फोल्डिंग:

(global-set-key (kbd "<f5>") 'set-selective-display-dlw)

(defun set-selective-display-dlw (&optional level)
"Fold text indented same of more than the cursor.
If level is set, set the indent level to LEVEL.
If 'selective-display' is already set to LEVEL, clicking
F5 again will unset 'selective-display' by setting it to 0."
  (interactive "P")
  (if (eq selective-display (1+ (current-column)))
      (set-selective-display 0)
    (set-selective-display (or level (1+ (current-column))))))

22

मैं अपने अजगर कोड को मोड़ने के लिए आउटलाइन माइनर मोड का उपयोग करता हूं। फोल्डिंग मोड में {{{और}}} जगह की आवश्यकता के बजाय, यह ब्लॉक को परिभाषित करने के लिए उपयोग करता है।

http://www.gnu.org/software/emacs/manual/html_node/emacs/Outline-Mode.html http://www.emacswiki.org/emacs/OutlineMinorMode

मुझे पूरा यकीन है कि यह emacs के साथ आता है। मैं फिर इसे अपने .emacs में जोड़ता हूं

;;======= Code folding =======
(add-hook 'python-mode-hook 'my-python-outline-hook)
; this gets called by outline to deteremine the level. Just use the length of the whitespace
(defun py-outline-level ()
  (let (buffer-invisibility-spec)
    (save-excursion
      (skip-chars-forward "    ")
      (current-column))))
; this get called after python mode is enabled
(defun my-python-outline-hook ()
  ; outline uses this regexp to find headers. I match lines with no indent and indented "class"
  ; and "def" lines.
  (setq outline-regexp "[^ \t]\\|[ \t]*\\(def\\|class\\) ")
  ; enable our level computation
  (setq outline-level 'py-outline-level)
  ; do not use their \C-c@ prefix, too hard to type. Note this overides some bindings.
  (setq outline-minor-mode-prefix "\C-t")
  ; turn on outline mode
  (outline-minor-mode t)
  ; initially hide all but the headers
  ;(hide-body)
  ; make paren matches visible
  (show-paren-mode 1)
)

8
लगता है कि outline-modeइमैक 24 में अजगर आउट-ऑफ-द-बॉक्स का समर्थन करता है - कस्टम outline-levelकार्यों की कोई आवश्यकता नहीं है । यह सब मैं अपने को जोड़ने के लिए की जरूरत है user.el:(add-hook 'python-mode-hook 'outline-minor-mode)
scytale

1
ओह और आप निश्चित रूप से ओवरराइड करना चाहते हैं outline-minor-mode-prefix- डिफ़ॉल्ट कीबाइंडिंग भयानक कर रहे हैं - मैं का उपयोग(setq outline-minor-mode-prefix (kbd "C-;"))
scytale

13

आप कोड फ़ाइल के साथ CEDET का उपयोग करके कोड तह भी प्राप्त कर सकते हैं:

(global-semantic-folding-mode t)

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


1
अगर कुछ बग का सामना करना पड़ रहा है, तो इस सवाल पर एक नज़र डालें: stackoverflow.com/questions/15307113/…
AdrieanKhisbe

9

hs-minor-mode खूबसूरती से काम करता है।

फोल्ड-डविम (मुझे क्या मतलब है) के साथ जोड़े जाने पर यह और भी खूबसूरती से काम करता है। उसके बाद फोल्ड-डीविम-ऑर्ग होता है, जो कोड फोल्डिंग के लिए की-बाइंडिंग जैसे ऑर्ग-मोड प्रदान करता है! दोनों को मुरब्बा (और मुझे लगता है कि कल्प) के माध्यम से स्थापित किया जा सकता है।



5

vimish-fold एक अच्छा और आसान उपाय भी है।

https://github.com/mrkkrp/vimish-fold

मुखपृष्ठ से:

यह Vim की तरह टेक्स्ट फोल्डिंग करने के लिए एक पैकेज है। इसकी निम्नलिखित विशेषताएं हैं:

  • सक्रिय क्षेत्रों की तह;
  • अच्छी दृश्य प्रतिक्रिया: यह स्पष्ट है कि पाठ का कौन सा भाग मुड़ा हुआ है;
  • डिफ़ॉल्ट रूप से दृढ़ता: जब आप फ़ाइल बंद करते हैं तो आपके फोल्ड गायब नहीं होते हैं;
  • दृढ़ता अच्छी तरह से तराजू, आप प्रतिकूल प्रभाव के बिना कई गुना के साथ सैकड़ों फाइलों पर काम कर सकते हैं;
  • यह इंडेंटेशन या कुछ और नहीं तोड़ता है;
  • सिलवटों को गुना राज्य से प्रकट किया जा सकता है और बहुत आसानी से वापस किया जा सकता है;
  • मौजूदा तह के बीच त्वरित नेविगेशन;
  • आप सिलवटों के लिए माउस का उपयोग कर सकते हैं (शुरुआती के लिए अच्छा है और न केवल उनके लिए);
  • एवी पैकेज के प्रशंसकों के लिए: आप टेक्स्ट को फोल्ड करने के लिए कम से कम कुंजी स्ट्रोक के साथ एवी का उपयोग कर सकते हैं!

use-packageमेरे द्वारा इस उत्कृष्ट स्निपेट का उपयोग करके इसे अपने विन्यास में स्थापित करने और इसे सक्रिय करने के लिए:

(use-package vimish-fold
  :ensure t
  :config (vimish-fold-global-mode t))

3

मुझे आश्चर्य है कि किसी ने संकीर्णता-विस्तार का उल्लेख नहीं किया। यह शानदार है, यह emacs के साथ भी बंडल आता है। बस उस कोड का चयन करें जिस पर आप ध्यान केंद्रित करना चाहते हैं और दबाएं C-x n n, पूर्ण दृश्य मोड पर वापस जाने के लिए बस करें C-x n w। मैं हमेशा एक और पैकेज के साथ अपने उपयोगकर्ता स्थान को अव्यवस्थित करने की तुलना में अंतर्निहित एमएसीएस कार्यक्षमता का उपयोग करना पसंद करता हूं। अगर एमएसीएस इसे अंतर्निहित कार्यक्षमता के साथ कर सकते हैं तो मैं पसंद करूंगा कि कुछ तीसरे पक्ष के पैकेज पर, लेकिन यह सिर्फ मेरे लिए है, इसका मतलब यह नहीं है या इसके अलावा कुछ भी नहीं है और इसके अलावा मुझे जटिल लंबे कॉन्फ़िगरेशन पर सरल सामान पसंद है।



2

मेरा मानना ​​है कि तह करने के लिए आपके "प्रोजेक्ट" की तुलना करना काफी अच्छा नहीं है, क्योंकि बफर सामग्री (टेक्स्ट) को बरकरार रखते हुए फोल्डिंग उपस्थिति को बदलने के बारे में है। आपकी परियोजना में बफर सामग्री को बरकरार रखते हुए अतिरिक्त पाठ दिखाना शामिल होगा, AFAIU। इसलिए। यह पाठ-सम्मिलन और तह की संरचना के रूप में लागू करने योग्य नहीं है (फिर, बफर सामग्री को बदल दिया जाएगा)।

लेकिन शायद, यह वास्तव में एक ही तंत्र के साथ संभव है जैसा कि तह के साथ किया जाता है - "ओवरले" ... "पहले-स्ट्रिंग" और "आफ्टर-स्ट्रिंग" ओवरले गुणों पर विचार करें ; शायद, आप अपनी फ़ंक्शन परिभाषाओं को बिंदु पर एक शून्य-लंबाई ओवरले से संबंधित इन तारों में डाल सकते हैं। को देखो रूपरेखा-झंडा क्षेत्र समारोह को देखने के लिए कैसे ओवरले रूपरेखा मोड में उपयोग किया जाता है।


2

यदि आप उपयोग करते हैं hs-minor-mode, तो अधिक सुविधाजनक शॉर्टकट सेट करना भी एक अच्छा विचार हो सकता है, जैसे:

(eval-after-load 'hideshow
 '(progn
   (global-set-key (kbd "C-+") 'hs-toggle-hiding)))

0

EinSelbst के उत्तर से प्रेरणा के साथ :

(सलाह-ऐड ’सेट-सेलेक्टिव-डिस्प्ले
            : फ़िल्टर-आर्ग्स (लैम्ब्डा (आर्ग्स)
                           (यदि (या (कार args) चयनात्मक-प्रदर्शन)
                               आर्ग
                             (सूची (1+ (वर्तमान-स्तंभ))))
            '(नाम। सेट-चयनात्मक-प्रदर्शन-से-कर्सर-स्तंभ)))

देखा, C-x $अचानक किसी भी बिना उपयोगी बन गया C-uहै और न ही M-4व्यापार।


0

यदि आप कुछ जावास्क्रिप्ट और उपयोग कर रहे हैं js2-mode.el, तो आप कर सकते हैं:

C-c C-f: टॉगल छिपाने / सभी दिखाएँ

C-c C-e: तत्व छिपाएँ

C-c C-s: तत्व दिखाओ

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