Archive

[Emacs]howmで直近のファイルを編集

Emacsでのメモ書き用にhowmを使用しています。ちょっと思いついたこと をサッとメモすることができ、今では手放すことができないソフトです。

ところがhowmで直近に編集したメモを編集するためには、一回最近編集し たファイルを一覧表示させた上で一番トップのファイルを選択する必要があり ます。そこで一発で直近のファイルを編集可能とする関数を作成しました。

概要

howmで直近に編集したファイルを開きます。直接使用するのは関数’howm-open-most-recent-file’です。 他の三つの関数は、あるディレクトリから最終更新時刻が最も新しいファイルを見つけるための関数です。

howmで使用するディレクトリをいちいち全部検査しているのでそれなりに時間がかかります。 年月別にディレクトリを分けているような人は対象ディレクトリを狭めるなど工夫の余地があると思います。 改造のネタにでもしてください。

使い方

以下を.emacs等に追加してください。

;; キーバインドを追加する
(global-set-key "\C-c,r" 'howm-open-most-recent-file)

;; ======================================================================
;; howm-open-most-recent-file
;; 一番新しいメモファイルを呼び出す関数
;; (require 'howm-mode)の記述の後に書くか、hookとかで引っかけてください。

(defun howm-open-most-recent-file ()
  (interactive)
  (let ((recent-file (my-get-most-recent-file howm-directory)))
    (if recent-file
        (progn
          (find-file recent-file)
          (message "howm's most recent file"))
      (message "can't find file"))))

;; ======================================================================
;; my-get-most-recent-file
;; あるディレクトリから更新時刻が最も新しいファイルを見つける(無い場合はnil)

(defun my-get-most-recent-file (dir)
  (if (not (file-directory-p dir))
      (error "can't find dir %s !" dir)
    (let ((files (mapcar '(lambda (file)
                            (cond ((and
                                    (file-regular-p file))
                                   file)
                                  ((and (file-directory-p file)
                                        (not (string-match "/\\.$" file))
                                        (not (string-match "/\\.\\.$" file)))
                                   (my-get-most-recent-file file))
                                  (t nil)))
                         (directory-files dir t))))
      (my-get-most-recent-file-from-list files))))

(defun my-get-most-recent-file-from-list (files)
  (let ((most-recent-file nil)
        (reserved-times '(0 0))
        (compare-results nil))
    (while files
      (setq file (car files))
      (if file
          (if most-recent-file
              (progn
                (setq compare-results (my-get-most-recent-file-compare reserved-times file))
                (if compare-results
                    (progn
                      (setq reserved-times compare-results)
                      (setq most-recent-file file))))
            (progn
              (setq most-recent-file file)
              (setq reserved-times (my-get-most-recent-file-compare reserved-times file)))))
      (setq files (cdr files)))
    most-recent-file))

(defun my-get-most-recent-file-compare (reserved-times file)
  (let ((file-times (car (cddddr (cdr (file-attributes file))))))
    (cond ((> (car file-times) (car reserved-times))
           file-times)
          ((equal (car reserved-times) (car file-times))
           (cond ((> (car (cdr file-times)) (car (cdr reserved-times)))
                  file-times)
                 (t nil)))
          (t nil))))