Emacs 如何在elisp defun中设置交互式目录选择的默认路径?

Emacs 如何在elisp defun中设置交互式目录选择的默认路径?,emacs,elisp,Emacs,Elisp,我想要一个以交互方式提示现有目录的函数,但我不希望从默认目录开始,而是希望在使用(交互“D”)时从“~/should/start/here/always/in/this/function”这样的函数本地默认路径开始?我的第一个想法是创建另一个函数,该函数首先设置默认目录,然后调用我的原始函数,但这似乎不正确,我不确定在这种情况下会出现怎样的交互提示。因为这是您自己写的,您可以这样做: (defun choose-directory (directory) "sample that uses

我想要一个以交互方式提示现有目录的函数,但我不希望从默认目录开始,而是希望在使用
(交互“D”)
时从“~/should/start/here/always/in/this/function”这样的函数本地默认路径开始?我的第一个想法是创建另一个函数,该函数首先设置默认目录,然后调用我的原始函数,但这似乎不正确,我不确定在这种情况下会出现怎样的交互提示。

因为这是您自己写的,您可以这样做:

(defun choose-directory (directory)
  "sample that uses interactive to get a directory"
  (interactive (list (read-directory-name "What directory? " 
                                          choose-directory-default-directory)))
  (message "You chose %s." directory))

(defvar choose-directory-default-directory "/home/tjackson/work/data"
  "Initial starting point.")
它与lisp表达式一起使用来调用以获取目录名(您可能希望添加其他参数,请检查链接/docs)

不过,正如你所想,你最初的预感也会起作用,它并没有那么清晰。但是,当您不想或无法修改要更改其行为的函数时,它确实可以很好地工作。我在下面列出了这个解决方案,向您展示了如何实现它(您没有提到的唯一一个难题是):

;; original version of choose-directory, calling (interactive "D")
(defun choose-directory (directory)
  "sample that uses interactive to get a directory"
  (interactive "DWhat directory? ")
  (message "You chose %s." directory))

(defun wrap-choose-directory ()
  (interactive)
  (let ((default-directory choose-directory-default-directory))
    (call-interactively 'choose-directory)))