使用emacs作为hugo博客的客户端

Hugo 生成博客的静态页面虽然已经很方便了,ox-hugo 自动md -> org也很便捷了,但写作和发布博客需要经过若干命令行操作才能完成。没有客户端界面直观。

目前写作和发布的流程

新建org文件 -> balabala并自动转md -> 命令行: $ hugo // 生成静态页面 -> magit stage/commit/push -> 完成

hugo 的 major-mode 插件: easy-hugo

easy-hugo 是 emacs 上的 hugo 博客管理的插件。支持markdown or org-mode or AsciiDoc or reStructuredText or mmark or html 等格式文档,多博客多站点,以及多平台部署。

easy-hugo 配置

(use-package easy-hugo
  :commands easy-hugo
  :bind
  (:map easy-hugo-mode-map
        ("SPC" . general-simulate-C-c)
        ("G" . kumo-easy-hugo-github-deploy))
  :custom
  (easy-hugo-org-header t)
  (easy-hugo-basedir kumo/easy-hugo-basedir)
  (easy-hugo-postdir kumo/easy-hugo-postdir)
  (easy-hugo-url kumo/easy-hugo-url)
  (easy-hugo-preview-url kumo/easy-hugo-preview-url)
  (easy-hugo-github-deploy-script kumo/easy-hugo-github-deploy-script)
  (easy-hugo-default-ext ".org")
  :hook
  (easy-hugo-mode . (lambda ()
                      (evil-set-initial-state 'easy-hugo-mode 'emacs)))
  )

需要配置 easy-hugo 的 basedir/postdir/preview-url/deploy-script 等等。方便 easy-hugo 读取出博客列表、部署脚本,以及执行一键预览等。

部署脚本

#!/bin/sh

# If a command fails then the deploy stops
set -e

printf "\033[0;32mDeploying updates to GitHub...\033[0m\n"

# Build the project.
hugo # if using a theme, replace with `hugo -t <YOURTHEME>`

# Go To Public folder
cd public

# Add changes to git.
git add .

# Commit changes.
msg="rebuilding site $(date)"
if [ -n "$*" ]; then
  msg="$*"
fi
git commit -m "$msg"

# Push source and build repos.
git push origin master -f
  • 配置的一些坑

    • 由于我使用了evil-mode,所以 easy-hugo-mode-map 的原生键位是不能用了。只有在 easy-hugo-mode 中屏蔽 evil-mode.
    :hook
    (easy-hugo-mode . (lambda ()
                        (evil-set-initial-state 'easy-hugo-mode 'emacs)))
    
    • 屏蔽 evil-mode 同时也屏蔽了 general 的触发键 SPC。 emacs 上没有了 SPC 就像走路蒙着双眼…
    :bind
    (:map easy-hugo-mode-map
          ("SPC" . general-simulate-C-c))
    
    • easy-hugo 原生的 github page 部署函数不支持交互式shell脚本,导致 git push 时不能输入密码。需要自己写个函数来替换它。

    这里使用 C-q 而不是 q 退出 async-shell-command 的 buffer。因为万一账号或密码中带有 “q” 就不好了…😅

    :bind
    (:map easy-hugo-mode-map
          ("G" . kumo-easy-hugo-github-deploy))
    
    
    (defun kumo-easy-hugo-github-deploy ()
      "Easy-Hugo deploy github page."
      (interactive)
      (let* ((output-buffer (get-buffer-create kumo/easy-hugo-github-deploy-buffer-name))
             (command-window (async-shell-command (expand-file-name (concat kumo/easy-hugo-basedir kumo/easy-hugo-github-deploy-script)) output-buffer nil)))
        (select-window command-window)
        (local-set-key (kbd "C-q") 'kill-buffer-and-window)))
    

现在的写作和发布的流程

呼出 easy-hugo -> n键 新建org balabala并自动转md -> G键 发布部署

博客总算能有一个像样的管理界面了😅
现在写作/发布可以直接依托 emacs,并且都不需要键入一个命令行。