2011-11-27 93 views

回答

2

如果你只是想这样当您打开与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命令所做的更改,而仅将文件加载到编辑器中的操作实际上并未对其进行修改。

无论如何,我相信你会在你的代码中实现合理的备份过程,并且在测试时会有很多偏执的行为!

3

我曾经工作过的地方有一些二进制文件,我想在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一个小壳包装和osadecompilestdin读取和写入stdout(这是必需的)。您还需要打开auto-compression-mode,但我认为这是默认设置。如果使用自定义界面更改jka-compr-compression-info-list,而不是直接设置它,则不必调用jka-compr-update

+1

这是正确的做法,它就像打开'.gz'文件等工作的方式。 –

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与你的程序的名称。这将创建一个缓冲区并将其填充到程序的输出中。如果一个名为文件名的缓冲区已经存在,它将覆盖它。如果这是一种可能性,您将需要通过添加后缀或其他内容来将缓冲区名称更改为安全。此代码也不会触发任何find-file挂钩,因此您必须手动选择模式,或修改代码以便为您执行此操作。

相关问题