2008-09-28 28 views
8

Tôi đang viết một chức năng tương tác mà tôi muốn nhớ đối số cuối cùng mà người dùng đã cung cấp và sử dụng nó làm mặc định.Emacs: Làm cách nào để lưu trữ tham số cuối cùng do người dùng cung cấp làm mặc định?

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

Lần đầu tiên các chức năng được gọi Tôi muốn nó nhớ đối số người dùng được cung cấp để lần sau họ gọi hàm họ có thể chỉ cần nhấn enter và nó sẽ sử dụng các giá trị mà họ cung cấp thời gian trước đó.

Tôi dường như không thể tìm thấy điều này trong tài liệu - làm thế nào để bạn thực hiện điều này một cách dễ dàng?

Trả lời

5

Bạn có thể xem cách lệnh compile thực hiện điều này. Hiển thị văn bản trợ giúp cho lệnh biên dịch với C-h f compile, di chuyển con trỏ qua tên của tệp chứa hàm, sau đó nhấn RETURN. Thao tác này sẽ hiển thị tệp nguồn cho compile.

Về cơ bản, có một biến động/toàn cục compile-command giữ lệnh biên dịch cuối cùng. Emacs là một hệ thống đơn luồng, đơn, vì vậy thực sự không cần nhiều hơn nữa. Cũng nên nhớ rằng Elisp là một trường rất cũ Lisp, và các biến có dynamic (gọi stack), không phải từ vựng, phạm vi. Trong loại này của hệ thống đó là tự nhiên:

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

Phát biểu của lệnh compile, bạn đã cố gắng sử dụng nó thay vì run-rake chức năng riêng của bạn?

0

Tôi đã tìm ra cách để làm điều này bằng tay bằng cách sử dụng defvar (toàn cầu), nhưng điều này giống như loại điều mà lẽ ra phải được cung cấp bởi thư viện lõi (loại giống như tham số make-scheme). Điều này có vẻ giống như nhiều mã hơn và hướng dẫn sử dụng nhiều hơn là:

(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 

là những gì bạn muốn sử dụng. Nó có một vị trí cho một biến lịch sử.

Dưới đây là một số mẫu mã:

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

Rõ ràng tùy yêu cầu của bạn. Các 'run-rake-lịch sử chỉ đơn giản là một biến được sử dụng để lưu trữ lịch sử cho lời gọi này của' read-from-minibuffer. Một tùy chọn khác sẽ là sử dụng 'hoàn thành đọc - nhưng giả định rằng bạn đã có danh sách các lựa chọn bạn muốn hạn chế người dùng sử dụng (thường không phải là trường hợp đối với các lệnh giống như trình bao).

+1

Đây phải là câu trả lời được chấp nhận. –

Các vấn đề liên quan