読者です 読者をやめる 読者になる 読者になる

Dired でバイナリファイルを開くときに本当に開くか確認する何か

emacs

環境

動機

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で定義された拡張子のファイルの時

感想

これを書いてたら何故か時間が消えていったが後悔はしていない