2008-09-28 7 views
8

Ich schreibe eine interaktive Funktion, die ich gerne an das letzte vom Benutzer angegebene Argument erinnern und es als Standard verwenden würde.Emacs: Wie speichern Sie den letzten vom Benutzer angegebenen Parameter als Standard?

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

Das erste Mal, wenn die Funktion aufgerufen wird, ich es dem Benutzer geliefert, das Argument erinnern wollen, so dass sie das nächste Mal die Funktion aufrufen, geben Sie einfach drücken sie können und es wird den Wert, den sie die vorherige Zeit geliefert wurde.

Ich kann nicht scheinen, dies in der Dokumentation zu finden - wie machst du das in elisp?

Antwort

5

Sie können sehen, wie der compile Befehl dies tut. Rufen Sie den Hilfstext für den Kompilierbefehl mit C-h f compile auf, bewegen Sie den Mauszeiger über den Namen der Datei, die die Funktion enthält, und drücken Sie RETURN. Dadurch wird die Quelldatei für compile angezeigt.

Grundsätzlich gibt es eine dynamische/globale Variable compile-command, die den letzten Kompilierbefehl enthält. Emacs ist ein Single-User-System mit einem Thread, so dass wirklich nicht viel mehr benötigt wird. Bedenken Sie auch, dass Elisp eine sehr alte Schule Lisp ist, und Variablen haben dynamische (Call-Stack), nicht lexikalisch, Umfang. Bei dieser Art von System ist es natürlich zu:

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

des compile Befehl Sprechen, haben Sie versucht, es statt Ihrer eigenen run-rake-Funktion?

0

Ich habe herausgefunden, wie man das manuell mit einem Defvar (global) macht, aber das fühlt sich an wie die Art von Dingen, die bereits von der Core-Bibliothek bereitgestellt werden sollten (Art des make-Parameters eines ähnlichen Schemas). Dies scheint wie mehr Code und mehr manuelle als es sein sollte:

(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 

ist, was Sie verwenden möchten. Es hat einen Punkt für eine Verlaufsvariable. Hier

ist ein Beispielcode:

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

Offensichtlich an Ihre Bedürfnisse anpassen. Der 'run-rake-history' ist einfach eine Variable, die verwendet wird, um den Verlauf für diesen Aufruf von 'read-from-minibuffer' zu speichern. Eine andere Möglichkeit wäre, "completing-read" zu verwenden, aber das setzt voraus, dass Sie eine Liste mit Optionen haben, auf die Sie den Benutzer beschränken möchten (was bei Shell-ähnlichen Befehlen normalerweise nicht der Fall ist).

+1

Dies sollte die akzeptierte Antwort sein. –