2014-01-14 112 views
4

我知道Emacs會自動打開壓縮文件,如.tar.gz。我試圖用自己的壓縮腳本而不是標準壓縮腳本來實現這個目標。 繼this link,我增加了以下我的Emacs的初始化文件如何在emacs中打開時自動解壓縮自定義壓縮文件?

(if (fboundp 'auto-compression-mode) 
    (auto-compression-mode 0) 
    (require 'jka-compr)) 
(add-to-list 'jka-compr-compression-info-list 
      ["\\.customcom\\'" 
       "custom compressing" "customcom" (-c) 
       "custom decompressing" "customcom" (-d) 
       nil t]) 
(auto-compression-mode 1) 

理想的情況下,我想運行的命令customcom -d foo.customcom當文件被打開,但與上述另外,它的運行customcom -d < foo.cusotmcom並給了一個錯誤。我如何修改上述內容以使輸入重定向無效,以便它只接受文件名而不是文件的內容,或者是否有解決此問題的不同方法?

回答

2

也許,下面的代碼是有幫助的。順便說一下,有趣的是jka-compr的作者沒有考慮到程序參數的評估,也沒有提供filename作爲可能的可評估論據之一。

我不知道你的壓縮/解壓縮程序。因此,我只用cat代替以.cat結尾的文件進行測試。

(defadvice jka-compr-info-compress-args (around eval-args activate) 
    "Evaluate program arguments" 
    (setq ad-return-value (mapcar 'eval (aref info 3)))) 

(defadvice jka-compr-info-uncompress-args (around eval-args activate) 
    "Evaluate program arguments" 
    (setq ad-return-value (mapcar 'eval (aref info 6)))) 


(add-to-list 'jka-compr-compression-info-list ["\\.cat\\'" "cat" "cat" ("-") 
          "cat uncompress" "cat" (filename) nil t ""]) 

(add-to-list 'auto-mode-alist '("\\.cat\\'" nil jka-compr)) 

(add-to-list 'file-name-handler-alist '("\\.cat\\'" . jka-compr-handler)) 

相應的增強請求:

http://debbugs.gnu.org/cgi/bugreport.cgi?msg=5;att=1;bug=16454

+0

這是邪惡! ;-) – Stefan

+0

這是純粹的天才。我不知道有一種方法可以在不修補源代碼的情況下擴展init文件中的現有功能。你能推薦一本好的elisp書嗎?我只用了1個月的時間才使用emacs。 – BobLoblaw

+0

我已向「[email protected]」提交了增強請求。標題是'增強:emacs庫jka-compr'。我不知道它何時到達名單。這種增強包括對程序參數的評估。正如@stefan指出的建議_are_邪惡的生產代碼。所以讓我們希望他們接受這個提升。有關elisp的介紹,請參閱「C-h i Emacs Lisp Intro」。更多增強的東西在'C-h i Elisp'中。 – Tobias

1

很難測試這個不知道是什麼您的自定義壓縮和解壓工具,但使用xargs似乎爲我工作在Linux上:

(if (fboundp 'auto-compression-mode) 
    (auto-compression-mode 0) 
    (require 'jka-compr)) 

(add-to-list 'jka-compr-compression-info-list 
      ["\\.customcomm\\'" 
       "custom compressing" "xargs" ("customcom" "-c") 
       "custom decompressing" "xargs" ("customcom" "-d") 
       nil t]) 

(auto-compression-mode 1) 

注意,你可能仍然有問題,如果這樣的輸出命令不是STDOUT

1

你可能想嘗試使用("-d" "-")作爲參數,萬一customcom如下解釋-表示「使用標準輸入」的習俗。或者取決於你的操作系統,你可以試試("-d" "/dev/stdin"):它至少應該在GNU/Linux下工作。