在访问并在emacs中写入文件时对文件进行预处理/后处理

时间:2014-11-28 08:03:31

标签: xml json emacs elisp

我有一堆相当冗长的xml文件,这些文件以某种方式命名,例如" verbosefile _ *。xml"。我有一对python脚本将这些xml文件转换为紧凑的json格式,反之亦然。目前我的工作流程是我首先使用我的脚本将详细的xml文件转换为紧凑的json文件,对该文件进行更改或编辑,然后将紧凑的json版本转换回详细的xml格式。每当我在emacs中访问/打开文件时,我都希望这个过程透明地发生。基本上,我的新工作流程应该是直接从编辑器打开详细的xml文件时,我应该看到紧凑的json表示,并且在写入文件时,json应该在后台转换为详细的xml格式并写入。关于如何做到这一点的一些提示将是伟大的。我是elisp和emacs钩子/函数的新手,即使我已经使用了编辑器一段时间了。

编辑:我可以更改python脚本以简化操作。例如,如果处理std输入的脚本使问题更容易解决,我可以这样做。

2 个答案:

答案 0 :(得分:5)

有各种方法可以做你要求的事。

其中一个,那就是"规范的方式" (虽然它似乎不经常使用)是使用format-alist。在您的情况下,格式的检测基于文件名而不是文件内容,因此您要全局向format-alist添加REGEXP部分为零的条目。然后,您可以通过auto-mode-alist设置一种特殊模式,该模式将首先通过您的第一个脚本(使用call-process-region)传递缓冲区内容,然后设置buffer-file-format表示您已使用已添加到format-alist的格式。

另一种选择是使用file-name-handler-alist,就像我们对.gz文件一样。

另一种选择是使用特殊模式(如上所述),但不是设置format-alistbuffer-file-format,而只需(add-hook 'write-file-functions #'my-write-hook nil t)并制作my-write-hook使用第二个脚本保存文件。

答案 1 :(得分:1)

我有不同的光盘格式(gjots),我想用emacs编辑它们' org-模式。

由于格式列表不能使用像* .gjots这样的文件扩展名,因此我按照上一篇文章对该技术的描述(并结合Model/View-like editing in Emacs处的代码)我得到了这个原始问题的解决方案:

(setq format-alist
      (cons '(gjots "gjots" nil "gjots2org" "org2gjots" t nil) format-alist))
(define-derived-mode gjots-mode org-mode "gjots"
  "Major mode for editing gjots files."
  (format-decode-buffer 'gjots))
(autoload 'gjots-mode "gjots-mode" "Major mode to edit gjots files." t)
(setq auto-mode-alist
      (cons '("\\.gjots$" . gjots-mode) auto-mode-alist))