2012-03-27 94 views
5

我在写一个需要外部文本文件的elisp模块。如何将“外部”文本文件打包到elisp模块中?

对于好奇,所述模块集成the interactive JS REPL for Cscript.exe与emacs的壳模式。 它允许我在Windows上运行emacs中的交互式javascript shell。

这是由js-comint.el动机,但它是一个独立的实现依赖于Windows和的Cscript.exe。

它目前正在工作,但有两个不同的文件:.el文件和.js文件。我宁愿只有一个文件。

我有这样的问题:如何将外部.js文件(这是该文件的先决条件)打包到.el文件中,以便我可以安装一个文件?

我想我可能只是定义与(也许精缩)一个字符串变量js文件,并插入到.el模块。我想会有一些字符串擒纵问题,但这会起作用。这是最好的方法吗?还有其他建议吗?

回答

1

好的,我没有找到更好的方法来做到这一点。但我确实决定将Javascript代码作为字符串嵌入到elisp模块中......工作得很好。

为了实现目标,我编写了一个简短的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文件可以引用该变量,jsshell-js-src,它包含最小化的Javascript源。它看起来像这样:

enter image description here

,因为我觉得这种方法很可能是在其他模块也是有用的,我在这里张贴这一点 - 任何需要捆绑一个单独的数据文件。

相关问题