2017-11-22 emacs hugo easy-hugo blog

easy-hugoでマルチブログライフを愉しむ

easy-hugo の作者 masasam さんが、我儘な私のリクエストに応えて数々のアップデートをしてくださいましたので、感謝の気持ちをこめて紹介させていただきます。 easy-hugo は、package-install できますが、頻繁に更新されているので、作者のページ で最新情報をチェックされるといいです。

Alt Text

easy-hugo の特徴

easy-hugo は、hugo によるブログ運用を限りなく自動化することに特化した Lisp です。

hugo によるマルチブログ環境

公開を目的としたブログは一つ、多くても二つというのが一般的で、私の場合もそうでしたが、 wordpress から hugo へ移行してみて、あまりの快適さに書庫代わりのようなブログが次々と増えていったのです。

私の場合は、全てのドメインとファイルを xserver で管理していますが、esay-hugo では、Github、Amazon S3、Google Cloud Storage などへの Deploy 設定も用意されています。

esay-hugo は、Emacs の上でそれらを渡り歩き、いとも簡単にマルチブログを管理できるのです。

さらなる手抜き:ファイル名を自動生成させる

ファイル名=タイトルという概念が一般的だと思うけれど、日本語のファイル名にはしたくないのと考える手間を省くために、12 桁のタイムスタンプをファイル名として New blog post 時に自動的挿入させています。

;; Timestamp to filename
(setq easy-hugo-default-ext (format-time-string "%Y%m%d%H%M.md"))

また、hugo の場合、公開されるページの url は、blogurl/post/failename というハイパーリンクになります。 どうでもよいことですが、私の場合、blogurl/filename になるようにしたかったので以下のように設定をしています。

archetypes/default.md

+++
categories = [""]
tags = [""]
title = ""
date = "{{ .Date }}"
url = "/{{ replace .TranslationBaseName "-" " " | title }}"
+++

拡張設定

timestamp をファイル名にしていると唯一不便なのは、どの記事をどのファイルに書いたかがわからないことです。

一覧リストからその内容を「ちら見」する機能が欲しいとリクエストしたら、view-other-window という関数を作っていただけたのでこれを更に便利に使うための関数を作りました。

view-other-window を開いたままで、j,k キーでページ移動できます。

;; View-other-window function more convenient
(defun easy-hugo-view-file-next (&optional reverse)
  (interactive)
  (View-quit)
  (if reverse (previous-line)
    (next-line))
  (easy-hugo-view-other-window))
(defun easy-hugo-view-file-previous ()
  (interactive)
  (easy-hugo-view-file-next 1))

