<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>remacs的世界</title>
    <link>/</link>
    <description>Recent content on remacs的世界</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>zh</language>
    <lastBuildDate>Thu, 11 Jul 2024 06:37:32 +0800</lastBuildDate><atom:link href="/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>大模型时代我们怎么玩Emacs：5. Org 文件导出为 Markdown 文件时的链接改造</title>
      <link>/posts/%E5%A4%A7%E6%A8%A1%E5%9E%8B%E6%97%B6%E4%BB%A3%E6%88%91%E4%BB%AC%E6%80%8E%E4%B9%88%E7%8E%A9emacs5.-org-%E6%96%87%E4%BB%B6%E5%AF%BC%E5%87%BA%E4%B8%BA-markdown-%E6%96%87%E4%BB%B6%E6%97%B6%E7%9A%84%E9%93%BE%E6%8E%A5%E6%94%B9%E9%80%A0/</link>
      <pubDate>Thu, 11 Jul 2024 06:37:32 +0800</pubDate>
      
      <guid>/posts/%E5%A4%A7%E6%A8%A1%E5%9E%8B%E6%97%B6%E4%BB%A3%E6%88%91%E4%BB%AC%E6%80%8E%E4%B9%88%E7%8E%A9emacs5.-org-%E6%96%87%E4%BB%B6%E5%AF%BC%E5%87%BA%E4%B8%BA-markdown-%E6%96%87%E4%BB%B6%E6%97%B6%E7%9A%84%E9%93%BE%E6%8E%A5%E6%94%B9%E9%80%A0/</guid>
      <description>&lt;div class=&#34;ox-hugo-toc toc has-section-numbers&#34;&gt;
&lt;div class=&#34;heading&#34;&gt;&amp;#30446;&amp;#24405;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class=&#34;section-num&#34;&gt;1&lt;/span&gt; &lt;a href=&#34;#%e5%89%8d%e8%a8%80&#34;&gt;前言&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;section-num&#34;&gt;2&lt;/span&gt; &lt;a href=&#34;#org-%e6%96%87%e4%bb%b6%e5%af%bc%e5%87%ba%e4%b8%ba-markdown-%e6%96%87%e4%bb%b6%e6%97%b6%e7%9a%84%e9%93%be%e6%8e%a5%e6%94%b9%e9%80%a0&#34;&gt;Org 文件导出为 Markdown 文件时的链接改造&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class=&#34;section-num&#34;&gt;2.1&lt;/span&gt; &lt;a href=&#34;#%e8%83%8c%e6%99%af&#34;&gt;背景&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;section-num&#34;&gt;2.2&lt;/span&gt; &lt;a href=&#34;#%e5%90%91%e5%a4%a7%e6%a8%a1%e5%9e%8b%e6%8f%8f%e8%bf%b0%e9%97%ae%e9%a2%98&#34;&gt;向大模型描述问题&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;section-num&#34;&gt;2.3&lt;/span&gt; &lt;a href=&#34;#%e8%b0%83%e8%af%95%e5%92%8c%e5%8f%8d%e9%a6%88&#34;&gt;调试和反馈&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;section-num&#34;&gt;2.4&lt;/span&gt; &lt;a href=&#34;#%e5%8f%af%e8%83%bd%e6%98%af-org-mode-%e7%9a%84%e4%b8%80%e4%b8%aa-bug&#34;&gt;可能是 Org-mode 的一个 bug&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;section-num&#34;&gt;2.5&lt;/span&gt; &lt;a href=&#34;#%e5%a2%9e%e5%8a%a0%e5%90%8e%e5%a4%84%e7%90%86%e8%a7%a3%e5%86%b3%e8%bf%99%e4%b8%aa-bug&#34;&gt;增加后处理解决这个 bug&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;section-num&#34;&gt;2.6&lt;/span&gt; &lt;a href=&#34;#%e6%9c%80%e7%bb%88%e7%94%9f%e6%88%90%e7%9a%84%e4%bb%a3%e7%a0%81&#34;&gt;最终生成的代码&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;section-num&#34;&gt;2.7&lt;/span&gt; &lt;a href=&#34;#%e6%9c%80%e7%bb%88%e7%9a%84%e6%95%88%e6%9e%9c&#34;&gt;最终的效果&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;section-num&#34;&gt;3&lt;/span&gt; &lt;a href=&#34;#%e7%bb%93%e8%af%ad&#34;&gt;结语&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;!--endtoc--&gt;
&lt;h2 id=&#34;前言&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;1&lt;/span&gt; 前言 &lt;a href=&#34;#%e5%89%8d%e8%a8%80&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;在大模型时代，一切皆有可能。对于 Emacs 同样如此，大模型拉低学习了 Emacs 的门槛，我们通过大模型可以做到以前我们敢想不敢做，或敢做没时间做，或有时间不会做的事。&lt;/p&gt;
&lt;p&gt;今天继续这个新的系列，跟大家分享在大模型时代，我们可以如何“玩” Emacs，我们应该怎么用大模型来满足自己对 Emacs 使用的需求。&lt;/p&gt;
&lt;h2 id=&#34;org-文件导出为-markdown-文件时的链接改造&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;2&lt;/span&gt; Org 文件导出为 Markdown 文件时的链接改造 &lt;a href=&#34;#org-%e6%96%87%e4%bb%b6%e5%af%bc%e5%87%ba%e4%b8%ba-markdown-%e6%96%87%e4%bb%b6%e6%97%b6%e7%9a%84%e9%93%be%e6%8e%a5%e6%94%b9%e9%80%a0&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;h3 id=&#34;背景&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;2.1&lt;/span&gt; 背景 &lt;a href=&#34;#%e8%83%8c%e6%99%af&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;我经常使用 Emacs 的 Org-mode 和 &lt;a href=&#34;https://github.com/honkit/honkit&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;honkit&lt;/a&gt; 软件来写产品手册或技术文档。我会先用 Org-mode 来写原始的文档，然后导出为 Markdown 文件，然后在命令行通过 &lt;code&gt;npx honkit serve&lt;/code&gt; 命令生成静态站点，打个包把所有的 HTML 发给前端部署一下，整个产品手册就写完了。成品大概长下面这样：&lt;/p&gt;
&lt;figure class=&#34;zoomImage&#34;&gt;&lt;img src=&#34;/ox-hugo/img_20240715_152235.png&#34; width=&#34;700&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;整个工作流非常顺畅，就是有一点很烦人，我在 Org 文档里会有很多截图，我的截图会带一些属性，例如 &lt;code&gt;width&lt;/code&gt;, &lt;code&gt;class&lt;/code&gt; 等，在导出为 Markdown 时，这些属性会丢失。&lt;/p&gt;
&lt;p&gt;下面是我在 Org 文件里的截图的文本的一个示例，通过 &lt;code&gt;#+ATTR_HTML:&lt;/code&gt; 会添加一些额外的属性：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-org&#34; data-lang=&#34;org&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;#+DOWNLOADED&lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;: screenshot @ 2024-07-11 四 06:41:14&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;#+CAPTION&lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;#+ATTR_ORG&lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;: :width 400&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;#+ATTR_LATEX&lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;: :width 0.5\linewidth :float nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;#+ATTR_HTML&lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;: :width 400 :class zoomImage&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[[&lt;span style=&#34;color:#b44&#34;&gt;file:org文件导出为Markdown文件时的链接改造.assets/demo.png&lt;/span&gt;]]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在实际导出为 Markdown 文件后，链接如下：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-markdown&#34; data-lang=&#34;markdown&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;![&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;img&lt;/span&gt;](&lt;span style=&#34;color:#b44&#34;&gt;org文件导出为Markdown文件时的链接改造.assets/demo.png&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;可以看到丢失了 &lt;code&gt;width&lt;/code&gt;, &lt;code&gt;class&lt;/code&gt; 等属性，这样会导致最终生成网页里的图片的大小会失控，有的时候我明明希望它以 400px 显示，却以 800px 来显示，看上去很不协调，我更希望的是下面这张图：&lt;/p&gt;
&lt;figure class=&#34;zoomImage&#34;&gt;&lt;img src=&#34;/ox-hugo/img_20240711_154812.png&#34; width=&#34;700&#34;&gt;
&lt;/figure&gt;

&lt;figure class=&#34;zoomImage&#34;&gt;&lt;img src=&#34;/ox-hugo/img_20240711_154942.png&#34; width=&#34;700&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;Markdown 天然支持 &lt;code&gt;&amp;lt;img src=&amp;quot;&amp;quot; width=&amp;quot;&amp;quot; alt=&amp;quot;&amp;quot; class=&amp;quot;&amp;quot;&amp;gt;&lt;/code&gt; 这样的标签，因此自然而然的就想，是不是可以让 Org-mode 在导出为 Markdown 格式时，将 Markdown 格式的链接做一个转换，同时带上 width 这些属性。&lt;/p&gt;
&lt;h3 id=&#34;向大模型描述问题&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;2.2&lt;/span&gt; 向大模型描述问题 &lt;a href=&#34;#%e5%90%91%e5%a4%a7%e6%a8%a1%e5%9e%8b%e6%8f%8f%e8%bf%b0%e9%97%ae%e9%a2%98&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;在向大模型描述问题的时候，请注意，最好使用实际的例子，比如实际的 Org 文档里的图片链接，导出为 Markdown 文档之后的链接，并写明期望的结果：&lt;/p&gt;
&lt;figure class=&#34;zoomImage&#34;&gt;&lt;img src=&#34;/ox-hugo/img_20240715_112632.png&#34; width=&#34;600&#34;&gt;
&lt;/figure&gt;

&lt;h3 id=&#34;调试和反馈&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;2.3&lt;/span&gt; 调试和反馈 &lt;a href=&#34;#%e8%b0%83%e8%af%95%e5%92%8c%e5%8f%8d%e9%a6%88&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;在拿到大模型给的初版代码时，我们需要进行试运行，并将相应的报错（如有）的信息给到大模型，让大模型调整代码。&lt;/p&gt;
&lt;figure class=&#34;zoomImage&#34;&gt;&lt;img src=&#34;/ox-hugo/img_20240715_142222.png&#34; width=&#34;600&#34;&gt;
&lt;/figure&gt;

&lt;h3 id=&#34;可能是-org-mode-的一个-bug&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;2.4&lt;/span&gt; 可能是 Org-mode 的一个 bug &lt;a href=&#34;#%e5%8f%af%e8%83%bd%e6%98%af-org-mode-%e7%9a%84%e4%b8%80%e4%b8%aa-bug&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;在调试许久之后，最终得到了如下的代码：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-emacs-lisp&#34; data-lang=&#34;emacs-lisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#a2f&#34;&gt;defun&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;my-org-md-export-image-links&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;text&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;backend&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;info&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;Convert image file links to HTML img tags with attributes on Markdown export.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#a2f&#34;&gt;when&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;org-export-derived-backend-p&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;backend&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;&amp;#39;md&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#b8860b&#34;&gt;replace-regexp-in-string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;\\!\\[.*\\](\\(.*\\))&amp;#34;&lt;/span&gt;  &lt;span style=&#34;color:#080;font-style:italic&#34;&gt;;; 更加严格匹配整个 Markdown 图片链接&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     (&lt;span style=&#34;color:#a2f&#34;&gt;lambda&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;m&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       (&lt;span style=&#34;color:#a2f&#34;&gt;let*&lt;/span&gt; ((&lt;span style=&#34;color:#b8860b&#34;&gt;path&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;match-string&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;m&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              &lt;span style=&#34;color:#080;font-style:italic&#34;&gt;;; 从 Org 文件解析中寻找对应的链接元素&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              (&lt;span style=&#34;color:#b8860b&#34;&gt;link&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;org-element-map&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;org-element-parse-buffer&lt;/span&gt;) &lt;span style=&#34;color:#b8860b&#34;&gt;&amp;#39;link&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                      (&lt;span style=&#34;color:#a2f&#34;&gt;lambda&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;el&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        (&lt;span style=&#34;color:#a2f&#34;&gt;when&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;string=&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;org-element-property&lt;/span&gt; &lt;span style=&#34;color:#a2f&#34;&gt;:path&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;el&lt;/span&gt;) &lt;span style=&#34;color:#b8860b&#34;&gt;path&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                          &lt;span style=&#34;color:#b8860b&#34;&gt;el&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                      &lt;span style=&#34;color:#800&#34;&gt;nil&lt;/span&gt; &lt;span style=&#34;color:#800&#34;&gt;t&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;&amp;#39;link&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              &lt;span style=&#34;color:#080;font-style:italic&#34;&gt;;; 提取链接的父元素中的 HTML 属性&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              (&lt;span style=&#34;color:#b8860b&#34;&gt;attributes&lt;/span&gt; (&lt;span style=&#34;color:#a2f&#34;&gt;and&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;link&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;org-export-read-attribute&lt;/span&gt; &lt;span style=&#34;color:#a2f&#34;&gt;:attr_html&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;org-element-property&lt;/span&gt; &lt;span style=&#34;color:#a2f&#34;&gt;:parent&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;link&lt;/span&gt;))))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              (&lt;span style=&#34;color:#b8860b&#34;&gt;width&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;plist-get&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;attributes&lt;/span&gt; &lt;span style=&#34;color:#a2f&#34;&gt;:width&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              (&lt;span style=&#34;color:#b8860b&#34;&gt;class&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;plist-get&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;attributes&lt;/span&gt; &lt;span style=&#34;color:#a2f&#34;&gt;:class&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         &lt;span style=&#34;color:#080;font-style:italic&#34;&gt;;; 生成带属性的 HTML &amp;lt;img&amp;gt; 标签&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         (&lt;span style=&#34;color:#a2f&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;attributes&lt;/span&gt;  &lt;span style=&#34;color:#080;font-style:italic&#34;&gt;; 只有当找到属性时才替换&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;             (&lt;span style=&#34;color:#00a000&#34;&gt;format&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;&amp;lt;img src=\&amp;#34;%s\&amp;#34; alt=\&amp;#34;%s\&amp;#34; %s %s&amp;gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                     &lt;span style=&#34;color:#b8860b&#34;&gt;path&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                     (&lt;span style=&#34;color:#00a000&#34;&gt;file-name-nondirectory&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;path&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                     (&lt;span style=&#34;color:#a2f&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;width&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;format&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;width=\&amp;#34;%s\&amp;#34;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;width&lt;/span&gt;) &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                     (&lt;span style=&#34;color:#a2f&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;class&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;format&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;class=\&amp;#34;%s\&amp;#34;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;class&lt;/span&gt;) &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;           &lt;span style=&#34;color:#b8860b&#34;&gt;m&lt;/span&gt;)))  &lt;span style=&#34;color:#080;font-style:italic&#34;&gt;; 如果没有属性或未找到匹配的元素，则不修改&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     &lt;span style=&#34;color:#b8860b&#34;&gt;text&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#b8860b&#34;&gt;add-to-list&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;&amp;#39;org-export-filter-link-functions&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;             &lt;span style=&#34;color:#b8860b&#34;&gt;&amp;#39;my-org-md-export-image-links&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;执行了这段代码，我们发现，生成的新的链接，是带上原有图片的 width 等属性了，但是生成的链接总是多了一些额外的字符串，我自己判断是在链接做正则替换的时候出了问题。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-markdown&#34; data-lang=&#34;markdown&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;![i&amp;lt;img src=&amp;#34;appComponents.assets/img_20231008_094849.png&amp;#34; alt=&amp;#34;img&amp;#34; width=&amp;#34;300&amp;#34; class=&amp;#34;zoomImage&amp;#34;&amp;gt;omponents.assets/img_20231008_094849.png)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;然而，更有趣的是，即使我使用 &lt;code&gt;emacs -Q&lt;/code&gt; 来启动 Emacs，执行上面的代码，依然存在这样的问题。&lt;/p&gt;
&lt;p&gt;为了检验正则表达式有无问题，我写了下面的一个小函数来做测试，发现测试结果是符合预期的 &lt;code&gt;&amp;lt;img src=\&amp;quot;appTest.assets/img_20231007_181409.png\&amp;quot; alt=\&amp;quot;img_20231007_181409.png\&amp;quot; 400 zoomImage&amp;gt;&lt;/code&gt;, 并没有出现上面的情况:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-emacs-lisp&#34; data-lang=&#34;emacs-lisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#b8860b&#34;&gt;replace-regexp-in-string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;\\!\\[.*?\\](\\([^)]+\\))&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; (&lt;span style=&#34;color:#a2f&#34;&gt;lambda&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;m&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   (&lt;span style=&#34;color:#a2f&#34;&gt;let*&lt;/span&gt; ((&lt;span style=&#34;color:#b8860b&#34;&gt;path&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;match-string&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;m&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     (&lt;span style=&#34;color:#a2f&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#800&#34;&gt;t&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         (&lt;span style=&#34;color:#00a000&#34;&gt;format&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;&amp;lt;img src=\&amp;#34;%s\&amp;#34; alt=\&amp;#34;%s\&amp;#34; width=\&amp;#34;%s\&amp;#34; class=\&amp;#34;%s\&amp;#34;&amp;gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                 &lt;span style=&#34;color:#b8860b&#34;&gt;path&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                 (&lt;span style=&#34;color:#00a000&#34;&gt;file-name-nondirectory&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;path&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                 &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;400&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                 &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;zoomImage&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       &lt;span style=&#34;color:#b8860b&#34;&gt;m&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;BalaBala...：
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#b44&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#b44&#34;&gt;![img](appTest.assets/img_20231007_181311.png)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#b44&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#b44&#34;&gt;Balabala：
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#b44&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#b44&#34;&gt;![img](appTest.assets/img_20231007_181409.png)&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;results&#34;&gt;
&lt;p&gt;&amp;ldquo;BalaBala&amp;hellip;：\n\n&amp;lt;img src=\&amp;ldquo;appTest.assets/img_20231007_181311.png\&amp;rdquo; alt=\&amp;ldquo;img_20231007_181311.png\&amp;rdquo; width=\&amp;ldquo;400\&amp;rdquo; class=\&amp;ldquo;zoomImage\&amp;quot;&amp;gt;\n\nBalabala：\n\n&amp;lt;img src=\&amp;ldquo;appTest.assets/img_20231007_181409.png\&amp;rdquo; alt=\&amp;ldquo;img_20231007_181409.png\&amp;rdquo; width=\&amp;ldquo;400\&amp;rdquo; class=\&amp;ldquo;zoomImage\&amp;quot;&amp;gt;&amp;rdquo;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;那么，此时此刻，凭我的知识和代码能力，是无能为力了，只能姑且认为这是 Org-mode 的一个隐藏 bug 吧。&lt;/p&gt;
&lt;h3 id=&#34;增加后处理解决这个-bug&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;2.5&lt;/span&gt; 增加后处理解决这个 bug &lt;a href=&#34;#%e5%a2%9e%e5%8a%a0%e5%90%8e%e5%a4%84%e7%90%86%e8%a7%a3%e5%86%b3%e8%bf%99%e4%b8%aa-bug&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;为了解决这个问题，我想到我们能不能在最终生成完的 Markdown 文件里找到所有 &lt;code&gt;![i&amp;lt;img src=&amp;quot;xxx&amp;quot; ...&amp;gt;components.assets/...png)&lt;/code&gt; 这样的字符串，将尖括号两边的多余字符串给删掉来解决呢？&lt;/p&gt;
&lt;p&gt;于是就有了下面这一次与大模型的对话和尝试：&lt;/p&gt;
&lt;figure class=&#34;zoomImage&#34;&gt;&lt;img src=&#34;/ox-hugo/img_20240715_155723.png&#34; width=&#34;600&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;最终经过尝试，通过下面这一段代码，在导出为 Markdown 后，在生成的 markdown 文件里处理这些有问题的链接：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-emacs-lisp&#34; data-lang=&#34;emacs-lisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#a2f&#34;&gt;defun&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;fix-markdown-image-links&lt;/span&gt; ()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;Fix image links in the exported Markdown file.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#00a000&#34;&gt;goto-char&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;point-min&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#a2f&#34;&gt;while&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;re-search-forward&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;!\\[i\\(&amp;lt;img.*?\&amp;#34;&amp;gt;\\).*&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#800&#34;&gt;nil&lt;/span&gt; &lt;span style=&#34;color:#800&#34;&gt;t&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#00a000&#34;&gt;replace-match&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;\\1&amp;#34;&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#a2f&#34;&gt;defun&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;my/org-export-to-markdown&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;org&lt;/span&gt; &lt;span style=&#34;color:#a2f&#34;&gt;&amp;amp;rest&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;args&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;Post-process the generated Markdown file.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#a2f&#34;&gt;let&lt;/span&gt; ((&lt;span style=&#34;color:#b8860b&#34;&gt;output-file&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;concat&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;file-name-sans-extension&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;buffer-file-name&lt;/span&gt;)) &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;.md&amp;#34;&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#a2f&#34;&gt;when&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;file-exists-p&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;output-file&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (&lt;span style=&#34;color:#b8860b&#34;&gt;find-file&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;output-file&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#080;font-style:italic&#34;&gt;;; 在这里进行你需要的文本处理操作，例如添加特定文本&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (&lt;span style=&#34;color:#b8860b&#34;&gt;fix-markdown-image-links&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#080;font-style:italic&#34;&gt;;; 保存并关闭文件&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (&lt;span style=&#34;color:#b8860b&#34;&gt;save-buffer&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (&lt;span style=&#34;color:#00a000&#34;&gt;kill-buffer&lt;/span&gt;))))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#b8860b&#34;&gt;advice-add&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;&amp;#39;org-md-export-to-markdown&lt;/span&gt; &lt;span style=&#34;color:#a2f&#34;&gt;:after&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;&amp;#39;my/org-export-to-markdown&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#b8860b&#34;&gt;advice-add&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;&amp;#39;org-gfm-export-to-markdown&lt;/span&gt; &lt;span style=&#34;color:#a2f&#34;&gt;:after&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;&amp;#39;my/org-export-to-markdown&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;完美！&lt;/p&gt;
&lt;h3 id=&#34;最终生成的代码&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;2.6&lt;/span&gt; 最终生成的代码 &lt;a href=&#34;#%e6%9c%80%e7%bb%88%e7%94%9f%e6%88%90%e7%9a%84%e4%bb%a3%e7%a0%81&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-emacs-lisp&#34; data-lang=&#34;emacs-lisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#a2f&#34;&gt;defun&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;my-org-md-export-image-links&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;text&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;backend&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;info&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;Convert image file links to HTML img tags with attributes on Markdown export.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#a2f&#34;&gt;when&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;org-export-derived-backend-p&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;backend&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;&amp;#39;md&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#b8860b&#34;&gt;replace-regexp-in-string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;\\!\\[.*\\](\\(.*\\))&amp;#34;&lt;/span&gt;  &lt;span style=&#34;color:#080;font-style:italic&#34;&gt;;; 更加严格匹配整个 Markdown 图片链接&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     (&lt;span style=&#34;color:#a2f&#34;&gt;lambda&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;m&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       (&lt;span style=&#34;color:#a2f&#34;&gt;let*&lt;/span&gt; ((&lt;span style=&#34;color:#b8860b&#34;&gt;path&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;match-string&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;m&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              &lt;span style=&#34;color:#080;font-style:italic&#34;&gt;;; 从 Org 文件解析中寻找对应的链接元素&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              (&lt;span style=&#34;color:#b8860b&#34;&gt;link&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;org-element-map&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;org-element-parse-buffer&lt;/span&gt;) &lt;span style=&#34;color:#b8860b&#34;&gt;&amp;#39;link&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                      (&lt;span style=&#34;color:#a2f&#34;&gt;lambda&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;el&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        (&lt;span style=&#34;color:#a2f&#34;&gt;when&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;string=&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;org-element-property&lt;/span&gt; &lt;span style=&#34;color:#a2f&#34;&gt;:path&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;el&lt;/span&gt;) &lt;span style=&#34;color:#b8860b&#34;&gt;path&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                          &lt;span style=&#34;color:#b8860b&#34;&gt;el&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                      &lt;span style=&#34;color:#800&#34;&gt;nil&lt;/span&gt; &lt;span style=&#34;color:#800&#34;&gt;t&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;&amp;#39;link&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              &lt;span style=&#34;color:#080;font-style:italic&#34;&gt;;; 提取链接的父元素中的 HTML 属性&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              (&lt;span style=&#34;color:#b8860b&#34;&gt;attributes&lt;/span&gt; (&lt;span style=&#34;color:#a2f&#34;&gt;and&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;link&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;org-export-read-attribute&lt;/span&gt; &lt;span style=&#34;color:#a2f&#34;&gt;:attr_html&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;org-element-property&lt;/span&gt; &lt;span style=&#34;color:#a2f&#34;&gt;:parent&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;link&lt;/span&gt;))))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              (&lt;span style=&#34;color:#b8860b&#34;&gt;width&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;plist-get&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;attributes&lt;/span&gt; &lt;span style=&#34;color:#a2f&#34;&gt;:width&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              (&lt;span style=&#34;color:#b8860b&#34;&gt;class&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;plist-get&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;attributes&lt;/span&gt; &lt;span style=&#34;color:#a2f&#34;&gt;:class&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         &lt;span style=&#34;color:#080;font-style:italic&#34;&gt;;; 生成带属性的 HTML &amp;lt;img&amp;gt; 标签&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         (&lt;span style=&#34;color:#a2f&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;attributes&lt;/span&gt;  &lt;span style=&#34;color:#080;font-style:italic&#34;&gt;; 只有当找到属性时才替换&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;             (&lt;span style=&#34;color:#00a000&#34;&gt;format&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;&amp;lt;img src=\&amp;#34;%s\&amp;#34; alt=\&amp;#34;%s\&amp;#34; %s %s&amp;gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                     &lt;span style=&#34;color:#b8860b&#34;&gt;path&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                     (&lt;span style=&#34;color:#00a000&#34;&gt;file-name-nondirectory&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;path&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                     (&lt;span style=&#34;color:#a2f&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;width&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;format&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;width=\&amp;#34;%s\&amp;#34;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;width&lt;/span&gt;) &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                     (&lt;span style=&#34;color:#a2f&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;class&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;format&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;class=\&amp;#34;%s\&amp;#34;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;class&lt;/span&gt;) &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;           &lt;span style=&#34;color:#b8860b&#34;&gt;m&lt;/span&gt;)))  &lt;span style=&#34;color:#080;font-style:italic&#34;&gt;; 如果没有属性或未找到匹配的元素，则不修改&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     &lt;span style=&#34;color:#b8860b&#34;&gt;text&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#b8860b&#34;&gt;add-to-list&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;&amp;#39;org-export-filter-link-functions&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;             &lt;span style=&#34;color:#b8860b&#34;&gt;&amp;#39;my-org-md-export-image-links&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#a2f&#34;&gt;defun&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;fix-markdown-image-links&lt;/span&gt; ()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;Fix image links in the exported Markdown file.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#00a000&#34;&gt;goto-char&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;point-min&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#a2f&#34;&gt;while&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;re-search-forward&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;!\\[i\\(&amp;lt;img.*?\&amp;#34;&amp;gt;\\).*&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#800&#34;&gt;nil&lt;/span&gt; &lt;span style=&#34;color:#800&#34;&gt;t&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#00a000&#34;&gt;replace-match&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;\\1&amp;#34;&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#a2f&#34;&gt;defun&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;my/org-export-to-markdown&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;org&lt;/span&gt; &lt;span style=&#34;color:#a2f&#34;&gt;&amp;amp;rest&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;args&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;Post-process the generated Markdown file.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#a2f&#34;&gt;let&lt;/span&gt; ((&lt;span style=&#34;color:#b8860b&#34;&gt;output-file&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;concat&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;file-name-sans-extension&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;buffer-file-name&lt;/span&gt;)) &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;.md&amp;#34;&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#a2f&#34;&gt;when&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;file-exists-p&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;output-file&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (&lt;span style=&#34;color:#b8860b&#34;&gt;find-file&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;output-file&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#080;font-style:italic&#34;&gt;;; 在这里进行你需要的文本处理操作，例如添加特定文本&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (&lt;span style=&#34;color:#b8860b&#34;&gt;fix-markdown-image-links&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#080;font-style:italic&#34;&gt;;; 保存并关闭文件&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (&lt;span style=&#34;color:#b8860b&#34;&gt;save-buffer&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (&lt;span style=&#34;color:#00a000&#34;&gt;kill-buffer&lt;/span&gt;))))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#b8860b&#34;&gt;advice-add&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;&amp;#39;org-md-export-to-markdown&lt;/span&gt; &lt;span style=&#34;color:#a2f&#34;&gt;:after&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;&amp;#39;my/org-export-to-markdown&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#b8860b&#34;&gt;advice-add&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;&amp;#39;org-gfm-export-to-markdown&lt;/span&gt; &lt;span style=&#34;color:#a2f&#34;&gt;:after&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;&amp;#39;my/org-export-to-markdown&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;最终的效果&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;2.7&lt;/span&gt; 最终的效果 &lt;a href=&#34;#%e6%9c%80%e7%bb%88%e7%9a%84%e6%95%88%e6%9e%9c&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;原始 org 文档：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-org&#34; data-lang=&#34;org&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000080;font-weight:bold&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt; title&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hello, world!
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;#+DOWNLOADED&lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;: screenshot @ 2024-06-27 四 15:41:48&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;#+CAPTION&lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;#+ATTR_ORG&lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;: :width 800&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;#+ATTR_LATEX&lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;: :width 1.0\linewidth :float nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;#+ATTR_HTML&lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;: :width 800 :class zoomImage&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[[&lt;span style=&#34;color:#b44&#34;&gt;file:temp.assets/img_20240627_154148.png&lt;/span&gt;]]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Good!
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;最终生成的 markdown 文档：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-markdown&#34; data-lang=&#34;markdown&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;-&lt;/span&gt; [&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;title&lt;/span&gt;](&lt;span style=&#34;color:#b44&#34;&gt;#org79702d9&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;a id=&amp;#34;org79702d9&amp;#34;&amp;gt;&amp;lt;/a&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000080;font-weight:bold&#34;&gt;# title
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hello, world!
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;img src=&amp;#34;temp.assets/img_20240627_154148.png&amp;#34; alt=&amp;#34;img_20240627_154148.png&amp;#34; width=&amp;#34;800&amp;#34; class=&amp;#34;zoomImage&amp;#34;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Good!
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;结语&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;3&lt;/span&gt; 结语 &lt;a href=&#34;#%e7%bb%93%e8%af%ad&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;今天这个案例，我们无法通过大模型一次性地解决问题，我们可以根据需要，让大模型辅助人，人需要思考，很多时候，人的思路比大模型更重要，人能更好地指导大模型如何服务于人。&lt;/p&gt;
&lt;p&gt;后续，将会继续分享几个案例。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;org 文件导出为 HTML 的 css 改造&lt;/li&gt;
&lt;li&gt;&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;我也会持续的使用 ChatGPT 和 Emacs，持续分享我的心得，感谢您的阅读。&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>大模型时代我们怎么玩Emacs：4. Org 文件里的链接和反链改造</title>
      <link>/posts/%E5%A4%A7%E6%A8%A1%E5%9E%8B%E6%97%B6%E4%BB%A3%E6%88%91%E4%BB%AC%E6%80%8E%E4%B9%88%E7%8E%A9emacs4.-org-%E6%96%87%E4%BB%B6%E9%87%8C%E7%9A%84%E9%93%BE%E6%8E%A5%E5%92%8C%E5%8F%8D%E9%93%BE%E6%94%B9%E9%80%A0/</link>
      <pubDate>Mon, 10 Jun 2024 21:00:39 +0800</pubDate>
      
      <guid>/posts/%E5%A4%A7%E6%A8%A1%E5%9E%8B%E6%97%B6%E4%BB%A3%E6%88%91%E4%BB%AC%E6%80%8E%E4%B9%88%E7%8E%A9emacs4.-org-%E6%96%87%E4%BB%B6%E9%87%8C%E7%9A%84%E9%93%BE%E6%8E%A5%E5%92%8C%E5%8F%8D%E9%93%BE%E6%94%B9%E9%80%A0/</guid>
      <description>&lt;div class=&#34;ox-hugo-toc toc has-section-numbers&#34;&gt;
