我需要使用外部命令行程序接受单个参数(文件名)来处理某些类型的文件,然后使用此程序修改的文件要么打开修改后的文件,要么接受命令行程序的输出作为文件的数据源。Emacs - 拦截文件,然后用外部程序打开并修改它,然后打开修改后的版本
任何方式来做到这一点?
我需要使用外部命令行程序接受单个参数(文件名)来处理某些类型的文件,然后使用此程序修改的文件要么打开修改后的文件,要么接受命令行程序的输出作为文件的数据源。Emacs - 拦截文件,然后用外部程序打开并修改它,然后打开修改后的版本
任何方式来做到这一点?
如果你只是想这样当您打开与CX比照文件的工作,那么你可能只需要附上您的行为find-file
,但更深层次的下跌,我相信insert-file-contents
是什么最终读取文件。
粗略的看起来似乎没有显示任何适当的钩子,所以你可以看看在建议之前这样做。
(defadvice insert-file-contents
(before my-before-insert-file-contents-advice)
"Process files externally before reading them."
(let ((filename (expand-file-name (ad-get-arg 0))))
(message "About to read file %s" filename)
;; your code here.
;; ;; stupid unsafe example:
;; (let ((file (shell-quote-argument filename))
;; (tempfile (shell-quote-argument (make-temp-file "some-prefix-"))))
;; (shell-command (format "sort %s >%s" file tempfile))
;; (shell-command (format "mv %s %s" tempfile file)))
))
(ad-activate 'insert-file-contents)
您可能想详细说明您的要求,以防您实际上不需要打开原始文件? (我认为这是一个可怕的想法,坦率地说,我当然不会使用这样的代码!)
例如,您可以读取原始文件,在缓冲区内处理它(也许使用shell-command-on带替换标志的区域),并将缓冲区设置为未修改。这样,如果您对该文件进行其他编辑,则仅可能保存shell命令所做的更改,而仅将文件加载到编辑器中的操作实际上并未对其进行修改。
无论如何,我相信你会在你的代码中实现合理的备份过程,并且在测试时会有很多偏执的行为!
我曾经工作过的地方有一些二进制文件,我想在emacs中查看。我这样做的方式是添加到jka-compr-compression-info-list
像编辑的AppleScript如下:
(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
从stdin
读取和写入stdout
(这是必需的)。您还需要打开auto-compression-mode
,但我认为这是默认设置。如果使用自定义界面更改jka-compr-compression-info-list
,而不是直接设置它,则不必调用jka-compr-update
。
您可以用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
与你的程序的名称。这将创建一个缓冲区并将其填充到程序的输出中。如果一个名为文件名的缓冲区已经存在,它将覆盖它。如果这是一种可能性,您将需要通过添加后缀或其他内容来将缓冲区名称更改为安全。此代码也不会触发任何find-file挂钩,因此您必须手动选择模式,或修改代码以便为您执行此操作。
这是正确的做法,它就像打开'.gz'文件等工作的方式。 –