2008-09-28 5 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, а переменные имеют динамический (стек вызовов), а не лексический, объем. В такой системе естественно:

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

Speaking команды compile, вы пытались использовать его вместо своего run-rake функции?

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» - это просто переменная, которая используется для хранения истории для этого вызова «read-from-minibuffer». Другим вариантом было бы использовать «завершение чтения», но предполагается, что у вас есть список вариантов, которые вы хотите ограничить для использования пользователем (что обычно не относится к командам с оболочкой).

+1

Это должен быть принятый ответ. –

 Смежные вопросы

  • Нет связанных вопросов^_^