&lt;div class=&#34;heading&#34;&gt;&amp;#30446;&amp;#24405;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class=&#34;section-num&#34;&gt;1&lt;/span&gt; &lt;a href=&#34;#%e5%89%8d%e8%a8%80&#34;&gt;前言&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;section-num&#34;&gt;2&lt;/span&gt; &lt;a href=&#34;#org-%e6%96%87%e4%bb%b6%e9%87%8c%e7%9a%84%e9%93%be%e6%8e%a5%e5%92%8c%e5%8f%8d%e9%93%be%e6%94%b9%e9%80%a0&#34;&gt;Org 文件里的链接和反链改造&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class=&#34;section-num&#34;&gt;2.1&lt;/span&gt; &lt;a href=&#34;#%e8%83%8c%e6%99%af&#34;&gt;背景&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;section-num&#34;&gt;2.2&lt;/span&gt; &lt;a href=&#34;#org-super-links&#34;&gt;org-super-links&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;section-num&#34;&gt;2.3&lt;/span&gt; &lt;a href=&#34;#org-super-links-%e7%9a%84%e4%b8%8d%e8%b6%b3&#34;&gt;org-super-links 的不足&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;section-num&#34;&gt;2.4&lt;/span&gt; &lt;a href=&#34;#%e6%94%b9%e9%80%a0-org-super-links-%e6%8f%92%e4%bb%b6&#34;&gt;改造 org-super-links 插件&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;section-num&#34;&gt;2.5&lt;/span&gt; &lt;a href=&#34;#%e6%9c%80%e7%bb%88%e6%95%88%e6%9e%9c&#34;&gt;最终效果&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;section-num&#34;&gt;2.6&lt;/span&gt; &lt;a href=&#34;#%e6%9c%80%e7%bb%88%e7%94%9f%e6%88%90%e7%9a%84%e4%bb%a3%e7%a0%81&#34;&gt;最终生成的代码&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;section-num&#34;&gt;3&lt;/span&gt; &lt;a href=&#34;#%e7%bb%93%e8%af%ad&#34;&gt;结语&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;!--endtoc--&gt;
&lt;h2 id=&#34;前言&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;1&lt;/span&gt; 前言 &lt;a href=&#34;#%e5%89%8d%e8%a8%80&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;在大模型时代，一切皆有可能。对于 Emacs 同样如此，大模型拉低学习了 Emacs 的门槛，我们通过大模型可以做到以前我们敢想不敢做，或敢做没时间做，或有时间不会做的事。&lt;/p&gt;
&lt;p&gt;今天继续这个新的系列，跟大家分享在大模型时代，我们可以如何“玩” Emacs，我们应该怎么用大模型来满足自己对 Emacs 使用的需求。&lt;/p&gt;
&lt;h2 id=&#34;org-文件里的链接和反链改造&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;2&lt;/span&gt; Org 文件里的链接和反链改造 &lt;a href=&#34;#org-%e6%96%87%e4%bb%b6%e9%87%8c%e7%9a%84%e9%93%be%e6%8e%a5%e5%92%8c%e5%8f%8d%e9%93%be%e6%94%b9%e9%80%a0&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;h3 id=&#34;背景&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;2.1&lt;/span&gt; 背景 &lt;a href=&#34;#%e8%83%8c%e6%99%af&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;我通过 Org mode 和 Denote 包来构筑我的知识体系。Org mode 有一个很好的功能就是链接，他可以让你在某一个 Org 文件内，增加链接到另外一个文件的某个标题行，这样能让知识链接成网，长期坚持，好处多多。&lt;/p&gt;
&lt;p&gt;Org mode 自带一个 &lt;code&gt;org-store-link&lt;/code&gt; 命令，可以将当前位置记录下来，然后通过 &lt;code&gt;org-insert-link&lt;/code&gt; 命令插入到其他的 Org 文件：&lt;/p&gt;
&lt;figure class=&#34;zoomImage&#34;&gt;&lt;img src=&#34;/ox-hugo/gif_20240608_210018.gif&#34; width=&#34;800&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;但这个功能有一个不够完善的地方，就是它的链接是单向的，我们从上面那个例子可以看到在文档的最末，链接到了 &lt;code&gt;第二级&lt;/code&gt; 这个标题行，但是在 &lt;code&gt;第二级&lt;/code&gt; 标题行，我们并不知道这个标题行被链接到哪些地方。&lt;/p&gt;
&lt;h3 id=&#34;org-super-links&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;2.2&lt;/span&gt; org-super-links &lt;a href=&#34;#org-super-links&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;a href=&#34;https://github.com/toshism/org-super-links&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;org-super-links&lt;/a&gt; 就是用来完善这个需求的。有了这个插件，我们可以通过 &lt;code&gt;org-super-links-store-link&lt;/code&gt; 来存储某个位置，然后通过 &lt;code&gt;org-super-links-insert-link&lt;/code&gt; 来插入链接：&lt;/p&gt;
&lt;figure class=&#34;zoomImage&#34;&gt;&lt;img src=&#34;/ox-hugo/gif_20240610_202750.gif&#34; width=&#34;800&#34;&gt;
&lt;/figure&gt;

&lt;h3 id=&#34;org-super-links-的不足&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;2.3&lt;/span&gt; org-super-links 的不足 &lt;a href=&#34;#org-super-links-%e7%9a%84%e4%b8%8d%e8%b6%b3&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;通过 &lt;code&gt;org-super-links&lt;/code&gt; 插件确实能够在我们插入某个链接时，在源文件的标题行以 &lt;code&gt;drawer&lt;/code&gt; 来显示反链信息。&lt;/p&gt;
&lt;figure class=&#34;zoomImage&#34;&gt;&lt;img src=&#34;/ox-hugo/img_20240610_203327.png&#34; width=&#34;400&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;对我来说，如果能在插入的地方所在的标题行也以 &lt;code&gt;drawer&lt;/code&gt; 的方式显示插入链接信息，那就更加完美了，相当于在插入和被插入的标题行，都在标题行下以 &lt;code&gt;drawer&lt;/code&gt; 的方式来记录链接信息，我们无论在哪，都能很方便的看到彼此的双向信息。这就是本次实验的初衷。&lt;/p&gt;
&lt;h3 id=&#34;改造-org-super-links-插件&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;2.4&lt;/span&gt; 改造 org-super-links 插件 &lt;a href=&#34;#%e6%94%b9%e9%80%a0-org-super-links-%e6%8f%92%e4%bb%b6&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;这一次的改造，跟之前几次不同，我们换了一种方式，我们将 &lt;code&gt;org-super-links&lt;/code&gt; 插件的主体源代码全部 copy 复制到 ChatGPT 中，得益于 GPT-4o 强大的窗口 token 数，整个插件的源代码都可以被 ChatGPT 阅读，并基于它的理解，我们进行相关的改造。&lt;/p&gt;
&lt;figure class=&#34;zoomImage&#34;&gt;&lt;img src=&#34;/ox-hugo/img_20240610_204030.png&#34; width=&#34;600&#34;&gt;
&lt;/figure&gt;

&lt;hr&gt;
&lt;p&gt;接着，就要逐步地清晰地描述自己的需求：&lt;/p&gt;
&lt;figure class=&#34;zoomImage&#34;&gt;&lt;img src=&#34;/ox-hugo/img_20240610_204115.png&#34; width=&#34;600&#34;&gt;
&lt;/figure&gt;

&lt;hr&gt;
&lt;p&gt;接着是不断的测试，并将错误情况告诉 ChatGPT，让它不断的调整代码，以及加入这段最重要的需求描述：&lt;/p&gt;
&lt;figure class=&#34;zoomImage&#34;&gt;&lt;img src=&#34;/ox-hugo/img_20240610_204355.png&#34; width=&#34;600&#34;&gt;
&lt;/figure&gt;

&lt;h3 id=&#34;最终效果&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;2.5&lt;/span&gt; 最终效果 &lt;a href=&#34;#%e6%9c%80%e7%bb%88%e6%95%88%e6%9e%9c&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;通过 &lt;code&gt;org-super-links-store-link&lt;/code&gt; 来存储源文件的标题行位置&lt;/li&gt;
&lt;li&gt;在目标位置，通过 &lt;code&gt;org-super-links-insert-link&lt;/code&gt; 来插入
&lt;ol&gt;
&lt;li&gt;当目标位置在一个标题行上，以 &lt;code&gt;drawer&lt;/code&gt; 的方式来记录链接信息，同时在源文件标题行以 &lt;code&gt;drawer&lt;/code&gt; 方式记录反链信息&lt;/li&gt;
&lt;li&gt;当目标位置不在标题行上，即在正文中，那不仅仅以 &lt;code&gt;drawer&lt;/code&gt; 的方式来记录链接信息，同时在光标处插入该链接信息，并且在源文件标题行以 &lt;code&gt;drawer&lt;/code&gt; 方式记录反链信息&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;这样，所有的链接和反链信息都可以在源文件标题行和目的文件标题行的 &lt;code&gt;drawer&lt;/code&gt; 清晰的看到，并且不妨碍在正文中的链接&lt;/li&gt;
&lt;/ol&gt;
&lt;figure class=&#34;zoomImage&#34;&gt;&lt;img src=&#34;/ox-hugo/gif_20240610_204612.gif&#34; width=&#34;800&#34;&gt;
&lt;/figure&gt;

&lt;h3 id=&#34;最终生成的代码&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;2.6&lt;/span&gt; 最终生成的代码 &lt;a href=&#34;#%e6%9c%80%e7%bb%88%e7%94%9f%e6%88%90%e7%9a%84%e4%bb%a3%e7%a0%81&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-emacs-lisp&#34; data-lang=&#34;emacs-lisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#080;font-style:italic&#34;&gt;;; 为了实现在存储位置时带上文件和标题行的信息，进行了如下的魔改&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#a2f&#34;&gt;defun&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;org-super-links-store-link&lt;/span&gt; (&lt;span style=&#34;color:#a2f&#34;&gt;&amp;amp;optional&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;GOTO&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;KEYS&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;Store a point to the register for use in function &lt;/span&gt;&lt;span style=&#34;color:#b8860b&#34;&gt;`org-super-links-insert-link&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#b44&#34;&gt;This is primarily intended to be called before &lt;/span&gt;&lt;span style=&#34;color:#b8860b&#34;&gt;`org-capture&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;, but
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#b44&#34;&gt;could possibly even be used to replace &lt;/span&gt;&lt;span style=&#34;color:#b8860b&#34;&gt;`org-store-link&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt; IF
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#b44&#34;&gt;function &lt;/span&gt;&lt;span style=&#34;color:#b8860b&#34;&gt;`org-super-links-insert-link&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt; is used to replace &lt;/span&gt;&lt;span style=&#34;color:#b8860b&#34;&gt;`org-insert-link&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;.  This
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#b44&#34;&gt;has not been thoroughly tested outside of links to/form org files.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#b44&#34;&gt;GOTO and KEYS are unused.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#a2f&#34;&gt;interactive&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;P&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#b8860b&#34;&gt;ignore&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;GOTO&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#b8860b&#34;&gt;ignore&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;KEYS&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#a2f&#34;&gt;save-excursion&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (&lt;span style=&#34;color:#a2f&#34;&gt;let&lt;/span&gt; ((&lt;span style=&#34;color:#b8860b&#34;&gt;c1&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;make-marker&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            (&lt;span style=&#34;color:#b8860b&#34;&gt;headline&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;org-get-heading&lt;/span&gt; &lt;span style=&#34;color:#800&#34;&gt;t&lt;/span&gt; &lt;span style=&#34;color:#800&#34;&gt;t&lt;/span&gt; &lt;span style=&#34;color:#800&#34;&gt;t&lt;/span&gt; &lt;span style=&#34;color:#800&#34;&gt;t&lt;/span&gt;)))  &lt;span style=&#34;color:#080;font-style:italic&#34;&gt;;; 获取标题行&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        (&lt;span style=&#34;color:#00a000&#34;&gt;set-marker&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;c1&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;point&lt;/span&gt;) (&lt;span style=&#34;color:#00a000&#34;&gt;current-buffer&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        (&lt;span style=&#34;color:#b8860b&#34;&gt;set-register&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;?^&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;cons&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;c1&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;headline&lt;/span&gt;))  &lt;span style=&#34;color:#080;font-style:italic&#34;&gt;;; 存储标记和标题行&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        (&lt;span style=&#34;color:#00a000&#34;&gt;message&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;Link copied with headline: %s&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;headline&lt;/span&gt;))))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#a2f&#34;&gt;defun&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;org-super-links-insert-link&lt;/span&gt; ()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;Insert a super link from the register.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#a2f&#34;&gt;interactive&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#a2f&#34;&gt;let*&lt;/span&gt; ((&lt;span style=&#34;color:#b8860b&#34;&gt;target&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;get-register&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;?^&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (&lt;span style=&#34;color:#a2f&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;target&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          (&lt;span style=&#34;color:#a2f&#34;&gt;let&lt;/span&gt; ((&lt;span style=&#34;color:#b8860b&#34;&gt;marker&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;car&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;target&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                (&lt;span style=&#34;color:#b8860b&#34;&gt;headline&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;cdr&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;target&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            (&lt;span style=&#34;color:#b8860b&#34;&gt;org-super-links--insert-link&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;marker&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;headline&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            (&lt;span style=&#34;color:#b8860b&#34;&gt;set-register&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;?^&lt;/span&gt; &lt;span style=&#34;color:#800&#34;&gt;nil&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        (&lt;span style=&#34;color:#00a000&#34;&gt;message&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;No link to insert!&amp;#34;&lt;/span&gt;))))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#a2f&#34;&gt;defun&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;org-super-links--insert-link&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;target&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;headline&lt;/span&gt; &lt;span style=&#34;color:#a2f&#34;&gt;&amp;amp;optional&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;no-forward&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;Insert link to marker TARGET at current `point`, and create backlink to here.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#b44&#34;&gt;Include HEADLINE in the link.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#b44&#34;&gt;If NO-FORWARD is non-nil skip creating the forward link.  Currently only used when converting a link.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#a2f&#34;&gt;let*&lt;/span&gt; ((&lt;span style=&#34;color:#b8860b&#34;&gt;source&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;point-marker&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;           (&lt;span style=&#34;color:#b8860b&#34;&gt;source-headline&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;org-get-heading&lt;/span&gt; &lt;span style=&#34;color:#800&#34;&gt;t&lt;/span&gt; &lt;span style=&#34;color:#800&#34;&gt;t&lt;/span&gt; &lt;span style=&#34;color:#800&#34;&gt;t&lt;/span&gt; &lt;span style=&#34;color:#800&#34;&gt;t&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;           (&lt;span style=&#34;color:#b8860b&#34;&gt;source-link&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;org-super-links-links-action&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;source&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;&amp;#39;org-super-links-pre-link-hook&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;           (&lt;span style=&#34;color:#b8860b&#34;&gt;target-link&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;org-super-links-links-action&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;target&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;&amp;#39;org-super-links-pre-backlink-hook&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;           (&lt;span style=&#34;color:#b8860b&#34;&gt;source-formatted-link&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;org-super-links-link-builder&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;source-link&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;           (&lt;span style=&#34;color:#b8860b&#34;&gt;target-formatted-link&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;org-super-links-link-builder&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;target-link&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;           (&lt;span style=&#34;color:#b8860b&#34;&gt;source-file&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;file-relative-name&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;buffer-file-name&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;marker-buffer&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;source&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                            (&lt;span style=&#34;color:#00a000&#34;&gt;file-name-directory&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;buffer-file-name&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;marker-buffer&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;target&lt;/span&gt;)))))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;           (&lt;span style=&#34;color:#b8860b&#34;&gt;target-file&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;buffer-file-name&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;marker-buffer&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;target&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;           (&lt;span style=&#34;color:#b8860b&#34;&gt;source-link&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;format&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;file:%s::%s&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;source-file&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;source-headline&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;           (&lt;span style=&#34;color:#b8860b&#34;&gt;target-link&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;format&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;file:%s::%s&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;target-file&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;headline&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (&lt;span style=&#34;color:#a2f&#34;&gt;with-current-buffer&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;marker-buffer&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;target&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        (&lt;span style=&#34;color:#a2f&#34;&gt;save-excursion&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          (&lt;span style=&#34;color:#00a000&#34;&gt;goto-char&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;marker-position&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;target&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          (&lt;span style=&#34;color:#a2f&#34;&gt;when&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;derived-mode-p&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;&amp;#39;org-mode&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            (&lt;span style=&#34;color:#b8860b&#34;&gt;org-super-links-insert-backlink&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;source-link&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;source-headline&lt;/span&gt;))))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (&lt;span style=&#34;color:#a2f&#34;&gt;unless&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;no-forward&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        (&lt;span style=&#34;color:#a2f&#34;&gt;with-current-buffer&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;marker-buffer&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;source&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          (&lt;span style=&#34;color:#a2f&#34;&gt;save-excursion&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            (&lt;span style=&#34;color:#00a000&#34;&gt;goto-char&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;marker-position&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;source&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            (&lt;span style=&#34;color:#a2f&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;org-at-heading-p&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                (&lt;span style=&#34;color:#b8860b&#34;&gt;org-super-links-insert-relatedlink&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;target-link&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;headline&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              (&lt;span style=&#34;color:#b8860b&#34;&gt;org-super-links-insert-inline-link&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;target-link&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;headline&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;source-headline&lt;/span&gt;)))))))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#a2f&#34;&gt;defun&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;org-super-links-insert-inline-link&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;target-link&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;headline&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;source-headline&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;Insert TARGET-LINK with HEADLINE at point and add related drawer at current heading.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#080;font-style:italic&#34;&gt;;; (insert (org-super-links-link-prefix))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#b8860b&#34;&gt;org-insert-link&lt;/span&gt; &lt;span style=&#34;color:#800&#34;&gt;nil&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;target-link&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;headline&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#00a000&#34;&gt;insert&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;org-super-links-link-postfix&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#b8860b&#34;&gt;org-back-to-heading&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#b8860b&#34;&gt;org-super-links-insert-relatedlink&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;target-link&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;headline&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#a2f&#34;&gt;defun&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;org-super-links-insert-backlink&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;link&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;desc&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;Insert backlink to LINK with DESC.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#b44&#34;&gt;Where the backlink is placed is determined by the variable `org-super-links-backlink-into-drawer`.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#a2f&#34;&gt;let*&lt;/span&gt; ((&lt;span style=&#34;color:#b8860b&#34;&gt;org-log-into-drawer&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;org-super-links-backlink-into-drawer&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;           (&lt;span style=&#34;color:#b8860b&#34;&gt;description&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;org-super-links-default-description-formatter&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;link&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;desc&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;           (&lt;span style=&#34;color:#b8860b&#34;&gt;beg&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;org-log-beginning&lt;/span&gt; &lt;span style=&#34;color:#800&#34;&gt;t&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (&lt;span style=&#34;color:#00a000&#34;&gt;goto-char&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;beg&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (&lt;span style=&#34;color:#00a000&#34;&gt;insert&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;org-super-links-backlink-prefix&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (&lt;span style=&#34;color:#00a000&#34;&gt;insert&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;org-link-make-string&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;link&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;description&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (&lt;span style=&#34;color:#00a000&#34;&gt;insert&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;org-super-links-backlink-postfix&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (&lt;span style=&#34;color:#b8860b&#34;&gt;org-indent-region&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;beg&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;point&lt;/span&gt;))))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#a2f&#34;&gt;defun&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;org-super-links-insert-relatedlink&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;link&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;desc&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;Insert LINK with DESC into related drawer.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#a2f&#34;&gt;let*&lt;/span&gt; ((&lt;span style=&#34;color:#b8860b&#34;&gt;org-log-into-drawer&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;org-super-links-related-into-drawer&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;           (&lt;span style=&#34;color:#b8860b&#34;&gt;drawer-name&lt;/span&gt; (&lt;span style=&#34;color:#a2f&#34;&gt;or&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;org-log-into-drawer&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;RELATED&amp;#34;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;           (&lt;span style=&#34;color:#b8860b&#34;&gt;beg&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;org-log-beginning&lt;/span&gt; &lt;span style=&#34;color:#800&#34;&gt;t&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (&lt;span style=&#34;color:#00a000&#34;&gt;goto-char&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;beg&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (&lt;span style=&#34;color:#a2f&#34;&gt;unless&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;org-at-heading-p&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        (&lt;span style=&#34;color:#b8860b&#34;&gt;org-back-to-heading&lt;/span&gt; &lt;span style=&#34;color:#800&#34;&gt;t&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (&lt;span style=&#34;color:#b8860b&#34;&gt;org-narrow-to-subtree&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (&lt;span style=&#34;color:#a2f&#34;&gt;let&lt;/span&gt; ((&lt;span style=&#34;color:#b8860b&#34;&gt;drawer-beg&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;re-search-forward&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;format&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;:%s:&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;drawer-name&lt;/span&gt;) &lt;span style=&#34;color:#800&#34;&gt;nil&lt;/span&gt; &lt;span style=&#34;color:#800&#34;&gt;t&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        (&lt;span style=&#34;color:#a2f&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;drawer-beg&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            (&lt;span style=&#34;color:#a2f&#34;&gt;progn&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              (&lt;span style=&#34;color:#00a000&#34;&gt;goto-char&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;drawer-beg&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              (&lt;span style=&#34;color:#00a000&#34;&gt;forward-line&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              (&lt;span style=&#34;color:#00a000&#34;&gt;insert&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;org-super-links-link-prefix&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              (&lt;span style=&#34;color:#b8860b&#34;&gt;org-insert-link&lt;/span&gt; &lt;span style=&#34;color:#800&#34;&gt;nil&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;link&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;desc&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              (&lt;span style=&#34;color:#00a000&#34;&gt;insert&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;org-super-links-link-postfix&lt;/span&gt;) &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;\n&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              (&lt;span style=&#34;color:#b8860b&#34;&gt;org-indent-region&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;drawer-beg&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;point&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          (&lt;span style=&#34;color:#00a000&#34;&gt;goto-char&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;point-max&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          (&lt;span style=&#34;color:#00a000&#34;&gt;insert&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;format&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;:%s:\n&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;drawer-name&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          (&lt;span style=&#34;color:#00a000&#34;&gt;insert&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;org-super-links-link-prefix&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          (&lt;span style=&#34;color:#b8860b&#34;&gt;org-insert-link&lt;/span&gt; &lt;span style=&#34;color:#800&#34;&gt;nil&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;link&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;desc&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          (&lt;span style=&#34;color:#00a000&#34;&gt;insert&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;org-super-links-link-postfix&lt;/span&gt;) &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;\n&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          (&lt;span style=&#34;color:#00a000&#34;&gt;insert&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;format&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;:%s:\n&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;END&amp;#34;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          (&lt;span style=&#34;color:#b8860b&#34;&gt;org-indent-region&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;beg&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;point&lt;/span&gt;))))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (&lt;span style=&#34;color:#00a000&#34;&gt;widen&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#a2f&#34;&gt;defun&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;org-super-links-related-into-drawer&lt;/span&gt; ()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;Name of the related drawer, as a string, or nil.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#b44&#34;&gt;This is the value of `org-super-links-related-into-drawer`.  However, if the
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#b44&#34;&gt;current entry has or inherits a RELATED_INTO_DRAWER property, it will
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#b44&#34;&gt;be used instead of the default value.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#a2f&#34;&gt;let&lt;/span&gt; ((&lt;span style=&#34;color:#b8860b&#34;&gt;p&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;org-entry-get&lt;/span&gt; &lt;span style=&#34;color:#800&#34;&gt;nil&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;RELATED_INTO_DRAWER&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;&amp;#39;inherit&lt;/span&gt; &lt;span style=&#34;color:#800&#34;&gt;t&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (&lt;span style=&#34;color:#a2f&#34;&gt;cond&lt;/span&gt; ((&lt;span style=&#34;color:#00a000&#34;&gt;equal&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;p&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;nil&amp;#34;&lt;/span&gt;) &lt;span style=&#34;color:#800&#34;&gt;nil&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            ((&lt;span style=&#34;color:#00a000&#34;&gt;equal&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;p&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;t&amp;#34;&lt;/span&gt;) &lt;span style=&#34;color:#b8860b&#34;&gt;org-super-links-related-drawer-default-name&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            ((&lt;span style=&#34;color:#00a000&#34;&gt;stringp&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;p&lt;/span&gt;) &lt;span style=&#34;color:#b8860b&#34;&gt;p&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            (&lt;span style=&#34;color:#b8860b&#34;&gt;p&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;org-super-links-related-drawer-default-name&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            ((&lt;span style=&#34;color:#00a000&#34;&gt;stringp&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;org-super-links-related-into-drawer&lt;/span&gt;) &lt;span style=&#34;color:#b8860b&#34;&gt;org-super-links-related-into-drawer&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            (&lt;span style=&#34;color:#b8860b&#34;&gt;org-super-links-related-into-drawer&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;org-super-links-related-drawer-default-name&lt;/span&gt;))))
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;结语&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;3&lt;/span&gt; 结语 &lt;a href=&#34;#%e7%bb%93%e8%af%ad&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;今天这个案例，是另外一种思路，我们将整个插件的源代码通过提示词一起给到大模型，由大模型做整体的理解和记忆，然后基于整体源代码，提出我们的需求、进行调试，最终达到我们的目标。&lt;/p&gt;
&lt;p&gt;后续，将会继续分享几个案例。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;org 文件导出为 HTML 的 css 改造&lt;/li&gt;
&lt;li&gt;&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;我也会持续的使用 ChatGPT 和 Emacs，持续分享我的心得，感谢您的阅读。&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>大模型时代我们怎么玩Emacs：3. Org mode 代码块执行错误信息优化</title>
      <link>/posts/%E5%A4%A7%E6%A8%A1%E5%9E%8B%E6%97%B6%E4%BB%A3%E6%88%91%E4%BB%AC%E6%80%8E%E4%B9%88%E7%8E%A9emacs3.-org-mode-%E4%BB%A3%E7%A0%81%E5%9D%97%E6%89%A7%E8%A1%8C%E9%94%99%E8%AF%AF%E4%BF%A1%E6%81%AF%E4%BC%98%E5%8C%96/</link>
      <pubDate>Thu, 23 May 2024 21:13:54 +0800</pubDate>
      
      <guid>/posts/%E5%A4%A7%E6%A8%A1%E5%9E%8B%E6%97%B6%E4%BB%A3%E6%88%91%E4%BB%AC%E6%80%8E%E4%B9%88%E7%8E%A9emacs3.-org-mode-%E4%BB%A3%E7%A0%81%E5%9D%97%E6%89%A7%E8%A1%8C%E9%94%99%E8%AF%AF%E4%BF%A1%E6%81%AF%E4%BC%98%E5%8C%96/</guid>
      <description>&lt;div class=&#34;ox-hugo-toc toc has-section-numbers&#34;&gt;
