2010-08-04 14 views
8

अक्सर मैं एक रूबी प्रतीक परिभाषित करता हूं (उदाहरण के लिए :some_value), तो मैं उसी नाम def some_value के साथ एक विधि बनाना चाहता हूं।Emacs रूबी प्रतीक शब्द पूर्णता

दुर्भाग्य से, स्वतः पूर्ण (M + /) some_value स्ट्रिंग की दूसरी घटना के लिए काम नहीं करता है, थोड़ा अलग (:some_value बनाम some_value) किया जा रहा है।

मैं ऐसी घटनाओं को संभालने के लिए emacs कैसे सेट कर सकता हूं?

+1

आपके लिए एम/मैप किया गया है वास्तव में क्या है? यदि यह dabbrev-expand है, तो dabbrev-abbrev-char-regexp के लिए आपका क्या मूल्य है? –

+1

0x4b की तरह कहते हैं, हमें और जानकारी चाहिए। आप किस रूबी मोड का उपयोग कर रहे हैं? RubyMode? MuMaMo-मोड? FWIW, dabbrev मेरे लिए बस ठीक है जब स्ट्रिंग की एकमात्र अन्य घटना ': some_value' है। –

+0

मैं मूल रूबी-मोड का उपयोग कर रहा हूं। मैंने एम -/क्या नहीं बदला है। हालांकि मैं किस मोड का उपयोग कर रहा हूं वह काफी अप्रासंगिक है। यह बिना किसी मोड के 'स्क्रैच' बफर में काम नहीं करता है। – vise

उत्तर

7

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

M-x customize-group 

बनाने के लिए और फिर

dabbrev 

यह dabbrev-मोड के लिए अनुकूलन पृष्ठ पर ले जाएगा। बिंदु पर जाएं Dabbrev Abbrev प्रमुख Regexp छोड़ें और Value menu पर क्लिक करें। मेनू से, "Regexp" चुनें।

अब आप एक मेनू कॉलम के आगे "Regexp:" लेबल वाले टेक्स्टफील्ड को देखते हैं जिसमें आप एक कोलन दर्ज करते हैं।

: 

फिर अगली पंक्ति में बटन State पर क्लिक करें और मूल्य "भविष्य सत्र के लिए सहेजें" चुनें।

+0

धन्यवाद, यह वही है जो मैं ढूंढ रहा था! – vise

+0

ग्रेट टिप! मैंने इसे केवल रूबी और क्लोजर मोड में सक्षम करने के लिए बढ़ाया: https://gist.github.com/shepmaster/10877484 – Shepmaster

1

आपके प्रश्न का सीधा जवाब नहीं है, लेकिन आपको auto complete mode का उपयोग करके rsense के साथ जोड़ा गया अधिक बुद्धिमान रूबी स्वत: पूर्णता प्राप्त करनी चाहिए।

+0

धन्यवाद, मैंने इंस्टॉल नहीं किया है लेकिन rsense बहुत प्यारी लग रही है। – vise

2

सबसे पहले, मेरे परिणाम! मैंने अपने मॉडल में :some_crazy_symbol टाइप किया। एक नई पंक्ति पर, मैं def so टाइप किया, M-/ दो बार मारा, और (Rinari end की आपूर्ति की।)

मैं इस बहुत अच्छी तरह से hippie-expand का उपयोग करके काम मिल गया

def some_crazy_symbol 
end 

साथ समाप्त हो गया। आप इसे बाहर परीक्षण करना चाहते हैं, तो जैसे M-/ को hippie-expand बाँध:

