8

ユーザーが指定した最後の引数を記憶してデフォルトとして使用したい対話型関数を作成しています。

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

関数が初めて呼び出されたときに、ユーザーが指定した引数を記憶して、次回関数を呼び出したときにエンターを押すだけで、前回指定した値が使用されるようにします。

ドキュメントでこれを見つけることができないようです-elispでこれを行うにはどうすればよいですか?

4

3 に答える 3

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 は、この read-from-minibuffer の呼び出しの履歴を格納するために使用される単純な変数です。別のオプションは 'completing-read - を使用することですが、これは、ユーザーの使用を制限したい選択肢のリストがあることを前提としています (これは通常、シェルのようなコマンドには当てはまりません)。

于 2008-09-29T19:52:57.623 に答える
5

compileコマンドがこれを行う方法を確認できます。でコンパイル コマンドのヘルプ テキストを表示しC-h f compile、関数を含むファイルの名前の上にカーソルを移動して、 を押しますRETURN。これにより、 のソース ファイルが表示されcompileます。

compile-command基本的に、最後のコンパイル コマンドを保持する動的/グローバル変数があります。Emacs はシングルユーザー、シングルスレッドのシステムなので、それ以上のものは必要ありません。また、Elisp は非常に古い学校の Lisp であり、変数のスコープはレキシカルではなく動的 (コール スタック) であることにも注意してください。この種のシステムでは、次のことが自然です。

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

コマンドといえば、compile独自のrun-rake関数の代わりに使用してみましたか?

于 2008-09-28T16:22:15.717 に答える
0

defvar (グローバル) を使用して手動でこれを行う方法を見つけましたが、これは、コア ライブラリによって既に提供されているはずの種類のもののように感じます (スキームの make-parameter のようなものです)。これは、本来よりも多くのコードと手動のように思えます。

(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)))
于 2008-09-28T15:55:14.067 に答える