&lt;div class=&#34;heading&#34;&gt;&amp;#30446;&amp;#24405;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class=&#34;section-num&#34;&gt;1&lt;/span&gt; &lt;a href=&#34;#%e5%89%8d%e8%a8%80&#34;&gt;前言&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;section-num&#34;&gt;2&lt;/span&gt; &lt;a href=&#34;#org-mode-%e4%bb%a3%e7%a0%81%e5%9d%97%e6%89%a7%e8%a1%8c%e5%87%ba%e9%94%99%e4%bf%a1%e6%81%af%e4%bc%98%e5%8c%96&#34;&gt;Org mode 代码块执行出错信息优化&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class=&#34;section-num&#34;&gt;2.1&lt;/span&gt; &lt;a href=&#34;#%e8%83%8c%e6%99%af&#34;&gt;背景&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;section-num&#34;&gt;2.2&lt;/span&gt; &lt;a href=&#34;#%e6%ad%a3%e7%a1%ae%e7%9a%84%e6%8f%8f%e8%bf%b0%e6%88%91%e4%bb%ac%e7%9a%84%e9%97%ae%e9%a2%98&#34;&gt;正确的描述我们的问题&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;section-num&#34;&gt;2.3&lt;/span&gt; &lt;a href=&#34;#%e6%b5%8b%e8%af%95%e4%bb%a5%e5%8f%8a%e9%9c%80%e6%b1%82%e7%b4%af%e8%bf%9b%e7%9a%84%e6%8f%8f%e8%bf%b0&#34;&gt;测试以及需求累进的描述&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;section-num&#34;&gt;2.4&lt;/span&gt; &lt;a href=&#34;#%e6%9c%80%e7%bb%88%e7%9a%84%e6%95%88%e6%9e%9c&#34;&gt;最终的效果&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;section-num&#34;&gt;2.5&lt;/span&gt; &lt;a href=&#34;#%e6%9c%80%e7%bb%88%e7%9a%84%e4%bb%a3%e7%a0%81&#34;&gt;最终的代码&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;section-num&#34;&gt;3&lt;/span&gt; &lt;a href=&#34;#%e7%bb%93%e8%af%ad&#34;&gt;结语&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;!--endtoc--&gt;
&lt;h2 id=&#34;前言&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;1&lt;/span&gt; 前言 &lt;a href=&#34;#%e5%89%8d%e8%a8%80&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;在大模型时代，一切皆有可能。对于 Emacs 同样如此，大模型拉低学习了 Emacs 的门槛，我们通过大模型可以做到以前我们敢想不敢做，或敢做没时间做，或有时间不会做的事。&lt;/p&gt;
&lt;p&gt;今天继续这个新的系列，跟大家分享在大模型时代，我们可以如何“玩” Emacs，我们应该怎么用大模型来满足自己对 Emacs 使用的需求。&lt;/p&gt;
&lt;div class=&#34;important&#34;&gt;
&lt;p&gt;上一篇关于根据 jieba 分词移动和删除的文章，只是提供了一个思路，后来经 &lt;code&gt;LuciusChen&lt;/code&gt; 道友推荐，我试用了 &lt;code&gt;roife&lt;/code&gt; 大佬的 &lt;a href=&#34;https://github.com/roife/emt&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;emt&lt;/a&gt; 包，利用 MacOS 自带的 Tokenizer 来分词，体验更加顺滑，强烈推荐！&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id=&#34;org-mode-代码块执行出错信息优化&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;2&lt;/span&gt; Org mode 代码块执行出错信息优化 &lt;a href=&#34;#org-mode-%e4%bb%a3%e7%a0%81%e5%9d%97%e6%89%a7%e8%a1%8c%e5%87%ba%e9%94%99%e4%bf%a1%e6%81%af%e4%bc%98%e5%8c%96&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;h3 id=&#34;背景&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;2.1&lt;/span&gt; 背景 &lt;a href=&#34;#%e8%83%8c%e6%99%af&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;我非常喜欢 Org mode，实际上我现在基本上不太使用 Office。Org mode 里有一个我非常喜欢的特性就是代码块。这使得我能在 Org 文件里通过代码块来编写一些小的程序，用一个专业术语叫「文学编程」。它能让在遇到某些任务时，一边记录你的思路，一边通过代码块以及 &lt;code&gt;:noweb&lt;/code&gt; 或 &lt;code&gt;:session&lt;/code&gt; 的特性，如流水般的往前行。&lt;/p&gt;
&lt;p&gt;然而代码块有一个很让人难受的默认行为就是：当代码块里的代码出现错误时，它的报错不是在 Org 文件的 &lt;code&gt;+RESULTS:&lt;/code&gt; 部分显示，而是新开了一个叫 &lt;code&gt;*Org-Babel Error Output*&lt;/code&gt; 的 buffer 显示。&lt;/p&gt;
&lt;figure class=&#34;zoomImage&#34;&gt;&lt;img src=&#34;/ox-hugo/img_20240524_065928.png&#34; width=&#34;800&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;这在体验上不够连贯和统一，于是我开始了这次尝试。&lt;/p&gt;
&lt;h3 id=&#34;正确的描述我们的问题&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;2.2&lt;/span&gt; 正确的描述我们的问题 &lt;a href=&#34;#%e6%ad%a3%e7%a1%ae%e7%9a%84%e6%8f%8f%e8%bf%b0%e6%88%91%e4%bb%ac%e7%9a%84%e9%97%ae%e9%a2%98&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;今天这个样例跟之前的不同，我们不是直接描述需求，而是先把相关函数的源代码给到 ChatGPT，让后直接让 ChatGPT 根据我们的描述来进行改造。&lt;/p&gt;
&lt;figure class=&#34;zoomImage&#34;&gt;&lt;img src=&#34;/ox-hugo/img_20240524_181418.png&#34; width=&#34;600&#34;&gt;
&lt;/figure&gt;

&lt;h3 id=&#34;测试以及需求累进的描述&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;2.3&lt;/span&gt; 测试以及需求累进的描述 &lt;a href=&#34;#%e6%b5%8b%e8%af%95%e4%bb%a5%e5%8f%8a%e9%9c%80%e6%b1%82%e7%b4%af%e8%bf%9b%e7%9a%84%e6%8f%8f%e8%bf%b0&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h3&gt;&lt;figure class=&#34;zoomImage&#34;&gt;&lt;img src=&#34;/ox-hugo/img_20240524_181900.png&#34; width=&#34;800&#34;&gt;
&lt;/figure&gt;

&lt;h3 id=&#34;最终的效果&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;2.4&lt;/span&gt; 最终的效果 &lt;a href=&#34;#%e6%9c%80%e7%bb%88%e7%9a%84%e6%95%88%e6%9e%9c&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h3&gt;&lt;figure class=&#34;zoomImage&#34;&gt;&lt;img src=&#34;/ox-hugo/gif_20240524182102.gif&#34; width=&#34;800&#34;&gt;
&lt;/figure&gt;

&lt;h3 id=&#34;最终的代码&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;2.5&lt;/span&gt; 最终的代码 &lt;a href=&#34;#%e6%9c%80%e7%bb%88%e7%9a%84%e4%bb%a3%e7%a0%81&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-emacs-lisp&#34; data-lang=&#34;emacs-lisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#a2f&#34;&gt;defun&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;my/org-babel-eval&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;command&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;query&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;Run COMMAND on QUERY.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#b44&#34;&gt;Return standard output and error produced by COMMAND.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#b44&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#b44&#34;&gt;Writes QUERY into a temp-buffer that is processed with
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#b8860b&#34;&gt;`org-babel--shell-command-on-region&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#a2f&#34;&gt;let&lt;/span&gt; ((&lt;span style=&#34;color:#b8860b&#34;&gt;error-buffer&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;get-buffer-create&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34; *Org-Babel Error*&amp;#34;&lt;/span&gt;)) &lt;span style=&#34;color:#b8860b&#34;&gt;exit-code&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#a2f&#34;&gt;with-current-buffer&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;error-buffer&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;erase-buffer&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#a2f&#34;&gt;with-temp-buffer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (&lt;span style=&#34;color:#00a000&#34;&gt;insert&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;query&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;\n&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (&lt;span style=&#34;color:#a2f&#34;&gt;setq&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;exit-code&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            (&lt;span style=&#34;color:#b8860b&#34;&gt;org-babel--shell-command-on-region&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;             &lt;span style=&#34;color:#b8860b&#34;&gt;command&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;error-buffer&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (&lt;span style=&#34;color:#a2f&#34;&gt;let&lt;/span&gt; ((&lt;span style=&#34;color:#b8860b&#34;&gt;stderr&lt;/span&gt; (&lt;span style=&#34;color:#a2f&#34;&gt;with-current-buffer&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;error-buffer&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;buffer-string&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            (&lt;span style=&#34;color:#b8860b&#34;&gt;stdout&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;buffer-string&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        (&lt;span style=&#34;color:#00a000&#34;&gt;concat&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;stdout&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                (&lt;span style=&#34;color:#a2f&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;not&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;string-empty-p&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;stderr&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    (&lt;span style=&#34;color:#00a000&#34;&gt;concat&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;\n--- STDERR ---\n&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;stderr&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                  &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;))))))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#b8860b&#34;&gt;advice-add&lt;/span&gt; &lt;span style=&#34;color:#00a000&#34;&gt;#&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#b8860b&#34;&gt;org-babel-eval&lt;/span&gt; &lt;span style=&#34;color:#a2f&#34;&gt;:override&lt;/span&gt; &lt;span style=&#34;color:#00a000&#34;&gt;#&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#b8860b&#34;&gt;my/org-babel-eval&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;结语&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;3&lt;/span&gt; 结语 &lt;a href=&#34;#%e7%bb%93%e8%af%ad&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;今天这个案例，是一个简单的案例，但是我们的处理思路有一些变化，不是直接描述需求，而是直接将需要改造的函数源代码给到 ChatGPT，让它按照我们的要求进行改造，最后调试，完成我们的目标。&lt;/p&gt;
&lt;p&gt;后续，将会继续分享几个案例。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;org-super-links 链接与反链改造&lt;/li&gt;
&lt;li&gt;&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;我也会持续的使用 ChatGPT 和 Emacs，持续分享我的心得，感谢您的阅读。&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>大模型时代我们怎么玩Emacs：2. 中文按词移动和删除</title>
      <link>/posts/%E5%A4%A7%E6%A8%A1%E5%9E%8B%E6%97%B6%E4%BB%A3%E6%88%91%E4%BB%AC%E6%80%8E%E4%B9%88%E7%8E%A9emacs2.-%E4%B8%AD%E6%96%87%E6%8C%89%E8%AF%8D%E7%A7%BB%E5%8A%A8%E5%92%8C%E5%88%A0%E9%99%A4/</link>
      <pubDate>Tue, 21 May 2024 16:26:43 +0800</pubDate>
      
      <guid>/posts/%E5%A4%A7%E6%A8%A1%E5%9E%8B%E6%97%B6%E4%BB%A3%E6%88%91%E4%BB%AC%E6%80%8E%E4%B9%88%E7%8E%A9emacs2.-%E4%B8%AD%E6%96%87%E6%8C%89%E8%AF%8D%E7%A7%BB%E5%8A%A8%E5%92%8C%E5%88%A0%E9%99%A4/</guid>
      <description>&lt;div class=&#34;ox-hugo-toc toc has-section-numbers&#34;&gt;
&lt;div class=&#34;heading&#34;&gt;&amp;#30446;&amp;#24405;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class=&#34;section-num&#34;&gt;1&lt;/span&gt; &lt;a href=&#34;#%e5%89%8d%e8%a8%80&#34;&gt;前言&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;section-num&#34;&gt;2&lt;/span&gt; &lt;a href=&#34;#%e5%a4%a7%e6%a8%a1%e5%9e%8b&#34;&gt;大模型&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;section-num&#34;&gt;3&lt;/span&gt; &lt;a href=&#34;#%e4%b8%ad%e6%96%87%e6%8c%89%e8%af%8d%e7%a7%bb%e5%8a%a8%e5%92%8c%e5%88%a0%e9%99%a4&#34;&gt;中文按词移动和删除&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class=&#34;section-num&#34;&gt;3.1&lt;/span&gt; &lt;a href=&#34;#%e8%83%8c%e6%99%af&#34;&gt;背景&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;section-num&#34;&gt;3.2&lt;/span&gt; &lt;a href=&#34;#%e6%ad%a3%e7%a1%ae%e7%9a%84%e6%8f%8f%e8%bf%b0%e6%88%91%e4%bb%ac%e7%9a%84%e9%97%ae%e9%a2%98&#34;&gt;正确的描述我们的问题&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;section-num&#34;&gt;3.3&lt;/span&gt; &lt;a href=&#34;#%e6%9c%80%e7%bb%88%e7%9a%84%e6%95%88%e6%9e%9c&#34;&gt;最终的效果&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;section-num&#34;&gt;3.4&lt;/span&gt; &lt;a href=&#34;#%e6%9c%80%e7%bb%88%e7%9a%84%e4%bb%a3%e7%a0%81%e5%92%8c%e4%bd%bf%e7%94%a8&#34;&gt;最终的代码和使用&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;section-num&#34;&gt;3.5&lt;/span&gt; &lt;a href=&#34;#%e5%ae%8c%e6%95%b4%e7%9a%84%e8%81%8a%e5%a4%a9%e8%ae%b0%e5%bd%95&#34;&gt;完整的聊天记录&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;section-num&#34;&gt;4&lt;/span&gt; &lt;a href=&#34;#%e7%bb%93%e8%af%ad&#34;&gt;结语&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;!--endtoc--&gt;
&lt;h2 id=&#34;前言&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;1&lt;/span&gt; 前言 &lt;a href=&#34;#%e5%89%8d%e8%a8%80&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;在大模型时代，一切皆有可能。对于 Emacs 同样如此，大模型拉低学习了 Emacs 的门槛，我们通过大模型可以做到以前我们敢想不敢做，或敢做没时间做，或有时间不会做的事。&lt;/p&gt;
&lt;p&gt;今天继续这个新的系列，跟大家分享在大模型时代，我们可以如何“玩” Emacs，我们应该怎么用大模型来满足自己对 Emacs 使用的需求。&lt;/p&gt;
&lt;h2 id=&#34;大模型&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;2&lt;/span&gt; 大模型 &lt;a href=&#34;#%e5%a4%a7%e6%a8%a1%e5%9e%8b&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;这个系列的几个案例，均基于 OpenAI 的 &lt;code&gt;ChatGPT-4o&lt;/code&gt; 模型（主要是花了钱，不用浪费不是😀）。大模型能做很多事，这里简单说说我们可以通过 ChatGPT 对 Emacs 做什么：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;让 ChatGPT 帮忙阅读代码，解释代码，这样以前看不懂的代码可以通过 ChatGPT 看明白&lt;/li&gt;
&lt;li&gt;让 ChatGPT 帮忙写代码，尤其是我们对 Emacs 的配置进行调整，需要写一些函数甚至插件&lt;/li&gt;
&lt;li&gt;让 ChatGPT 优化已经写好的代码，让代码更加规范和可读&lt;/li&gt;
&lt;li&gt;让 ChatGPT 充当 Emacs 百科，充当 Google 的角色，回答各种配置问题&lt;/li&gt;
&lt;li&gt;&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所有的这一切，都需要有一个前提，就是你需要学会「正确的问问题」。我想这个技能，不是因为 ChatGPT 的出现才出现，这个问题亘古至今如此，只是对象，从以前问夫子，到网络时代问网友，再到 AI 时代问大模型，其原理不变其宗。&lt;/p&gt;
&lt;p&gt;我们与 ChatGPT 的交流，主要通过提示工程。提示词是有方法论的，网上有很多教程，这里不做介绍。与 AI 交流，其实就跟练剑一样，练的多了，也就会了剑，无他，惟手熟耳！&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;关于这些案例，我在与 ChatGPT 交谈时，实际上并没有很好地遵循提示工程的“三段式”，比较随性，仅供参考。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;中文按词移动和删除&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;3&lt;/span&gt; 中文按词移动和删除 &lt;a href=&#34;#%e4%b8%ad%e6%96%87%e6%8c%89%e8%af%8d%e7%a7%bb%e5%8a%a8%e5%92%8c%e5%88%a0%e9%99%a4&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;h3 id=&#34;背景&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;3.1&lt;/span&gt; 背景 &lt;a href=&#34;#%e8%83%8c%e6%99%af&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;大家知道英文的单词之间有空格，而中文的词语之间没有空格，这就导致了中英文之间对于词的处理逻辑完全不同。如果按照英文的逻辑，我们按词来移动光标，就会把所有连在一起的中文句子作为一个“词”，这显然不符合我们中国人的使用习惯。&lt;/p&gt;
&lt;figure class=&#34;zoomImage&#34;&gt;&lt;img src=&#34;/ox-hugo/gif_20240521_183406.gif&#34; width=&#34;800&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;之前一直用 &lt;code&gt;cireu&lt;/code&gt; 大佬的 &lt;a href=&#34;https://github.com/cireu/jieba.el&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;jieba.el&lt;/a&gt; 包，很好用，但是不知道是因为升级了 node 还是因为升级了这个包，突然不能用了，一直报如下的错误，以我这个粗浅的水平捣鼓了半天也没找到解决方法。&lt;/p&gt;
&lt;div class=&#34;error&#34;&gt;
&lt;p&gt;map-keymap: Wrong type argument: processp, #[0 &amp;ldquo;����	�����������\&amp;rdquo;!&amp;amp;�&amp;quot; [&amp;ldquo;JIEBA-SERVER&amp;rdquo; jieba-server-start-args make-process :name :command :coding utf-8-emacs-unix :noquery t :connection-type &amp;hellip;] 16]&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;于是就产生了找 ChatGPT 写一个自用版本的想法。&lt;/p&gt;
&lt;h3 id=&#34;正确的描述我们的问题&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;3.2&lt;/span&gt; 正确的描述我们的问题 &lt;a href=&#34;#%e6%ad%a3%e7%a1%ae%e7%9a%84%e6%8f%8f%e8%bf%b0%e6%88%91%e4%bb%ac%e7%9a%84%e9%97%ae%e9%a2%98&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h3&gt;&lt;h4 id=&#34;第一次描述问题&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;3.2.1&lt;/span&gt; 第一次描述问题 &lt;a href=&#34;#%e7%ac%ac%e4%b8%80%e6%ac%a1%e6%8f%8f%e8%bf%b0%e9%97%ae%e9%a2%98&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;令人欣喜的是 ChatGPT 给出的初始解决方案就是用 Python 实现的分词部分，这也正是我想要的。&lt;/p&gt;
&lt;figure class=&#34;zoomImage&#34;&gt;&lt;img src=&#34;/ox-hugo/img_20240521_211340.png&#34; width=&#34;600&#34;&gt;
&lt;/figure&gt;

