On Blahfe

HydeをつかってEmacsをJekyllクライアントにする

blog/backendemacsjekyllhydegithub-pages
thumbnail

Emacianとしてその殻の中に閉じこもっていたいです。だけど、世間がそれを許さず次々と無理難題を押しつけてくるのです。今回はタスク等から出てきた備忘禄をGitHub Pages(Jekyll)で管理しようと重い腰を上げました。

PROBLEM

  • タスクメモがAsanaなどのタスク管理ツールに散在している
  • ブラウザをつかって文章を書くのがつらい
  • Gist/Yagist等でもいいのだけど編集がめんどうとか個人だとオーバースペックとか

SOLUTION

というわけで、GitHub PagesJekyll)をEmacsで楽に管理できないかと以前から考えていたのですが、いい塩梅のライブラリを発見しました。JekyllだからHydeと言います。名前が jekyll doctor (hyde)とかぶっていますがここでは気にしません。

HydeのPros/Consは以下の通りです。

Pros

  • gitの自動コメント
  • jekyll buildjekyll serveのショートカット

Cons

  • キーバインドが既存のものとかぶる
  • hyde-homeがカスタム変数ではない
  • add-hookが効かない

Hydeの設定

Hydeの設定は基本いじることもなくJekyllを使うことが出来ます。下記記載するのはConsつぶしですが、ここはお好みです。

まず、キーバインド操作。Hyde本体がキーバインドをdefvarで割り当てているので、init.elの設定でrequire前に割り込みevalして、hyde関数にhyde-home引数をわたすことで解決します。あと、折り返し回りは別設定になっているのでadaptive-wraptruncate-linesを設定しています。

emacs-lisp
;;; Hyde (Jekyll client)
(require-package 'adaptive-wrap)
(defun hyde/open-post-maybe-into-other-window (pos)
  "Opens the post under cursor in the editor (POS)."
  (interactive "d")
  (let ((post-file-name (nth
                         1
                         (split-string (strip-string (thing-at-point 'line)) " : ")))
        (dir (get-text-property pos 'dir)))
    (let ((hyde-buffer (current-buffer)))
      (find-file-other-window
       (strip-string (concat hyde-home "/" dir "/" post-file-name)))
      (hyde-markdown-activate-mode hyde-buffer)
      (adaptive-wrap-prefix-mode t)
      (set-default 'truncate-lines nil))))
(defun hyde/quit-wrap ()
  "Quits hyde."
  (interactive)
  (progn
    (delete-other-windows)
    (kill-buffer (current-buffer))))
(defun create-markdown-scratch ()
  "Create a markdown scratch buffer."
  (interactive)
  (switch-to-buffer (get-buffer-create "*markdown*"))
  (markdown-mode))
(defun hyde/nabinno ()
  "Run hyde-wrap with home parameter."
  (interactive)
  (progn
    (delete-other-windows)
    (create-markdown-scratch)
    (split-window-horizontally)
    (other-window 1)
    (hyde "~/nabinno.github.io/")))
(defvar hyde-mode-map
  (let
      ((hyde-mode-map (make-sparse-keymap)))
    (define-key hyde-mode-map (kbd "N") 'hyde/new-post)
    (define-key hyde-mode-map (kbd "G") 'hyde/load-posts)
    (define-key hyde-mode-map (kbd "C") 'hyde/hyde-commit-post)
    (define-key hyde-mode-map (kbd "P") 'hyde/hyde-push)
    (define-key hyde-mode-map (kbd "J") 'hyde/run-jekyll)
    (define-key hyde-mode-map (kbd "S") 'hyde/serve)
    (define-key hyde-mode-map (kbd "K") 'hyde/stop-serve)
    (define-key hyde-mode-map (kbd "d") 'hyde/deploy)
    (define-key hyde-mode-map (kbd "D") 'hyde/delete-post)
    (define-key hyde-mode-map (kbd "U") 'hyde/promote-to-post)
    (define-key hyde-mode-map (kbd "X") 'hyde/quit-wrap)
    (define-key hyde-mode-map (kbd "O") 'hyde/open-post-maybe-into-other-window)
    hyde-mode-map)
  "Keymap for Hyde")
(global-set-key (kbd "C-c ; j") 'hyde/nabinno)
(require-package 'hyde)
(require 'hyde)

次に、ホストIPの操作。Jekyllのルートにおく.hyde.elの中身です。JekyllはWebrickを使っているので、VMなどでホストをいじっている場合はhyde/serve-commandにホストIPを0.0.0.0(jekyll s -H 0.0.0.0)に変更する必要があります。

emacs-lisp
(setq hyde-deploy-dir "_site"
      hyde-posts-dir  "_posts"
      hyde-drafts-dir "_drafts"
      hyde-images-dir "images"
      hyde/git/remote "upstream" ; The name of the remote to which we should push
      hyde/git/branch "master"   ; The name of the branch on which your blog resides
      hyde/jekyll-command "jekyll b"    ; Command to build
      hyde/serve-command  "jekyll s -H 0.0.0.0 --force_polling"    ; Command to serve
      hyde-custom-params '(("category" "personal")
                           ("tags" "")
                           ("cover" "false")
                           ("cover-image" "")))

WRAPUP

Hydeを介してEmacsでJekyllを操作できるのは、やはり快適です。特にorg-modeとMarkdownの相性が良く。org-modeで管理していた備忘をMarkdownに変換し、Jekyll(GitHub Pages)にパブリッシュというワークフローが引けたのが良かったです。数年間はお世話になると思います。

nabinno
Emacsianでアート好き、ランニング好きな@nabinnoが書いています
GitHub / X / LinkedIn / ネクイノ
blog/market

今後の成長分野:新たなテクノロジーの展望

テクノロジーの進化は、絶え間ない変化の中で私たちの日常を塗り替えてきました。時には経済的な危機が、新たな可能性を切り拓く契機となることもあります。そこで、過去のリセッション期に生まれたテクノロジーの足

market-trendrecession
blog/organization

ATKerneyの課題解決パターンの魅力的な探求

ATKerneyの課題解決パターン は、課題の本質を見極め、効果的な戦略的構造化を通じて解決策を導き出す手法にフォーカスしています。この冒険の旅は、解決者と協力者たちが心を一つにし、課題に立ち向かう様

problem-solvingatkerney
blog/market

就職氷河期とは何だったのか

私はいわゆる就職氷河期世代です。周囲から時折漏れ聞こえる不平のような言葉がありますが、それを単なる不平として片付けるのはもったいない気がします。できれば、その中に新しい視点を見つけ、次のチャンスへ繋げ

labor-economicsrecessionemployment-ice-age