2008-09-28 7 views
8

मैं एक इंटरेक्टिव फ़ंक्शन लिख रहा हूं जिसे मैं उपयोगकर्ता द्वारा प्रदान किए गए अंतिम तर्क को याद रखना चाहता हूं और इसे डिफ़ॉल्ट के रूप में उपयोग करना चाहता हूं।Emacs: आप उपयोगकर्ता द्वारा डिफ़ॉल्ट रूप से आपूर्ति किए गए अंतिम पैरामीटर को कैसे स्टोर करते हैं?

(defun run-rake (param) 
    (interactive "sTask: ") 
    (shell-command (format "rake %s" task))) 

पहली बार समारोह शुरू हो जाती है मैं इसे तर्क उपयोगकर्ता की आपूर्ति की ताकि अगली बार जब वे समारोह वे सिर्फ दबा सकते हैं आह्वान दर्ज करें और यह मूल्य वे पिछले समय की आपूर्ति का उपयोग करेगा याद रखना चाहते हैं।

मुझे प्रलेखन में यह प्रतीत नहीं होता है - आप इसे elisp में कैसे करते हैं?

उत्तर

5

आप देख सकते हैं कि compile आदेश करता है: यह सिर्फ अधिक कोड, और अधिक मार्गदर्शन की तुलना में यह होना चाहिए की तरह लगता है। C-h f compile के साथ संकलन कमांड के लिए सहायता टेक्स्ट लाएं, कर्सर को उस फ़ाइल के नाम पर ले जाएं जिसमें फ़ंक्शन है, फिर RETURN दबाएं। यह compile के लिए स्रोत फ़ाइल लाएगा।

असल में, एक गतिशील/वैश्विक चर compile-command है जो अंतिम संकलन आदेश रखता है। Emacs एक एकल उपयोगकर्ता, एकल थ्रेडेड सिस्टम है, इसलिए वास्तव में और अधिक की आवश्यकता नहीं है। यह भी ध्यान रखें कि एलिस्प एक बहुत पुराना स्कूल लिस्प है, और चर के पास गतिशील (कॉल स्टैक) है, न कि व्याख्यात्मक, गुंजाइश। ,

(let ((compile-command "gcc -o foo foo.c frobnicate.c")) 
    ... 
    (compile) 
    ...) 

compile आदेश की बात हो रही आप अपने खुद के run-rake समारोह के बजाय इसका उपयोग करने की कोशिश की है: इस प्रकार की प्रणाली में यह स्वाभाविक है?

0

मुझे पता चला कि इसे डिफवर (ग्लोबल) का उपयोग करके मैन्युअल रूप से कैसे किया जाए, लेकिन ऐसा लगता है कि कोर लाइब्रेरी (जैसे योजना के मेक-पैरामीटर) द्वारा पहले से ही प्रदान की जानी चाहिए।

(defvar *editconf-ruby-run-rake-last-rake-task* nil) 

(defun editconf-ruby-run-rake-last-rake-task (&optional new-val) 
    (when new-val 
    (setf *editconf-ruby-run-rake-last-rake-task* new-val)) 
    *editconf-ruby-run-rake-last-rake-task*) 

(defun editconf-ruby-run-rake (task-name) 
    "Execute rake `task-name'. See                        
`krb-ruby-get-rakefile-path-for-current-buffer' for how the                 
Rakefile is located.." 
    (interactive 
    (let* ((rakefile (krb-ruby-get-rakefile-path-for-current-buffer)) 
      (rake-tasks (krb-ruby-get-rake-tasks rakefile)) 
      (default-task (or (editconf-ruby-run-rake-last-rake-task) 
          (editconf-ruby-run-rake-last-rake-task (car rake-tasks))))) 
    (list 
     (read-string (format "Task [%s|%s]: " 
          rake-tasks 
          default-task) 
        nil nil default-task)))) 
    (editconf-ruby-run-rake-last-rake-task task-name) 
    (let ((cmd (format "cd %s; rake %s" 
        (krb-lisp-strip-path-suffix rakefile 1) 
        task-name))) 
    (message "editconf-ruby-run-rake: cmd='%s'" cmd) 
    (shell-command cmd))) 
8
read-from-minibuffer 

वह है जो आप उपयोग करना चाहते हैं। यह एक इतिहास चर के लिए एक जगह है।

(defvar run-rake-history nil "History for run-rake") 
(defun run-rake (cmd) 
(interactive (list (read-from-minibuffer "Task: " (car run-rake-history) nil nil 'run-rake-history))) 
    (shell-command (format "rake %s " cmd))) 

जाहिर है अपनी आवश्यकताओं के अनुकूलित:

यहां कुछ नमूना कोड है। 'रन-रेक-इतिहास केवल एक चर है जिसका उपयोग' पढ़ने-से-मिनीबफर 'के इस आमंत्रण के लिए इतिहास को संग्रहीत करने के लिए किया जाता है। एक और विकल्प 'पूर्ण-पढ़ने' का उपयोग करना होगा - लेकिन यह मानता है कि आपको उन विकल्पों की एक सूची मिली है जिन्हें आप उपयोगकर्ता को उपयोग करने के लिए प्रतिबंधित करना चाहते हैं (जो आम तौर पर शेल-जैसी कमांड के मामले में नहीं है)।

+1

यह स्वीकार्य उत्तर होना चाहिए। –

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

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