&lt;h4 id=&#34;测试以及需求累进的描述&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;3.2.2&lt;/span&gt; 测试以及需求累进的描述 &lt;a href=&#34;#%e6%b5%8b%e8%af%95%e4%bb%a5%e5%8f%8a%e9%9c%80%e6%b1%82%e7%b4%af%e8%bf%9b%e7%9a%84%e6%8f%8f%e8%bf%b0&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;我们需要对每一个模块进行测试，并且将测试的结果，精确的描述给 ChatGPT，让 ChatGPT 给出更新的代码，然后我们再次重试。&lt;/p&gt;
&lt;figure class=&#34;zoomImage&#34;&gt;&lt;img src=&#34;/ox-hugo/img_20240521_211720.png&#34; width=&#34;600&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;整个过程会遇到很多问题，例如性能的问题，刚开始的版本很卡：&lt;/p&gt;
&lt;figure class=&#34;zoomImage&#34;&gt;&lt;img src=&#34;/ox-hugo/img_20240521_211927.png&#34; width=&#34;600&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;当然，ChatGPT 并不总是正确的，至少我个人觉得他给的 2 个解决方案，并不是很好，我自己想了下给了他一个可能的解决方案来解决性能问题：&lt;/p&gt;
&lt;figure class=&#34;zoomImage&#34;&gt;&lt;img src=&#34;/ox-hugo/img_20240521_212035.png&#34; width=&#34;600&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;以及，我们将 Python 脚本服务化，通过 REST API 的方式来调用：&lt;/p&gt;
&lt;figure class=&#34;zoomImage&#34;&gt;&lt;img src=&#34;/ox-hugo/img_20240521_212122.png&#34; width=&#34;600&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;中间并不是一帆风顺，还会遇到各种报错和警告：&lt;/p&gt;
&lt;figure class=&#34;zoomImage&#34;&gt;&lt;img src=&#34;/ox-hugo/img_20240521_212228.png&#34; width=&#34;600&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;进一步地，我们要考虑在 Mac 上如何优雅的启动这个服务：&lt;/p&gt;
&lt;figure class=&#34;zoomImage&#34;&gt;&lt;img src=&#34;/ox-hugo/img_20240521_212309.png&#34; width=&#34;600&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;最麻烦的就是当你搞定了 Python 脚本和服务，搞定了其中 Backward 方向移动的时候，在 Forward 方向却一直无法正确的移动，此时，也许需要一点点自己的判断力、逻辑思维能力和创造力，我现在回想来，在整个过程中，我自己发挥了 2 个重要的作用：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;提供了一个思路是把光标所在的句子文本送去分词，而不是 ChatGPT 提供的把整个 buffer 送过去分词&lt;/li&gt;
&lt;li&gt;在经过大量的测试后发现，光标在移动到句子分界线尤其是句首的时候，总是出现问题，于是我扩展了送过去分词的文本范围，一句不行，我把两句一起送过去，这样既解决了性能的问题，也解决了边界的问题，当然这个方法并不优美，算是一个笨方法。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;最终的效果&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;3.3&lt;/span&gt; 最终的效果 &lt;a href=&#34;#%e6%9c%80%e7%bb%88%e7%9a%84%e6%95%88%e6%9e%9c&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;最终我们得到了如下的效果：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;我们按下 &lt;code&gt;M-f&lt;/code&gt; 和 &lt;code&gt;M-b&lt;/code&gt; 可以实现中文的按词向前向后移动，而且兼容英文。我们按下 &lt;code&gt;M-DEL&lt;/code&gt; 和 &lt;code&gt;M-d&lt;/code&gt; 实现了向后和向前按词删除。&lt;/li&gt;
&lt;li&gt;我们利用了一个非常简单的 Python 程序来做 jieba 服务后端，其他部分完全通过 elisp 实现。&lt;/li&gt;
&lt;li&gt;我们综合的考虑了性能和效果。&lt;/li&gt;
&lt;/ol&gt;
&lt;figure class=&#34;zoomImage&#34;&gt;&lt;img src=&#34;/ox-hugo/gif_20240521_213319.gif&#34; width=&#34;800&#34;&gt;
&lt;/figure&gt;

