【问题标题】:Directory function is called for in Emacs/elisp在 Emacs/elisp 中调用目录函数
【发布时间】:2015-07-27 21:07:45
【问题描述】:

如何找到调用函数的目录?

例如,如果我拨打电话

(defconst dir default-directory)

dir 的值是包含上述行的fine 所在的目录,而不是我调用它的目录。

提前致谢

【问题讨论】:

  • 一个函数不会被“从一个目录”调用,所以你的问题按照目前的措辞没有什么意义。您是在问如何为给定函数找出定义该函数的 elisp 库的路径?
  • 目前我有一个名为 foo.el 的文件(例如在 Desktop/ 中),其中包含问题中的行,我正在另一个名为 bar.el 的文件(例如 Documents/ 中)中使用该行该行返回“~/Desktop/”,但我希望它返回“~/Documents/”这有意义吗?
  • 不是真的——“在另一个文件中使用该行”是什么意思?这听起来好像两个文件都定义了(defconst dir default-directory)。在任何情况下,default-directory 是一个缓冲区本地值,通常与给定 elisp 库的位置没有任何关系。它的值将在加载和评估您的 elisp 时设置,并且(无需采取其他措施)您将获得评估代码时当前缓冲区的值。
  • 对于文件访问缓冲区,default-directory 将是访问文件的父目录。否则,它只是从创建缓冲区时的default-directory 值继承而来。 (当然,您可以手动设置该值;通常通过调用cd)。
  • 顺便说一下,我认为名称 dir 只是为了举例,但如果不是:您的 defconst 调用定义了一个动态范围变量(elisp 不 真的 有常量),并且您绝对不想使用像dir 这样的名称,而动态变量名称没有命名空间前缀,因为这太容易与其他代码中的临时绑定发生冲突。如果你要编译它,字节编译器会抱怨它。

标签: emacs elisp


【解决方案1】:

Emacs 中的默认行为是使用与file being "visited" in the current buffer 关联的directory。 所以,

(file-name-directory (buffer-file-name))

应该给你当前缓冲区文件的目录名(即,你当前正在使用的那个,你的自定义 Lisp 函数被调用)。

如果您不确定是否在缓冲区的上下文中调用您的自定义函数,该缓冲区已经有一个与之关联的文件名,您应该对此进行测试:

(let ((file (buffer-file-name)))
    (if (not file)
        (progn ... no file name here ...)
      ... ok, file name available ...))           

【讨论】:

  • 当我这样使用它时:(message (file-name-directory (buffer-file-name))) 我收到错误“消息:错误的类型参数:stringp,nil”有什么想法吗?
  • @AlexChesters:你执行代码时当前的缓冲区(有光标的那个)是多少?是一个有关联文件名的文件名,还是没有类似*scratch*(或*Messages*)的文件名?对于这些缓冲区,buffer-file-name 回答 nil
  • 谢谢@Dirk!那是我的问题,我在目录而不是实际文件中使用它。
猜你喜欢
  • 1970-01-01
  • 2012-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多