2012-03-27 4 views
5

Ich schreibe ein elisp-Modul, das eine externe Textdatei benötigt.Wie kann ich eine "externe" Textdatei in ein elisp-Modul packen?

Für die Neugierigen integriert das Modul the interactive JS REPL for Cscript.exe mit Shell-Modus in Emacs. Es ermöglicht mir, eine interaktive Javascript-Shell in Emacs unter Windows auszuführen.

Dies wurde durch js-comint.el motiviert, ist aber eine separate Implementierung abhängig von Windows und cscript.exe.

Es funktioniert derzeit, aber es gibt zwei verschiedene Dateien: die .el-Datei und die .js-Datei. Ich hätte lieber nur eine Datei.

Die Frage, die ich habe, ist das: Wie kann ich die externe .js-Datei, die eine Voraussetzung für dieses Ding ist, in die .el-Datei, so dass ich eine Ein-Datei-Installation haben kann?

Ich stelle mir vor, ich könnte einfach eine String-Variable mit der (möglicherweise minimiert) js-Datei definieren und diese in das .el-Modul einfügen. Ich nehme an, es wird ein paar Probleme mit der Saitenhemmung geben, aber das wird funktionieren. Ist das der beste Weg? Irgendwelche anderen Vorschläge?

Antwort

1

ok, ich habe keinen besseren Weg gefunden, dies zu tun. Aber ich habe entschieden, dass der Javascript-Code als String in das elisp-Modul eingebettet wird ... hat gut funktioniert.

Um es möglich zu machen, schrieb ich eine kurze elisp Funktion, die ein neues elisp Modul erstellt. Es wählt einen neuen Namen basierend auf dem alten Namen - xxxx-bundle.el statt xxxx.el. Dann schreibt es den Inhalt aus der ursprünglichen .el-Datei in eine Datei mit dem neuen Namen. Dann schreibt es eine einfache setq Anweisung in die gleiche Datei; Das gesamte JavaScript-Programm ist der Literal-String-Wert in dieser Anweisung. Die Sache, die setq einfach macht, ist die Funktion pp-to-string in elisp, die den gesamten Javascript-Code in eine literale Zeichenkette umwandelt, die für die Verwendung in Emacs geeignet ist.

Die fn das Bündel sieht wie folgt zu generieren:

(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")))))) 

Der Helfer fn den Inhalt zu minimieren nur Leerzeichen kollabiert und eliminiert aufeinander folgende Zeilenumbrüche, diese Art der Sache.

Die resultierende .EL-Datei kann dann auf die Variable jsshell-js-src verweisen, die die minimierte Javascript-Quelle enthält. Es sieht wie folgt aus:

enter image description here

ich dies hier bin Entsendung weil ich der Ansatz denken wahrscheinlich in anderen Modulen als auch nützlich sein würde - alles, was eine separate Datendatei bündeln muss.