如果是自己写的一个包example,目录下有个example.el,同时目录里面有一个json文件example.json
,如何才对准确的定位到这个文件的绝对路径(或者相对对example.el的路径)。
example
|- example.el
|- example.json
如果上传到elpa,目录名字会加上版本号变成example-xxxx之类的。我的需求是在不改变example.el代码的情况下对任何版本都可以读取example.json
。
好像太啰嗦了,不知道怎么表达。
https://whispering-beach-14031.herokuapp.com/load-file-name
;; In example.el
(concat (file-name-directory load-file-name) "example.json")
2 个赞
在el文件内定义一个变量存储example所在文件夹的路径
(defvar example-site-directory (file-name-directory load-file-name)
"The directory where all of the example files are located.")
然后在你的代码内引用这个变量就行了
2 个赞
可以了,谢谢两位。
我查到了使用(file-name-directory load-file-name)
办法,但是直接在example.el使用C-x C-e
报错,所以我就怀疑了。elisp还是有很多坑的,一不小心就入了坑了。要是有一些简单的elisp中文教程就好了,学习elisp要比其他语言困难好多,完全是个人观点啊。
Lisp 程序的执行有三阶段,load, compile, eval。C-x C-e 相当于直接进入 eval,而 load-file-name 只在 load 阶段生效。
2 个赞
明白了,多谢。顺便请问你一下,你是如何学习elisp的?
我大致看了两本书讲 Emacs Lisp 的书之后就开始入 Common Lisp 和 Lisp Machine 的巨坑了,对于 ELisp 了解是建立在对于 Lisp 语言家族的了解上。所以可能不太具有参考意义。
链接里对 Emacs Lisp 的两本书其实已经够让初学了解语言特性了,最重要的是知道怎么编程,说白了语言只是工具,而 Emacs Lisp 对于使用者的限制是相当宽松的。习惯 Python 的可以把 Elisp 当命令式写,想玩函数式也支持递归和 lambda,甚至 pattern match 都有支持,想用面向对象有 EIEIO,只要把自己的习惯代入进去就可以了。
别的中文资料:
1 个赞
(expand-file-name
"example.json"
(file-name-directory
(or load-file-name buffer-file-name)))
-
load-file-name
会在 (require 'example)
时生效
-
buffer-file-name
会在 M-x eval-buffer
时生效
3 个赞