<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Emacs on 乐的博客</title><link>https://liujiale.me/tags/emacs/</link><description>Recent content in Emacs on 乐的博客</description><generator>Hugo -- 0.152.2</generator><language>zh-CN</language><copyright>2015-2026 CC BY-NC-ND 4.0</copyright><lastBuildDate>Mon, 18 Aug 2025 16:05:05 +0800</lastBuildDate><atom:link href="https://liujiale.me/tags/emacs/index.xml" rel="self" type="application/rss+xml"/><item><title>为什么很多人会攒自己的 Emacs 配置？</title><link>https://liujiale.me/til/why-many-people-will-save-their-emacs-configuration/</link><pubDate>Mon, 18 Aug 2025 14:37:00 +0800</pubDate><guid>https://liujiale.me/til/why-many-people-will-save-their-emacs-configuration/</guid><description>&lt;h2 id="背景"&gt;背景&lt;/h2&gt;
&lt;p&gt;我大概从 2020 年开始使用 Doom Emacs，但是在今天之前从来没有想过要攒一套自己的 Emacs 配置。原因有很多，主要考虑到没有足够的时间，而且自己攒的未必能比一些发行版做得更好。&lt;/p&gt;
&lt;p&gt;但是最近我开始重新考虑这件事情，因此记录下来自己的一些想法。&lt;/p&gt;
&lt;h2 id="为什么"&gt;为什么&lt;/h2&gt;
&lt;p&gt;我发现自己对 Emacs 本身缺乏理解。我的快捷键是 evil + general + 原生 Emacs 混合起来的，我配置包的方式是 Doom Emacs 在 straght.el 的基础上封装的，并且很多包经过了发行版内部调整，用了很多私有变量和方法。&lt;/p&gt;
&lt;p&gt;如果不去看源码，我是不知道他们是如何配置出来的，面对茫茫多的快捷键组合，我也不知道哪些是我需要的，哪些是“我不知道的”。&lt;/p&gt;</description></item><item><title>使用 gptel 帮助生成博客的 url</title><link>https://liujiale.me/til/using-gptel-to-generate-blog-urls/</link><pubDate>Tue, 06 May 2025 23:42:00 +0800</pubDate><guid>https://liujiale.me/til/using-gptel-to-generate-blog-urls/</guid><description>&lt;p&gt;&lt;strong&gt;背景：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;经常需要写博客，又期望定制一个符合博文主题的 url，以前是自己去 Google translate 翻译然后改成 slug 格式（全小写，连字符连接）。&lt;/p&gt;
&lt;p&gt;像这篇文章的格式：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;using-gptel-to-generate-blog-urls&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;现在有 llm 之后，会开一个 deepseek 的网页或者 ChatGPT 的网页，设置基础 prompt，然后就将中文的文章名称发给它，让他给出对应的英文&lt;/p&gt;
&lt;p&gt;最近我想到也许可以将这个步骤通过一个 elisp 函数来实现，最终基于 gptel 加上一些简单的 elisp 代码实现了整个流程。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;完整代码：&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-emacs-lisp" data-lang="emacs-lisp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;defun&lt;/span&gt; &lt;span class="nv"&gt;my/gptel-gen-hugo-properties&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;&amp;#34;Generate Hugo export properties for current Org heading.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;interactive&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;unless&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;org-at-heading-p&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ne"&gt;user-error&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;必须在 Org 模式标题位置使用&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;gptel-request&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;format&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;将中文标题转换为英文 slug（全小写，连字符连接）：
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;需要翻译的原文：「%s」&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;string-trim&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;org-get-heading&lt;/span&gt; &lt;span class="no"&gt;t&lt;/span&gt; &lt;span class="no"&gt;t&lt;/span&gt; &lt;span class="no"&gt;t&lt;/span&gt; &lt;span class="no"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:system&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;只返回转换后的字符串&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:callback&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;lambda&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;response&lt;/span&gt; &lt;span class="nv"&gt;info&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;when-let*&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nv"&gt;raw&lt;/span&gt; &lt;span class="nv"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;slug&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;replace-regexp-in-string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;&amp;#34;\\([^a-z0-9]\\|-\\)+&amp;#34;&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;-&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;downcase&lt;/span&gt; &lt;span class="nv"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="no"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;org-set-property&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;EXPORT_HUGO_BUNDLE&amp;#34;&lt;/span&gt; &lt;span class="nv"&gt;slug&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;org-set-property&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;EXPORT_FILE_NAME&amp;#34;&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;index.zh&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;message&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;生成成功：%s&amp;#34;&lt;/span&gt; &lt;span class="nv"&gt;slug&lt;/span&gt;&lt;span class="p"&gt;)))))&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;使用方法：&lt;/p&gt;</description></item><item><title>封装将 Firefox 中链接插入 Org-mode 的过程成为可分享的包</title><link>https://liujiale.me/posts/wrap-firefox-links-insert-into-org-mode-as-shareable-package/</link><pubDate>Sun, 15 Jan 2023 10:35:00 +0800</pubDate><guid>https://liujiale.me/posts/wrap-firefox-links-insert-into-org-mode-as-shareable-package/</guid><description>&lt;h2 id="tl-dr"&gt;TL:DR;&lt;/h2&gt;
&lt;p&gt;为了将前面的逻辑方便的分享出去，我基于 &lt;a href="https://github.com/manateelazycat/deno-bridge"&gt;deno-bridge&lt;/a&gt; 封装了 &lt;a href="https://github.com/nailuoGG/deno-bridge-echo"&gt;deno-bridge-echo&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;将 Firefox 中的链接插入 Org-mode 是一个有用的方案，然而其实现涉及多种语言和工具，因此很难将其共享给其他人。为了解决这个问题，我使用 deno-bridge 工具封装了一个名为 deno-bridge-echo 的包，使其更易于使用和分享。现在，任何人都可以使用 deno-bridge-echo 来获取并插入来自 Firefox 的链接，而不必担心其底层实现细节。&lt;/p&gt;
&lt;h2 id="问题"&gt;问题&lt;/h2&gt;
&lt;p&gt;如何将之前的方案分享出去？&lt;/p&gt;
&lt;p&gt;之前有群友建议说可以提 PR，但是由于这个方案混合使用了多个语言、工具，可能不大好去提到别的仓库中。&lt;/p&gt;</description></item><item><title>方便地在 Org-mode 中插入 Firefox 中的链接</title><link>https://liujiale.me/posts/conveniently-inserting-links-from-firefox-in-org-mode/</link><pubDate>Tue, 10 Jan 2023 22:55:00 +0800</pubDate><guid>https://liujiale.me/posts/conveniently-inserting-links-from-firefox-in-org-mode/</guid><description>&lt;h2 id="tl-dr"&gt;TL:DR;&lt;/h2&gt;
&lt;p&gt;在撰写博客和记笔记时，我希望能够轻松地插入我正在浏览的标签页的 URL 和标题。我曾考虑使用 AppleScript，这与我之前在 Alfred 中的实现方式相似。但是，当我尝试在 Firefox 中获取 URL 时，只能通过模拟按键点击的方式，这样做既不可靠，也会打断我的写作思路。&lt;/p&gt;
&lt;p&gt;最终，我通过编写 Tampermonkey 脚本和本地 Python HTTP 服务的方式来解决这个问题。这种方法可以将
Firefox 中当前访问的标签页信息存储起来，并通过 lisp 从 HTTP 服务中获取该标签页的信息，最终解决了该问
题。&lt;/p&gt;
&lt;h2 id="一-问题"&gt;一、问题&lt;/h2&gt;
&lt;h3 id="在-emacs-中获取并插入-firefox-中的链接的体验并不是很好"&gt;在 Emacs 中获取并插入 Firefox 中的链接的体验并不是很好&lt;/h3&gt;
&lt;p&gt;最近在使用 Emacs 时，我发现了一个命令可以快速获取并插入其他应用程序中的链接，这个命令叫做
&lt;code&gt;org-mac-link-get-link&lt;/code&gt; 。然而，我发现在使用 Firefox 中获取链接时，这个命令的使用体验并不是很好，经常会出现获取失败的情况。&lt;/p&gt;</description></item></channel></rss>