背景:

经常需要写博客,又期望定制一个符合博文主题的 url,以前是自己去 Google translate 翻译然后改成 slug 格式(全小写,连字符连接)。

像这篇文章的格式:

using-gptel-to-generate-blog-urls

现在有 llm 之后,会开一个 deepseek 的网页或者 ChatGPT 的网页,设置基础 prompt,然后就将中文的文章名称发给它,让他给出对应的英文

最近我想到也许可以将这个步骤通过一个 elisp 函数来实现,最终基于 gptel 加上一些简单的 elisp 代码实现了整个流程。

完整代码:

(defun my/gptel-gen-hugo-properties ()
  "Generate Hugo export properties for current Org heading."
  (interactive)
  (unless (org-at-heading-p) (user-error "必须在 Org 模式标题位置使用"))

  (gptel-request
      (format "将中文标题转换为英文 slug(全小写,连字符连接):
需要翻译的原文:「%s」"
              (string-trim (org-get-heading t t t t)))
    :system "只返回转换后的字符串"
    :callback
    (lambda (response info)
      (when-let* ((raw response)
                 (slug (replace-regexp-in-string
                        "\\([^a-z0-9]\\|-\\)+" "-"
                        (downcase raw) nil t)))
       (org-set-property "EXPORT_HUGO_BUNDLE" slug)
       (org-set-property "EXPORT_FILE_NAME" "index.zh")
       (message "生成成功:%s" slug)))))

使用方法:

将光标放在标题位置,然后 M x ,执行命令 my/gptel-gen-hugo-properties ,等待片刻即可

过程分析:

  • 检查光标是否在 org-mode 的标题位置,如果不是就打印警告信息并退出流程
  • 如果是就获取当前标题,使用 gptel-request 调用本地 llm,
  • 将返回结果清洗拼装,使用 org-set-property 设置对应属性 EXPORT_HUGO_BUNDLE

注意我这里因为考虑到中英文双语内容,使用的是 hugo bundle 方式来组织文件

优势

  • 整个过程都在 Emacs 中操作,不需要在多个网页之间切换
  • 使用 gptel 来调用本地 ollama 服务
  • 本地模型足够胜任该任务