【问题标题】:Preprocess/postprocess a file upon visiting and writing it in emacs在 emacs 中访问和写入文件时预处理/后处理文件
【发布时间】:2014-11-28 08:03:31
【问题描述】:

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

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

【问题讨论】:

  • 这里是有关设置哨兵的文档的链接:gnu.org/software/emacs/manual/html_node/elisp/Sentinels.html 这是有关为流程设置过滤器的文档的链接(以防万一您需要监控流程输出并根据所述输出采取某些行动):gnu.org/software/emacs/manual/html_node/elisp/… 这是使用start-process讨论的文档的链接:gnu.org/software/emacs/manual/html_node/elisp/…
  • 一旦你把那个进程的东西弄走,剩下的就是小菜一碟了——使用主要模式钩子或查找文件钩子或类似的东西。我会先从流程的东西开始——让它工作,然后是一个简单的 Google for emacs add-hook 以及您使用的任何主要模式都应该可以满足您的需求。
  • 看看hexl-mode。这是一个十六进制编辑器,它使用外部命令将文件转储为人类可读的格式,并在保存后再次将其转换回来。

标签: xml json emacs elisp


【解决方案1】:

有多种方法可以满足您的要求。

其中一个是“规范方式”(尽管它似乎不经常使用)是使用format-alist。在您的情况下,格式的检测基于文件名而不是文件内容,因此您将全局添加一个条目到format-alist,其中 REGEXP 部分为 nil。然后你通过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 保存文件。

【讨论】:

    【解决方案2】:

    我有不同的磁盘格式 (gjots),我想使用 emacs 的 org-mode 编辑它们。

    由于 format-alist 不能使用像 *.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))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-06
      • 2013-11-19
      • 2015-10-05
      相关资源
      最近更新 更多