Dired でバイナリファイルを開くときに本当に開くか確認する何か
環境
動機
diredでバイナリとか開くときに本当に開いていいか確認してくれる何かが欲しい
— がんま (@ganmacs) 2015, 9月 24
Emacsでは写真やらPDFやらをEmacs内で見れるイッてる機能があります.
しかし,写真やらPDF開こうとすると数秒かかって非常に辛いです.
さらに,Diredを使っているとよく押し間違えてPDFを開いてしまい,数秒待ったあとkill-bufferするみたいなことによくなります.
これが非常に辛いのでなんとかしたいということで書きました.
実際
(defun util/same-ext? (file-path ext) "Check same exntion or not." (let ((file-ext (file-name-extension file-path))) (if file-ext (string= (downcase file-ext) ext)))) (defun util/chomp (str) (replace-regexp-in-string "[\n\r]" "" str)) (setq dired-open-whitelist '("c" "coffee" "clj" "el" "ex" "exs" "go" "h" "hs" "html" "js" "ml" "md" "rb" "yml" "scala" "slim" "scss")) (defun dired/binary? () (let ((cmd (format "nkf -g %s" (dired/filename-at-point)))) (string= "BINARY" (util/chomp (shell-command-to-string cmd))))) (defun dired/filename-at-point () (car (dired-get-marked-files 'no-dir))) (defun dired/directory? () (file-directory-p (car (dired-get-marked-files)))) (defun dired/include-whitelist? (filename whitelist) (if whitelist (or (util/same-ext? filename (car whitelist)) (dired/include-whitelist? filename (cdr whitelist))))) (defun dired-file-open-or-not () "File open if file type is directory or file exntion is in whitelist or file is not binary." (interactive) (let ((ext-lst dired-open-whitelist) (filename (dired/filename-at-point))) (if (or (dired/directory?) (dired/include-whitelist? filename ext-lst) (not (dired/binary?))) (dired-find-file) (if (yes-or-no-p (format "Do you really open? %s" filename)) (dired-find-file)))))
後は
(define-key dired-mode-map (kbd "C-f") 'dired-file-open-or-not)
何をしたか
開くのに時間がかかりそうなファイルを開いていいかどうかを聞くようにしました.
ファイルがBINARYかどうかをnkf
で確認してます.
しかし,毎回nkf
を叩くのは辛いので以下の条件の時はnkf
を叩かずそのままファイルを開いています.
- ディレクトリの時
- whitelistで定義された拡張子のファイルの時
感想
これを書いてたら何故か時間が消えていったが後悔はしていない