(global-set-key (kbd "M-/") 'hippie-expand) 

यहाँ 'documentation। हिप्पी वर्तमान बिंदु पर कई अलग-अलग विस्तारों को आजमाकर कामों का विस्तार करता है। ये विस्तार hippie-expand-try-functions-list चर में संग्रहीत हैं। अपने सिस्टम पर (और डिफ़ॉल्ट), इस चर के लिए सेट है:

(try-complete-file-name-partially try-complete-file-name try-expand-all-abbrevs try-expand-list try-expand-line try-expand-dabbrev try-expand-dabbrev-all-buffers try-expand-dabbrev-from-kill try-complete-lisp-symbol-partially try-complete-lisp-symbol)

minibuffer रीडआउट पता चला है कि इस विशेष विस्तार try-expand-dabbrev समारोह का उपयोग कर पूरा किया गया।

1

Dabbrev संक्षिप्त रूप छोड़ें अग्रणी Regexp और hippie-expand नहीं करता है वास्तव में क्या आप चाहते हैं और आप कुछ elisp कौशल भी होते हैं, तो आप hippie-expand के लिए एक कस्टम समारोह बना सकते हैं।

hippie-expand पर emacs-wiki पर पृष्ठ "substring expansion" के बारे में अनुभाग देखें। वहाँ एक समारोह तुम वहाँ इस्तेमाल कर सकते हैं आप अनुकूलित करने के लिए संशोधित कर सकते हैं ..

Substring Expansion

जब कर तुतलाना प्रोग्रामिंग मानक dabbrev कम उपयोगी है, क्योंकि Emacs एक पैकेज प्रतीकों के साथ शुरू करने में कोई नामस्थान, इसलिए है वही उपसर्ग, इसलिए एक ही उपसर्ग को बार-बार टाइप करना होगा यदि कोई पैकेज से प्रतीकों को पूरा करना चाहता है। IswitchBuffers के साथ यह वांछित प्रतीक प्राप्त करने के लिए एक अद्वितीय सबस्ट्रिंग टाइप किया जा सकता है, यह अधिक प्रभावी है।

डैब्रेब इस संबंध में कुछ भी नहीं प्रदान करता है, इसलिए मैं हिप्पी एक्सपैंड में बदल गया जिसे मैंने पहले कभी नहीं उपयोग किया था।

(defun try-my-dabbrev-substring (old) 
    (let ((old-fun (symbol-function 'he-dabbrev-search))) 
    (fset 'he-dabbrev-search (symbol-function 'my-dabbrev-substring-search)) 
    (unwind-protect 
     (try-expand-dabbrev old) 
     (fset 'he-dabbrev-search old-fun)))) 


(defun my-dabbrev-substring-search (pattern &optional reverse limit) 
    (let ((result()) 
    (regpat (cond ((not hippie-expand-dabbrev-as-symbol) 
       (concat (regexp-quote pattern) "\\sw+")) 
       ((eq (char-syntax (aref pattern 0)) ?_) 
       (concat (regexp-quote pattern) "\\(\\sw\\|\\s_\\)+")) 
       (t 
       (concat (regexp-quote pattern) 
        "\\(\\sw\\|\\s_\\)+"))))) 
    (while (and (not result) 
     (if reverse 
      (re-search-backward regpat limit t) 
      (re-search-forward regpat limit t))) 
     (setq result (buffer-substring-no-properties (save-excursion 
                (goto-char (match-beginning 0)) 
                (skip-syntax-backward "w_") 
                (point)) 
          (match-end 0))) 
     (if (he-string-member result he-tried-table t) 
     (setq result nil)))  ; ignore if bad prefix or already in table 
    result)) 
1

मैं लगा रहा solution I came up with that works for hippie-expand का हिस्सा चाहते हैं:

यहाँ एक समारोह हिप्पी के आधार पर dabbrev विस्तार जो विस्तार सबस्ट्रिंग निष्पादित करता है का विस्तार है।

संक्षेप में:

(defun hippie-expand-ruby-symbols (orig-fun &rest args) 
    (if (eq major-mode 'ruby-mode) 
     (let ((table (make-syntax-table ruby-mode-syntax-table))) 
     (modify-syntax-entry ?: "." table) 
     (with-syntax-table table (apply orig-fun args))) 
    (apply orig-fun args))) 

(advice-add 'hippie-expand :around #'hippie-expand-ruby-symbols) 

hippie-expandruby-mode में प्रतीकों का विस्तार होगा जब : एक विराम वर्ण माना जाता है, तो यह सलाह एक अस्थायी वाक्य रचना तालिका जहां : एक विराम वर्ण है और इसके साथ hippie-expand कॉल बनाता है।

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