我正在编写一个需要外部文本文件的elisp模块。
对于好奇的人来说,该模块在emacs中将the interactive JS REPL for Cscript.exe与shell模式集成在一起。 它允许我在Windows上的emacs中运行交互式javascript shell。
这是由js-comint.el推动的,但它是一个独立于Windows和cscript.exe的实现。
它目前正在运行,但有两个不同的文件:.el文件和.js文件。我宁愿只有一个档案。
我的问题是:如何将外部.js文件打包到.el文件中,这是一个先决条件,以便我可以安装一个文件?
我想我可以用(可能缩小的)js文件定义一个字符串变量并将其插入到.el模块中。我想会有一些字符串 - 擒纵问题,但这会有效。这是最好的方式吗?还有其他建议吗?
答案 0 :(得分:1)
为了实现这一目标,我写了一个简短的elisp函数,它创建了一个新的elisp模块。
它根据旧名称选择一个新名称 - xxxx-bundle.el而不是xxxx.el。然后,它将原始.el文件中的内容写入具有新名称的文件中。然后它将一个简单的setq
语句写入同一个文件中;整个Javascript程序是该语句中的文字字符串值。使setq
容易的事情是elisp中的pp-to-string
函数,它将所有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文件然后可以引用包含最小化Javascript源的变量jsshell-js-src
。它看起来像这样:
我在这里发布这个是因为我认为这种方法在其他模块中可能也很有用 - 任何需要捆绑单独数据文件的东西。