如何定位到自己写的package内的文件

如果是自己写的一个包example,目录下有个example.el,同时目录里面有一个json文件example.json,如何才对准确的定位到这个文件的绝对路径(或者相对对example.el的路径)。

example
|- example.el
|- example.json

如果上传到elpa,目录名字会加上版本号变成example-xxxx之类的。我的需求是在不改变example.el代码的情况下对任何版本都可以读取example.json

好像太啰嗦了,不知道怎么表达。

;; 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 个赞

向前辈学习 :+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 个赞