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

re5*_*5et 7 emacs elisp

我想要一个以交互方式提示现有目录的函数,但不是从default-directory开始,我想要一个函数本地默认路径,比如'〜/ should/start/here/always/in/this/function'来启动何时使用(interactive "D")我该如何实现?我的第一个想法是创建另一个函数,首先设置default-dir,然后调用我的原始函数,但这似乎不正确,我不确定在这种情况下将如何提示交互.

Tre*_*son 10

既然你自己写这篇文章,你可以这样做:

(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.")
Run Code Online (Sandbox Code Playgroud)

其中使用interactivelisp表达式来调用read-directory以获取目录名称(您可能希望添加其他参数,请检查链接/文档).

你原来的预感也会起作用,但是,正如你所想的那样,并不是那么干净.但是,当您不希望或不能修改要更改其行为的函数时,它确实可以正常工作.我在下面列出了这个解决方案,向您展示了如何实现它(您没有提到的唯一一个难题call-interactively):

;; 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)))
Run Code Online (Sandbox Code Playgroud)