6

プログラムを非同期で起動する関数があります。

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

そして、選択できるすべての実行可能ファイルのリストがあります。app関数を のように動作させswitch-to-buffer、ユーザーにタブ補完を提供したい。Emacs でミニバッファー補完を使用するにはどうすればよいですか?

4

2 に答える 2

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 Inputinteractiveに従って変数に代入する代わりに使用するほうが、より慣用的である可能性があります。

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

Emacs からプログラムを実行し、出力を待たないに従ってプロセス出力を気にしない場合は、(start-process app-name nil app-name)代わりに を使用することもできます。(async-shell-command app-name)


Emacs での補完に関するアイデアについてはMinibuffer Completionを、Emacs からプロセスを呼び出すための非同期プロセスについては、どちらも GNU マニュアルから参照してください。

于 2012-07-26T11:57:35.537 に答える
4

自分でリストを維持する必要なしに可能なシェルコマンドを完了したい場合で、Emacs 23以降を使用している場合は、次を使用できますread-shell-command

(defun app (app-name)
  (interactive (list (read-shell-command "Run application: ")))
  (async-shell-command app-name))
于 2012-07-26T13:07:37.200 に答える