背景:
经常需要写博客,又期望定制一个符合博文主题的 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 服务
- 本地模型足够胜任该任务