2012-03-27 4 views
5

Я пишу модуль elisp, для которого требуется внешний текстовый файл.Как я могу упаковать «внешний» текстовый файл в модуль elisp?

Для любопытных модуль объединяет the interactive JS REPL for Cscript.exe с режимом оболочки в emacs. Это позволяет мне запускать интерактивную оболочку javascript в emacs, в Windows.

Это было мотивировано 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 простой, - это функция pp-to-string в elisp, которая избегает всего кода Javascript в литеральной строке, подходящей для использования в emacs.

ФН генерировать пучок выглядит следующим образом:

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

Помощник сноска, чтобы свести к минимуму содержимое просто сжимает пробелы и устраняет последовательные переводы строк, такого рода вещи.

В результате файл .el может ссылаться на переменную jsshell-js-src, которая содержит минимизированный источник Javascript. Это выглядит следующим образом:

enter image description here

Я отправляю это здесь, потому что я считаю, что подход, вероятно, будет полезным и в других модулях, а также - все, что необходимо связать отдельный файл данных.

Смежные вопросы