emacs+hugo写博客的配置

Posted by [Kohn] on Monday, May 8, 2023 本文阅读量

1 hugo介绍

参考官网的入门文档: https://gohugo.io/getting-started/

我常用的命令是:

  1. 首次使用初始化一个项目: hugo new site quickstart, 并cd进去

  2. https://themes.gohugo.io/ 挑选一个主题并下载到themes目录

  3. 按照挑选的主题的文档配置好config

  4. 编写博客, 将md文件放到content/post下(我用的是"Clean White", 需要放到post下, 其他的主题可能放到别的目录)

  5. 执行"hugo"生成静态文件, 静态文件会生成到public目录下

  6. 将生成的public目录上传放到ecs, 通过ecs上拉起的nginx提供web服务. 上传可以通过rsync(注意配置免密登录):

    hugo && rsync -avz --delete public/ user@HOST:/path/to/project/quickstart/public
    

2 ox-hugo

个人习惯使用emacs的org-mode编写各类文档, 编写完成后需要将org格式的文档转换成markdown格式. 这里还不仅仅是简单的org2markdown, 因为hugo要求在 markdown的头部添加一些元数据, 这些元数据用于标记博文的标签/分类/作者等信息. 这时候就需要用到ox-hugo这个emacs的插件了.

插件的安装很简单, list-packages然后选择插件安装即可. 使用时, 在编写完 org文档之后, 执行命令org-hugo-export-to-md就能在hugo的content/posts下生成一个markdown文件.

ox-hugo推荐所有博文放到一个org文件中, 然后每一个一级标题表示一篇博文, 当然也支持一篇博文一个org文件. 个人喜欢后者, 下面介绍的也是后者的使用方式.

ox-hugo要求在org的头部元数据增加一些标签, 例如HUGO_BASE_DIR, 这样 ox-hugo才能知道hugo项目的路径(对应了上一小节的hugo new site命令生成出来的那个目录), 个人目前在使用的标签有:

标签 解释 例子
HUGO_TAGS 博文的tag emacs
HUGO_URL 博文的URL, 我用的"Clean White"主题要求带有这个属性, 否则博文无法正常显示. 这个参数最终会体现在博文的URL上. write-blog-with-hugo
HUGO_CATEGORIES 博文的分类 editor
HUGO_BASE_DIR hugo项目根目录, 我习惯将org文件放置在hugo根目录的content-org目录下, 因此只需要指定成..即可 ../
HUGO_AUTO_SET_LASTMOD 是否要自动填充上次编辑时间 t
HUGO_SECTION 上一小节提到, “Clean White"主题要求博文放置到content/post目录下, 而ox-hugo默认是仿造posts目录下, 通过这个参数来指定输出的目录 post

每篇新博客需要添加这么一大堆标签比较麻烦, 因此这里使用了yasnippet定制了一个代码片段, 这样每次只要输入blog然后tab就能自动填充所有需要的标签了, 个人在用的snippet:

# key: blog
# name: blog
# --
#+OPTIONS: ^:nil _:nil f:nil toc:nil num:1
#+title: $1
#+STARTUP: showeverything
#+LATEX_HEADER: \usepackage{xeCJK}
#+LATEX_HEADER: \setCJKmainfont{Songti SC}
#+LATEX_HEADER: \usemintedstyle{autumn}
#+DATE: `(shell-command-to-string "echo -n $(date +%Y-%m-%d)")`
#+HUGO_TAGS:
#+HUGO_URL: ${2:`(file-name-nondirectory (file-name-sans-extension (buffer-file-name)))`}
#+HUGO_CATEGORIES:
#+HUGO_BASE_DIR: ../
#+HUGO_AUTO_SET_LASTMOD: t
#+HUGO_SECTION: post



# Local Variables:
# org-hugo-auto-export-on-save: t
# End:

片段中的末尾那一段是用来告知ox-hugo, 每次保存org文件, 自动导出markdown文件.

ox-hugo的文档: https://ox-hugo.scripter.co/doc/usage/, 可以看到更多高级用法.