&lt;h3 id=&#34;最终的代码和使用&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;3.4&lt;/span&gt; 最终的代码和使用 &lt;a href=&#34;#%e6%9c%80%e7%bb%88%e7%9a%84%e4%bb%a3%e7%a0%81%e5%92%8c%e4%bd%bf%e7%94%a8&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h3&gt;&lt;h4 id=&#34;python-服务端&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;3.4.1&lt;/span&gt; Python 服务端 &lt;a href=&#34;#python-%e6%9c%8d%e5%8a%a1%e7%ab%af&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;Python 服务端代码：&lt;/p&gt;
&lt;div class=&#34;tip&#34;&gt;
&lt;p&gt;你可以将端口替换成你想用的端口，我这里随便挑了一个不太会被其他程序占用的端口。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#00f;font-weight:bold&#34;&gt;flask&lt;/span&gt; &lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;import&lt;/span&gt; Flask, request, jsonify
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#00f;font-weight:bold&#34;&gt;jieba&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;# jieba.setLogLevel(jieba.logging.ERROR)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;app &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; Flask(&lt;span style=&#34;color:#b8860b&#34;&gt;__name__&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a2f&#34;&gt;@app.route&lt;/span&gt;(&lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;/segment&amp;#39;&lt;/span&gt;, methods&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;[&lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;POST&amp;#39;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#00a000&#34;&gt;segment_text&lt;/span&gt;():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    data &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; request&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;json
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    text &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; data&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;get(&lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;text&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;not&lt;/span&gt; text:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;return&lt;/span&gt; jsonify([])  &lt;span style=&#34;color:#080;font-style:italic&#34;&gt;# 如果没有提供文本，返回一个空列表&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    words &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; jieba&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;lcut(text)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;return&lt;/span&gt; jsonify(words)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;__name__&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;__main__&amp;#39;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    app&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;run(host&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;127.0.0.1&amp;#39;&lt;/span&gt;, port&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;27350&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;此时你就可以通过 &lt;code&gt;python segment.py&lt;/code&gt; 来启动这个后端服务了。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;如果你想在 Mac 上以 &lt;code&gt;launchctl&lt;/code&gt; 和 &lt;code&gt;gunicorn&lt;/code&gt; 来启动服务，ChatGPT 也帮我们生成了如下的 plist 文件：&lt;/p&gt;
&lt;div class=&#34;attention&#34;&gt;
&lt;p&gt;请注意，请务必将下面的文件所有路径替换成你自己的路径！&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080&#34;&gt;&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;UTF-8&amp;#34;?&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080&#34;&gt;&amp;lt;!DOCTYPE plist PUBLIC &amp;#34;-//Apple//DTD PLIST 1.0//EN&amp;#34; &amp;#34;http://www.apple.com/DTDs/PropertyList-1.0.dtd&amp;#34;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;lt;plist&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;version=&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;1.0&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;lt;dict&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;lt;key&amp;gt;&lt;/span&gt;Label&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;lt;string&amp;gt;&lt;/span&gt;com.remacs.segment&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;lt;key&amp;gt;&lt;/span&gt;ProgramArguments&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;lt;array&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;lt;string&amp;gt;&lt;/span&gt;/Users/randolph/.venv/py310/bin/gunicorn&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;lt;string&amp;gt;&lt;/span&gt;--chdir&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;lt;string&amp;gt;&lt;/span&gt;/Users/randolph/bin/python_script&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;lt;string&amp;gt;&lt;/span&gt;-w&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;lt;string&amp;gt;&lt;/span&gt;4&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;lt;string&amp;gt;&lt;/span&gt;-b&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;lt;string&amp;gt;&lt;/span&gt;127.0.0.1:27350&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;lt;string&amp;gt;&lt;/span&gt;segment:app&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;lt;/array&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;lt;key&amp;gt;&lt;/span&gt;EnvironmentVariables&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;lt;dict&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;lt;key&amp;gt;&lt;/span&gt;PATH&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;lt;string&amp;gt;&lt;/span&gt;/Users/randolph/.venv/py310/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;lt;/dict&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;lt;key&amp;gt;&lt;/span&gt;RunAtLoad&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;lt;true/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;lt;key&amp;gt;&lt;/span&gt;KeepAlive&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;lt;true/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;lt;key&amp;gt;&lt;/span&gt;StandardOutPath&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;lt;string&amp;gt;&lt;/span&gt;/Users/randolph/Temp/com.remacs.segment.out&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;lt;key&amp;gt;&lt;/span&gt;StandardErrorPath&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;lt;string&amp;gt;&lt;/span&gt;/Users/randolph/Temp/com.remacs.segment.err&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;lt;/dict&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;lt;/plist&amp;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;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;launchctl load ~/Library/LaunchAgents/com.remacs.segment.plist
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;elisp-代码&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;3.4.2&lt;/span&gt; elisp 代码 &lt;a href=&#34;#elisp-%e4%bb%a3%e7%a0%81&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h4&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-emacs-lisp&#34; data-lang=&#34;emacs-lisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#a2f&#34;&gt;require&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;&amp;#39;request&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#a2f&#34;&gt;defun&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;call-jieba-segment&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;text&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;调用 RESTful API 使用 jieba 分词 TEXT。&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#a2f&#34;&gt;let&lt;/span&gt; ((&lt;span style=&#34;color:#b8860b&#34;&gt;response&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;request&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;http://127.0.0.1:27350/segment&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#a2f&#34;&gt;:type&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#a2f&#34;&gt;:data&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;json-encode&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;`&lt;/span&gt;((&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;text&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color:#b8860b&#34;&gt;text&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#a2f&#34;&gt;:headers&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;&amp;#39;&lt;/span&gt;((&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;Content-Type&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;application/json&amp;#34;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#a2f&#34;&gt;:parser&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;&amp;#39;json-read&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#a2f&#34;&gt;:sync&lt;/span&gt; &lt;span style=&#34;color:#800&#34;&gt;t&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#080;font-style:italic&#34;&gt;;; (message &amp;#34;请求状态: %s&amp;#34; (request-response-status-code response))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#080;font-style:italic&#34;&gt;;; (message &amp;#34;请求响应: %S&amp;#34; (request-response-data response))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#a2f&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;not&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;eq&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;request-response-status-code&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;response&lt;/span&gt;) &lt;span style=&#34;color:#666&#34;&gt;200&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        (&lt;span style=&#34;color:#d2413a;font-weight:bold&#34;&gt;error&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;调用 jieba 分词 API 失败: %s&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;               (&lt;span style=&#34;color:#b8860b&#34;&gt;request-response-status-code&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;response&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (&lt;span style=&#34;color:#b8860b&#34;&gt;request-response-data&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;response&lt;/span&gt;))))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#a2f&#34;&gt;defun&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;get-current-sentence&lt;/span&gt; ()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;获取当前光标所在的句子。&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#a2f&#34;&gt;save-excursion&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#a2f&#34;&gt;let&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;beg&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;end&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (&lt;span style=&#34;color:#a2f&#34;&gt;setq&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;beg&lt;/span&gt; (&lt;span style=&#34;color:#a2f&#34;&gt;progn&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;backward-sentence&lt;/span&gt;) (&lt;span style=&#34;color:#00a000&#34;&gt;point&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (&lt;span style=&#34;color:#a2f&#34;&gt;setq&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;end&lt;/span&gt; (&lt;span style=&#34;color:#a2f&#34;&gt;progn&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;forward-sentence&lt;/span&gt;) (&lt;span style=&#34;color:#b8860b&#34;&gt;forward-sentence&lt;/span&gt;) (&lt;span style=&#34;color:#00a000&#34;&gt;point&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (&lt;span style=&#34;color:#00a000&#34;&gt;buffer-substring-no-properties&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;beg&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;end&lt;/span&gt;))))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#a2f&#34;&gt;defun&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;get-segmented-words&lt;/span&gt; ()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;获取当前句子的分词结果。&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#a2f&#34;&gt;let*&lt;/span&gt; ((&lt;span style=&#34;color:#b8860b&#34;&gt;sentence&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;get-current-sentence&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         (&lt;span style=&#34;color:#b8860b&#34;&gt;words&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;call-jieba-segment&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;sentence&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#00a000&#34;&gt;append&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;words&lt;/span&gt; &lt;span style=&#34;color:#800&#34;&gt;nil&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#a2f&#34;&gt;defun&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;get-sentence-boundaries&lt;/span&gt; ()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;获取当前句子的起始和结束位置。&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#a2f&#34;&gt;save-excursion&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#a2f&#34;&gt;let&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;beg&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;end&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (&lt;span style=&#34;color:#a2f&#34;&gt;setq&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;beg&lt;/span&gt; (&lt;span style=&#34;color:#a2f&#34;&gt;progn&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;backward-sentence&lt;/span&gt;) (&lt;span style=&#34;color:#00a000&#34;&gt;point&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (&lt;span style=&#34;color:#a2f&#34;&gt;setq&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;end&lt;/span&gt; (&lt;span style=&#34;color:#a2f&#34;&gt;progn&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;forward-sentence&lt;/span&gt;) (&lt;span style=&#34;color:#b8860b&#34;&gt;forward-sentence&lt;/span&gt;) (&lt;span style=&#34;color:#00a000&#34;&gt;point&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (&lt;span style=&#34;color:#00a000&#34;&gt;cons&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;beg&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;end&lt;/span&gt;))))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#a2f&#34;&gt;defun&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;backward-word-by-jieba&lt;/span&gt; ()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;基于 jieba 分词结果向后移动一个单词。&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#a2f&#34;&gt;interactive&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#a2f&#34;&gt;let*&lt;/span&gt; ((&lt;span style=&#34;color:#b8860b&#34;&gt;words&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;get-segmented-words&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         (&lt;span style=&#34;color:#b8860b&#34;&gt;pos&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;point&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         (&lt;span style=&#34;color:#b8860b&#34;&gt;boundaries&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;get-sentence-boundaries&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         (&lt;span style=&#34;color:#b8860b&#34;&gt;sentence-start&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;car&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;boundaries&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         (&lt;span style=&#34;color:#b8860b&#34;&gt;word-starts&lt;/span&gt; (&lt;span style=&#34;color:#a2f&#34;&gt;let&lt;/span&gt; ((&lt;span style=&#34;color:#b8860b&#34;&gt;start&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;sentence-start&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                            &lt;span style=&#34;color:#b8860b&#34;&gt;starts&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        (&lt;span style=&#34;color:#a2f&#34;&gt;dolist&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;word&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;words&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                          (&lt;span style=&#34;color:#a2f&#34;&gt;setq&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;starts&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;append&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;starts&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;list&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;start&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                          (&lt;span style=&#34;color:#a2f&#34;&gt;setq&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;start&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;start&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;length&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;word&lt;/span&gt;))))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#b8860b&#34;&gt;starts&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#a2f&#34;&gt;catch&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;&amp;#39;break&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (&lt;span style=&#34;color:#a2f&#34;&gt;dolist&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;start&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;reverse&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;word-starts&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        (&lt;span style=&#34;color:#a2f&#34;&gt;when&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;start&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;pos&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          (&lt;span style=&#34;color:#00a000&#34;&gt;goto-char&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;start&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          (&lt;span style=&#34;color:#a2f&#34;&gt;throw&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;&amp;#39;break&lt;/span&gt; &lt;span style=&#34;color:#800&#34;&gt;nil&lt;/span&gt;))))))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#a2f&#34;&gt;defun&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;backward-delete-word-by-jieba&lt;/span&gt; ()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;基于 jieba 分词结果向后删除一个单词。&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#a2f&#34;&gt;interactive&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#a2f&#34;&gt;let*&lt;/span&gt; ((&lt;span style=&#34;color:#b8860b&#34;&gt;words&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;get-segmented-words&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         (&lt;span style=&#34;color:#b8860b&#34;&gt;pos&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;point&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         (&lt;span style=&#34;color:#b8860b&#34;&gt;boundaries&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;get-sentence-boundaries&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         (&lt;span style=&#34;color:#b8860b&#34;&gt;sentence-start&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;car&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;boundaries&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         (&lt;span style=&#34;color:#b8860b&#34;&gt;word-starts&lt;/span&gt; (&lt;span style=&#34;color:#a2f&#34;&gt;let&lt;/span&gt; ((&lt;span style=&#34;color:#b8860b&#34;&gt;start&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;sentence-start&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                            &lt;span style=&#34;color:#b8860b&#34;&gt;starts&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        (&lt;span style=&#34;color:#a2f&#34;&gt;dolist&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;word&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;words&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                          (&lt;span style=&#34;color:#a2f&#34;&gt;setq&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;starts&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;append&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;starts&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;list&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;start&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                          (&lt;span style=&#34;color:#a2f&#34;&gt;setq&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;start&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;start&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;length&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;word&lt;/span&gt;))))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#b8860b&#34;&gt;starts&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#a2f&#34;&gt;catch&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;&amp;#39;break&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (&lt;span style=&#34;color:#a2f&#34;&gt;dolist&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;start&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;reverse&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;word-starts&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        (&lt;span style=&#34;color:#a2f&#34;&gt;when&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;start&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;pos&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          (&lt;span style=&#34;color:#00a000&#34;&gt;delete-region&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;start&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;pos&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          (&lt;span style=&#34;color:#a2f&#34;&gt;throw&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;&amp;#39;break&lt;/span&gt; &lt;span style=&#34;color:#800&#34;&gt;nil&lt;/span&gt;))))))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#a2f&#34;&gt;defun&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;forward-word-by-jieba&lt;/span&gt; ()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;基于 jieba 分词结果向前移动一个单词。&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#a2f&#34;&gt;interactive&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#a2f&#34;&gt;let*&lt;/span&gt; ((&lt;span style=&#34;color:#b8860b&#34;&gt;words&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;get-segmented-words&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         (&lt;span style=&#34;color:#b8860b&#34;&gt;pos&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;point&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         (&lt;span style=&#34;color:#b8860b&#34;&gt;boundaries&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;get-sentence-boundaries&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         (&lt;span style=&#34;color:#b8860b&#34;&gt;sentence-start&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;car&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;boundaries&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         (&lt;span style=&#34;color:#b8860b&#34;&gt;word-starts&lt;/span&gt; (&lt;span style=&#34;color:#a2f&#34;&gt;let&lt;/span&gt; ((&lt;span style=&#34;color:#b8860b&#34;&gt;start&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;sentence-start&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                            &lt;span style=&#34;color:#b8860b&#34;&gt;starts&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        (&lt;span style=&#34;color:#a2f&#34;&gt;dolist&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;word&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;words&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                          (&lt;span style=&#34;color:#a2f&#34;&gt;setq&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;starts&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;append&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;starts&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;list&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;start&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                          (&lt;span style=&#34;color:#a2f&#34;&gt;setq&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;start&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;start&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;length&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;word&lt;/span&gt;))))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#b8860b&#34;&gt;starts&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#a2f&#34;&gt;catch&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;&amp;#39;break&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (&lt;span style=&#34;color:#a2f&#34;&gt;dolist&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;start&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;word-starts&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        (&lt;span style=&#34;color:#a2f&#34;&gt;when&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;start&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;pos&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          (&lt;span style=&#34;color:#00a000&#34;&gt;goto-char&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;start&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          (&lt;span style=&#34;color:#a2f&#34;&gt;throw&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;&amp;#39;break&lt;/span&gt; &lt;span style=&#34;color:#800&#34;&gt;nil&lt;/span&gt;))))))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#a2f&#34;&gt;defun&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;forward-delete-word-by-jieba&lt;/span&gt; ()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;基于 jieba 分词结果向前删除一个单词。&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#a2f&#34;&gt;interactive&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#a2f&#34;&gt;let*&lt;/span&gt; ((&lt;span style=&#34;color:#b8860b&#34;&gt;words&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;get-segmented-words&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         (&lt;span style=&#34;color:#b8860b&#34;&gt;pos&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;point&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         (&lt;span style=&#34;color:#b8860b&#34;&gt;boundaries&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;get-sentence-boundaries&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         (&lt;span style=&#34;color:#b8860b&#34;&gt;sentence-start&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;car&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;boundaries&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         (&lt;span style=&#34;color:#b8860b&#34;&gt;sentence-end&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;cdr&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;boundaries&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         (&lt;span style=&#34;color:#b8860b&#34;&gt;word-starts&lt;/span&gt; (&lt;span style=&#34;color:#a2f&#34;&gt;let&lt;/span&gt; ((&lt;span style=&#34;color:#b8860b&#34;&gt;start&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;sentence-start&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                            &lt;span style=&#34;color:#b8860b&#34;&gt;starts&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        (&lt;span style=&#34;color:#a2f&#34;&gt;dolist&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;word&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;words&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                          (&lt;span style=&#34;color:#a2f&#34;&gt;setq&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;starts&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;append&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;starts&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;list&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;start&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                          (&lt;span style=&#34;color:#a2f&#34;&gt;setq&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;start&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;start&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;length&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;word&lt;/span&gt;))))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#b8860b&#34;&gt;starts&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#a2f&#34;&gt;catch&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;&amp;#39;break&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (&lt;span style=&#34;color:#a2f&#34;&gt;dolist&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;start&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;word-starts&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        (&lt;span style=&#34;color:#a2f&#34;&gt;when&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;start&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;pos&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          (&lt;span style=&#34;color:#00a000&#34;&gt;delete-region&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;pos&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;start&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          (&lt;span style=&#34;color:#a2f&#34;&gt;throw&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;&amp;#39;break&lt;/span&gt; &lt;span style=&#34;color:#800&#34;&gt;nil&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#080;font-style:italic&#34;&gt;;; 如果没有找到大于 pos 的分词起始位置，则删除到句子的结束位置&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (&lt;span style=&#34;color:#a2f&#34;&gt;when&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;pos&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;sentence-end&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        (&lt;span style=&#34;color:#00a000&#34;&gt;delete-region&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;pos&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;sentence-end&lt;/span&gt;)))))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;;; 将函数绑定到快捷键&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#b8860b&#34;&gt;global-set-key&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;kbd&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;M-b&amp;#34;&lt;/span&gt;) &lt;span style=&#34;color:#b8860b&#34;&gt;&amp;#39;backward-word-by-jieba&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#b8860b&#34;&gt;global-set-key&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;kbd&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;M-DEL&amp;#34;&lt;/span&gt;) &lt;span style=&#34;color:#b8860b&#34;&gt;&amp;#39;backward-delete-word-by-jieba&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#b8860b&#34;&gt;global-set-key&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;kbd&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;M-f&amp;#34;&lt;/span&gt;) &lt;span style=&#34;color:#b8860b&#34;&gt;&amp;#39;forward-word-by-jieba&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#b8860b&#34;&gt;global-set-key&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;kbd&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;M-d&amp;#34;&lt;/span&gt;) &lt;span style=&#34;color:#b8860b&#34;&gt;&amp;#39;forward-delete-word-by-jieba&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;完整的聊天记录&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;3.5&lt;/span&gt; 完整的聊天记录 &lt;a href=&#34;#%e5%ae%8c%e6%95%b4%e7%9a%84%e8%81%8a%e5%a4%a9%e8%ae%b0%e5%bd%95&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;这个案例，是我最近这段时间花时间最多，最复杂的案例，当然主要原因也是我自己水平有限。因此这个聊天记录里，有很多非常低级的问题，最终生成的代码也应该有很大的提升空间，仅供参考。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://chatgpt.com/share/cba47ae6-12c6-402f-ad25-65cafb68be15&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;与 ChatGPT 的完整聊天记录&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;结语&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;4&lt;/span&gt; 结语 &lt;a href=&#34;#%e7%bb%93%e8%af%ad&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;今天这个案例，是一个相对复杂的案例，它涉及到了 Emacs 和外部服务之间的交互，整个聊天过程也比较复杂，除了 ChatGPT 之外，还需要动很多脑筋想办法解决问题。最终实现自己需求的那一刻，那份满足感难以言表。&lt;/p&gt;
&lt;p&gt;后续，将会继续分享几个案例。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Org mode 代码块的出错信息&lt;/li&gt;
&lt;li&gt;org-super-links 链接与反链改造&lt;/li&gt;
&lt;li&gt;&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;我也会持续的使用 ChatGPT 和 Emacs，持续分享我的心得，感谢您的阅读。&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>大模型时代我们怎么玩Emacs：1. 中英文输入时的空格</title>
      <link>/posts/%E5%A4%A7%E6%A8%A1%E5%9E%8B%E6%97%B6%E4%BB%A3%E6%88%91%E4%BB%AC%E6%80%8E%E4%B9%88%E7%8E%A9emacs1.-%E4%B8%AD%E8%8B%B1%E6%96%87%E8%BE%93%E5%85%A5%E6%97%B6%E7%9A%84%E7%A9%BA%E6%A0%BC/</link>
      <pubDate>Mon, 20 May 2024 21:22:18 +0800</pubDate>
      
      <guid>/posts/%E5%A4%A7%E6%A8%A1%E5%9E%8B%E6%97%B6%E4%BB%A3%E6%88%91%E4%BB%AC%E6%80%8E%E4%B9%88%E7%8E%A9emacs1.-%E4%B8%AD%E8%8B%B1%E6%96%87%E8%BE%93%E5%85%A5%E6%97%B6%E7%9A%84%E7%A9%BA%E6%A0%BC/</guid>
      <description>&lt;div class=&#34;ox-hugo-toc toc has-section-numbers&#34;&gt;
&lt;div class=&#34;heading&#34;&gt;&amp;#30446;&amp;#24405;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class=&#34;section-num&#34;&gt;1&lt;/span&gt; &lt;a href=&#34;#%e6%a6%82%e8%bf%b0&#34;&gt;概述&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;section-num&#34;&gt;2&lt;/span&gt; &lt;a href=&#34;#%e5%a4%a7%e6%a8%a1%e5%9e%8b&#34;&gt;大模型&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;section-num&#34;&gt;3&lt;/span&gt; &lt;a href=&#34;#%e4%b8%ad%e8%8b%b1%e6%96%87%e8%be%93%e5%85%a5%e6%97%b6%e7%9a%84%e7%a9%ba%e6%a0%bc&#34;&gt;中英文输入时的空格&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class=&#34;section-num&#34;&gt;3.1&lt;/span&gt; &lt;a href=&#34;#%e8%83%8c%e6%99%af&#34;&gt;背景&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;section-num&#34;&gt;3.2&lt;/span&gt; &lt;a href=&#34;#%e6%ad%a3%e7%a1%ae%e7%9a%84%e6%8f%8f%e8%bf%b0%e6%88%91%e4%bb%ac%e7%9a%84%e9%97%ae%e9%a2%98&#34;&gt;正确的描述我们的问题&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;section-num&#34;&gt;3.3&lt;/span&gt; &lt;a href=&#34;#%e6%9c%80%e7%bb%88%e7%9a%84%e6%95%88%e6%9e%9c&#34;&gt;最终的效果&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;section-num&#34;&gt;3.4&lt;/span&gt; &lt;a href=&#34;#%e6%9c%80%e7%bb%88%e7%94%9f%e6%88%90%e7%9a%84%e4%bb%a3%e7%a0%81&#34;&gt;最终生成的代码&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;section-num&#34;&gt;3.5&lt;/span&gt; &lt;a href=&#34;#%e5%ae%8c%e6%95%b4%e7%9a%84%e8%81%8a%e5%a4%a9%e8%ae%b0%e5%bd%95&#34;&gt;完整的聊天记录&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;section-num&#34;&gt;4&lt;/span&gt; &lt;a href=&#34;#%e7%bb%93%e8%af%ad&#34;&gt;结语&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;!--endtoc--&gt;
&lt;h2 id=&#34;概述&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;1&lt;/span&gt; 概述 &lt;a href=&#34;#%e6%a6%82%e8%bf%b0&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;在大模型时代，一切皆有可能。对于 Emacs 同样如此，大模型拉低学习了 Emacs 的门槛，我们通过大模型可以做到以前我们敢想不敢做，或敢做没时间做，或有时间不会做的事。&lt;/p&gt;
&lt;p&gt;今天开始一个新的系列，跟大家分享在大模型时代，我们可以如何“玩” Emacs，我们应该怎么用大模型来满足自己对 Emacs 使用的需求。&lt;/p&gt;
&lt;h2 id=&#34;大模型&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;2&lt;/span&gt; 大模型 &lt;a href=&#34;#%e5%a4%a7%e6%a8%a1%e5%9e%8b&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;这个系列的几个案例，均基于 OpenAI 的 &lt;code&gt;ChatGPT-4o&lt;/code&gt; 模型（主要是花了钱，不用浪费不是😀）。大模型能做很多事，这里简单说说我们可以通过 ChatGPT 对 Emacs 做什么：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;让 ChatGPT 帮忙阅读代码，解释代码，这样以前看不懂的代码可以通过 ChatGPT 看明白&lt;/li&gt;
&lt;li&gt;让 ChatGPT 帮忙写代码，尤其是我们对 Emacs 的配置进行调整，需要写一些函数甚至插件&lt;/li&gt;
&lt;li&gt;让 ChatGPT 优化已经写好的代码，让代码更加规范和可读&lt;/li&gt;
&lt;li&gt;让 ChatGPT 充当 Emacs 百科，充当 Google 的角色，回答各种配置问题&lt;/li&gt;
&lt;li&gt;&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所有的这一切，都需要有一个前提，就是你需要学会「正确的问问题」。我想这个技能，不是因为 ChatGPT 的出现才出现，这个问题亘古至今如此，只是对象，从以前问夫子，到网络时代问网友，再到 AI 时代问大模型，其原理不变其宗。&lt;/p&gt;
&lt;p&gt;我们与 ChatGPT 的交流，主要通过提示工程。提示词是有方法论的，网上有很多教程，这里不做介绍。与 AI 交流，其实就跟练剑一样，练的多了，也就会了剑，无他，惟手熟耳！&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;关于这些案例，我在与 ChatGPT 交谈时，实际上并没有很好地遵循提示工程的“三段式”，比较随性，仅供参考。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;中英文输入时的空格&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;3&lt;/span&gt; 中英文输入时的空格 &lt;a href=&#34;#%e4%b8%ad%e8%8b%b1%e6%96%87%e8%be%93%e5%85%a5%e6%97%b6%e7%9a%84%e7%a9%ba%e6%a0%bc&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;h3 id=&#34;背景&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;3.1&lt;/span&gt; 背景 &lt;a href=&#34;#%e8%83%8c%e6%99%af&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;中文和英文的输入，到底要不要加空格，是一个很有意思的话题。很多人喜欢在中文和英文之间加上空格，有些人不喜欢。如果要加空格，又会遇到一致性的问题，就是如何保证一篇文章的整体风格的统一，要么都加，要么都不加。除了一致性问题，还会遇到在某些特殊的场合不应该加，比如在一个链接里，就不应该在中英文之间加空格。&lt;/p&gt;
&lt;p&gt;我自己倾向于加上空格，这样在阅读和导出为 HTML 或其他格式时，更加美观。&lt;/p&gt;
&lt;p&gt;前几年，试用过 &lt;a href=&#34;https://github.com/coldnew/pangu-spacing&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;pangu-spacing&lt;/a&gt; 这个包，用了一段时间之后发现几个问题：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;默认情况下， 它只是通过 Overlay 让你看上去在中英文之间加了空格，实际上没有加，这会导致在导出为其他文件如 HTML 时没有加空格。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;如果通过 &lt;code&gt;(setq pangu-spacing-real-insert-separtor t)&lt;/code&gt; 设置在中英文之间真实加上空格，那会出现一个致命的问题，它会默认把整个文档的所有中英文之间加上空格，甚至类似 &lt;code&gt;[[file:中文English文件夹名/中文English.png]]&lt;/code&gt; 这种链接，也会自动在中英文之间加上空格，这样就破坏了链接的结构。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;请注意，它的修改范围是整个文档，这在一个很大的已经有很多内容的 Org 文档里，简直就是一个灾难。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;具有强制性，无法删除我们不想要的空格&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;正确的描述我们的问题&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;3.2&lt;/span&gt; 正确的描述我们的问题 &lt;a href=&#34;#%e6%ad%a3%e7%a1%ae%e7%9a%84%e6%8f%8f%e8%bf%b0%e6%88%91%e4%bb%ac%e7%9a%84%e9%97%ae%e9%a2%98&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;下面我们通过 ChatGPT 看看能否解决这个痛点问题，首先，我们需要将问题正确的描述出来，让大模型理解我们的需求是什么。&lt;/p&gt;
&lt;h4 id=&#34;第一次描述问题&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;3.2.1&lt;/span&gt; 第一次描述问题 &lt;a href=&#34;#%e7%ac%ac%e4%b8%80%e6%ac%a1%e6%8f%8f%e8%bf%b0%e9%97%ae%e9%a2%98&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h4&gt;&lt;figure class=&#34;zoomImage&#34;&gt;&lt;img src=&#34;/ox-hugo/img_20240521_062256.png&#34; width=&#34;800&#34;&gt;
&lt;/figure&gt;

&lt;h4 id=&#34;测试之后的问题描述&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;3.2.2&lt;/span&gt; 测试之后的问题描述 &lt;a href=&#34;#%e6%b5%8b%e8%af%95%e4%b9%8b%e5%90%8e%e7%9a%84%e9%97%ae%e9%a2%98%e6%8f%8f%e8%bf%b0&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h4&gt;&lt;figure class=&#34;zoomImage&#34;&gt;&lt;img src=&#34;/ox-hugo/img_20240521_062502.png&#34; width=&#34;800&#34;&gt;
&lt;/figure&gt;

&lt;h4 id=&#34;额外的需求描述&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;3.2.3&lt;/span&gt; 额外的需求描述 &lt;a href=&#34;#%e9%a2%9d%e5%a4%96%e7%9a%84%e9%9c%80%e6%b1%82%e6%8f%8f%e8%bf%b0&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h4&gt;&lt;figure class=&#34;zoomImage&#34;&gt;&lt;img src=&#34;/ox-hugo/img_20240521_062531.png&#34; width=&#34;800&#34;&gt;
&lt;/figure&gt;

&lt;figure class=&#34;zoomImage&#34;&gt;&lt;img src=&#34;/ox-hugo/img_20240521_062557.png&#34; width=&#34;800&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;&amp;hellip;&lt;/p&gt;
&lt;h3 id=&#34;最终的效果&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;3.3&lt;/span&gt; 最终的效果 &lt;a href=&#34;#%e6%9c%80%e7%bb%88%e7%9a%84%e6%95%88%e6%9e%9c&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;通过不断的测试 ChatGPT 生成的代码，我们得到了一个非常好的实现（对我个人来说满足我的需求），我们可以通过 &lt;code&gt;(auto-space-mode t)&lt;/code&gt; 的方式开启中英文之间自动加空格，也可以通过 &lt;code&gt;(auto-space-mode nil)&lt;/code&gt; 来关闭这个模式。&lt;/p&gt;
&lt;p&gt;它与 &lt;code&gt;pangu-spacing&lt;/code&gt; 相比有哪些特点呢：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;足够安全：只作用于输入的时候，不会改变文件原有的中英文布局&lt;/li&gt;
&lt;li&gt;真实空格：添加的是空格，并且可以删除，非强制&lt;/li&gt;
&lt;li&gt;兼容性考虑：如果已经手动输入了空格就不会再插入空格&lt;/li&gt;
&lt;li&gt;不考虑标点符号：先只考虑中英文和数字，因为标点在 org 里比较复杂，有很多表示强调的符号不应该自动加空格&lt;/li&gt;
&lt;/ol&gt;
&lt;figure class=&#34;zoomImage&#34;&gt;&lt;img src=&#34;/ox-hugo/gif_20240521_063623.gif&#34; width=&#34;800&#34;&gt;
&lt;/figure&gt;

&lt;h3 id=&#34;最终生成的代码&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;3.4&lt;/span&gt; 最终生成的代码 &lt;a href=&#34;#%e6%9c%80%e7%bb%88%e7%94%9f%e6%88%90%e7%9a%84%e4%bb%a3%e7%a0%81&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-emacs-lisp&#34; data-lang=&#34;emacs-lisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#a2f&#34;&gt;defun&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;add-space-between-chinese-and-english&lt;/span&gt; ()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;在中英文之间自动添加空格。&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#a2f&#34;&gt;let&lt;/span&gt; ((&lt;span style=&#34;color:#b8860b&#34;&gt;current-char&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;char-before&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        (&lt;span style=&#34;color:#b8860b&#34;&gt;prev-char&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;char-before&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;1-&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;point&lt;/span&gt;)))))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#a2f&#34;&gt;when&lt;/span&gt; (&lt;span style=&#34;color:#a2f&#34;&gt;and&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;current-char&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;prev-char&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;               (&lt;span style=&#34;color:#a2f&#34;&gt;or&lt;/span&gt; (&lt;span style=&#34;color:#a2f&#34;&gt;and&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;is-chinese-character&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;prev-char&lt;/span&gt;) (&lt;span style=&#34;color:#b8860b&#34;&gt;is-halfwidth-character&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;current-char&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                   (&lt;span style=&#34;color:#a2f&#34;&gt;and&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;is-halfwidth-character&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;prev-char&lt;/span&gt;) (&lt;span style=&#34;color:#b8860b&#34;&gt;is-chinese-character&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;current-char&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;               (&lt;span style=&#34;color:#b8860b&#34;&gt;not&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;eq&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;prev-char&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;?\s&lt;/span&gt;))) &lt;span style=&#34;color:#080;font-style:italic&#34;&gt;; 检查前一个字符不是空格&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (&lt;span style=&#34;color:#a2f&#34;&gt;save-excursion&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        (&lt;span style=&#34;color:#00a000&#34;&gt;goto-char&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;1-&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;point&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        (&lt;span style=&#34;color:#00a000&#34;&gt;insert&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34; &amp;#34;&lt;/span&gt;)))))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#a2f&#34;&gt;defun&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;is-chinese-character&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;char&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;判断字符是否为中文字符。&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#a2f&#34;&gt;and&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;char&lt;/span&gt; (&lt;span style=&#34;color:#a2f&#34;&gt;or&lt;/span&gt; (&lt;span style=&#34;color:#a2f&#34;&gt;and&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;#x4e00&lt;/span&gt;) (&lt;span style=&#34;color:#00a000&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;#x9fff&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                (&lt;span style=&#34;color:#a2f&#34;&gt;and&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;#x3400&lt;/span&gt;) (&lt;span style=&#34;color:#00a000&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;#x4dbf&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                (&lt;span style=&#34;color:#a2f&#34;&gt;and&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;#x20000&lt;/span&gt;) (&lt;span style=&#34;color:#00a000&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;#x2a6df&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                (&lt;span style=&#34;color:#a2f&#34;&gt;and&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;#x2a700&lt;/span&gt;) (&lt;span style=&#34;color:#00a000&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;#x2b73f&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                (&lt;span style=&#34;color:#a2f&#34;&gt;and&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;#x2b740&lt;/span&gt;) (&lt;span style=&#34;color:#00a000&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;#x2b81f&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                (&lt;span style=&#34;color:#a2f&#34;&gt;and&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;#x2b820&lt;/span&gt;) (&lt;span style=&#34;color:#00a000&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;#x2ceaf&lt;/span&gt;)))))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#a2f&#34;&gt;defun&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;is-halfwidth-character&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;char&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;判断字符是否为半角字符，包括英文字母、数字和标点符号。&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#a2f&#34;&gt;and&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;char&lt;/span&gt; (&lt;span style=&#34;color:#a2f&#34;&gt;or&lt;/span&gt; (&lt;span style=&#34;color:#a2f&#34;&gt;and&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;?a&lt;/span&gt;) (&lt;span style=&#34;color:#00a000&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;?z&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                (&lt;span style=&#34;color:#a2f&#34;&gt;and&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;?A&lt;/span&gt;) (&lt;span style=&#34;color:#00a000&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;?Z&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                (&lt;span style=&#34;color:#a2f&#34;&gt;and&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;?0&lt;/span&gt;) (&lt;span style=&#34;color:#00a000&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;?9&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                )))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#a2f&#34;&gt;defun&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;delayed-add-space-between-chinese-and-english&lt;/span&gt; ()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;延迟执行，在中英文之间自动添加空格。&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#b8860b&#34;&gt;run-with-idle-timer&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#800&#34;&gt;nil&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;&amp;#39;add-space-between-chinese-and-english&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#a2f&#34;&gt;define-minor-mode&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;auto-space-mode&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;在中英文之间自动添加空格的模式。&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a2f&#34;&gt;:lighter&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34; Auto-Space&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a2f&#34;&gt;:global&lt;/span&gt; &lt;span style=&#34;color:#800&#34;&gt;t&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#a2f&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;auto-space-mode&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (&lt;span style=&#34;color:#b8860b&#34;&gt;add-hook&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;&amp;#39;post-self-insert-hook&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;&amp;#39;add-space-between-chinese-and-english&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#b8860b&#34;&gt;remove-hook&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;&amp;#39;post-self-insert-hook&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;&amp;#39;add-space-between-chinese-and-english&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;完整的聊天记录&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;3.5&lt;/span&gt; 完整的聊天记录 &lt;a href=&#34;#%e5%ae%8c%e6%95%b4%e7%9a%84%e8%81%8a%e5%a4%a9%e8%ae%b0%e5%bd%95&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;a href=&#34;https://chatgpt.com/share/ecbc5fc6-4620-4cd9-94dc-a03630fa3573&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;与 ChatGPT 的完整聊天记录&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;结语&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;4&lt;/span&gt; 结语 &lt;a href=&#34;#%e7%bb%93%e8%af%ad&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;这个系列的分享，只是提供了一个新的思路，我们在这个伟大的时代，要善于利用大模型达到我们的目标。当然，我的这些分享，在大牛面前，什么都不是，大佬分分钟都能做到而且做的更好。但从一个产品经理的角度，从一个代码经验近乎小白的角度，似乎有那么一些意义。&lt;/p&gt;
&lt;p&gt;后续，将会继续分享几个案例。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;中文按词移动和删除&lt;/li&gt;
&lt;li&gt;Org mode 代码块的出错信息&lt;/li&gt;
&lt;li&gt;org-super-links 链接与反链改造&lt;/li&gt;
&lt;li&gt;&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;我也会持续的使用 ChatGPT 和 Emacs，持续分享我的心得，感谢您的阅读。&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>面向产品经理的Emacs教程：34. Emacs里的表格</title>
      <link>/posts/%E9%9D%A2%E5%90%91%E4%BA%A7%E5%93%81%E7%BB%8F%E7%90%86%E7%9A%84emacs%E6%95%99%E7%A8%8B34.-emacs%E9%87%8C%E7%9A%84%E8%A1%A8%E6%A0%BC/</link>
      <pubDate>Thu, 22 Feb 2024 14:05:31 +0800</pubDate>
      
      <guid>/posts/%E9%9D%A2%E5%90%91%E4%BA%A7%E5%93%81%E7%BB%8F%E7%90%86%E7%9A%84emacs%E6%95%99%E7%A8%8B34.-emacs%E9%87%8C%E7%9A%84%E8%A1%A8%E6%A0%BC/</guid>
      <description>&lt;div class=&#34;ox-hugo-toc toc has-section-numbers&#34;&gt;
&lt;div class=&#34;heading&#34;&gt;&amp;#30446;&amp;#24405;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class=&#34;section-num&#34;&gt;1&lt;/span&gt; &lt;a href=&#34;#%e8%af%be%e7%a8%8b%e5%9b%9e%e9%a1%be&#34;&gt;课程回顾&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;section-num&#34;&gt;2&lt;/span&gt; &lt;a href=&#34;#%e6%a6%82%e8%bf%b0&#34;&gt;概述&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;section-num&#34;&gt;3&lt;/span&gt; &lt;a href=&#34;#emacs%e9%87%8c%e7%9a%84%e8%a1%a8%e6%a0%bc&#34;&gt;Emacs里的表格&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class=&#34;section-num&#34;&gt;3.1&lt;/span&gt; &lt;a href=&#34;#table-dot-el&#34;&gt;table.el&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;section-num&#34;&gt;3.2&lt;/span&gt; &lt;a href=&#34;#org-table-dot-el&#34;&gt;org-table.el&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;section-num&#34;&gt;4&lt;/span&gt; &lt;a href=&#34;#%e7%bb%93%e8%af%ad&#34;&gt;结语&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;!--endtoc--&gt;
&lt;h2 id=&#34;课程回顾&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;1&lt;/span&gt; 课程回顾 &lt;a href=&#34;#%e8%af%be%e7%a8%8b%e5%9b%9e%e9%a1%be&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;通过上节课，我们学习了如何升级 Emacs 的插件，以及遇到报错应该如何处理。&lt;/p&gt;
&lt;p&gt;今天我们来学习 Emacs 里的表格。&lt;/p&gt;
&lt;h2 id=&#34;概述&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;2&lt;/span&gt; 概述 &lt;a href=&#34;#%e6%a6%82%e8%bf%b0&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Emacs 里是否可以处理表格？当然可以。尤其是 Org-mode，被称为文本界的 Office 套件，必须可以处理表格。今天我们来学习 Emacs 里的表格。&lt;/p&gt;
&lt;p&gt;今天的主要内容有：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;创建表格&lt;/li&gt;
&lt;li&gt;导出表格&lt;/li&gt;
&lt;li&gt;表格公式&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;emacs里的表格&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;3&lt;/span&gt; Emacs里的表格 &lt;a href=&#34;#emacs%e9%87%8c%e7%9a%84%e8%a1%a8%e6%a0%bc&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;h3 id=&#34;table-dot-el&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;3.1&lt;/span&gt; table.el &lt;a href=&#34;#table-dot-el&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Emacs 自带 &lt;code&gt;table.el&lt;/code&gt; 包，可以处理纯文本表格，比如我们可以通过 &lt;code&gt;table-insert&lt;/code&gt; 命令在当前光标处插入一个表格：&lt;/p&gt;
&lt;figure class=&#34;zoomImage&#34;&gt;&lt;img src=&#34;/ox-hugo/gif_20240223_092603.gif&#34; width=&#34;800&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;我们可以通过 &lt;code&gt;&amp;lt;TAB&amp;gt;&lt;/code&gt; 键在不同的单元格里移动和编辑。&lt;/p&gt;
&lt;p&gt;如果要使用这个包，需要注意以下几点：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;你需要使用等宽字体，或调整好你的中英文字体大小比例，这样不至于表格会错乱不对齐&lt;/li&gt;
&lt;li&gt;插入的表格，不依赖于文件格式，在任何缓冲区都可以插入，可以理解为类似于像 ASCII 艺术的那种感觉&lt;/li&gt;
&lt;li&gt;table.el 更关注的是文本表格的视觉布局和组织，不支持公式等复杂功能&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;org-table-dot-el&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;3.2&lt;/span&gt; org-table.el &lt;a href=&#34;#org-table-dot-el&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;下面讲一讲更加实用的 &lt;code&gt;org-table.el&lt;/code&gt; 包，这个包是 Org-mode 官方支持的表格功能，它几乎能做到 Office 里做到的事，区别在于它是基于纯文本的，而 Office 不是。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;你问我？我当然更加喜欢基于纯文本的 Org-mode，如果不是要和其他人协作，我甚至可能会卸载 Office。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;下面就简单讲一讲 Org-mode 里的表格操作。&lt;/p&gt;
&lt;h4 id=&#34;表格基本操作&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;3.2.1&lt;/span&gt; 表格基本操作 &lt;a href=&#34;#%e8%a1%a8%e6%a0%bc%e5%9f%ba%e6%9c%ac%e6%93%8d%e4%bd%9c&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h4&gt;&lt;h5 id=&#34;创建表格&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;3.2.1.1&lt;/span&gt; 创建表格 &lt;a href=&#34;#%e5%88%9b%e5%bb%ba%e8%a1%a8%e6%a0%bc&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h5&gt;&lt;p&gt;我自己创建表格用的是 &lt;code&gt;yasnippet&lt;/code&gt; 的模板，只需要输入 &lt;code&gt;&amp;lt;ta&lt;/code&gt; 再按下 &lt;code&gt;&amp;lt;tab&amp;gt;&lt;/code&gt; 键，Emacs 就会自动在 Org 文档里创建一个表格：&lt;/p&gt;
&lt;figure class=&#34;zoomImage&#34;&gt;&lt;img src=&#34;/ox-hugo/gif_20240223_104503.gif&#34; width=&#34;800&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;这个 yasnippet 的模板如下：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-txt&#34; data-lang=&#34;txt&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;# -*- mode: snippet -*-
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;# name: table
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;# key: &amp;lt;ta
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;# --
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#+CAPTION: $1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#+NAME: ${1:tablename}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#+ATTR_LATEX: :float nil :environment tabularx :width \textwidth :align
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;| ${2:key} | ${3:description} |
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|-$0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h5 id=&#34;表格的编辑&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;3.2.1.2&lt;/span&gt; 表格的编辑 &lt;a href=&#34;#%e8%a1%a8%e6%a0%bc%e7%9a%84%e7%bc%96%e8%be%91&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h5&gt;&lt;p&gt;我自己常用的表格编辑动作如下，供参考：&lt;/p&gt;
&lt;p&gt;&lt;a id=&#34;table--Emacs Org mode 表格常用编辑动作&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class=&#34;table-caption&#34;&gt;
  &lt;span class=&#34;table-number&#34;&gt;&lt;a href=&#34;#table--Emacs Org mode 表格常用编辑动作&#34;&gt;&amp;#34920; 1&lt;/a&gt;:&lt;/span&gt;
  Emacs Org mode 表格常用编辑动作
&lt;/div&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;快捷键&lt;/th&gt;
					&lt;th&gt;函数&lt;/th&gt;
					&lt;th&gt;作用&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&amp;lt;tab&amp;gt;&lt;/td&gt;
					&lt;td&gt;org-cycle&lt;/td&gt;
					&lt;td&gt;进入下一个单元格，同时可以自动调整表格格式&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&amp;lt;backtab&amp;gt;&lt;/td&gt;
					&lt;td&gt;org-shifttab&lt;/td&gt;
					&lt;td&gt;进入上一个单元格，同时可以自动调整表格格式&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;C-c C-c&lt;/td&gt;
					&lt;td&gt;org-ctrl-c-ctrl-c&lt;/td&gt;
					&lt;td&gt;自动调整表格格式&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;RET&lt;/td&gt;
					&lt;td&gt;org-return&lt;/td&gt;
					&lt;td&gt;进入下一行&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;C-c RET&lt;/td&gt;
					&lt;td&gt;org-ctrl-c-ret&lt;/td&gt;
					&lt;td&gt;在当前行下加一行分隔线和新行然后移动到新行&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;C-c -&lt;/td&gt;
					&lt;td&gt;org-ctrl-c-minus&lt;/td&gt;
					&lt;td&gt;在当前行下加一行分隔线&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;M-up&lt;/td&gt;
					&lt;td&gt;org-metaup&lt;/td&gt;
					&lt;td&gt;交换当前行和上一行&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;M-down&lt;/td&gt;
					&lt;td&gt;org-metadown&lt;/td&gt;
					&lt;td&gt;交换当前行和下一行&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;M-left&lt;/td&gt;
					&lt;td&gt;org-metaleft&lt;/td&gt;
					&lt;td&gt;交行当前列和左边一列&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;M-right&lt;/td&gt;
					&lt;td&gt;org-metaright&lt;/td&gt;
					&lt;td&gt;交换当前列和右边一列&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;M-S-up&lt;/td&gt;
					&lt;td&gt;org-shiftmetaup&lt;/td&gt;
					&lt;td&gt;删除当前行&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;M-S-down&lt;/td&gt;
					&lt;td&gt;org-shiftmetadown&lt;/td&gt;
					&lt;td&gt;在当前位置新增空行并将当前行下移一行&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;M-S-left&lt;/td&gt;
					&lt;td&gt;org-shiftmetaleft&lt;/td&gt;
					&lt;td&gt;删除当前列&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;M-S-right&lt;/td&gt;
					&lt;td&gt;org-shiftmetaright&lt;/td&gt;
					&lt;td&gt;在当前位置新增空列并将当前列右移一列&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;org-table-blank-field&lt;/td&gt;
					&lt;td&gt;清空当前单元格&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;M-a&lt;/td&gt;
					&lt;td&gt;org-backward-sentence&lt;/td&gt;
					&lt;td&gt;跳转到当前单元格首&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;M-e&lt;/td&gt;
					&lt;td&gt;org-forward-sentence&lt;/td&gt;
					&lt;td&gt;跳转到当前单元格尾&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;C-&amp;lt;tab&amp;gt;&lt;/td&gt;
					&lt;td&gt;org-ctrl-c-tab&lt;/td&gt;
					&lt;td&gt;折叠或展开当前列&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;C-c &#39;&lt;/td&gt;
					&lt;td&gt;org-edit-special&lt;/td&gt;
					&lt;td&gt;在一个新buffer输入表格公式&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;C-c =&lt;/td&gt;
					&lt;td&gt;org-table-eval-formula&lt;/td&gt;
					&lt;td&gt;在当前单元格输入公式&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;C-c *&lt;/td&gt;
					&lt;td&gt;org-ctrl-c-star&lt;/td&gt;
					&lt;td&gt;重新按照公式计算和更新表格&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;C-c }&lt;/td&gt;
					&lt;td&gt;org-table-toggle-coordinate-overlays&lt;/td&gt;
					&lt;td&gt;是否显示表格的参考线更便于编写公式&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id=&#34;表格公式&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;3.2.2&lt;/span&gt; 表格公式 &lt;a href=&#34;#%e8%a1%a8%e6%a0%bc%e5%85%ac%e5%bc%8f&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;下面着重说下Org mode里表格的公式。&lt;/p&gt;
