2012-07-26 26 views
6

मैं एक समारोह है कि कार्यक्रमों एसिंक्रोनस रूप से शुरूआत की है:Emacs minibuffer पूरा होने

(defun app (app-name) 
    (interactive "sRun application: ") 
    (async-shell-command app-name)) 

और मुझे जो से चुनने के लिए सभी निष्पादन योग्य की एक सूची है। मैं app फ़ंक्शन को switch-to-buffer के रूप में व्यवहार करने के लिए चाहता हूं, जो उपयोगकर्ता के लिए टैब-समापन प्रदान करता है। मैं Emacs में मिनीबफर पूर्णता का उपयोग कैसे करूं?

उत्तर

8

completing-read कमांड का उपयोग करें। समारोह दिखेगा तरह

(defun app() 
    (interactive) 
    (let ((app-name (completing-read "Run application: " program-list))) 
    (async-shell-command app-name))) 

संभवतः अधिक मुहावरेदार बजाय Emacs Lisp Idioms: Prompting for User Input के अनुसार एक चर को असाइन करने के interactive उपयोग करने के लिए है:

(defun app (app-name) 
    (interactive (list (completing-read "Run application: " app-list))) 
    (async-shell-command app-name)) 

इसके अलावा, आप (start-process app-name nil app-name) बजाय (async-shell-command app-name) का उपयोग कर सकते हैं, अगर आप Run a program from Emacs and don't wait for output के अनुसार प्रक्रिया आउटपुट की परवाह नहीं है।


Emacs से प्रक्रियाओं को फोन करने के लिए Emacs में पूरा होने पर अधिक विचारों के लिए Minibuffer Completion और Asynchronous Processes देखें, दोनों जीएनयू मैनुअल से।

4

आप एक सूची अपने आप को बनाए रखने के लिए जरूरत के बिना संभव खोल आदेश के लिए पूरा होने हैं, और आप Emacs 23 या नए प्रयोग कर रहे हैं, तो आप उपयोग कर सकते हैं read-shell-command:

(defun app (app-name) 
    (interactive (list (read-shell-command "Run application: "))) 
    (async-shell-command app-name))