ブログを書くコストを下げる工夫

ブログを記述することの一番の障壁は書き初めが面倒くさいことだ。「ブロ グを書くぞ」と気合を入れてからファイルを開いたしている。文章を書こうと 思うと心構えが必要になる。問題はその心構えをすること自体が徐々に億劫に なってくることだ。

即座にファイルを開いて文章を書き初められるように専用のコマンドを実装した。 作成した文章を即座に特定のディレクトリに書き込めるようにした。

(defcustom symdon-ga-post-directory "/ng/symdon/pages/posts"
  "Path to directory of symdon-ga posts")


(defun symdon-ga-create-new-file-path ()
  (concat
   (directory-file-name symdon-ga-post-directory)
   "/"
   (format "%s.org"
	   (truncate (float-time)))))


(defun symdon-ga-post (text)
  (with-current-buffer (find-file-noselect (symdon-ga-create-new-file-path))
    (insert text)
    (save-buffer)
    (current-buffer)))


(defun editor-get-editor-buffer-text ()
  (with-current-buffer (get-buffer editor-buffer-name)
    (buffer-substring-no-properties (point-min) (point-max))))


(defun editor-save-as-kill ()
  (interactive)
  (symdon-ga-post
   (editor-get-editor-buffer-text))
  (kill-buffer editor-buffer-name))

(custom-set-variables '(symdon-ga-post-directory "/ng/symdon/pages/posts"))

(bind-keys :map editor-mode-map
	   ("C-c C-c" . editor-save-as-kill))

essay.el

ドキュメントを記述するためのコマンドとドキュメント用の骨組を提供します。

(require 'essay)

Editor Mode

(defvar editor-buffer-name "*EDITOR*")

(defvar editor-map (make-sparse-keymap))


(defun editor-refresh-export-option-date ()
  "DATEエクスポートオプションの更新"
  (interactive)
  (let* ((timestamp (format-time-string "%+FT%T%z"))
  	 (pattern (format "s/^\#+DATE:.*$/#+DATE: %s/g" timestamp)))
    (call-process-region (point-min) (point-max) "sed" t t t "-e" pattern)))


(defun editor-create-buffer ()
  (interactive)
  (let ((buf-name editor-buffer-name))
    (with-current-buffer (get-buffer-create buf-name)
      (if (= 0 (buffer-size))
  	  (progn
  	    ;; エクスポートオプションの追加
  	    (save-excursion
              (goto-char 0)
              (insert "#+DATE:\n#+TAGS[]: comment\n\n"))

  	    (editor-refresh-export-option-date)))
      (kill-all-local-variables)
      (use-local-map editor-map)
      (editor-mode))
    (switch-to-buffer buf-name)))

(define-derived-mode editor-mode org-mode
  "Editor mode"
  nil)

(defcustom editor-base-directory "/opt/ng/symdon/pages/posts"
  "Editor mode")
(defcustom editor-file-path-directory-style nil
  "Editor mode")

(defun editor-make-new-file-path ()
  "エディターモードの保存先ファイルのパス返す。

  通常ではファイルスタイルorgファイル (XXXX.org) のパスを返す。
  `editor-file-path-directory-style` をNONE NILにするとディレクトリスタ
  イルのパス(XXXX/index.org)を返す。
  "
  (let ((file-style-path (concat (directory-file-name editor-base-directory)
  				 (format "/%s.org" (truncate (float-time))))))
    (if editor-file-path-directory-style
  	(concat (directory-file-name (file-name-sans-extension file-style-path)) "/index.org")
      file-style-path)))

(defcustom editor-new-file-path #'editor-make-new-file-path
  "Editor mode")

(defun editor-save-as-kill ()
  "エディターバッファの内容をファイルに保存してgit commitする"
  (interactive)
  (let ((new-file-path (funcall editor-new-file-path)))

    ;; Create parent directory.
    (make-directory (file-name-directory new-file-path) t)

    ;; Copy buffer content
    (switch-to-buffer
     (with-current-buffer (find-file-noselect new-file-path)
       (insert-buffer-substring (get-buffer editor-buffer-name))
       (save-buffer)
       (current-buffer)))

    ;; Git commit
    (let ((default-directory (file-name-directory new-file-path)))
      (shell-command (format "git add %s" new-file-path))
      (shell-command (format "git commit -m 'Add comment.' %s" new-file-path))))

  (kill-buffer editor-buffer-name))

(defun editor-save-as-kill-file-style ()
  "ファイルスタイルでエディターバッファの内容を保存する"
  (interactive)
  (let ((editor-file-path-directory-style nil))
    (editor-save-as-kill)))

(defun editor-save-as-kill-directory-style ()
  "ディレクトリスタイルでエディターバッファの内容を保存する"
  (interactive)
  (let ((editor-file-path-directory-style t))
    (editor-save-as-kill)))

(transient-define-prefix editor-save-as ()
			 "Editor mode save as..."
			 ["Save as"
			  ("f" "Save as file style" editor-save-as-kill-file-style)
			  ("d" "Save as directory style" editor-save-as-kill-directory-style)
			  ("s" "Save as default" editor-save-as-kill)
			  ])

(bind-keys :map editor-mode-map
  	   ("C-x C-s" . editor-save-as))