2008-09-28 9 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はシングルユーザーのシングルスレッドシステムなので、これ以上の必要はありません。また、Elispは非常に古い学校のLispであり、変数には字句範囲ではなく動的(呼び出しスタック)があることに注意してください。あなたがあなた自身のrun-rake機能の代わりにそれを使用してみましたが、compileコマンドといえば

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

:この種のシステムでは、自然にありますか?

0

私はdefvar(グローバル)を使ってこれを手動で行う方法を考え出しましたが、これはコアライブラリによって提供されるはずのもののような感じです(スキームのmakeパラメータのようなもの)。これはちょうどより多くのコードのように思えるし、それがあるべきよりも多くのマニュアル:

(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))) 

は明らかにあなたのニーズにカスタマイズします。 'run-rake-history'は、このミニバッファからの読み込みの履歴を保存するための変数です。もう一つのオプションは 'completing-read'を使うことですが、あなたが選択するリストを持っていることを前提としています(シェルのようなコマンドの場合はそうではありません)。

+1

これは受け入れられる回答である必要があります。 –

関連する問題