Emacs Diredから一瞬でgzip圧縮するショートカットをつくる

gzip_static

なんでgzipかというと、Webの表示速度UPのためですね。

cssやjsなどの静的ファイルをgzipにすることで、ブラウザとサーバーの間の通信量を減らせます。

ホームページ最適化によく使うコマンドのため、書いてみました。


(defun dired-gzip-9c ()
  "gzip -9c FILE.A > FILE.A.gz"
  (interactive)
  ;; マークされた複数のもの、またはポインタがある場所のものを対象
  (let ((files (dired-get-marked-files t current-prefix-arg)))
    ;; 拡張子がすでに.gzのものは対象にしない
    (dired-do-shell-command
     (concat "for file in * ; do if [[ ! $file =~ \\\\.gz$ ]] ; then gzip -9c $file > $file.gz; fi done")
     nil files)
    ;; U: unmark マークを全て削除
    ;; g: revert-buffer 更新・再度読み込み
    (execute-kbd-macro (kbd "Ug"))
    ))


;; diredでのみ有効なショートカットへ登録
(add-hook 'dired-mode-hook
          (lambda ()
            (define-key dired-mode-map
              (kbd "C-S-z") 'dired-gzip-9c)))

(Cocoa Emacs 23,24で確認しました)

EmacsのTrampでサーバー上にアクセスして、ファイルにgzip圧縮をかけます。Diredからマークを付けたもの複数を対象 or マークしていなければポインタのある行のファイルを対象にしてgzip圧縮をかけます。

dired-do-shell-commandは、`*'の位置にリストをあてはめます。

しかし`*'は左右に半角スペースが必要なため、拡張子.gzを付けて出力ってのができませんでした。仕方がないのでループ構造にして解決。条件分岐で圧縮済みのものを除外しています。

そして超簡単関数 execute-kbd-macro を使ってマーク削除と更新をします。

ちなみに、Diredでgzファイルを開けば直接編集できたりします。