如果我这样做:
(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中使用变量?
答案 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
的范围时,绑定不再有效。
请注意,如果您没有load
但require
一个模块,那么在加载时,Emacs也会将模块注册为已提供,并且不重新加载它再次致电require
时。这可能是您第三次获得nil
的原因(请参阅unload-feature
)。
在您的模块中,您可以为自己的符号定义全局绑定:
(defvar jeckyll2hide/module-path load-file-name)
然后,第一次load
(或require
)模块时,您将定义一个变量,该变量将全局绑定到加载期间本地绑定到load-file-name
的值
1。格式化和强调我的