&lt;h5 id=&#34;如何引用行-列-分隔线和单元格&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;3.2.2.1&lt;/span&gt; 如何引用行、列、分隔线和单元格 &lt;a href=&#34;#%e5%a6%82%e4%bd%95%e5%bc%95%e7%94%a8%e8%a1%8c-%e5%88%97-%e5%88%86%e9%9a%94%e7%ba%bf%e5%92%8c%e5%8d%95%e5%85%83%e6%a0%bc&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h5&gt;&lt;dl&gt;
&lt;dt&gt;行&lt;/dt&gt;
&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;用 &lt;code&gt;@#&lt;/code&gt; 来表示第几行：如 &lt;code&gt;@1&lt;/code&gt; 表示第一行， &lt;code&gt;@0&lt;/code&gt; 表示当前行&lt;/li&gt;
&lt;li&gt;用 &lt;code&gt;@&amp;gt;&lt;/code&gt; 来表示最后一行&lt;/li&gt;
&lt;li&gt;用 &lt;code&gt;@&amp;lt;&lt;/code&gt; 来表示第一行&lt;/li&gt;
&lt;li&gt;用 &lt;code&gt;@+3&lt;/code&gt; 来表示当前行后3行： &lt;code&gt;@-2&lt;/code&gt; 表示当前行前2行&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;dt&gt;列&lt;/dt&gt;
&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;用 &lt;code&gt;$数字&lt;/code&gt; 来表示第几列：如 &lt;code&gt;$1&lt;/code&gt; 表示第一列， &lt;code&gt;$0&lt;/code&gt; 表示当前列&lt;/li&gt;
&lt;li&gt;用 &lt;code&gt;$&amp;gt;&lt;/code&gt; 来表示最后一列&lt;/li&gt;
&lt;li&gt;用 &lt;code&gt;$&amp;lt;&lt;/code&gt; 来表示第一列&lt;/li&gt;
&lt;li&gt;用 &lt;code&gt;$+3&lt;/code&gt; 来表示当前列后3列： &lt;code&gt;$-2&lt;/code&gt; 表示当前列前2列&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;dt&gt;单元格&lt;/dt&gt;
&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;用 &lt;code&gt;@#$#&lt;/code&gt; 来表示第几行第几列的单元格，如 &lt;code&gt;@2$3&lt;/code&gt; 表示第二行第三列&lt;/li&gt;
&lt;li&gt;用 &lt;code&gt;@0$0&lt;/code&gt; 表示当前单元格&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;dt&gt;分隔线&lt;/dt&gt;
&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;用 &lt;code&gt;@I&lt;/code&gt; 表示第一个水平分隔线，用 &lt;code&gt;@II&lt;/code&gt; 表示第二个， &lt;code&gt;@III&lt;/code&gt; 表示第三个&lt;/li&gt;
&lt;li&gt;用 &lt;code&gt;@-I&lt;/code&gt; 表示在当前行上一个水平分隔线， &lt;code&gt;@+I&lt;/code&gt; 表示当前行下一个水平分隔线&lt;/li&gt;
&lt;li&gt;用 &lt;code&gt;@III+2&lt;/code&gt; 表示在第三个水平分隔线后2行&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;dt&gt;范围&lt;/dt&gt;
&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;用 &lt;code&gt;..&lt;/code&gt; 表示范围，如 &lt;code&gt;@2..@&amp;gt;&lt;/code&gt; 表示第2行到最后一行&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;dt&gt;结果的格式&lt;/dt&gt;
&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;用 &lt;code&gt;;xx&lt;/code&gt; 来表示结果的格式规定，如 &lt;code&gt;;%.1f&lt;/code&gt; 表示保留到小数点后1位&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;h5 id=&#34;常用例子&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;3.2.2.2&lt;/span&gt; 常用例子 &lt;a href=&#34;#%e5%b8%b8%e7%94%a8%e4%be%8b%e5%ad%90&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h5&gt;&lt;p&gt;Org-mode 的表格支持两种公式，我们先讲 calc 格式或 elisp 的代码公式，我们可以根据需要灵活运用。&lt;/p&gt;
&lt;h6 id=&#34;求平均&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;3.2.2.2.1&lt;/span&gt; 求平均 &lt;a href=&#34;#%e6%b1%82%e5%b9%b3%e5%9d%87&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h6&gt;&lt;p&gt;假设我们的原始表格如下：&lt;/p&gt;
&lt;p&gt;&lt;a id=&#34;table--测试表格1&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class=&#34;table-caption&#34;&gt;
  &lt;span class=&#34;table-number&#34;&gt;&lt;a href=&#34;#table--测试表格1&#34;&gt;&amp;#34920; 2&lt;/a&gt;:&lt;/span&gt;
  测试表格1
&lt;/div&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;年份&lt;/th&gt;
					&lt;th&gt;销售额&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;2020&lt;/td&gt;
					&lt;td&gt;135&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;2021&lt;/td&gt;
					&lt;td&gt;150&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;2022&lt;/td&gt;
					&lt;td&gt;175&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;2023&lt;/td&gt;
					&lt;td&gt;160&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;平均&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;那么我们如何来写这个公式呢，我们可以将光标放到总计对应的那个空单元格，然后按下 &lt;code&gt;C-c &#39;&lt;/code&gt; 后编辑公式： &lt;code&gt;@&amp;gt;$2=vmean(@I$2..@II$2)&lt;/code&gt; ，
编辑完后，表格就变成了如下：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-org&#34; data-lang=&#34;org&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#b44&#34;&gt;| 年份 | 销售额 |&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#b44&#34;&gt;|------+--------|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#b44&#34;&gt;| 2020 |    135 |&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#b44&#34;&gt;| 2021 |    150 |&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#b44&#34;&gt;| 2022 |    175 |&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#b44&#34;&gt;| 2023 |    160 |&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#b44&#34;&gt;|------+--------|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#b44&#34;&gt;| 平均 |        |&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;#+TBLFM&lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;: @&amp;gt;$2=vmean(@2$2..@5$2);%.1f&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;我们可以使用 &lt;code&gt;;%.1f&lt;/code&gt; 来表示公式计算后的格式，如这个代表精确到小数点后一位。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;然后我们在最后一个单元格里按下 &lt;code&gt;C-c *&lt;/code&gt; (或将光标移动到公式行按 &lt;code&gt;C-c C-c&lt;/code&gt; ) 就可以得到最终结果了：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;年份&lt;/th&gt;
					&lt;th&gt;销售额&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;2020&lt;/td&gt;
					&lt;td&gt;135&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;2021&lt;/td&gt;
					&lt;td&gt;150&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;2022&lt;/td&gt;
					&lt;td&gt;175&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;2023&lt;/td&gt;
					&lt;td&gt;160&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;平均&lt;/td&gt;
					&lt;td&gt;&lt;b&gt;&lt;font color=&#34;red&#34;&gt;155.0&lt;/font&gt;&lt;/b&gt;&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h6 id=&#34;求和&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;3.2.2.2.2&lt;/span&gt; 求和 &lt;a href=&#34;#%e6%b1%82%e5%92%8c&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h6&gt;&lt;p&gt;还是针对上面的表格，求和的公式为 &lt;code&gt;@&amp;gt;$2=vsum(@I$2..@II$2)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;最终的结果为：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;年份&lt;/th&gt;
					&lt;th&gt;销售额&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;2020&lt;/td&gt;
					&lt;td&gt;135&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;2021&lt;/td&gt;
					&lt;td&gt;150&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;2022&lt;/td&gt;
					&lt;td&gt;175&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;2023&lt;/td&gt;
					&lt;td&gt;160&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;平均&lt;/td&gt;
					&lt;td&gt;&lt;b&gt;&lt;font color=&#34;red&#34;&gt;620&lt;/font&gt;&lt;/b&gt;&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h6 id=&#34;单元格拼接&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;3.2.2.2.3&lt;/span&gt; 单元格拼接 &lt;a href=&#34;#%e5%8d%95%e5%85%83%e6%a0%bc%e6%8b%bc%e6%8e%a5&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h6&gt;&lt;p&gt;针对上面那个表格，如果我们想要增加一列，新的列由左边两列拼接而来，如 &lt;code&gt;2020年的销售额为135万&lt;/code&gt; ，此时编辑公式为 &lt;code&gt;(concat $1 &amp;quot;年的销售额为&amp;quot; $2 &amp;quot;万&amp;quot;)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;最终的结果为：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;年份&lt;/th&gt;
					&lt;th&gt;销售额&lt;/th&gt;
					&lt;th&gt;新的文本&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;2020&lt;/td&gt;
					&lt;td&gt;135&lt;/td&gt;
					&lt;td&gt;2020年的销售额为135万&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;2021&lt;/td&gt;
					&lt;td&gt;150&lt;/td&gt;
					&lt;td&gt;2021年的销售额为150万&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;2022&lt;/td&gt;
					&lt;td&gt;175&lt;/td&gt;
					&lt;td&gt;2022年的销售额为175万&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;2023&lt;/td&gt;
					&lt;td&gt;160&lt;/td&gt;
					&lt;td&gt;2023年的销售额为160万&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h6 id=&#34;多个公式&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;3.2.2.2.4&lt;/span&gt; 多个公式 &lt;a href=&#34;#%e5%a4%9a%e4%b8%aa%e5%85%ac%e5%bc%8f&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h6&gt;&lt;p&gt;如果有多个公式，在 &lt;code&gt;#+TBLFM:&lt;/code&gt; 的公式一行，通过  &lt;code&gt;::&lt;/code&gt; 将多个公式连接起来，如下：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-org&#34; data-lang=&#34;org&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#b44&#34;&gt;| 年份 | 销售额 | 拼接的文本  |&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#b44&#34;&gt;|------+--------+-------------|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#b44&#34;&gt;| 2020 |    160 | 2020年160万 |&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#b44&#34;&gt;| 2021 |    150 | 2021年150万 |&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#b44&#34;&gt;| 2022 |    175 | 2022年175万 |&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#b44&#34;&gt;| 2023 |    160 | 2023年160万 |&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#b44&#34;&gt;|------+--------+-------------|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#b44&#34;&gt;| 平均 | 161.25 |             |&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#b44&#34;&gt;| 总计 |    645 |             |&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;#+TBLFM&lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;: @&amp;gt;&amp;gt;$2=vmean(@I$2..@II$2)::@&amp;gt;$2=vsum(@I$2..@II$2)::@2$3..@5$3=&amp;#39;(concat $1 &amp;#34;年&amp;#34; $2 &amp;#34;万&amp;#34;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;基本上学会上面这些常用的公式，能解决日常工作的大部分问题了，如果还有别的诉求，可以详细阅读 &lt;a href=&#34;https://orgmode.org/manual/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Org-mode 的官方文档&lt;/a&gt;。&lt;/p&gt;
