我需要使用接受单个参数(filename)的外部命令行程序处理某些类型的文件,然后使用此程序修改的文件打开修改后的文件或接受命令行程序的输出作为文件的数据源。
有什么办法吗?
答案 0 :(得分:3)
我曾经工作的地方有一些我希望在emacs中查看的二进制文件。我这样做的方法是添加jka-compr-compression-info-list
,如下所示编辑applescripts:
(add-to-list 'jka-compr-compression-info-list
["\\.scpt\\'"
"Compiling" "osacompile-helper.sh" nil
"Decompiling" "osacompile-helper.sh" ("-d")
nil nil "Fasd"])
(jka-compr-update)
此处osacompile-helper.sh
只是osacompile
和osadecompile
周围的一个小shell包装,它从stdin
读取并写入stdout
(这是必需的)。您还需要启用auto-compression-mode
,但我认为这是默认设置。如果您使用自定义界面更改jka-compr-compression-info-list
,而不是直接设置,则无需致电jka-compr-update
。
答案 1 :(得分:2)
如果您只是希望在使用 Cx Cf 打开文件时才能使用此功能,那么您可以将行为附加到find-file
,但我更深入了解{{1}是最终读取文件的内容。
粗略的外观似乎没有显示任何合适的钩子,所以你可以在建议之前看看这样做。
insert-file-contents
您可能想详细说明您的要求,以防您实际上不需要破坏原始文件? (我认为这是一个可怕的想法,坦率地说;我当然不会使用这样的代码!)
例如,您可以读取原始文件,在缓冲区中处理它(可能使用带有replace标志的shell-command-on-region),并将缓冲区设置为未修改。这样,如果对文件进行其他编辑,则只能保存shell命令所做的更改,而仅将文件加载到编辑器中的操作实际上并没有对其进行修改。
无论如何,我相信你会在你的代码中实现合理的备份过程,并且在测试时会有很多偏执狂!
答案 2 :(得分:1)
您可以使用shell-command
调用外部程序,并将输出定向到新缓冲区。最小的工作示例是:
(defun my-find-and-process-file ()
(interactive)
(let* ((file (read-file-name "File name: "))
(buf (pop-to-buffer file)))
(shell-command (format "cat %s" file) buf)))
将cat
替换为您的程序名称。这将创建一个缓冲区并用程序的输出填充它。如果已存在具有文件名的缓冲区,则它将覆盖它。如果这是可能的,您将需要通过添加后缀或其他内容将缓冲区名称更改为安全的名称。此代码也不会触发任何查找文件挂钩,因此您必须手动选择模式,或修改代码以便为您执行此操作。