2013-06-15 6 views
5

स्नैकमेक एक पायथन की तरह प्रतिस्थापन है जो कि संकलन की तुलना में वर्कफ़्लो की दिशा में अधिक तैयार है। यह काफी अच्छा है, लेकिन यह भी काफी नया है, और मुझे Emacs में इसके लिए एक मोड नहीं मिल रहा है। मैं सिर्फ बहुत ही सरल कुछ चाहते हैं: मौलिक मोड से एक बहुत ही मामूली संशोधन, इसलिए Emacs मैनुअल ध्यानपूर्वक पढ़ने में मैं, मैं init.el में निम्नलिखित शुरू कर दिया:emacs मोड?

(define-derived-mode snake-mode fundamental-mode 
    ... 
) 

मेकअप की तरह, snakemake इंडेंट के बारे में सख्त (वास्तविक है टैब "\ t" वर्ण, एक प्रकार के टैब पर डिफ़ॉल्ट रूप से emacs कैसे व्यवहार करता है)। जब मैं इसके बजाय "सी-क्यू टैब" टाइप करता हूं तो यह बफर में एक असली टैब कैरेक्टर रखता है: यह काम करता है, मैंने इसे मौलिक मोड में एक सांपफाइल के साथ करने की कोशिश की और यह पूरी तरह से चलता है। तो प्रत्येक बार जब मैं इस मोड में एक टैब चाहता हूं, तो "सी-क्यू टैब" टाइप करने से बचने के लिए, पहला जोड़ा मैं सांप-मोड में बनाना चाहता हूं, "सी-क्यू टैब" (या ऐसा कुछ) करने के लिए टैब कुंजी को पुन: स्थापित करना है। इसलिए मैं Emacs पुस्तिका अवलोकन और करने की कोशिश की:

(define-derived-mode snake-mode fundamental-mode 
    (global-set-key (kbd "\t") (kbd "C-q \t")) 
    ... 
) 

लेकिन इस और अन्य विकल्प काम नहीं कर रहे ... शायद एक सिफारिश अभ्यास टैब कुंजी की तरह मानक कुंजी rebinding नहीं है?

साँप-मोड मैं चाहूँगा करने के लिए अन्य अलावा यह अजगर के अनुसार वाक्य रचना को उजागर करने के लिए (लेकिन नहीं किसी भी अजगर व्यवहार, जैसे, अजगर इंडेंट व्यवहार है)

निष्कर्ष निकाल लिए, बस इन 2 है "सांप-मोड" बनाने में मौलिक मोड में सरल संशोधन और स्नैप-मोड का आह्वान करने का एक तरीका यदि फ़ाइल नाम "सांपफाइल" था, तो मैं सब कुछ ढूंढ रहा था, लेकिन मैंने पहले से ही इमैक मैनुअल को समझने में कई घंटे बिताए हैं और कुछ googling कर रहा है, और ऐसा लगता है कि मैं भी करीब नहीं हूँ। यह इतना आसान है, और मुझे पूरा यकीन है कि यह संभव है; कोई सलाह?

धन्यवाद

मरे

उत्तर

4

निम्नलिखित (कुछ हद तक सुरुचिपूर्ण, मुझे लगता है ... कम से कम यह छोटा है) kludge अब के लिए चाल है। यह वास्तव में दो चीजें करता है जो मैं पूछ रहा था, यानी, (1) टैब कुंजी (एक अच्छी तरह से) को दोबारा जोड़ता है, और (2) पाइथन के अनुसार सिंटैक्स हाइलाइटिंग करता है (साथ ही यह केवल इस मोड में जाता है जब फ़ाइल को कॉल किया जाता है "Snakefile", जो अच्छा है), और इसलिए यह मेरे सवाल

; snake-mode 
(add-to-list 'auto-mode-alist '("Snakefile" . snake-mode)) 

(defun insert-tab() 
    (interactive) 
    (insert "  ")) ; a "real" tab, i.e., what "C-q \t" would give 