&lt;h4 id=&#34;列表表格&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;3.2.3&lt;/span&gt; 列表表格 &lt;a href=&#34;#%e5%88%97%e8%a1%a8%e8%a1%a8%e6%a0%bc&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;我们在日常工作中，还会遇到一个诉求，就是更加复杂的表格，例如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;在一个单元格里放一张图片&lt;/li&gt;
&lt;li&gt;在一个单元格里放一些项目符号&lt;/li&gt;
&lt;li&gt;在一个单元格里放多个段落文本&lt;/li&gt;
&lt;li&gt;&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;上述诉求，用常规的 &lt;code&gt;org-table.el&lt;/code&gt; 是无法实现的，此时，我们需要 &lt;a href=&#34;https://github.com/kjambunathan/org-mode-ox-odt&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;org-mode-ox-odt&lt;/a&gt; 这个包的帮助。&lt;/p&gt;
&lt;h5 id=&#34;安装配置&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;3.2.3.1&lt;/span&gt; 安装配置 &lt;a href=&#34;#%e5%ae%89%e8%a3%85%e9%85%8d%e7%bd%ae&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h5&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-emacs-lisp&#34; data-lang=&#34;emacs-lisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#b8860b&#34;&gt;add-to-list&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;&amp;#39;package-archives&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;             &lt;span style=&#34;color:#666&#34;&gt;&amp;#39;&lt;/span&gt;(&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;ox-odt&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;https://kjambunathan.github.io/elpa/&amp;#34;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#a2f&#34;&gt;use-package&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;ox-odt&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a2f&#34;&gt;:ensure&lt;/span&gt; &lt;span style=&#34;color:#800&#34;&gt;t&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a2f&#34;&gt;:after&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;org&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;ox&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;ox-html&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a2f&#34;&gt;:init&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#b8860b&#34;&gt;add-to-list&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#b8860b&#34;&gt;&amp;#39;org-export-filter-parse-tree-functions&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   (&lt;span style=&#34;color:#a2f&#34;&gt;defun&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;org-html--translate-list-tables&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;tree&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;backend&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;info&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     (&lt;span style=&#34;color:#a2f&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;member&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;backend&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;&amp;#39;&lt;/span&gt;(&lt;span style=&#34;color:#b8860b&#34;&gt;html&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;latex&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         (&lt;span style=&#34;color:#b8860b&#34;&gt;org-odt--translate-list-tables&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;tree&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;backend&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;info&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       &lt;span style=&#34;color:#b8860b&#34;&gt;tree&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  )
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h5 id=&#34;如何使用&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;3.2.3.2&lt;/span&gt; 如何使用 &lt;a href=&#34;#%e5%a6%82%e4%bd%95%e4%bd%bf%e7%94%a8&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h5&gt;&lt;p&gt;安装完这个包后，我们就可以通过 &lt;code&gt;list table&lt;/code&gt; （列表表格）来构建复杂的表格了。下面是一个示例：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-org&#34; data-lang=&#34;org&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;#+CAPTION&lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;: 示例列表表格&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;#+NAME&lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;: 示例列表表格&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;#+ATTR_ODT&lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;: :list-table t&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;-
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;- &lt;/span&gt;标题1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;- &lt;/span&gt;标题2
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;- &lt;/span&gt;标题3
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;- &lt;/span&gt;----------------
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;- &lt;/span&gt;2007
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  -
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;- &lt;/span&gt;很好
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;- &lt;/span&gt;非常好
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;- &lt;/span&gt;特别好
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  -
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;- [ ]&lt;/span&gt; 待办1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;- [ ]&lt;/span&gt; 待办2
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;- [ ]&lt;/span&gt; 待办3
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;- &lt;/span&gt;---------------
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  -
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     噼里啪啦第一段话
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     噼里啪啦第二段话
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  -
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     [[&lt;span style=&#34;color:#b44&#34;&gt;https://orgmode.org/resources/img/org-mode-unicorn.svg&lt;/span&gt;]]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  -
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     &lt;span style=&#34;color:#b44&#34;&gt;| 标题1 | 标题2     |&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     &lt;span style=&#34;color:#b44&#34;&gt;|-------+-----------|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     &lt;span style=&#34;color:#b44&#34;&gt;|  2008 | good      |&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     &lt;span style=&#34;color:#b44&#34;&gt;|  2010 | wonderful |&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;然后在我们按下 &lt;code&gt;C-c C-e&lt;/code&gt; 选择 &lt;code&gt;html&lt;/code&gt; 的格式进行导出的时候，可以看到这个复杂表格已经按照我们的预期生成了：&lt;/p&gt;
&lt;figure class=&#34;zoomImage&#34;&gt;&lt;img src=&#34;/ox-hugo/img_20240226_140144.png&#34; width=&#34;500&#34;&gt;
&lt;/figure&gt;

&lt;h2 id=&#34;结语&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;4&lt;/span&gt; 结语 &lt;a href=&#34;#%e7%bb%93%e8%af%ad&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;通过今天的学习，我们了解了在 Emacs/Org-mdoe 内的表格，我们了解到如何在 Org-mode 里处理复杂一点的表格，如何使用公式，如何通过列表表格来生成更加复杂的表格，Org-mode 简直就是纯文本界的 Office！&lt;/p&gt;
&lt;p&gt;这节课的配置文件的快照见：&lt;a href=&#34;https://github.com/wowhxj/emacs-from-scratch/blob/master/config-mirror/emacs-config-l34.org&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;emacs-config-l34.org&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;你也可以在 &lt;a href=&#34;https://github.com/wowhxj/emacs-from-scratch&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;这里&lt;/a&gt; 查看最新的配置文件。&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>面向产品经理的Emacs教程：33. Emacs升级插件</title>
      <link>/posts/%E9%9D%A2%E5%90%91%E4%BA%A7%E5%93%81%E7%BB%8F%E7%90%86%E7%9A%84emacs%E6%95%99%E7%A8%8B33.-emacs%E5%8D%87%E7%BA%A7%E6%8F%92%E4%BB%B6/</link>
      <pubDate>Sun, 04 Feb 2024 10:03:33 +0800</pubDate>
      
      <guid>/posts/%E9%9D%A2%E5%90%91%E4%BA%A7%E5%93%81%E7%BB%8F%E7%90%86%E7%9A%84emacs%E6%95%99%E7%A8%8B33.-emacs%E5%8D%87%E7%BA%A7%E6%8F%92%E4%BB%B6/</guid>
      <description>&lt;div class=&#34;ox-hugo-toc toc has-section-numbers&#34;&gt;
&lt;div class=&#34;heading&#34;&gt;&amp;#30446;&amp;#24405;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class=&#34;section-num&#34;&gt;1&lt;/span&gt; &lt;a href=&#34;#%e8%af%be%e7%a8%8b%e5%9b%9e%e9%a1%be&#34;&gt;课程回顾&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;section-num&#34;&gt;2&lt;/span&gt; &lt;a href=&#34;#%e6%a6%82%e8%bf%b0&#34;&gt;概述&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;section-num&#34;&gt;3&lt;/span&gt; &lt;a href=&#34;#auto-package-update-dot-el-%e6%8f%92%e4%bb%b6&#34;&gt;auto-package-update.el 插件&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;section-num&#34;&gt;4&lt;/span&gt; &lt;a href=&#34;#package-menu-filter-upgradable-%e5%91%bd%e4%bb%a4&#34;&gt;package-menu-filter-upgradable 命令&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;section-num&#34;&gt;5&lt;/span&gt; &lt;a href=&#34;#%e5%88%a0%e9%99%a4-elpa-%e6%96%87%e4%bb%b6%e5%a4%b9%e9%87%8d%e6%96%b0%e5%ae%89%e8%a3%85&#34;&gt;删除 elpa 文件夹重新安装&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class=&#34;section-num&#34;&gt;5.1&lt;/span&gt; &lt;a href=&#34;#%e5%88%a0%e9%99%a4-elpa-%e6%96%87%e4%bb%b6%e5%a4%b9%e5%86%8d%e9%87%8d%e6%96%b0%e5%90%af%e5%8a%a8&#34;&gt;删除 elpa 文件夹再重新启动&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;section-num&#34;&gt;6&lt;/span&gt; &lt;a href=&#34;#%e7%bb%93%e8%af%ad&#34;&gt;结语&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;!--endtoc--&gt;
&lt;h2 id=&#34;课程回顾&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;1&lt;/span&gt; 课程回顾 &lt;a href=&#34;#%e8%af%be%e7%a8%8b%e5%9b%9e%e9%a1%be&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;通过上节课，我们了解了如何通过 Emacs 来管理简历，以后的个人简历只需要修改 Org 文件就可以了，只需要关心内容，不需要关心格式，文本即一切！&lt;/p&gt;
&lt;p&gt;今天我们来学习如何升级 Emacs 的插件，以及如何解决升级过程中出现的问题。&lt;/p&gt;
&lt;h2 id=&#34;概述&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;2&lt;/span&gt; 概述 &lt;a href=&#34;#%e6%a6%82%e8%bf%b0&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Emacs 的各种插件（package）丰富多样，功能越来越强大和完善，对于插件的升级，相信很多人都有一个烦恼：升级了插件，怕之前的配置不兼容了，不升级插件吧，可能新版插件提升了性能，增加了很多新的功能，一个字——纠结！&lt;/p&gt;
&lt;p&gt;因此升级插件和将插件保持在一个稳定的版本，是一个平衡，看自己的需要，以及自己的性格。就我个人而言，我比较倾向于使用较新版的插件，体验新的功能。&lt;/p&gt;
&lt;p&gt;那升级插件，有好几种方式：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;通过 &lt;code&gt;auto-package-update.el&lt;/code&gt; 插件来实现全部插件的定时自动升级&lt;/li&gt;
&lt;li&gt;通过 &lt;code&gt;package-menu-filter-upgradable&lt;/code&gt; 命令手动对某些包升级&lt;/li&gt;
&lt;li&gt;隔一段时间，删除 &lt;code&gt;elpa&lt;/code&gt; 目录，再重新启动 Emacs，Emacs 会自动安装最新版的插件&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;就我个人而言，我倾向于删除 &lt;code&gt;elpa&lt;/code&gt; 目录的方式，简单粗暴。&lt;/p&gt;
&lt;h2 id=&#34;auto-package-update-dot-el-插件&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;3&lt;/span&gt; auto-package-update.el 插件 &lt;a href=&#34;#auto-package-update-dot-el-%e6%8f%92%e4%bb%b6&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;我们可以通过 &lt;a href=&#34;https://github.com/rranelli/auto-package-update.el&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;auto-package-update.el&lt;/a&gt; 插件实现对所有插件的定时全量自动更新。&lt;/p&gt;
&lt;p&gt;我们只需要将如下配置添加到我们的配置文件即可：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-emacs-lisp&#34; data-lang=&#34;emacs-lisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#a2f&#34;&gt;use-package&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;auto-package-update&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a2f&#34;&gt;:ensure&lt;/span&gt; &lt;span style=&#34;color:#800&#34;&gt;t&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a2f&#34;&gt;:hook&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;after-init&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;auto-package-update-maybe&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a2f&#34;&gt;:if&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;not&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;daemonp&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a2f&#34;&gt;:custom&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#b8860b&#34;&gt;auto-package-update-interval&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;30&lt;/span&gt;)              &lt;span style=&#34;color:#080;font-style:italic&#34;&gt;; 每30天检查一次&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#b8860b&#34;&gt;auto-package-update-prompt-before-update&lt;/span&gt; &lt;span style=&#34;color:#800&#34;&gt;t&lt;/span&gt;)   &lt;span style=&#34;color:#080;font-style:italic&#34;&gt;; 升级前提示&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#b8860b&#34;&gt;auto-package-update-delete-old-versions&lt;/span&gt; &lt;span style=&#34;color:#800&#34;&gt;t&lt;/span&gt;)    &lt;span style=&#34;color:#080;font-style:italic&#34;&gt;; 删除旧版本&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#b8860b&#34;&gt;auto-package-update-hide-results&lt;/span&gt; &lt;span style=&#34;color:#800&#34;&gt;t&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;package-menu-filter-upgradable-命令&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;4&lt;/span&gt; package-menu-filter-upgradable 命令 &lt;a href=&#34;#package-menu-filter-upgradable-%e5%91%bd%e4%bb%a4&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;我们通过 &lt;code&gt;list-packages&lt;/code&gt; 界面下，执行 &lt;code&gt;package-menu-filter-upgradable&lt;/code&gt; (&lt;code&gt;/ u&lt;/code&gt;) 命令查看当前哪些包可以升级：&lt;/p&gt;
&lt;p&gt;这张图展示了所有可以升级的包列表：&lt;/p&gt;
&lt;figure class=&#34;zoomImage&#34;&gt;&lt;img src=&#34;/ox-hugo/img_20240202_162750.png&#34; width=&#34;800&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;这张图展示了已经安装了包列表：&lt;/p&gt;
&lt;figure class=&#34;zoomImage&#34;&gt;&lt;img src=&#34;/ox-hugo/img_20240202_162808.png&#34; width=&#34;800&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;此时将光标移动到想要升级的包那一行，按下 &lt;code&gt;i&lt;/code&gt; 键标记要升级的包，按下 &lt;code&gt;x&lt;/code&gt; 执行即可：&lt;/p&gt;
&lt;figure class=&#34;zoomImage&#34;&gt;&lt;img src=&#34;/ox-hugo/gif_20240202_170402.gif&#34; width=&#34;800&#34;&gt;
&lt;/figure&gt;

&lt;h2 id=&#34;删除-elpa-文件夹重新安装&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;5&lt;/span&gt; 删除 elpa 文件夹重新安装 &lt;a href=&#34;#%e5%88%a0%e9%99%a4-elpa-%e6%96%87%e4%bb%b6%e5%a4%b9%e9%87%8d%e6%96%b0%e5%ae%89%e8%a3%85&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;下面我们来学习另外一种更加粗暴的方式，把 &lt;code&gt;.emacs.d&lt;/code&gt; 文件夹下的 &lt;code&gt;elpa&lt;/code&gt; 文件夹（装所有插件的文件夹）全部删除，此时重新启动 Emacs 时，Emacs 会自动下载最新版的插件包。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;自从我开始做这个系列，已经过了接近一年了，很多插件都没更新，现在一口气更新所有的插件，我们尝试解决插件更新后的配置调整问题。&lt;/p&gt;
&lt;p&gt;在实际测试后，发现升级了包后并没有发现冲突，于是我改了下 &lt;code&gt;cape&lt;/code&gt; 这个包的配置，用来进行演示。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;删除-elpa-文件夹再重新启动&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;5.1&lt;/span&gt; 删除 elpa 文件夹再重新启动 &lt;a href=&#34;#%e5%88%a0%e9%99%a4-elpa-%e6%96%87%e4%bb%b6%e5%a4%b9%e5%86%8d%e9%87%8d%e6%96%b0%e5%90%af%e5%8a%a8&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;为了安全，建议不要直接删除，可以使用 &lt;code&gt;mv elpa elpa.bak&lt;/code&gt; 命令将文件夹重命名，这样万一出现意外，我们随时可以恢复。&lt;/p&gt;
&lt;p&gt;我们删除/重命名完 &lt;code&gt;elpa&lt;/code&gt; 文件夹后，再次启动 Emacs，可以看到，Emacs 报了以下的错误：&lt;/p&gt;
&lt;figure class=&#34;zoomImage&#34;&gt;&lt;img src=&#34;/ox-hugo/img_20240204_094628.png&#34; width=&#34;800&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;我们可以看到 &lt;code&gt;cape-super-capf&lt;/code&gt; 这个函数名的定义出了问题，进一步地，我们可以通过在启动 Emacs 的时候添加 &lt;code&gt;--debug-init&lt;/code&gt; 的参数，来获得具体出错的 backtrace 信息。&lt;/p&gt;
&lt;p&gt;知道了这个错误，我们可以查看 &lt;code&gt;cape&lt;/code&gt; 这个包的相关网站（主要是 Github 首页以及相关的 issue），通过搜索，我们看到，这位大神把 &lt;code&gt;cape-super-capf&lt;/code&gt; 这个函数名，改成了 &lt;code&gt;cape-capf-super&lt;/code&gt; ，因此我们要做的就是修改这个变量名，然后重启 Emacs，至此，我们成功修复了该问题：&lt;/p&gt;
&lt;figure class=&#34;zoomImage&#34;&gt;&lt;img src=&#34;/ox-hugo/img_20240204_095321.png&#34; width=&#34;800&#34;&gt;
&lt;/figure&gt;

&lt;h2 id=&#34;结语&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;6&lt;/span&gt; 结语 &lt;a href=&#34;#%e7%bb%93%e8%af%ad&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;通过今天的学习，我们了解了如何升级各种插件包，我们可以通过 &lt;code&gt;--debug-init&lt;/code&gt; 的方法来尝试找到各种启动问题，然后逐个解决。&lt;/p&gt;
&lt;p&gt;这节课的配置文件的快照见：&lt;a href=&#34;https://github.com/wowhxj/emacs-from-scratch/blob/master/config-mirror/emacs-config-l33.org&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;emacs-config-l33.org&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;你也可以在 &lt;a href=&#34;https://github.com/wowhxj/emacs-from-scratch&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;这里&lt;/a&gt; 查看最新的配置文件。&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>面向产品经理的Emacs教程：32. 通过Emacs来管理简历</title>
      <link>/posts/%E9%9D%A2%E5%90%91%E4%BA%A7%E5%93%81%E7%BB%8F%E7%90%86%E7%9A%84emacs%E6%95%99%E7%A8%8B32.-%E9%80%9A%E8%BF%87emacs%E6%9D%A5%E7%AE%A1%E7%90%86%E7%AE%80%E5%8E%86/</link>
      <pubDate>Wed, 31 Jan 2024 13:35:22 +0800</pubDate>
      
      <guid>/posts/%E9%9D%A2%E5%90%91%E4%BA%A7%E5%93%81%E7%BB%8F%E7%90%86%E7%9A%84emacs%E6%95%99%E7%A8%8B32.-%E9%80%9A%E8%BF%87emacs%E6%9D%A5%E7%AE%A1%E7%90%86%E7%AE%80%E5%8E%86/</guid>
      <description>&lt;div class=&#34;ox-hugo-toc toc has-section-numbers&#34;&gt;
&lt;div class=&#34;heading&#34;&gt;&amp;#30446;&amp;#24405;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class=&#34;section-num&#34;&gt;1&lt;/span&gt; &lt;a href=&#34;#%e8%af%be%e7%a8%8b%e5%9b%9e%e9%a1%be&#34;&gt;课程回顾&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;section-num&#34;&gt;2&lt;/span&gt; &lt;a href=&#34;#%e6%a6%82%e8%bf%b0&#34;&gt;概述&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;section-num&#34;&gt;3&lt;/span&gt; &lt;a href=&#34;#%e5%a4%a7%e4%bd%93%e6%80%9d%e8%b7%af&#34;&gt;大体思路&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;section-num&#34;&gt;4&lt;/span&gt; &lt;a href=&#34;#resume%e6%a8%a1%e6%9d%bf&#34;&gt;Resume模板&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;section-num&#34;&gt;5&lt;/span&gt; &lt;a href=&#34;#%e7%bb%93%e8%af%ad&#34;&gt;结语&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;!--endtoc--&gt;
&lt;h2 id=&#34;课程回顾&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;1&lt;/span&gt; 课程回顾 &lt;a href=&#34;#%e8%af%be%e7%a8%8b%e5%9b%9e%e9%a1%be&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;通过上节课，我们了解了如何通过 Emacs 看视频，写视频笔记，这在后疫情时代，对听网课，梳理自己的知识体系非常有帮助。&lt;/p&gt;
&lt;p&gt;今天我们来学习如何通过 Emacs 来管理简历。&lt;/p&gt;
&lt;h2 id=&#34;概述&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;2&lt;/span&gt; 概述 &lt;a href=&#34;#%e6%a6%82%e8%bf%b0&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;以前我的简历是这样的，通过一个 Word 文档来管理自己的简历：&lt;/p&gt;
&lt;figure class=&#34;zoomImage&#34;&gt;&lt;img src=&#34;/ox-hugo/img_20240119_162219.png&#34; width=&#34;200&#34;&gt;
&lt;/figure&gt;

&lt;figure class=&#34;zoomImage&#34;&gt;&lt;img src=&#34;/ox-hugo/img_20240119_162355.png&#34; width=&#34;600&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;但是 Word 文档的麻烦，需要花很多时间去调整格式，对于我一个习惯了 Org-mode，坚信内容为上的人来说，简直无法忍受，我们为什么不通过 Emacs 和 Org-mode 来管理自己的简历呢？&lt;/p&gt;
&lt;p&gt;这节课，我们将学习如何通过 Emacs 的 Org-mode 来管理自己的简历。&lt;/p&gt;
&lt;h2 id=&#34;大体思路&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;3&lt;/span&gt; 大体思路 &lt;a href=&#34;#%e5%a4%a7%e4%bd%93%e6%80%9d%e8%b7%af&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;中间陆陆续续试过一些包，总体试用感觉比较麻烦，不太简约，最终还是选定了 Org-mode 转成 Latex PDF 的方式来实现简历的管理。&lt;/p&gt;
&lt;p&gt;这个方式整体思路是，我们通过创建一个 Org 格式的简历模板，针对不同的人，或者不同的阶段，只需要对其中的内容进行替换就可以了。&lt;/p&gt;
&lt;h2 id=&#34;resume模板&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;4&lt;/span&gt; Resume模板 &lt;a href=&#34;#resume%e6%a8%a1%e6%9d%bf&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-org&#34; data-lang=&#34;org&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;#+TITLE&lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;: Randolph的简历&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;#+OPTIONS&lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;: toc:nil H:10 tex:t author:nil date:nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;#+STARTUP&lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;: hidestars indent&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;#+LaTex_CLASS&lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;: article&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;#+LaTeX_CLASS_OPTIONS&lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;: [letterpaper]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;#+LaTeX_HEADER&lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;: \usepackage{/Users/randolph/org/template/resume/resume}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;#+LATEX_HEADER&lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;: \usepackage[explicit]{titlesec}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;#+LATEX_HEADER&lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;: \usepackage[left=0.4in,right=0.5in,top=0.5in,bottom=0.5in]{geometry}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;#+LATEX_HEADER&lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;: \pagenumbering{gobble} % remove page number&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;#+LaTeX_HEADER&lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;: \usepackage{tabularx}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;#+LaTeX_HEADER&lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;: \hypersetup{colorlinks=true, urlcolor={url-blue}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;#+LaTeX_HEADER&lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;: \usepackage{enumitem}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;#+LaTeX_HEADER&lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;: \setlist{leftmargin=0.25in,nosep}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;#+LATEX_HEADER&lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;: \usepackage{xeCJK,fontspec,xunicode,xltxtra}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;#+LATEX_HEADER&lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;: \setCJKmainfont{Microsoft YaHei}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;#+LATEX_HEADER&lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;: \setCJKmonofont{Microsoft YaHei}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;#+LATEX_HEADER&lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;: \setCJKfamilyfont{Microsoft YaHei}{Microsoft YaHei}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;#+LATEX_HEADER&lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;: \setmainfont{Microsoft YaHei}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;#+LATEX_HEADER&lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;: \setmonofont{Source Code Pro}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;#+LATEX_HEADER&lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;: \usepackage{setspace}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;#+LATEX_HEADER&lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;: \onehalfspacing&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;#+BEGIN_CENTER&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;| 手机：(+86) 1860xxxxxxxx | 邮箱：[[mailto:xxxxxxx@gmail.com][xxxxxx@gmail.com]] |
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;#+END_CENTER&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000080;font-weight:bold&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt; 自我评价&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;- &lt;/span&gt;走在人工智能人机交互领域应用@@latex:{\color{red}@@ *创新* @@latex:}@@最前端
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;- &lt;/span&gt;一个有技术背景、有商业洞察力、能力@@latex:{\color{red}@@ *综合* @@latex:}@@的产品经理
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;- &lt;/span&gt;富有 @@latex:{\color{red}@@ &lt;span style=&#34;font-weight:bold&#34;&gt;*好奇心和激情*&lt;/span&gt; @@latex:}@@
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000080;font-weight:bold&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt; 工作经历&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#800080;font-weight:bold&#34;&gt;**&lt;/span&gt; xx集团 ｜ AI研究院 ｜ 资深产品经理
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#800080;font-weight:bold&#34;&gt;***&lt;/span&gt; 2020.11 至今
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;- &lt;/span&gt;带领团队从 0 开始负责xxxx的工作。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a00000&#34;&gt;+ xxxx；
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a00000&#34;&gt;  +&lt;/span&gt; xxxx；
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;\smallskip
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;- &lt;/span&gt;赋能集团xxxx。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a00000&#34;&gt;+ xxxx *加粗* xxxx；
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a00000&#34;&gt;  +&lt;/span&gt; xxxx；
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#800080;font-weight:bold&#34;&gt;**&lt;/span&gt; xxx ｜ AI产品经理
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#800080;font-weight:bold&#34;&gt;***&lt;/span&gt; 2020.9 - 2020.11
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;- &lt;/span&gt;负责xxx。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000080;font-weight:bold&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt; 教育经历&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#800080;font-weight:bold&#34;&gt;**&lt;/span&gt; xxx大学
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#800080;font-weight:bold&#34;&gt;***&lt;/span&gt; 2006 - 2008
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;生物信息技术，硕士，xxxxxx
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#800080;font-weight:bold&#34;&gt;**&lt;/span&gt; xxx 大学
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#800080;font-weight:bold&#34;&gt;***&lt;/span&gt; 2002 - 2006
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;生物信息技术，本科
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000080;font-weight:bold&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt; 语言及技能&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;- &lt;/span&gt;CET-6，熟练的英语读写听说能力
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;- &lt;/span&gt;有研发、服务、产品等技术背景
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;- &lt;/span&gt;有带领团队经验
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;- &lt;/span&gt;有销售经验和市场洞察力
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;- &lt;/span&gt;有人工智能、大模型、知识图谱、NLP、互联网等领域经验
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;- &lt;/span&gt;有良好的沟通表达能力
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;- &lt;/span&gt;富有好奇心和激情
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;根据这个模板内容，通过 &lt;code&gt;C-c C-e l o&lt;/code&gt; (&lt;code&gt;org-latex-export-to-pdf&lt;/code&gt;) 转换成 PDF 文件，大致格式如下：&lt;/p&gt;
&lt;figure class=&#34;zoomImage&#34;&gt;&lt;img src=&#34;/ox-hugo/img_20240131_134908.png&#34; width=&#34;600&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;整个模板分为以下几个部分：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;自我评价&lt;/li&gt;
&lt;li&gt;工作经历&lt;/li&gt;
&lt;li&gt;教育经历&lt;/li&gt;
&lt;li&gt;语言及技能&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;verse&#34;&gt;
&lt;p&gt;注：&lt;br&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;我们可以使用 Org-mode 自带的粗体格式来加粗&lt;br&gt;&lt;/li&gt;
&lt;li&gt;我们可以使用 &lt;code&gt;@@latex:{\color{red}@@ 需要变成红色的文字 @@latex:}@@&lt;/code&gt; 包裹让字的颜色变化&lt;br&gt;&lt;/li&gt;
&lt;li&gt;我们可以通过 &lt;code&gt;\smallskip&lt;/code&gt; 让某些段落之间增加距离&lt;br&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;p&gt;自此，我们就可以套用这个模板来管理我们的简历，我们只需要关注内容，而不需要去管格式和排版了，愉快！&lt;/p&gt;
&lt;h2 id=&#34;结语&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;5&lt;/span&gt; 结语 &lt;a href=&#34;#%e7%bb%93%e8%af%ad&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;通过今天的学习，我们了解了如何在 Emacs 里通过 Org-mode 和 Latex 来管理简历，这节课没有配置上的变化，我把这个模板放到 Github 上，大家各取所需。&lt;/p&gt;
&lt;p&gt;这节课的模板文件的见：&lt;a href=&#34;https://github.com/wowhxj/emacs-from-scratch/blob/master/config-mirror/resume-template.org&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;resume-template.org&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;你也可以在 &lt;a href=&#34;https://github.com/wowhxj/emacs-from-scratch&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;这里&lt;/a&gt; 查看最新的配置文件。&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>面向产品经理的Emacs教程：31. 通过Emacs来看视频</title>
      <link>/posts/%E9%9D%A2%E5%90%91%E4%BA%A7%E5%93%81%E7%BB%8F%E7%90%86%E7%9A%84emacs%E6%95%99%E7%A8%8B31.-%E9%80%9A%E8%BF%87emacs%E6%9D%A5%E7%9C%8B%E8%A7%86%E9%A2%91/</link>
      <pubDate>Fri, 19 Jan 2024 15:35:22 +0800</pubDate>
      
      <guid>/posts/%E9%9D%A2%E5%90%91%E4%BA%A7%E5%93%81%E7%BB%8F%E7%90%86%E7%9A%84emacs%E6%95%99%E7%A8%8B31.-%E9%80%9A%E8%BF%87emacs%E6%9D%A5%E7%9C%8B%E8%A7%86%E9%A2%91/</guid>
      <description>&lt;div class=&#34;ox-hugo-toc toc has-section-numbers&#34;&gt;
&lt;div class=&#34;heading&#34;&gt;&amp;#30446;&amp;#24405;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class=&#34;section-num&#34;&gt;1&lt;/span&gt; &lt;a href=&#34;#%e8%af%be%e7%a8%8b%e5%9b%9e%e9%a1%be&#34;&gt;课程回顾&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;section-num&#34;&gt;2&lt;/span&gt; &lt;a href=&#34;#%e6%a6%82%e8%bf%b0&#34;&gt;概述&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;section-num&#34;&gt;3&lt;/span&gt; &lt;a href=&#34;#mpvi&#34;&gt;mpvi&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class=&#34;section-num&#34;&gt;3.1&lt;/span&gt; &lt;a href=&#34;#mpvi-%e5%ae%89%e8%a3%85&#34;&gt;mpvi 安装&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;section-num&#34;&gt;3.2&lt;/span&gt; &lt;a href=&#34;#%e5%a6%82%e4%bd%95%e4%bd%bf%e7%94%a8&#34;&gt;如何使用&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;section-num&#34;&gt;4&lt;/span&gt; &lt;a href=&#34;#%e7%bb%93%e8%af%ad&#34;&gt;结语&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;!--endtoc--&gt;
&lt;h2 id=&#34;课程回顾&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;1&lt;/span&gt; 课程回顾 &lt;a href=&#34;#%e8%af%be%e7%a8%8b%e5%9b%9e%e9%a1%be&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;通过上节课，我们了解了如何在 Emacs 里使用浏览器，我们可以通过 EWW 来浏览一些文字型的网页，并且达到一个非常好的去广告效果，我们可以通过强大的 EAF 在 Emacs 里使用真正的 Chromium 浏览器，非常强大。&lt;/p&gt;
&lt;p&gt;今天我们来学习如何通过 Emacs 来看视频。&lt;/p&gt;
&lt;h2 id=&#34;概述&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;2&lt;/span&gt; 概述 &lt;a href=&#34;#%e6%a6%82%e8%bf%b0&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;肯定有同学会纳闷，看视频就是看视频，为什么要通过 Emacs 来看视频，有什么好处？为什么看个视频还要搞的这么麻烦？&lt;/p&gt;
&lt;p&gt;你是否曾经遇到这样的场景呢？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;你正在看一个教学视频&lt;/li&gt;
&lt;li&gt;边看视频边做笔记（电子笔记）&lt;/li&gt;
&lt;li&gt;时不时需要截屏&lt;/li&gt;
&lt;li&gt;还要能让自己做的笔记和视频的时间戳对应上&lt;/li&gt;
&lt;li&gt;&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;而要实现上面的场景，我们完全可以通过 Emacs 来做到，通过 Emacs 的 Org mode 来记笔记，通过我们今天要介绍的 &lt;code&gt;mpvi&lt;/code&gt; 来实现上述功能。&lt;/p&gt;
&lt;h2 id=&#34;mpvi&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;3&lt;/span&gt; mpvi &lt;a href=&#34;#mpvi&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;a href=&#34;https://github.com/lorniu/mpvi&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;mpvi&lt;/a&gt; 插件可以让 Emacs 来控制 mpv 视频播放，并与 Org-mode 结合起来。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;mpvi 插件是 &lt;a href=&#34;https://emacs-china.org&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;emacs-china&lt;/a&gt; 论坛的一位道友开发的，之前名字叫 &lt;code&gt;org-mpvi&lt;/code&gt; ，经过改版后，非常好用了。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;mpvi-安装&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;3.1&lt;/span&gt; mpvi 安装 &lt;a href=&#34;#mpvi-%e5%ae%89%e8%a3%85&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h3&gt;&lt;h4 id=&#34;依赖&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;3.1.1&lt;/span&gt; 依赖 &lt;a href=&#34;#%e4%be%9d%e8%b5%96&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;我们先安装相关的依赖，其中 &lt;code&gt;mpv&lt;/code&gt; 是播放器， &lt;code&gt;yt-dlp&lt;/code&gt; 是看网络视频的， &lt;code&gt;ffmpeg&lt;/code&gt; 用来做视频剪辑操作的， &lt;code&gt;tesseract&lt;/code&gt; 用来识别文字：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;brew install mpv yt-dlp ffmpeg tesseract
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;我不需要弹幕，也不看直播，所以没有安装 &lt;code&gt;danmaku2ass&lt;/code&gt; 和 &lt;code&gt;seam&lt;/code&gt; ，需要的朋友自行安装。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 id=&#34;安装-mpvi-插件&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;3.1.2&lt;/span&gt; 安装 mpvi 插件 &lt;a href=&#34;#%e5%ae%89%e8%a3%85-mpvi-%e6%8f%92%e4%bb%b6&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h4&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-emacs-lisp&#34; data-lang=&#34;emacs-lisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#a2f&#34;&gt;use-package&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;mpvi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a2f&#34;&gt;:ensure&lt;/span&gt; &lt;span style=&#34;color:#800&#34;&gt;t&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a2f&#34;&gt;:commands&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;mpvi-open&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;mpvi-seek&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;mpvi-insert&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a2f&#34;&gt;:bind&lt;/span&gt; ((&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;C-c v o&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;mpvi-open&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         (&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;C-c v s&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;mpvi-seek&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         &lt;span style=&#34;color:#a2f&#34;&gt;:map&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;mpvi-seek-map&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              (&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;C-i&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;my/mpvi-seeking-capture-as-screenshot&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a2f&#34;&gt;:config&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#080;font-style:italic&#34;&gt;;; 如果不设置这个值，会提示ipc的错误需要你update mpv&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#a2f&#34;&gt;setq&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;emms-player-mpv-ipc-method&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;&amp;#39;ipc-server&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#080;font-style:italic&#34;&gt;;; 通过这个函数来对视频截图，我不喜欢使用attach的方式&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#a2f&#34;&gt;defun&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;my/mpvi-seeking-capture-as-screenshot&lt;/span&gt; ()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;Capture current video screenshot and insert as a link.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#a2f&#34;&gt;interactive&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#a2f&#34;&gt;with-current-buffer&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;window-buffer&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;minibuffer-selected-window&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (&lt;span style=&#34;color:#a2f&#34;&gt;unless&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;derived-mode-p&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;&amp;#39;org-mode&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        (&lt;span style=&#34;color:#d2413a;font-weight:bold&#34;&gt;user-error&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;This is not org-mode, should not insert org link&amp;#34;&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#a2f&#34;&gt;with-current-buffer&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;window-buffer&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;minibuffer-selected-window&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (&lt;span style=&#34;color:#a2f&#34;&gt;when&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;mpvi-parse-link-at-point&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        (&lt;span style=&#34;color:#00a000&#34;&gt;end-of-line&lt;/span&gt;) (&lt;span style=&#34;color:#00a000&#34;&gt;insert&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;\n&amp;#34;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (&lt;span style=&#34;color:#a2f&#34;&gt;let&lt;/span&gt; ((&lt;span style=&#34;color:#b8860b&#34;&gt;foldername&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;concat&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;file-name-base&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;buffer-file-name&lt;/span&gt;)) &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;.assets/&amp;#34;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            (&lt;span style=&#34;color:#b8860b&#34;&gt;imgName&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;concat&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;img_&amp;#34;&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;format-time-string&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;%Y%m%d_%H%M%S&amp;#34;&lt;/span&gt;) &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;.png&amp;#34;&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        (&lt;span style=&#34;color:#a2f&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;not&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;file-exists-p&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;foldername&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            (&lt;span style=&#34;color:#b8860b&#34;&gt;mkdir&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;foldername&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        (&lt;span style=&#34;color:#a2f&#34;&gt;let&lt;/span&gt; ((&lt;span style=&#34;color:#b8860b&#34;&gt;imgPath&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;concat&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;foldername&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;imgName&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              (&lt;span style=&#34;color:#b8860b&#34;&gt;relativeFilename&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;concat&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;file-name-base&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;buffer-name&lt;/span&gt;)) &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;.assets/&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;imgName&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          (&lt;span style=&#34;color:#b8860b&#34;&gt;mpvi-screenshot-current-playing&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;imgPath&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;video&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          (&lt;span style=&#34;color:#00a000&#34;&gt;insert&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;concat&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;#+DOWNLOADED: screenshot @ &amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                          (&lt;span style=&#34;color:#00a000&#34;&gt;format-time-string&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;%Y-%m-%d %a %H:%M:%S&amp;#34;&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;current-time&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                          &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;\n#+CAPTION: \n#+ATTR_ORG: :width 600&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                          &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;\n#+ATTR_LATEX: :width 1.0\\linewidth :float nil\n&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                          &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;#+ATTR_HTML: :width 600&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                          &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34; :class zoomImage\n[[file:&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;relativeFilename&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;]]&amp;#34;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          ))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (&lt;span style=&#34;color:#b8860b&#34;&gt;org-redisplay-inline-images&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#a2f&#34;&gt;throw&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;&amp;#39;mpvi-seek&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;Capture and insert done.&amp;#34;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  )
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;其依赖的 &lt;code&gt;emms&lt;/code&gt; 包会自动下载安装。&lt;/li&gt;
&lt;li&gt;我修改了默认的在 &lt;code&gt;mpvi-seek&lt;/code&gt; 界面下的快捷键 &lt;code&gt;C-i&lt;/code&gt; ，绑定到了我自己喜欢的截图方式。&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;如何使用&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;3.2&lt;/span&gt; 如何使用 &lt;a href=&#34;#%e5%a6%82%e4%bd%95%e4%bd%bf%e7%94%a8&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h3&gt;&lt;h4 id=&#34;打开视频&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;3.2.1&lt;/span&gt; 打开视频 &lt;a href=&#34;#%e6%89%93%e5%bc%80%e8%a7%86%e9%a2%91&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;通过 &lt;code&gt;C-c v o&lt;/code&gt; 打开一个视频文件，此时会自动调用 mpv 软件来播放这个视频。&lt;/p&gt;
&lt;figure class=&#34;zoomImage&#34;&gt;&lt;img src=&#34;/ox-hugo/img_20240119_094803.png&#34; width=&#34;800&#34;&gt;
&lt;/figure&gt;

&lt;h4 id=&#34;视频播放控制&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;3.2.2&lt;/span&gt; 视频播放控制 &lt;a href=&#34;#%e8%a7%86%e9%a2%91%e6%92%ad%e6%94%be%e6%8e%a7%e5%88%b6&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;视频播放控制，最重要的命令是 &lt;code&gt;mpvi-seek&lt;/code&gt; ，我绑定到了 &lt;code&gt;C-c v s&lt;/code&gt; 快捷键上，按下后，在迷你缓冲区里会展示当前视频的相关信息，如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;当前时间戳&lt;/li&gt;
&lt;li&gt;总时长&lt;/li&gt;
&lt;li&gt;播放进度&lt;/li&gt;
&lt;li&gt;当前播放状态&lt;/li&gt;
&lt;li&gt;播放速度&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&#34;zoomImage&#34;&gt;&lt;img src=&#34;/ox-hugo/img_20240119_095005.png&#34; width=&#34;800&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;我们可以在迷你缓冲区通过 &lt;code&gt;SPC&lt;/code&gt; （空格键）开控制视频的播放与暂停，通过 &lt;code&gt;j, k&lt;/code&gt; 控制播放速度，通过 &lt;code&gt;n, p&lt;/code&gt; 控制播放进度，通过 &lt;code&gt;C-i&lt;/code&gt; 来将当前视频画面截图并插入到Org文档里（这个快捷键绑定的是我重新的函数，具体看上面的配置），其他的操控命令和快捷键如下：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;快捷键&lt;/th&gt;
					&lt;th&gt;说明&lt;/th&gt;
					&lt;th&gt;条件&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;, ,&lt;/td&gt;
					&lt;td&gt;播放链接&lt;/td&gt;
					&lt;td&gt;光标在视频链接上的时候&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;, s&lt;/td&gt;
					&lt;td&gt;进入到 mpvi-seek 界面&lt;/td&gt;
					&lt;td&gt;光标在视频链接上的时候&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;, a&lt;/td&gt;
					&lt;td&gt;更改视频开始时间&lt;/td&gt;
					&lt;td&gt;光标在视频链接上的时候&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;, b&lt;/td&gt;
					&lt;td&gt;更改视频结束时间&lt;/td&gt;
					&lt;td&gt;光标在视频链接上的时候&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;, v&lt;/td&gt;
					&lt;td&gt;预览视频时间戳位置的画面&lt;/td&gt;
					&lt;td&gt;光标在视频链接上的时候&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;, c&lt;/td&gt;
					&lt;td&gt;视频下载转码截取等&lt;/td&gt;
					&lt;td&gt;光标在视频链接上的时候&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;i&lt;/td&gt;
					&lt;td&gt;在buffer中插入时间戳链接&lt;/td&gt;
					&lt;td&gt;光标在 mpvi-seek 迷你缓冲区界面&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;SPACE&lt;/td&gt;
					&lt;td&gt;暂停与播放&lt;/td&gt;
					&lt;td&gt;光标在 mpvi-seek 迷你缓冲区界面&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;C-i&lt;/td&gt;
					&lt;td&gt;插入当前视频截图&lt;/td&gt;
					&lt;td&gt;光标在 mpvi-seek 迷你缓冲区界面&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;j/k/l&lt;/td&gt;
					&lt;td&gt;调整播放速度&lt;/td&gt;
					&lt;td&gt;光标在 mpvi-seek 迷你缓冲区界面&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;n/p/N/P/M-n/M-p/C-l&lt;/td&gt;
					&lt;td&gt;调整播放进度&lt;/td&gt;
					&lt;td&gt;光标在 mpvi-seek 迷你缓冲区界面&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;r/C-r&lt;/td&gt;
					&lt;td&gt;对当前播放页面进行OCR识别并复制结果&lt;/td&gt;
					&lt;td&gt;光标在 mpvi-seek 迷你缓冲区界面&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;t/C-t&lt;/td&gt;
					&lt;td&gt;复制当前页面的字幕&lt;/td&gt;
					&lt;td&gt;光标在 mpvi-seek 迷你缓冲区界面&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;v/C-v&lt;/td&gt;
					&lt;td&gt;切换网络视频 playlist 里的视频&lt;/td&gt;
					&lt;td&gt;光标在 mpvi-seek 迷你缓冲区界面&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;o/C-o&lt;/td&gt;
					&lt;td&gt;切换到默认程序打开当前视频&lt;/td&gt;
					&lt;td&gt;光标在 mpvi-seek 迷你缓冲区界面&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;q/C-q&lt;/td&gt;
					&lt;td&gt;退出 minibuffer&lt;/td&gt;
					&lt;td&gt;光标在 mpvi-seek 迷你缓冲区界面&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id=&#34;在org文档里记视频笔记&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;3.2.3&lt;/span&gt; 在Org文档里记视频笔记 &lt;a href=&#34;#%e5%9c%a8org%e6%96%87%e6%a1%a3%e9%87%8c%e8%ae%b0%e8%a7%86%e9%a2%91%e7%ac%94%e8%ae%b0&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;code&gt;mpvi&lt;/code&gt; 除了能很方便的通过快捷键来进行播放控制外，还有一个非常棒的作用，就是一边看视频，一边做笔记。我们可以在 &lt;code&gt;mpvi-seek&lt;/code&gt; 时按下 &lt;code&gt;i&lt;/code&gt; 键插入当前视频的链接：&lt;/p&gt;
&lt;figure class=&#34;zoomImage&#34;&gt;&lt;img src=&#34;/ox-hugo/img_20240119_100057.png&#34; width=&#34;800&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;这个链接的展开形式如下：&lt;/p&gt;
&lt;figure class=&#34;zoomImage&#34;&gt;&lt;img src=&#34;/ox-hugo/img_20240119_100151.png&#34; width=&#34;800&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;我们可以把这个链接当作一个 Org-link 来对待，比如使用 &lt;code&gt;C-c C-o&lt;/code&gt; 打开这个视频，并跳转到该时间戳。&lt;/p&gt;
&lt;p&gt;当我们发现在视频的某一个画面非常好，需要截图插入到 Org 文档中，我们可以使用 &lt;code&gt;C-i&lt;/code&gt; 来插入当前视频画面，非常方便：&lt;/p&gt;
&lt;figure class=&#34;zoomImage&#34;&gt;&lt;img src=&#34;/ox-hugo/img_20240119_100458.png&#34; width=&#34;800&#34;&gt;
&lt;/figure&gt;

&lt;h2 id=&#34;结语&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;4&lt;/span&gt; 结语 &lt;a href=&#34;#%e7%bb%93%e8%af%ad&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;通过今天的学习，我们了解了如何在 Emacs 里通过 &lt;code&gt;mpvi&lt;/code&gt; 插件来看视频，并且与 Org-mode 结合，非常方便的来记视频笔记。&lt;/p&gt;
&lt;p&gt;这节课的配置文件的快照见：&lt;a href=&#34;https://github.com/wowhxj/emacs-from-scratch/blob/master/config-mirror/emacs-config-l31.org&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;emacs-config-l31.org&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;你也可以在 &lt;a href=&#34;https://github.com/wowhxj/emacs-from-scratch&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;这里&lt;/a&gt; 查看最新的配置文件。&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>面向产品经理的Emacs教程：30. 在Emacs里使用浏览器</title>
      <link>/posts/%E9%9D%A2%E5%90%91%E4%BA%A7%E5%93%81%E7%BB%8F%E7%90%86%E7%9A%84emacs%E6%95%99%E7%A8%8B30.-%E5%9C%A8emacs%E9%87%8C%E4%BD%BF%E7%94%A8%E6%B5%8F%E8%A7%88%E5%99%A8/</link>
      <pubDate>Fri, 05 May 2023 09:12:47 +0800</pubDate>
      
      <guid>/posts/%E9%9D%A2%E5%90%91%E4%BA%A7%E5%93%81%E7%BB%8F%E7%90%86%E7%9A%84emacs%E6%95%99%E7%A8%8B30.-%E5%9C%A8emacs%E9%87%8C%E4%BD%BF%E7%94%A8%E6%B5%8F%E8%A7%88%E5%99%A8/</guid>
      <description>&lt;div class=&#34;ox-hugo-toc toc has-section-numbers&#34;&gt;
&lt;div class=&#34;heading&#34;&gt;&amp;#30446;&amp;#24405;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class=&#34;section-num&#34;&gt;1&lt;/span&gt; &lt;a href=&#34;#%e8%af%be%e7%a8%8b%e5%9b%9e%e9%a1%be&#34;&gt;课程回顾&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;section-num&#34;&gt;2&lt;/span&gt; &lt;a href=&#34;#%e6%a6%82%e8%bf%b0&#34;&gt;概述&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;section-num&#34;&gt;3&lt;/span&gt; &lt;a href=&#34;#eww&#34;&gt;EWW&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class=&#34;section-num&#34;&gt;3.1&lt;/span&gt; &lt;a href=&#34;#%e5%85%b3%e4%ba%8e%e5%9b%be%e7%89%87%e6%98%be%e7%a4%ba&#34;&gt;关于图片显示&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;section-num&#34;&gt;3.2&lt;/span&gt; &lt;a href=&#34;#%e5%85%b3%e4%ba%8e%e5%bf%ab%e6%8d%b7%e9%94%ae&#34;&gt;关于快捷键&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;section-num&#34;&gt;3.3&lt;/span&gt; &lt;a href=&#34;#%e4%b9%a6%e7%ad%be&#34;&gt;书签&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;section-num&#34;&gt;4&lt;/span&gt; &lt;a href=&#34;#eaf&#34;&gt;EAF&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class=&#34;section-num&#34;&gt;4.1&lt;/span&gt; &lt;a href=&#34;#%e5%ae%89%e8%a3%85-eaf&#34;&gt;安装 EAF&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;section-num&#34;&gt;4.2&lt;/span&gt; &lt;a href=&#34;#%e9%85%8d%e7%bd%ae-eaf&#34;&gt;配置 EAF&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;section-num&#34;&gt;4.3&lt;/span&gt; &lt;a href=&#34;#%e4%bd%bf%e7%94%a8-eaf&#34;&gt;使用 EAF&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;section-num&#34;&gt;5&lt;/span&gt; &lt;a href=&#34;#xwidget&#34;&gt;xwidget&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;section-num&#34;&gt;6&lt;/span&gt; &lt;a href=&#34;#%e7%bb%93%e8%af%ad&#34;&gt;结语&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;!--endtoc--&gt;
&lt;h2 id=&#34;课程回顾&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;1&lt;/span&gt; 课程回顾 &lt;a href=&#34;#%e8%af%be%e7%a8%8b%e5%9b%9e%e9%a1%be&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;上节课，我们学习了如何在 Emacs 里通过 &lt;code&gt;calibredb.el&lt;/code&gt; 插件看书，通过 Emacs 强大的书签和文本搜索能力、强大的编辑能力，使我们看书做笔记的效率大大提升。&lt;/p&gt;
&lt;p&gt;今天我们学习如何在 Emacs 里使用浏览器。&lt;/p&gt;
&lt;h2 id=&#34;概述&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;2&lt;/span&gt; 概述 &lt;a href=&#34;#%e6%a6%82%e8%bf%b0&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;我一直秉承一个观点，Emacs 是一个非常棒的软件，如果能在 Emacs 里实现、并且实现的还不错的任务，如记笔记、写博客、写文档、编程等嗯，尽可能的考虑 All-in-one，但是并非所有的场景都适合用 Emacs 来解决，比如浏览器，尽管 Emacs 里有强大的 EAF，有传统的 EWW，有 xwidget，但独立的浏览器的体验还是更好一些，你可以安装各式各样的扩展，可以安装各种油猴脚本，可以实现各种各样的需求。&lt;/p&gt;
&lt;p&gt;那 Emacs 里的浏览器就没有作用了吗？当然不是，至少 EWW 就可以做为一个非常好的看纯文本网站内容的好工具（至少去广告这一点做的太好了）。&lt;/p&gt;
&lt;p&gt;当然也一定有不同观点的人，他们希望尽可能的 All-in-one，因此，今天会简单说一说在 Emacs 里使用浏览器。&lt;/p&gt;
&lt;h2 id=&#34;eww&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;3&lt;/span&gt; EWW &lt;a href=&#34;#eww&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;a href=&#34;https://www.gnu.org/software/emacs/manual/html_mono/eww.html&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;EWW (GNU Emacs Web Wowser)&lt;/a&gt; 是 Emacs 自带的浏览器，虽然有些年头了，但界面清爽简洁，特别适合终端或者希望专注在文字上的场景（例如看技术文档，看小说😄等），在 Emacs 里打开 EWW 非常简单，直接执行 &lt;code&gt;M-x eww&lt;/code&gt; ，然后他会让你输入网址，例如 &lt;code&gt;www.baidu.com&lt;/code&gt; ，结果如下：&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;/ox-hugo/img_20230505_134357.png&#34; width=&#34;800&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;我们可以找一个文字比较多的网站，例如 EWW 的官方文档，可以看到，整个界面非常简洁：&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;/ox-hugo/img_20230505_134942.png&#34; width=&#34;800&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;下面，我们介绍如何对 EWW 进行改造，使它更加符合我们的使用场景和习惯。&lt;/p&gt;
&lt;h3 id=&#34;关于图片显示&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;3.1&lt;/span&gt; 关于图片显示 &lt;a href=&#34;#%e5%85%b3%e4%ba%8e%e5%9b%be%e7%89%87%e6%98%be%e7%a4%ba&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;就我个人而言，我更倾向于使用 EWW 浏览文字型的网站，因此，我并不希望它显示图片，此时我们可以通过下面的配置来完成：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-emacs-lisp&#34; data-lang=&#34;emacs-lisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#a2f&#34;&gt;use-package&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;shr&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a2f&#34;&gt;:ensure&lt;/span&gt; &lt;span style=&#34;color:#800&#34;&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a2f&#34;&gt;:defer&lt;/span&gt; &lt;span style=&#34;color:#800&#34;&gt;t&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a2f&#34;&gt;:custom&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#b8860b&#34;&gt;shr-inhibit-images&lt;/span&gt; &lt;span style=&#34;color:#800&#34;&gt;t&lt;/span&gt;)                &lt;span style=&#34;color:#080;font-style:italic&#34;&gt;; 不显示图片&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#b8860b&#34;&gt;shr-image-animate&lt;/span&gt; &lt;span style=&#34;color:#800&#34;&gt;nil&lt;/span&gt;)               &lt;span style=&#34;color:#080;font-style:italic&#34;&gt;; 不显示 gif&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  )
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这样，我们就将所有图片禁止显示，所有图片的位置会以一个 &lt;code&gt;*&lt;/code&gt; 来替换：&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;/ox-hugo/img_20230505_152049.png&#34; width=&#34;800&#34;&gt;
&lt;/figure&gt;

&lt;h3 id=&#34;关于快捷键&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;3.2&lt;/span&gt; 关于快捷键 &lt;a href=&#34;#%e5%85%b3%e4%ba%8e%e5%bf%ab%e6%8d%b7%e9%94%ae&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;在 &lt;code&gt;EWW&lt;/code&gt;  界面按下 &lt;code&gt;?&lt;/code&gt; 后，可以看到所有的快捷键：&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;/ox-hugo/img_20230505_152156.png&#34; width=&#34;800&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;我们可以通过下面的方式来将快捷键定制成自己喜欢的，例如改成我个人习惯使用 &lt;code&gt;Surfingkeys&lt;/code&gt; 插件的快捷键：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-emacs-lisp&#34; data-lang=&#34;emacs-lisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#a2f&#34;&gt;use-package&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;eww&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a2f&#34;&gt;:ensure&lt;/span&gt; &lt;span style=&#34;color:#800&#34;&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a2f&#34;&gt;:commands&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;eww&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;eww-follow-link&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a2f&#34;&gt;:hook&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;eww-mode&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;visual-line-mode&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a2f&#34;&gt;:bind&lt;/span&gt; ((&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;\e\e w&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;eww&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         &lt;span style=&#34;color:#a2f&#34;&gt;:map&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;eww-mode-map&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         (&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;o&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;eww-browse-with-external-browser&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         (&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;D&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;eww-forward-url&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         (&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;S&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;eww-back-url&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         (&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;f&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;link-hint-open-link&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         (&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;TAB&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;shr-next-link&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         (&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;&amp;lt;backtab&amp;gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;shr-previous-link&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         (&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;j&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;scroll-up-line&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         (&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;k&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;scroll-down-line&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         )
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a2f&#34;&gt;:config&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#a2f&#34;&gt;setq&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;eww-download-directory&lt;/span&gt; (&lt;span style=&#34;color:#00a000&#34;&gt;expand-file-name&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;~/Downloads&amp;#34;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#a2f&#34;&gt;setq&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;eww-form-checkbox-symbol&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;☐&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#a2f&#34;&gt;setq&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;eww-form-checkbox-selected-symbol&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;☑&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  )
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这里我们着重说下 &lt;code&gt;link-hint-open-link&lt;/code&gt; ，我们按下 &lt;code&gt;f&lt;/code&gt; 后，所有链接前面会出现一些候选快捷键，我们按下对应的快捷键就相当于点击了这个链接：&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;/ox-hugo/img_20230505_155407.png&#34; width=&#34;800&#34;&gt;
&lt;/figure&gt;

&lt;h3 id=&#34;书签&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;3.3&lt;/span&gt; 书签 &lt;a href=&#34;#%e4%b9%a6%e7%ad%be&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;书签有两种方式，一种是使用 EWW 的书签，另一种是使用 Emacs 的统一书签，我个人倾向于后者。&lt;/p&gt;
&lt;h4 id=&#34;eww-的书签&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;3.3.1&lt;/span&gt; EWW 的书签 &lt;a href=&#34;#eww-%e7%9a%84%e4%b9%a6%e7%ad%be&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;EWW 的书签比较简单，直接按下 &lt;code&gt;b (eww-add-bookmark)&lt;/code&gt; 添加书签，按下 &lt;code&gt;B (eww-list-bookmarks)&lt;/code&gt; 来显示书签列表，在书签列表里，按下 &lt;code&gt;C-k&lt;/code&gt; 即可删除书签。&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;/ox-hugo/img_20230505_155855.png&#34; width=&#34;800&#34;&gt;
&lt;/figure&gt;

&lt;h4 id=&#34;emacs-自带的书签&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;3.3.2&lt;/span&gt; Emacs 自带的书签 &lt;a href=&#34;#emacs-%e8%87%aa%e5%b8%a6%e7%9a%84%e4%b9%a6%e7%ad%be&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;我们按下 &lt;code&gt;C-x r m&lt;/code&gt; 来将当前页面添加到书签，然后按下 &lt;code&gt;C-x r l&lt;/code&gt; 来展示所有的书签，使用 Emacs 的书签好处在于，它可以对任何 BUFFER 进行书签，比如某个 Org 文件。&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;/ox-hugo/img_20230505_160217.png&#34; width=&#34;800&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;需要删除书签，只需要将光标移动到对应的行，然后按下 &lt;code&gt;d&lt;/code&gt; 标记删除，再按下 &lt;code&gt;x&lt;/code&gt; 确认并执行即可。&lt;/p&gt;
&lt;h2 id=&#34;eaf&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;4&lt;/span&gt; EAF &lt;a href=&#34;#eaf&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;上面介绍的 EWW 主要用在某些特定场景，例如看一些文字型的网站，下面将介绍一个 Emacs 里的大杀器 —— &lt;a href=&#34;https://github.com/emacs-eaf/emacs-application-framework&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;EAF (Emacs Application Framework)&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;它可以让我们在 Emacs 里运行高级的桌面程序，如浏览器、PDF阅读器、音乐播放器等，下面是一张使用 EAF 运行浏览器的截图：&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;/ox-hugo/img_20230505_161750.png&#34; width=&#34;800&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;这俨然就是一个现代浏览器啊！下面主要介绍一下如何在 MacOS 里安装配置 EAF。&lt;/p&gt;
&lt;h3 id=&#34;安装-eaf&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;4.1&lt;/span&gt; 安装 EAF &lt;a href=&#34;#%e5%ae%89%e8%a3%85-eaf&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h3&gt;&lt;h4 id=&#34;安装依赖&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;4.1.1&lt;/span&gt; 安装依赖 &lt;a href=&#34;#%e5%ae%89%e8%a3%85%e4%be%9d%e8%b5%96&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;安装下面的 Python 依赖包（不管是否使用 Python 的 venv 虚拟环境，都可以，这一步建议手动做，并且版本最好都按照下面的指定好，否则安装完后启动 EAF 后容易报错）：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pip3 install -U epc sexpdata tld lxml mac-app-frontmost &lt;span style=&#34;color:#b8860b&#34;&gt;PyQt6&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;==&lt;/span&gt;6.3.1 PyQt6-Qt6&lt;span style=&#34;color:#666&#34;&gt;==&lt;/span&gt;6.3.1 PyQt6-sip PyQt6-WebEngine&lt;span style=&#34;color:#666&#34;&gt;==&lt;/span&gt;6.3.1 PyQt6-WebEngine-Qt6&lt;span style=&#34;color:#666&#34;&gt;==&lt;/span&gt;6.3.1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;克隆-eaf-仓库&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;4.1.2&lt;/span&gt; 克隆 EAF 仓库 &lt;a href=&#34;#%e5%85%8b%e9%9a%86-eaf-%e4%bb%93%e5%ba%93&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;我们假定把 EAF 的所有内容都放到 &lt;code&gt;~/emacs-application-framework&lt;/code&gt; 这个文件夹：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git clone --depth&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;1&lt;/span&gt; -b master https://github.com/emacs-eaf/emacs-application-framework.git ~/emacs-application-framework/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;安装-eaf&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;4.1.3&lt;/span&gt; 安装 EAF &lt;a href=&#34;#%e5%ae%89%e8%a3%85-eaf&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h4&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a2f&#34;&gt;cd&lt;/span&gt; ~/emacs-application-framework/ &lt;span style=&#34;color:#666&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; ./install-eaf.py --install-all-apps
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;注：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;./install-eaf.py&lt;/code&gt; 有很多有用的参数，其中 &lt;code&gt;--install-all-apps&lt;/code&gt; 是安装 EAF 所有的应用，我倾向于这种方式是因为可以随时通过配置文件里 require 相应的模块来启用相关应用，而不用再次安装；&lt;/li&gt;
&lt;li&gt;你也可以不加 &lt;code&gt;--install-all-apps&lt;/code&gt; 参数，这样在安装的时候，它会提示你每一个应用你是否需要安装，如下图：&lt;/li&gt;
&lt;/ol&gt;
&lt;figure&gt;&lt;img src=&#34;/ox-hugo/img_20230505_215922.png&#34; width=&#34;800&#34;&gt;
&lt;/figure&gt;

&lt;/blockquote&gt;
&lt;h3 id=&#34;配置-eaf&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;4.2&lt;/span&gt; 配置 EAF &lt;a href=&#34;#%e9%85%8d%e7%bd%ae-eaf&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;我们按照自己的要求启用相应的应用即可：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-emacs-lisp&#34; data-lang=&#34;emacs-lisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#a2f&#34;&gt;use-package&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;eaf&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a2f&#34;&gt;:load-path&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;~/emacs-application-framework&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a2f&#34;&gt;:config&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#a2f&#34;&gt;require&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;&amp;#39;eaf-browser&lt;/span&gt;)                &lt;span style=&#34;color:#080;font-style:italic&#34;&gt;; 启用浏览器&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#080;font-style:italic&#34;&gt;;; (require &amp;#39;eaf-pdf-viewer)          ; 启用PDF阅读器&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  )
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;使用-eaf&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;4.3&lt;/span&gt; 使用 EAF &lt;a href=&#34;#%e4%bd%bf%e7%94%a8-eaf&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;安装完后，我们执行 &lt;code&gt;M-x eaf-open-browser&lt;/code&gt; ，它会提醒输入链接，我们输入URL，然后就可以愉快的使用啦：&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;/ox-hugo/img_20230505_163145.png&#34; width=&#34;800&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;值得一提的是，EAF 的浏览器也支持按下 &lt;code&gt;f&lt;/code&gt; 键快速选择链接，这一点非常方便：&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;/ox-hugo/img_20230505_163247.png&#34; width=&#34;800&#34;&gt;
&lt;/figure&gt;

&lt;h2 id=&#34;xwidget&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;5&lt;/span&gt; xwidget &lt;a href=&#34;#xwidget&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;我们在安装 &lt;code&gt;emacs-plus&lt;/code&gt; 时，如果加上了 &lt;code&gt;--with-xwidget&lt;/code&gt; 选项，那么 Emacs 就可以支持 &lt;code&gt;xwidget&lt;/code&gt; 浏览器。我们使用 &lt;code&gt;M-x xwidget-webkit-browse-url&lt;/code&gt; 来启动：&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;/ox-hugo/img_20230505_163538.png&#34; width=&#34;800&#34;&gt;
&lt;/figure&gt;

&lt;h2 id=&#34;结语&#34;&gt;&lt;span class=&#34;section-num&#34;&gt;6&lt;/span&gt; 结语 &lt;a href=&#34;#%e7%bb%93%e8%af%ad&#34; class=&#34;anchor&#34;&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;通过今天的学习，我们了解了如何在 Emacs 里使用浏览器，在不同的场景需求下，我们可以选择不同的方案。当然，从我个人的角度来讲，我还是倾向于使用单独的浏览器😄&lt;/p&gt;
&lt;p&gt;这节课的配置文件的快照见：&lt;a href=&#34;https://github.com/wowhxj/emacs-from-scratch/blob/master/config-mirror/emacs-config-l30.org&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;emacs-config-l30.org&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;你也可以在 &lt;a href=&#34;https://github.com/wowhxj/emacs-from-scratch&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;这里&lt;/a&gt; 查看最新的配置文件。&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>