(bind-key "j" 'easy-hugo-view-file-next view-mode-map)
(bind-key "k" 'easy-hugo-view-file-previous view-mode-map)

自分色にキーバンドする

(setq easy-hugo-no-help t)
;;Keys
  (bind-key [tab] 'easy-hugo-no-help easy-hugo-mode-map)
  (bind-key "o" 'easy-hugo-view-other-window easy-hugo-mode-map)
  (bind-key "e" 'my/edit-easy-hugo easy-hugo-mode-map)
  (bind-key "C-c p" 'easy-hugo-preview)
  (bind-key "C-c P" 'easy-hugo-publish)
  (bind-key "C-c e" 'easy-hugo))

設定ファイル

設定ファイルは、以下のとおりです。

試行錯誤を繰り返し、今も日進月歩ですので、最新版は、私の Github に置いてあります。

(use-package easy-hugo
  :init
  ;; Main blog (=blog1)
  (setq easy-hugo-basedir "~/Dropbox/Web/textgh/snap/"
        easy-hugo-url "https://snap.textgh.org"
        easy-hugo-sshdomain "xsrv"
        easy-hugo-root "/home/minorugh/textgh.org/public_html/snap/"
        easy-hugo-previewtime "300")
  ;; Bloglist
  (setq easy-hugo-bloglist
       ;; blog2 setting
        '(((easy-hugo-basedir . "~/Dropbox/Web/textgh/essay/")
          (easy-hugo-url . "https://essay.textgh.org")
          (easy-hugo-sshdomain . "xsrv")
          (easy-hugo-root . "/home/minorugh/textgh.org/public_html/essay/"))
       ;; blog3 setting
         ((easy-hugo-basedir . "~/Dropbox/Web/textgh/photo/")
          (easy-hugo-url . "https://photo.textgh.org")
          (easy-hugo-sshdomain . "xsrv")
          (easy-hugo-root . "/home/minorugh/textgh.org/public_html/photo/"))
       ;; blog4 setting
         ((easy-hugo-basedir . "~/Dropbox/Web/textgh/ryo/")
          (easy-hugo-url . "https://ryo.textgh.org")
          (easy-hugo-sshdomain . "xsrv")
          (easy-hugo-root . "/home/minorugh/textgh.org/public_html/ryo/"))))
  ;; No help-mode from startup
  (setq easy-hugo-no-help t)
  ;; Charactor-sort at s key
  (setq easy-hugo-sort-default-char 1)
  ;; Timestamp to filename
  (setq easy-hugo-default-ext (format-time-string "%Y%m%d%H%M.md"))
  :config
  ;; Sort-char at startup
  (setq easy-hugo--sort-char-flg 2)
  (setq easy-hugo--sort-time-flg nil))
;; end of use-package settings //////////////////////////////////////

;; Customize help menu
(setq easy-hugo-help
"n .. New blog post    R .. Rename file     p .. Preview          G .. Refresh
d .. Delete post      a .. Seach blog ag   P .. Publish server   J .. Jump blog
v .. Open view-mode   S .. Sort time       < .. Previous blog    > .. Next blog
, .. Pre postdir      . .. Next postdir    ? .. Describe-mode    N .. No help-mode
O .. Open base dir    c .. Open config     e .. Edit easy-hugo   o .. View other window
")
(setq easy-hugo-help-line 5)
(bind-key [tab] 'easy-hugo-no-help easy-hugo-mode-map)
(bind-key "o" 'easy-hugo-view-other-window easy-hugo-mode-map)
(bind-key "e" 'my/edit-easy-hugo easy-hugo-mode-map)
(bind-key "C-c p" 'easy-hugo-preview)
(bind-key "C-c P" 'easy-hugo-publish)
(bind-key "C-c e" 'easy-hugo)


;; Edit this file
(defun my/edit-easy-hugo ()
  (interactive)
  (find-file "~/Dropbox/emacs.d/inits/80_easy-hugo.el"))

;; View-other-window function more convenient
(defun easy-hugo-view-file-next (&optional reverse)
  (interactive)
  (View-quit)
  (if reverse (previous-line)
    (next-line))
  (easy-hugo-view-other-window))
(defun easy-hugo-view-file-previous ()
  (interactive)
  (easy-hugo-view-file-next 1))

(bind-key "j" 'easy-hugo-view-file-next view-mode-map)
(bind-key "k" 'easy-hugo-view-file-previous view-mode-map)

;;; 80_easy-hugo.el ends here

最後に

easy-hugo のファイル一覧は、デフォルトでは、記事のタイムスタンプ順に並びます。この設定の場合、記事の内容を修正、更新する度に、ファイルの並びが変わることになります。

私の場合は、記事を作成した時系列順に並べておきたいので、デフォルトのファイルの並びをファイル名順になるように設定しています。ファイル名をタイムスタンプにしているのは、その必要も満たすためなのです。

use-packege 設定の中の以下の箇所がそれです。

:init
;; Charactor-sort at s key
(setq easy-hugo-sort-default-char 1)
:config
;; Sort-char at startup
(setq easy-hugo--sort-char-flg 2)
(setq easy-hugo--sort-time-flg nil)

masasam さんに感謝

ご紹介した設定の全ては、easy-hugo の作者、masasam さんのご指導によるものです。

Emacs-Lisp のイロハも知らなかった初心者の私ですが、easy-hugo と関わったお陰で、片言ながらも Lisp の読み書きができるようになり、パッチワークでカスタマイズできるまでになりました。

masasam さんに感謝、easy-hugo に感謝です。

2017-11-22 emacs hugo easy-hugo blog