(define-minor-mode snake-mode 
    "Snakemake." 
    :lighter " snake-make" 
    (python-mode) 
    (setq indent-line-function 'insert-tab) 
) 

; how to hard-code "\t" to a "real" tab (not recommended) 
; (global-set-key "\t" `insert-tab) 

; end snake-mode 

जवाब देता है यह कैसे सुंदर है, है, मुझे यकीन है, ऊपर बहस के लिए। और यह केवल स्नैकमेक के लिए उचित मोड की यात्रा पर एक शुरुआत है (जो "नियम" और "आउटपुट:" इत्यादि जैसे स्नैकमेक विशिष्ट शब्दों के लिए हाइलाइट करता है)

+0

इस "समाधान" में एक छोटा सा परिशिष्ट: "डालने-टैब" फ़ंक्शन पहले से ही emacs में परिभाषित किया गया है, इसलिए किसी को (सांप-टैब() को रोकना चाहिए ... या कोई अन्य नाम जो पहले से नहीं है नामस्थान – user2489449

1

define-derived-mode मैक्रो स्वचालित रूप से मोड में परिभाषित करता है के नाम पर एक कीमैप प्रदान करता है। आप एक साथ उपयोग कर सकते हैं define-key साथ टैब कुंजी बनाने के लिए बस इस तरह एक टैब सम्मिलित करें:

(define-derived-mode snake-mode fundamental-mode "Snake" 
    "A mode for Python's snakemake." 
    (define-key snake-mode-map "\t" 'self-insert-command)) 

फिर, आप अपने मोड के खरोज तंत्र की स्थापना कर सकता है इतना है कि यह समझदारी से एक डालने से एक लाइन indents (सिंगल) जब भी उचित हो, लाइन की शुरुआत में टैब। इस तरह आपको टैब पर पुनर्विचार करने की आवश्यकता नहीं है, बेशक, बुद्धिमान इंडेंटेशन को सही ढंग से एक कुंजी को पुनर्निर्मित करने के बजाय इसे लागू करना बहुत मुश्किल है। अधिक जानकारी के लिए lunaryorn का जवाब देखें।

1

ऐसा मत करें। ऐसा नहीं है कि इंडेंटेशन को संभालने के लिए प्रमुख तरीके कैसे हैं। उन्हें कभी भी टीएबी को दोबारा नहीं देखना चाहिए, C-h v indent-line-function देखें:

वर्तमान पंक्ति को इंडेंट करने के लिए फ़ंक्शन। इस फ़ंक्शन को कोई तर्क नहीं दिया जाएगा। यदि इसे कहीं कहा जाता है जहां ऑटो इंडेंटेशन नहीं किया जा सकता है (उदा। स्ट्रिंग के अंदर), फ़ंक्शन को केवल 'नोइंडेंट' वापस करना चाहिए। इस फ़ंक्शन को सेट करना आपको टैब इंडेंट को उचित रूप से बनाने की ज़रूरत है। जब तक आपको वास्तव में आवश्यकता न हो तब तक टैब को दोबारा न करें।

यह वैसे भी काम नहीं करेगा, क्योंकि आप अन्य कुंजी बाइंडिंग में कुंजी बाइंडिंग को बाध्य नहीं कर सकते हैं।

इसके बजाय, अपने मोड समारोह में t को indent-tabs-mode निर्धारित करते हैं, खरोज के लिए Emacs उपयोग टैब वर्ण बनाने के लिए, और एक समारोह है कि इंडेंट उचित रूप से भाषा के नियमों के अनुसार करने के लिए सेट indent-line-function बफर-स्थानीय स्तर पर,। जाहिर है, आपको यह कार्य स्वयं लिखना होगा।

4

आपकी प्रार्थनाओं का उत्तर दिया गया है:

https://github.com/kyleam/snakemake-mode

मैं इससे बहुत खुश हूं।

melpa से snakemake-mode के रूप में प्राप्त किया जा सकता है।

संबंधित मुद्दे