如何显示模块的完整路径

时间:2015-10-27 13:34:21

标签: emacs elisp

如果我这样做:

(message (format "===> %s loaded" (file-name-base load-file-name)))

我只得到文件的基本名称。

===> 0100-start loaded

如果我这样做:

(message (format "===> %s loaded" 'load-file-name))

我明白了:

===> load-file-name loaded

不是我想要的......

如果我这样做:

(message (format "===> %s loaded" load-file-name))

我明白了:

===> nil loaded

不知道那里发生了什么。我虽然变量load-file-name具有使用它的模块的值。并且它以某种方式拥有它,否则我无法得到(file-name-base load-file-name),但它本身使用不起作用。我可能需要使用变量名称反引用前向引用和前缀 - 逗号,但不知道如何执行此操作。 Elisp witchery。

我想得到的是:

===> /home/user1/.emacs.d/conf/0100-start.el loaded

如何获得lisp模块的完整绝对路径?我虽然这是load-file-name的工作。我该如何显示它?

我如何在elisp中使用变量?

2 个答案:

答案 0 :(得分:4)

首先,message可以进行格式化,因此不需要format

其次,当你引用变量时,如'foo,它不会被评估,所以你没有得到它的价值。

第三, C-h f file-name-base RET 应该解释你的第一个输出。

最后,正在加载的文件中的正确格式

(message "===> %s loaded" load-file-name)

以及您看到nil的原因是在加载期间未评估。请尝试 C-h v load-file-name RET

答案 1 :(得分:3)

Scoping Rules for Variable Binding 1

  

Emacs中的本地绑定Lisp具有不确定的范围和动态范围。   [...]

     
      
  • 无限范围表示程序的任何部分都可能访问变量绑定。范围是指在程序执行时,绑定存在的时间。
  •   
  • 动态范围表示只要激活构建它的构造,绑定就会持续。
  •   

(Emacs也可以执行lexical binding

当您load文件时,会发生类似这样的事情:

(defun load (file)
  (let ((load-file-name file))
    (do-load file)))

因此,load-file-name仅在文件加载期间绑定到file。当代码存在let的范围时,绑定不再有效。

请注意,如果您没有loadrequire一个模块,那么在加载时,Emacs也会将模块注册为已提供,并且重新加载它再次致电require。这可能是您第三次获得nil的原因(请参阅unload-feature)。

在您的模块中,您可以为自己的符号定义全局绑定:

(defvar jeckyll2hide/module-path load-file-name)

然后,第一次load(或require)模块时,您将定义一个变量,该变量将全局绑定到加载期间本地绑定到load-file-name的值

1。格式化和强调我的