好的,我没有找到更好的方法来做到这一点。但我确实决定将 Javascript 代码作为字符串嵌入到 elisp 模块中......效果很好。
为了实现它,我编写了一个简短的 elisp 函数,它创建了一个新的 elisp 模块。它根据旧名称选择一个新名称 - xxxx-bundle.el 而不是 xxxx.el 。然后它将原始 .el 文件中的内容写入具有新名称的文件中。然后它将一个简单的setq
语句写入同一个文件;整个 Javascript 程序就是该语句中的文字字符串值。让事情变得setq
简单的是pp-to-string
elisp 中的函数,它将所有 Javascript 代码转义为适合在 emacs 中使用的文字字符串。
生成捆绑包的 fn 如下所示:
(defun jsshell-produce-bundle (&optional jsshell-el bundle-el jsshell-js)
"Produce a new .el file, which contains all the jsshell.el
function and also embeds the jsshell.js source as a string. The
resulting .el file will then be suitable for a one-file
distribution of JSShell.
JSShell depends on two pieces: jsshell.el and jsshell.js. Rather
than distributing and installing two distinct files, the bundle
embeds the .js file into the .el file, for a one-file
distribution option. This function produces that one file.
Most people will never need to use this function. It's useful only
after modifying either the original jsshell.el or the jsshell.js file,
when you want to produce a new distributable bundle. In other words, it's
useful for the developer of jsshell.el.
"
(let ((jsshell-el (or jsshell-el
(concat (file-name-directory jsshell--load-path) "jsshell.el")
"jsshell.el")))
(let ((bundle-el (or bundle-el
(concat (file-name-directory jsshell-el) "jsshell-bundle.el")))
(jsshell-js (or jsshell-js
(and jsshell-js-tmpf
(file-readable-p jsshell-js-tmpf)
jsshell-js-tmpf)
jsshell-location-of-jsshell-js ;; orig dev wkstation
(concat (file-name-directory jsshell-el) "jsshell.js")))
jssrc)
(with-temp-file bundle-el
(insert (concat
";;; "
(file-name-nondirectory bundle-el)
" -- JSShell generated bundle\n"))
(insert (concat ";;\n;; generated " (current-time-string) "\n;;\n\n"))
(insert-file-contents jsshell-el)
(goto-char (point-max))
(insert "\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n")
(insert ";; this is the embedded Javascript code for the JS REPL\n\n")
(setq jssrc (jsshell--minimized-js-contents jsshell-js))
(goto-char (point-max))
(insert (concat "(setq jsshell-js-src "
(pp-to-string jssrc)
")\n"
"\n(provide '"
(file-name-sans-extension (file-name-nondirectory bundle-el))
")\n"
"\n;;; "
(file-name-nondirectory bundle-el)
" ends\n"))))))
最小化内容的帮助器 fn 只是折叠空格并消除连续的换行符,诸如此类。
然后,生成的 .el 文件可以引用变量jsshell-js-src
,其中包含最小化的 Javascript 源代码。它看起来像这样:
我在这里发布这个是因为我认为这种方法可能在其他模块中也很有用——任何需要捆绑单独数据文件的东西。