<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh">
  <title>红枫吟 - Emacs</title>
    <subtitle>风落花语风落天，花落风雨花落田.</subtitle>
  <link href="https://honmaple.me/posts/tech/emacs/atom.xml" rel="self" type="application/atom+xml"/>
  <link href="https://honmaple.me/posts/tech/emacs/"/>
  <generator uri="https://github.com/honmaple/snow">Snow</generator>
    <updated>Tue, 14 Jul 2026 16:59:40 +0000</updated>
  <id>https://honmaple.me</id>
    <entry xml:lang="zh">
      <title>让Eglot支持tailwindcss以及多个LSP服务</title>
      <link href="https://honmaple.me/posts/2026/01/eglot-multi-lsp-language-server/" rel="alternate"></link>
      <published>Fri, 02 Jan 2026 00:39:44 +0000</published>
      <updated>Tue, 14 Jul 2026 16:59:40 +0000</updated>
      <author>
        <name>honmaple</name>
      </author>
      <link rel="alternate" href="https://honmaple.me/posts/2026/01/eglot-multi-lsp-language-server/" type="text/html"/>
      <id>https://honmaple.me/posts/2026/01/eglot-multi-lsp-language-server/</id>
      <summary type="html">
&lt;h2 id=&quot;heading-1&quot;&gt;前言&lt;/h2&gt;
&lt;p&gt;
   虽然我不是专业的前端开发人员，但偶尔还是会写一下 &lt;code&gt;HTML/CSS/Javascript&lt;/code&gt; 或者&lt;code&gt;Vue&lt;/code&gt;。在一个 &lt;b&gt;HTML&lt;/b&gt; 文件中，我需要使用多个 &lt;b&gt;LSP服务&lt;/b&gt;，比如使用 &lt;code&gt;vscode-html-language-server&lt;/code&gt; 补全css样式，使用&lt;code&gt;tailwindcss-language-server&lt;/code&gt; 补全tailwindcss的class名称，使用 &lt;code&gt;vscode-eslint-language-server&lt;/code&gt; 检查语法
&lt;/p&gt;

&lt;p&gt;
   但我目前使用的Emacs lSP客户端 &lt;b&gt;Eglot&lt;/b&gt; 一直不支持多个LSP服务，目前的解决方式有两种，一是把...&lt;/p&gt;</summary>
      <content type="html">
&lt;h2 id=&quot;heading-1&quot;&gt;前言&lt;/h2&gt;
&lt;p&gt;
   虽然我不是专业的前端开发人员，但偶尔还是会写一下 &lt;code&gt;HTML/CSS/Javascript&lt;/code&gt; 或者&lt;code&gt;Vue&lt;/code&gt;。在一个 &lt;b&gt;HTML&lt;/b&gt; 文件中，我需要使用多个 &lt;b&gt;LSP服务&lt;/b&gt;，比如使用 &lt;code&gt;vscode-html-language-server&lt;/code&gt; 补全css样式，使用&lt;code&gt;tailwindcss-language-server&lt;/code&gt; 补全tailwindcss的class名称，使用 &lt;code&gt;vscode-eslint-language-server&lt;/code&gt; 检查语法
&lt;/p&gt;

&lt;p&gt;
   但我目前使用的Emacs lSP客户端 &lt;b&gt;Eglot&lt;/b&gt; 一直不支持多个LSP服务，目前的解决方式有两种，一是把 &lt;b&gt;Eglot&lt;/b&gt; 更换为 &lt;b&gt;lsp-mode&lt;/b&gt; 或者 &lt;b&gt;lsp-bridge&lt;/b&gt;， 二是使用第三方命令行代理服务，比如:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;
 &lt;a href=&quot;https://github.com/thefrontside/lspx&quot;&gt;https://github.com/thefrontside/lspx&lt;/a&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
 &lt;a href=&quot;https://github.com/joaotavora/rassumfrassum&quot;&gt;https://github.com/joaotavora/rassumfrassum&lt;/a&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
   &lt;b&gt;lspx&lt;/b&gt; 是因为我的电脑上没有相关环境，无法编译，&lt;b&gt;rass&lt;/b&gt; 是由 &lt;b&gt;Eglot&lt;/b&gt; 的作者开发，不过看情况他是准备把 &lt;b&gt;rass&lt;/b&gt; 作为一个通用的LSP代理，所以配置文件会单独放置到 &lt;b&gt;HOME&lt;/b&gt; 目录，这一点我不是很喜欢
&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;
   算了，找来找去还不如自己写一个(轮子+1)，&lt;a href=&quot;https://github.com/honmaple/eglot-lspx&quot;&gt;eglot-lspx&lt;/a&gt;，一个多LSP代理服务，用于解决 &lt;b&gt;Eglot&lt;/b&gt; 无法使用 &lt;code&gt;tailwindcss&lt;/code&gt; 以及不支持多个LSP服务的问题
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;heading-2&quot;&gt;如何使用？&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;
 编译
&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;1&lt;/span&gt;&lt;span&gt;git clone https://github.com/honmaple/eglot-lspx
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;2&lt;/span&gt;&lt;span&gt;cd eglot-lspx
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;3&lt;/span&gt;&lt;span&gt;go build .&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;
     然后把编译好的 &lt;code&gt;eglot-lspx&lt;/code&gt; 文件放到可执行路径下，比如我放到了 &lt;code&gt;~/.emacs.d/bin&lt;/code&gt; 目录，并添加路径到Emacs配置
&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;1&lt;/span&gt;&lt;span&gt;(add-to-list &amp;#39;exec-path (expand-file-name &amp;#34;bin&amp;#34; user-emacs-directory) t)&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
 配置Eglot
&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 1&lt;/span&gt;&lt;span&gt;(defvar eglot-lspx-command (executable-find &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;eglot-lspx&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 2&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 3&lt;/span&gt;&lt;span&gt;(when eglot-lspx-command
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 4&lt;/span&gt;&lt;span&gt;  (add-to-list &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#39;eglot-server-programs&lt;/span&gt; &lt;span style=&quot;color:#f92672&quot;&gt;`&lt;/span&gt;((web-mode :language-id &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 5&lt;/span&gt;&lt;span&gt;                                        &lt;span style=&quot;color:#f92672&quot;&gt;.&lt;/span&gt; (&lt;span style=&quot;color:#f92672&quot;&gt;,&lt;/span&gt;eglot-lspx-command
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 6&lt;/span&gt;&lt;span&gt;                                           &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;--&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;vscode-html-language-server&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;--stdio&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 7&lt;/span&gt;&lt;span&gt;                                           &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;--&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;tailwindcss-language-server&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;--stdio&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 8&lt;/span&gt;&lt;span&gt;  (add-to-list &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#39;eglot-server-programs&lt;/span&gt; &lt;span style=&quot;color:#f92672&quot;&gt;`&lt;/span&gt;((vue-mode :language-id &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 9&lt;/span&gt;&lt;span&gt;                                        &lt;span style=&quot;color:#f92672&quot;&gt;.&lt;/span&gt; (&lt;span style=&quot;color:#f92672&quot;&gt;,&lt;/span&gt;eglot-lspx-command
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;10&lt;/span&gt;&lt;span&gt;                                           &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;--&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;vue-language-server&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;--stdio&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;11&lt;/span&gt;&lt;span&gt;                                           &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;--&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;vscode-html-language-server&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;--stdio&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;12&lt;/span&gt;&lt;span&gt;                                           &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;--&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;tailwindcss-language-server&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;--stdio&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;13&lt;/span&gt;&lt;span&gt;                                           :initializationOptions
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;14&lt;/span&gt;&lt;span&gt;                                           (lambda (server) (&lt;span style=&quot;color:#a6e22e&quot;&gt;list&lt;/span&gt; :vue-language-server (eglot-volar-options server)))))))&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
 合并补全信息
&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;1&lt;/span&gt;&lt;span&gt;--provider completion=0,tailwindcss-language-server&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;
     可以使用LSP服务名或者索引名，使用逗号分隔，索引名即第n个LSP服务，从0开始，未设置将合并全部
&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;heading-3&quot;&gt;示例&lt;/h2&gt;
&lt;p&gt;
   
  &lt;a class=&quot;mx-auto block w-fit max-w-full no-underline&quot; href=&quot;https://s.libforest.com/images/2026/01/eglot-lspx-02.png-show&quot; data-img-lightbox data-gallery=&quot;page-images&quot; data-type=&quot;image&quot;&gt;
    &lt;img data-src=&quot;https://s.libforest.com/images/2026/01/eglot-lspx-02.png-thumb&quot;
         alt=&quot;eglot-lspx-02.png&quot;
         decoding=&quot;async&quot;
         class=&quot;lazy mx-auto cursor-zoom-in rounded-md &quot;&gt;
  &lt;/a&gt;
  &lt;link rel=&quot;stylesheet&quot; href=&quot;https://honmaple.me/libs/glightbox/glightbox.min.css&quot;&gt;
  &lt;script src=&quot;https://honmaple.me/libs/vanilla-lazyload/lazyload.min.js&quot; defer&gt;&lt;/script&gt;
  &lt;script src=&quot;https://honmaple.me/libs/glightbox/glightbox.min.js&quot; defer&gt;&lt;/script&gt;
    &lt;script src=&quot;https://honmaple.me/js/lazyload.js&quot; defer&gt;&lt;/script&gt;
    &lt;script src=&quot;https://honmaple.me/js/lightbox.js&quot; defer&gt;&lt;/script&gt;

   
  &lt;a class=&quot;mx-auto block w-fit max-w-full no-underline&quot; href=&quot;https://s.libforest.com/images/2026/01/eglot-lspx-01.png-show&quot; data-img-lightbox data-gallery=&quot;page-images&quot; data-type=&quot;image&quot;&gt;
    &lt;img data-src=&quot;https://s.libforest.com/images/2026/01/eglot-lspx-01.png-thumb&quot;
         alt=&quot;eglot-lspx-01.png&quot;
         decoding=&quot;async&quot;
         class=&quot;lazy mx-auto cursor-zoom-in rounded-md &quot;&gt;
  &lt;/a&gt;

&lt;/p&gt;</content>
        <category term="Tech/Linux/Emacs"></category>
    </entry>
    <entry xml:lang="zh">
      <title>为maple-translate增加更友好的sdcv离线翻译</title>
      <link href="https://honmaple.me/posts/2024/04/wei-maple-translatezeng-jia-geng-you-hao-de-sdcvchi-xian-fan-yi/" rel="alternate"></link>
      <published>Mon, 22 Apr 2024 21:51:27 +0000</published>
      <updated>Mon, 22 Apr 2024 23:14:41 +0000</updated>
      <author>
        <name>honmaple</name>
      </author>
      <link rel="alternate" href="https://honmaple.me/posts/2024/04/wei-maple-translatezeng-jia-geng-you-hao-de-sdcvchi-xian-fan-yi/" type="text/html"/>
      <id>https://honmaple.me/posts/2024/04/wei-maple-translatezeng-jia-geng-you-hao-de-sdcvchi-xian-fan-yi/</id>
      <summary type="html">
&lt;blockquote&gt;
&lt;p&gt;
之前我写的Emacs翻译插件 &lt;b&gt;maple-translate&lt;/b&gt; 有一个 &lt;b&gt;sdcv&lt;/b&gt; 离线翻译的功能，它使用了 &lt;code&gt;Elisp&lt;/code&gt; 解析 &lt;b&gt;StarDict&lt;/b&gt; 的字典文件，所以不需要安装其它任何依赖。但是也是因为此原因，首次使用离线翻译需要等待字典文件加载到内存，这不是很友好，此次我将添加 &lt;b&gt;sdcv&lt;/b&gt; 二进制文件的支持，使离线翻译能够更加快捷方便
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;
首先是安装 &lt;b&gt;sdcv&lt;/b&gt; 二进制文件
&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 1&lt;/span&gt;&lt;span&gt;└──╼ brew install sdcv
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 2&lt;/span&gt;&lt;span&gt;└──╼ sdcv --help
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 3&lt;/span&gt;&lt;span&gt;用法：
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 4&lt;/span&gt;&lt;span&gt;  sdcv [选项...&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;</summary>
      <content type="html">
&lt;blockquote&gt;
&lt;p&gt;
之前我写的Emacs翻译插件 &lt;b&gt;maple-translate&lt;/b&gt; 有一个 &lt;b&gt;sdcv&lt;/b&gt; 离线翻译的功能，它使用了 &lt;code&gt;Elisp&lt;/code&gt; 解析 &lt;b&gt;StarDict&lt;/b&gt; 的字典文件，所以不需要安装其它任何依赖。但是也是因为此原因，首次使用离线翻译需要等待字典文件加载到内存，这不是很友好，此次我将添加 &lt;b&gt;sdcv&lt;/b&gt; 二进制文件的支持，使离线翻译能够更加快捷方便
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;
首先是安装 &lt;b&gt;sdcv&lt;/b&gt; 二进制文件
&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 1&lt;/span&gt;&lt;span&gt;└──╼ brew install sdcv
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 2&lt;/span&gt;&lt;span&gt;└──╼ sdcv --help
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 3&lt;/span&gt;&lt;span&gt;用法：
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 4&lt;/span&gt;&lt;span&gt;  sdcv [选项…]  words
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 5&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 6&lt;/span&gt;&lt;span&gt;帮助选项：
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 7&lt;/span&gt;&lt;span&gt;  -h, --help                     显示帮助选项
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 8&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 9&lt;/span&gt;&lt;span&gt;应用程序选项：
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;10&lt;/span&gt;&lt;span&gt;  -v, --version                  display version information and exit
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;11&lt;/span&gt;&lt;span&gt;  -l, --list-dicts               display list of available dictionaries and exit
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;12&lt;/span&gt;&lt;span&gt;  -u, --use-dict=bookname        for search use only dictionary with this bookname
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;13&lt;/span&gt;&lt;span&gt;  -n, --non-interactive          for use in scripts
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;14&lt;/span&gt;&lt;span&gt;  -j, --json-output              print the result formatted as JSON
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;15&lt;/span&gt;&lt;span&gt;  --json                         print the result formatted as JSON
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;16&lt;/span&gt;&lt;span&gt;  -e, --exact-search             do not fuzzy-search for similar words, only return exact matches
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;17&lt;/span&gt;&lt;span&gt;  -0, --utf8-output              output must be in utf8
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;18&lt;/span&gt;&lt;span&gt;  -1, --utf8-input               input of sdcv in utf8
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;19&lt;/span&gt;&lt;span&gt;  -2, --data-dir=path/to/dir     use this directory as path to stardict data directory
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;20&lt;/span&gt;&lt;span&gt;  -x, --only-data-dir            only use the dictionaries in data-dir, do not search in user and system directories
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;21&lt;/span&gt;&lt;span&gt;  -c, --color                    colorize the output&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;
然后定义二进制文件的路径，如果 &lt;b&gt;sdcv&lt;/b&gt; 未安装，则返回为 &lt;code&gt;nil&lt;/code&gt;
&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;1&lt;/span&gt;&lt;span&gt;(defvar maple-translate-sdcv-program (executable-find &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;sdcv&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;))&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;
接着修改之前写好的 &lt;code&gt;maple-translate-sdcv&lt;/code&gt; 函数，通过判断 &lt;code&gt;maple-translate-sdcv-program&lt;/code&gt; 是否为空采取不同的翻译操作
&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 1&lt;/span&gt;&lt;span&gt;(defun maple-translate-sdcv(word &lt;span style=&quot;color:#66d9ef&quot;&gt;&amp;amp;optional&lt;/span&gt; callback)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 2&lt;/span&gt;&lt;span&gt;  &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;Search WORD with sdcv, use async request if CALLBACK non-nil.&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 3&lt;/span&gt;&lt;span&gt;  (if maple-translate-sdcv-program
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 4&lt;/span&gt;&lt;span&gt;      (maple-translate-execute maple-translate-sdcv-program
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 5&lt;/span&gt;&lt;span&gt;        :args (&lt;span style=&quot;color:#a6e22e&quot;&gt;append&lt;/span&gt; &lt;span style=&quot;color:#f92672&quot;&gt;&amp;#39;&lt;/span&gt;(&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;-n&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;-x&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;-j&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;-0&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;-1&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;-2&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 6&lt;/span&gt;&lt;span&gt;                      (cl-loop for dict in maple-translate-sdcv-dicts
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 7&lt;/span&gt;&lt;span&gt;                               collect (&lt;span style=&quot;color:#a6e22e&quot;&gt;expand-file-name&lt;/span&gt; (&lt;span style=&quot;color:#a6e22e&quot;&gt;cdr&lt;/span&gt; dict) maple-translate-sdcv-dir))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 8&lt;/span&gt;&lt;span&gt;                      (&lt;span style=&quot;color:#a6e22e&quot;&gt;list&lt;/span&gt; word))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 9&lt;/span&gt;&lt;span&gt;        :format (maple-translate-sdcv-format)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;10&lt;/span&gt;&lt;span&gt;        :callback callback)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;11&lt;/span&gt;&lt;span&gt;    &lt;span style=&quot;color:#75715e&quot;&gt;;; ...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;12&lt;/span&gt;&lt;span&gt;    &lt;span style=&quot;color:#75715e&quot;&gt;;; 使用ELisp解析并翻译&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;13&lt;/span&gt;&lt;span&gt;    ))&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;
需要说明的是，由于该函数接收一个 &lt;code&gt;callback&lt;/code&gt; 的变量，用于处理异步翻译，如果是同步翻译，可以直接使用 &lt;code&gt;call-process&lt;/code&gt; 获取结果
&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;1&lt;/span&gt;&lt;span&gt;(with-temp-buffer
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;2&lt;/span&gt;&lt;span&gt;  (&lt;span style=&quot;color:#a6e22e&quot;&gt;apply&lt;/span&gt; &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#39;call-process&lt;/span&gt; &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;sdcv&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&quot;color:#66d9ef&quot;&gt;nil&lt;/span&gt; &lt;span style=&quot;color:#66d9ef&quot;&gt;t&lt;/span&gt; &lt;span style=&quot;color:#66d9ef&quot;&gt;nil&lt;/span&gt; &lt;span style=&quot;color:#f92672&quot;&gt;&amp;#39;&lt;/span&gt;(&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;-n&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;-x&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;-j&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;-0&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;-1&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;-2&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;/Users/xxx/.emacs.d/stardict/stardict-lazyworm-ec-2.4.2&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;word&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;3&lt;/span&gt;&lt;span&gt;  (&lt;span style=&quot;color:#a6e22e&quot;&gt;buffer-string&lt;/span&gt;))&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;
但如果是异步翻译，则需要使用 &lt;code&gt;start-process&lt;/code&gt; ，再通过监听进程状态在进程结束后再获取翻译结果
&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;1&lt;/span&gt;&lt;span&gt;(let ((name (&lt;span style=&quot;color:#a6e22e&quot;&gt;format&lt;/span&gt; &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;maple-translate-process %s&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&quot;color:#f92672&quot;&gt;,&lt;/span&gt;program)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;2&lt;/span&gt;&lt;span&gt;  (&lt;span style=&quot;color:#a6e22e&quot;&gt;set-process-sentinel&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;3&lt;/span&gt;&lt;span&gt;   (&lt;span style=&quot;color:#a6e22e&quot;&gt;apply&lt;/span&gt; &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#39;start-process&lt;/span&gt; name (&lt;span style=&quot;color:#a6e22e&quot;&gt;format&lt;/span&gt; &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;*%s*&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt; name) &lt;span style=&quot;color:#f92672&quot;&gt;,&lt;/span&gt;program &lt;span style=&quot;color:#f92672&quot;&gt;,&lt;/span&gt;args)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;4&lt;/span&gt;&lt;span&gt;   (lambda(process _)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;5&lt;/span&gt;&lt;span&gt;     (unless (process-live-p process)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;6&lt;/span&gt;&lt;span&gt;       (with-current-buffer (&lt;span style=&quot;color:#a6e22e&quot;&gt;process-buffer&lt;/span&gt; process)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;7&lt;/span&gt;&lt;span&gt;         (prog1 (&lt;span style=&quot;color:#a6e22e&quot;&gt;funcall&lt;/span&gt; &lt;span style=&quot;color:#f92672&quot;&gt;,&lt;/span&gt;callback &lt;span style=&quot;color:#f92672&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#a6e22e&quot;&gt;format&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;8&lt;/span&gt;&lt;span&gt;           (&lt;span style=&quot;color:#a6e22e&quot;&gt;kill-buffer&lt;/span&gt; (&lt;span style=&quot;color:#a6e22e&quot;&gt;current-buffer&lt;/span&gt;))))))))&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;
这里的 &lt;b&gt;buffer&lt;/b&gt; 名称也可以通过 &lt;code&gt;(generate-new-buffer &quot; *temp*&quot; t)&lt;/code&gt; 生成一个临时 &lt;b&gt;buffer&lt;/b&gt;
&lt;/p&gt;

&lt;p&gt;
最后就是翻译结果的展示，由于输出的是多行 &lt;b&gt;json&lt;/b&gt;，比如:
&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;1&lt;/span&gt;&lt;span&gt;[]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;2&lt;/span&gt;&lt;span&gt;[{&amp;#34;dict&amp;#34;: &amp;#34;懒虫简明英汉词典&amp;#34;,&amp;#34;word&amp;#34;:&amp;#34;word&amp;#34;,&amp;#34;definition&amp;#34;:&amp;#34;\n[wә:d]\nn.\n字, 词, 话, 消息, 诺言, 命令\nvt.\n为...措辞&amp;#34;}]&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;
所以我在解析翻译结果时取了个巧，没有使用 &lt;code&gt;(buffer-string)&lt;/code&gt; 而是直接在 &lt;b&gt;buffer&lt;/b&gt; 里操作，每次都跳到开始位置，再依次向下移动 &lt;b&gt;n&lt;/b&gt; 行，这个 &lt;b&gt;n&lt;/b&gt; 即是字典的数量，最后使用 &lt;code&gt;(thing-at-point &#39;line t)&lt;/code&gt; 获取当前行的数据
&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 1&lt;/span&gt;&lt;span&gt;(defun maple-translate-sdcv-format()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 2&lt;/span&gt;&lt;span&gt;  &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;Format result with sdcv output.&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 3&lt;/span&gt;&lt;span&gt;  (let ((results (cl-loop for index from &lt;span style=&quot;color:#ae81ff&quot;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 4&lt;/span&gt;&lt;span&gt;                          for dicts in maple-translate-sdcv-dicts
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 5&lt;/span&gt;&lt;span&gt;                          collect
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 6&lt;/span&gt;&lt;span&gt;                          (progn
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 7&lt;/span&gt;&lt;span&gt;                            (&lt;span style=&quot;color:#a6e22e&quot;&gt;goto-char&lt;/span&gt; (&lt;span style=&quot;color:#a6e22e&quot;&gt;point-min&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 8&lt;/span&gt;&lt;span&gt;                            (&lt;span style=&quot;color:#a6e22e&quot;&gt;forward-line&lt;/span&gt; index)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 9&lt;/span&gt;&lt;span&gt;                            (string-join (cl-loop for child across-ref (json-read-from-string (&lt;span style=&quot;color:#a6e22e&quot;&gt;decode-coding-string&lt;/span&gt; (thing-at-point &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#39;line&lt;/span&gt; &lt;span style=&quot;color:#66d9ef&quot;&gt;t&lt;/span&gt;) &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#39;utf-8&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;10&lt;/span&gt;&lt;span&gt;                                                  collect (&lt;span style=&quot;color:#a6e22e&quot;&gt;format&lt;/span&gt; &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;%s: %s&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;11&lt;/span&gt;&lt;span&gt;                                                                  (alist-get &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#39;dict&lt;/span&gt; child)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;12&lt;/span&gt;&lt;span&gt;                                                                  (alist-get &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#39;definition&lt;/span&gt; child)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;13&lt;/span&gt;&lt;span&gt;                                         &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;\n&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;\n&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;)))))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;14&lt;/span&gt;&lt;span&gt;    (unless (&lt;span style=&quot;color:#a6e22e&quot;&gt;null&lt;/span&gt; results)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;15&lt;/span&gt;&lt;span&gt;      (string-join (cl-remove &lt;span style=&quot;color:#66d9ef&quot;&gt;nil&lt;/span&gt; results) &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;\n&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;\n&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;))))&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;
最终效果
&lt;/p&gt;
&lt;video width=&quot;100%&quot; controls&gt;
  &lt;source src=&quot;https://s.libforest.com/images/2024/04/maple-translate-sdcv.mov&quot; type=&quot;video/mp4&quot;&gt;
&lt;/video&gt;

&lt;p&gt;
&lt;b&gt;maple-translate&lt;/b&gt;的具体修改可见: &lt;a href=&quot;https://github.com/honmaple/emacs-maple-translate/commit/dfd0eae6486d62c26a3fa3fb07ee7e5f4640eb16&quot;&gt;dfd0eae&lt;/a&gt;
&lt;/p&gt;</content>
        <category term="Tech/Linux/Emacs"></category>
    </entry>
    <entry xml:lang="zh">
      <title>重复造轮子之Emacs翻译插件maple-translate</title>
      <link href="https://honmaple.me/posts/2023/11/zhong-fu-zao-lun-zi-zhi-emacsfan-yi-cha-jian-maple-translate/" rel="alternate"></link>
      <published>Fri, 03 Nov 2023 22:19:03 +0000</published>
      <updated>Wed, 15 Nov 2023 15:21:38 +0000</updated>
      <author>
        <name>honmaple</name>
      </author>
      <link rel="alternate" href="https://honmaple.me/posts/2023/11/zhong-fu-zao-lun-zi-zhi-emacsfan-yi-cha-jian-maple-translate/" type="text/html"/>
      <id>https://honmaple.me/posts/2023/11/zhong-fu-zao-lun-zi-zhi-emacsfan-yi-cha-jian-maple-translate/</id>
      <summary type="html">
&lt;blockquote&gt;
&lt;p&gt;
我之前一直都在使用 &lt;a href=&quot;https://github.com/xuchunyang/youdao-dictionary.el&quot;&gt;youdao-dictionary&lt;/a&gt; 这个插件，虽然没有配置过秘钥，这时会有使用次数的限制(反正是每天1000次还是多少来着，有些忘了)，但是我平时使用次数不多，所以也不会达到使用限制，不管是单词翻译还是长句翻译都很不错。但最近几个月 &lt;b&gt;youdao-dictionary&lt;/b&gt; 如果不配置私钥，处于一个完全不可用的状态。
&lt;/p&gt;

&lt;p&gt;
我曾寻找过它的替代品，并且使用过一段时间的 &lt;a href=&quot;https://github.com/condy0919/fanyi.el&quot;&gt;fanyi.el&lt;/a&gt;，不可否认，这同样是一个非常不错的插件，不管是UI还是功能，但是，可能是因为 &lt;b&gt;fanyi.el&lt;/b&gt; 使用异步请求的原因，偶尔会出现一些意想不到的报错，更重要的是它不支持长句翻译和离线翻译。
&lt;/p&gt;

&lt;p&gt;
考虑再三，还是决定自己造一个轮子，主要功能就按照我之前使用 &lt;b&gt;youdao-dictionary&lt;/b&gt; 的习惯...&lt;/p&gt;&lt;/blockquote&gt;</summary>
      <content type="html">
&lt;blockquote&gt;
&lt;p&gt;
我之前一直都在使用 &lt;a href=&quot;https://github.com/xuchunyang/youdao-dictionary.el&quot;&gt;youdao-dictionary&lt;/a&gt; 这个插件，虽然没有配置过秘钥，这时会有使用次数的限制(反正是每天1000次还是多少来着，有些忘了)，但是我平时使用次数不多，所以也不会达到使用限制，不管是单词翻译还是长句翻译都很不错。但最近几个月 &lt;b&gt;youdao-dictionary&lt;/b&gt; 如果不配置私钥，处于一个完全不可用的状态。
&lt;/p&gt;

&lt;p&gt;
我曾寻找过它的替代品，并且使用过一段时间的 &lt;a href=&quot;https://github.com/condy0919/fanyi.el&quot;&gt;fanyi.el&lt;/a&gt;，不可否认，这同样是一个非常不错的插件，不管是UI还是功能，但是，可能是因为 &lt;b&gt;fanyi.el&lt;/b&gt; 使用异步请求的原因，偶尔会出现一些意想不到的报错，更重要的是它不支持长句翻译和离线翻译。
&lt;/p&gt;

&lt;p&gt;
考虑再三，还是决定自己造一个轮子，主要功能就按照我之前使用 &lt;b&gt;youdao-dictionary&lt;/b&gt; 的习惯:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;
 翻译光标下的单词，以及选中的单词或句子
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
 翻译的内容输出到 &lt;code&gt;echoarea&lt;/code&gt; 或者新的 &lt;code&gt;buffer&lt;/code&gt;，方便复制
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
 增加一个离线翻译的功能，并且可以不依赖外部工具
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;

&lt;p&gt;
基于上述，所以有了这个新的轮子 &lt;a href=&quot;https://github.com/honmaple/emacs-maple-translate&quot;&gt;maple-translate&lt;/a&gt;
&lt;/p&gt;

&lt;h2 id=&quot;heading-1&quot;&gt;如何使用?&lt;/h2&gt;
&lt;p&gt;
   可以使用 &lt;b&gt;quelpa&lt;/b&gt; 安装
&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;1&lt;/span&gt;&lt;span&gt;(use-package maple-translate
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;2&lt;/span&gt;&lt;span&gt;  :quelpa (:fetcher github :repo &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;honmaple/emacs-maple-translate&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;3&lt;/span&gt;&lt;span&gt;  :commands (maple-translate maple-translate+))&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;
   或者手动下载仓库
&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;1&lt;/span&gt;&lt;span&gt;git clone https://github.com/honmaple/emacs-maple-translate ~/.emacs.d/site-lisp/maple-translate&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;
   然后进行配置
&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;1&lt;/span&gt;&lt;span&gt;(use-package maple-translate
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;2&lt;/span&gt;&lt;span&gt;  :ensure &lt;span style=&quot;color:#66d9ef&quot;&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;3&lt;/span&gt;&lt;span&gt;  :commands (maple-translate maple-translate+))&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;h2 id=&quot;heading-2&quot;&gt;长句翻译&lt;/h2&gt;
&lt;p&gt;
   &lt;del&gt;目前长句翻译仅支持 &lt;code&gt;youdao&lt;/code&gt;&lt;/del&gt;, 目前支持 &lt;code&gt;youdao&lt;/code&gt; 和 &lt;code&gt;google&lt;/code&gt; 两种翻译引擎，可以修改设置
&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;1&lt;/span&gt;&lt;span&gt;(setq maple-translate-engine &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#39;youdao&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;2&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color:#75715e&quot;&gt;;; 或者&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;3&lt;/span&gt;&lt;span&gt;(setq maple-translate-engine &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#39;google&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;h2 id=&quot;heading-3&quot;&gt;谷歌翻译&lt;/h2&gt;
&lt;p&gt;
   国内无法直接使用，但是可以单独为谷歌翻译设置代理
&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;1&lt;/span&gt;&lt;span&gt;(setq maple-translate-google-url &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;https://translate.googleapis.com/translate_a/single&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;2&lt;/span&gt;&lt;span&gt;(setq maple-translate-google-proxies
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;3&lt;/span&gt;&lt;span&gt;      &lt;span style=&quot;color:#f92672&quot;&gt;&amp;#39;&lt;/span&gt;((&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;http&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&quot;color:#f92672&quot;&gt;.&lt;/span&gt; &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;127.0.0.1:1086&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;4&lt;/span&gt;&lt;span&gt;        (&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;https&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&quot;color:#f92672&quot;&gt;.&lt;/span&gt; &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;127.0.0.1:1086&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;)))&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;h2 id=&quot;heading-4&quot;&gt;离线翻译&lt;/h2&gt;
&lt;p&gt;
   我个人平时在使用 &lt;b&gt;Emacs&lt;/b&gt; 时不太习惯依赖外部的工具，比如我之前就写过一个markdown，org-mode实时预览插件 &lt;a href=&quot;https://github.com/honmaple/emacs-maple-preview&quot;&gt;maple-preview&lt;/a&gt;，它区别于其它插件，并不会依赖外部的工具，比如 &lt;b&gt;Pandoc&lt;/b&gt;，甚至不会生出任何文件到我的本地环境
&lt;/p&gt;

&lt;p&gt;
   同样的，我也不希望使用离线翻译时还要依赖外部诸如 &lt;b&gt;sdcv，goldendict&lt;/b&gt; 等工具，我想要直接使用 &lt;code&gt;Elisp&lt;/code&gt; 来对词典进行解析。所幸前人栽树，后人乘凉，已经有了一个纯 &lt;code&gt;Elisp&lt;/code&gt; 实现的解析器 &lt;a href=&quot;https://www.emacswiki.org/emacs/stardict.el&quot;&gt;https://www.emacswiki.org/emacs/stardict.el&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
   我所需要做的，就是下载需要的词典到本地(这个步骤是必须的，即使我不喜欢)，然后设置
&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;1&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color:#75715e&quot;&gt;;; 离线词典所在的目录&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;2&lt;/span&gt;&lt;span&gt;(setq maple-translate-sdcv-dir &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;~/.stardict/dicts&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;3&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color:#75715e&quot;&gt;;; 所使用的词典 -&amp;gt; (词典名词 . 词典具体目录)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;4&lt;/span&gt;&lt;span&gt;(setq maple-translate-sdcv-dicts
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;5&lt;/span&gt;&lt;span&gt;      &lt;span style=&quot;color:#f92672&quot;&gt;&amp;#39;&lt;/span&gt;((&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;lazyworm-ec&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&quot;color:#f92672&quot;&gt;.&lt;/span&gt; &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;stardict-lazyworm-ec-2.4.2&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;6&lt;/span&gt;&lt;span&gt;        (&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;lazyworm-ce&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&quot;color:#f92672&quot;&gt;.&lt;/span&gt; &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;stardict-lazyworm-ce-2.4.2&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;)))&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;
   最后修改翻译引擎
&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;1&lt;/span&gt;&lt;span&gt;(setq maple-translate-engine &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#39;sdcv&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;
   注意：&lt;b&gt;第一次使用离线翻译需要等待词典初始化，这会需要耗费一段时间，后面就快了&lt;/b&gt;
&lt;/p&gt;

&lt;h2 id=&quot;heading-5&quot;&gt;多引擎翻译&lt;/h2&gt;
&lt;p&gt;
   &lt;b&gt;maple-translate&lt;/b&gt; 同样支持&lt;b&gt;多引擎&lt;/b&gt;，需要修改设置为一个列表
&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;1&lt;/span&gt;&lt;span&gt;(setq maple-translate-engine &lt;span style=&quot;color:#f92672&quot;&gt;&amp;#39;&lt;/span&gt;(youdao dictcn sdcv))&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;h2 id=&quot;heading-6&quot;&gt;翻译原理&lt;/h2&gt;
&lt;p&gt;
   目前支持的几个引擎: &lt;code&gt;youdao(有道)&lt;/code&gt;、&lt;code&gt;dictcn(海词)&lt;/code&gt;、&lt;code&gt;iciba(金山词霸)&lt;/code&gt;、&lt;code&gt;bing(必应)&lt;/code&gt;、&lt;code&gt;google(谷歌)&lt;/code&gt;、&lt;code&gt;sdcv(离线)&lt;/code&gt;。除 &lt;code&gt;sdcv&lt;/code&gt; 外，其它几个都依赖于网络，&lt;b&gt;maple-translate&lt;/b&gt; 可以看作是一个爬虫，通过爬取翻译页面，然后使用Emacs内置的 &lt;code&gt;dom&lt;/code&gt; 对HTML进行解析，最后获取到想要的内容(谷歌使用API获取)。基于此，我还写了一个超简单的 &lt;code&gt;类xpath&lt;/code&gt; 解析器
&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 1&lt;/span&gt;&lt;span&gt;(defun maple-translate-dom-by-key(dom key)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 2&lt;/span&gt;&lt;span&gt;  (let (func num)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 3&lt;/span&gt;&lt;span&gt;    (when (&lt;span style=&quot;color:#a6e22e&quot;&gt;string-match&lt;/span&gt; &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;\\&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;\\&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;([0-9]+&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;\\&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;\\&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt; key)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 4&lt;/span&gt;&lt;span&gt;      (setq num (match-string &lt;span style=&quot;color:#ae81ff&quot;&gt;1&lt;/span&gt; key))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 5&lt;/span&gt;&lt;span&gt;      (setq key (&lt;span style=&quot;color:#a6e22e&quot;&gt;substring&lt;/span&gt; key &lt;span style=&quot;color:#ae81ff&quot;&gt;0&lt;/span&gt; (&lt;span style=&quot;color:#a6e22e&quot;&gt;-&lt;/span&gt; (&lt;span style=&quot;color:#a6e22e&quot;&gt;length&lt;/span&gt; key) (&lt;span style=&quot;color:#a6e22e&quot;&gt;length&lt;/span&gt; num) &lt;span style=&quot;color:#ae81ff&quot;&gt;2&lt;/span&gt;))))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 6&lt;/span&gt;&lt;span&gt;    (cond ((string-prefix-p &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt; key)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 7&lt;/span&gt;&lt;span&gt;           (setq key (&lt;span style=&quot;color:#a6e22e&quot;&gt;substring&lt;/span&gt; key &lt;span style=&quot;color:#ae81ff&quot;&gt;1&lt;/span&gt;) func &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#39;dom-by-class&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 8&lt;/span&gt;&lt;span&gt;          ((string-prefix-p &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;#&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt; key)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 9&lt;/span&gt;&lt;span&gt;           (setq key (&lt;span style=&quot;color:#a6e22e&quot;&gt;substring&lt;/span&gt; key &lt;span style=&quot;color:#ae81ff&quot;&gt;1&lt;/span&gt;) func &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#39;dom-by-id&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;10&lt;/span&gt;&lt;span&gt;          ((string-prefix-p &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt; key)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;11&lt;/span&gt;&lt;span&gt;           (setq func (lambda(p _) (dom-children p))))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;12&lt;/span&gt;&lt;span&gt;          (&lt;span style=&quot;color:#66d9ef&quot;&gt;t&lt;/span&gt; (setq key (&lt;span style=&quot;color:#a6e22e&quot;&gt;intern&lt;/span&gt; key) func &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#39;dom-by-tag&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;13&lt;/span&gt;&lt;span&gt;    (if (&lt;span style=&quot;color:#a6e22e&quot;&gt;null&lt;/span&gt; num)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;14&lt;/span&gt;&lt;span&gt;        (&lt;span style=&quot;color:#a6e22e&quot;&gt;funcall&lt;/span&gt; func dom key)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;15&lt;/span&gt;&lt;span&gt;      (&lt;span style=&quot;color:#a6e22e&quot;&gt;nth&lt;/span&gt; (&lt;span style=&quot;color:#a6e22e&quot;&gt;string-to-number&lt;/span&gt; num) (&lt;span style=&quot;color:#a6e22e&quot;&gt;funcall&lt;/span&gt; func dom key)))))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;16&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;17&lt;/span&gt;&lt;span&gt;(defun maple-translate-dom-find(dom xpath)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;18&lt;/span&gt;&lt;span&gt;  (cl-loop for key in (string-split (string-trim xpath) &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;19&lt;/span&gt;&lt;span&gt;           if (&lt;span style=&quot;color:#a6e22e&quot;&gt;consp&lt;/span&gt; dom)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;20&lt;/span&gt;&lt;span&gt;           do (setq dom (maple-translate-dom-by-key dom key))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;21&lt;/span&gt;&lt;span&gt;           else return dom)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;22&lt;/span&gt;&lt;span&gt;  dom)&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;
   这样，我就能通过一些简单的语法来定位想要的内容，比如在有道里面使用
&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;1&lt;/span&gt;&lt;span&gt;(maple-translate-dom-find dom &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;.simple dict-module/.trans-container/.word-exp&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;
   获取到 &lt;b&gt;class&lt;/b&gt; 名称为 &lt;code&gt;simple dict-module&lt;/code&gt; 下的 &lt;b&gt;class&lt;/b&gt; 名称为 &lt;code&gt;trans-container&lt;/code&gt; 下的 &lt;b&gt;class&lt;/b&gt; 名称为 &lt;code&gt;word-exp&lt;/code&gt; 的所有元素, 也就是&lt;b&gt;基本释义&lt;/b&gt;
&lt;/p&gt;</content>
        <category term="Tech/Linux/Emacs"></category>
    </entry>
    <entry xml:lang="zh">
      <title>Emacs笔记之修复yaml-mode的格式化问题</title>
      <link href="https://honmaple.me/posts/2023/02/Emacs笔记之修复yaml-mode的格式化问题/" rel="alternate"></link>
      <published>Tue, 21 Feb 2023 17:18:40 +0000</published>
      <updated>Sun, 26 Feb 2023 01:28:12 +0000</updated>
      <author>
        <name>honmaple</name>
      </author>
      <link rel="alternate" href="https://honmaple.me/posts/2023/02/Emacs笔记之修复yaml-mode的格式化问题/" type="text/html"/>
      <id>https://honmaple.me/posts/2023/02/Emacs笔记之修复yaml-mode的格式化问题/</id>
      <summary type="html">
&lt;table&gt;
&lt;tr&gt;
&lt;th&gt;更新时间&lt;/th&gt;
&lt;th&gt;备注&lt;/th&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;2023-02-26&lt;/td&gt;
&lt;td&gt;增加更多判断逻辑, 比如上一行是列表，当前行也是列表，则按正常缩进计算&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;
一直以来 &lt;b&gt;yaml-mode&lt;/b&gt; 都有一个问题，在使用 &lt;code&gt;(indent-region (point-min) (point-max))&lt;/code&gt; 时已经格式好的内容总是会得到错误的缩进，比如一个简单的配置
&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;1&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color:#f92672&quot;&gt;test1&lt;/span&gt;: &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;val&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;2&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color:#f92672&quot;&gt;test2&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;3&lt;/span&gt;&lt;span&gt;  - &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;val1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;4&lt;/span&gt;&lt;span&gt;  - &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;val2&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;5&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color:#f92672&quot;&gt;test3&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;6&lt;/span&gt;&lt;span&gt;  &lt;span style=&quot;color:#f92672&quot;&gt;test4&lt;/span&gt;: &lt;span style=&quot;color:#e6db74&quot;&gt;&quot;val4...&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;</summary>
      <content type="html">
&lt;table&gt;
&lt;tr&gt;
&lt;th&gt;更新时间&lt;/th&gt;
&lt;th&gt;备注&lt;/th&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;2023-02-26&lt;/td&gt;
&lt;td&gt;增加更多判断逻辑, 比如上一行是列表，当前行也是列表，则按正常缩进计算&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;
一直以来 &lt;b&gt;yaml-mode&lt;/b&gt; 都有一个问题，在使用 &lt;code&gt;(indent-region (point-min) (point-max))&lt;/code&gt; 时已经格式好的内容总是会得到错误的缩进，比如一个简单的配置
&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;1&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color:#f92672&quot;&gt;test1&lt;/span&gt;: &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;val&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;2&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color:#f92672&quot;&gt;test2&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;3&lt;/span&gt;&lt;span&gt;  - &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;val1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;4&lt;/span&gt;&lt;span&gt;  - &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;val2&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;5&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color:#f92672&quot;&gt;test3&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;6&lt;/span&gt;&lt;span&gt;  &lt;span style=&quot;color:#f92672&quot;&gt;test4&lt;/span&gt;: &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;val4&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;
在调用 &lt;code&gt;indent-regin&lt;/code&gt; 后就会变成
&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;1&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color:#f92672&quot;&gt;test1&lt;/span&gt;: &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;val&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;2&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color:#f92672&quot;&gt;test2&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;3&lt;/span&gt;&lt;span&gt;  - &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;val1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;4&lt;/span&gt;&lt;span&gt;  - &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;val2&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;5&lt;/span&gt;&lt;span&gt;  &lt;span style=&quot;color:#f92672&quot;&gt;test3&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;6&lt;/span&gt;&lt;span&gt;    &lt;span style=&quot;color:#f92672&quot;&gt;test4&lt;/span&gt;: &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;val4&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;
而我又总是手痒，写好的配置文件总是会忍不住 &lt;code&gt;indent-region&lt;/code&gt; 一番，结果本来正确的格式立马变得各种乱七八糟，当初为了解决这个问题，还专门为 &lt;b&gt;yaml-mode&lt;/b&gt; 激活了 &lt;b&gt;lsp-mode&lt;/b&gt;, 并且使用 &lt;code&gt;lsp-format-buffer&lt;/code&gt; 来进行处理。
&lt;/p&gt;

&lt;p&gt;
本来一切都还正常，但最近发现了另外一个问题，如果在 &lt;b&gt;org-mode&lt;/b&gt; 中插入 &lt;b&gt;yaml&lt;/b&gt; 的代码片段，调用 &lt;code&gt;indent-region&lt;/code&gt; 还是还有之前的问题, &lt;b&gt;org-mode&lt;/b&gt; 中又无法直接调用 &lt;code&gt;lsp-format-buffer&lt;/code&gt;, 所以专门研究了一下 &lt;b&gt;yaml-mode&lt;/b&gt;
&lt;/p&gt;

&lt;p&gt;
发现 &lt;b&gt;yaml-mode&lt;/b&gt; 只是定义了 &lt;code&gt;indent-line-function&lt;/code&gt; 变量，没有定义 &lt;code&gt;indent-region-function&lt;/code&gt;, 导致调用 &lt;code&gt;indent-region&lt;/code&gt; 时其实是逐行调用 &lt;code&gt;yaml-indent-line&lt;/code&gt;, 这里面有一个计算当前缩进的 &lt;code&gt;yaml-compute-indentation&lt;/code&gt; 函数，计算方式有些简单粗暴，如果上一行是一个 &lt;b&gt;hash key&lt;/b&gt;, 当前行的缩进就是上一行的缩进加 &lt;code&gt;yaml-indent-offset&lt;/code&gt; 的值, 这里并没有判断当前行是新建行还是已经有相关内容，如果是新建行那么缩进就是对的，如果是已有的内容就是错的，所以我修改了这一部分逻辑，如果是 &lt;b&gt;已有内容并且当前行的缩进小于上一行&lt;/b&gt; 则不进行处理, 比如:
&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;1&lt;/span&gt;&lt;span&gt;  - &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;val2&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;2&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color:#ae81ff&quot;&gt;test3:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;
虽然增加的判断逻辑很简单，但至少在使用 &lt;code&gt;indent-region&lt;/code&gt; 时已经格式好的内容就不会出现混乱的情况了, 也不用专门为 &lt;b&gt;yaml&lt;/b&gt; 文件激活一个 &lt;b&gt;lsp&lt;/b&gt; 进程。
&lt;/p&gt;

&lt;p&gt;
目前处理的方式还是采用 advice + letf 形式，否则需要修改很多内容，有兴趣的同道可以参考一下
&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 1&lt;/span&gt;&lt;span&gt;(defun maple/yaml-compute-indentation()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 2&lt;/span&gt;&lt;span&gt;  (let ((ci (&lt;span style=&quot;color:#a6e22e&quot;&gt;current-indentation&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 3&lt;/span&gt;&lt;span&gt;        (cm (&lt;span style=&quot;color:#a6e22e&quot;&gt;looking-at&lt;/span&gt; yaml-hash-key-re))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 4&lt;/span&gt;&lt;span&gt;        (cl (&lt;span style=&quot;color:#a6e22e&quot;&gt;looking-at&lt;/span&gt; &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;^&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;\s&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;*-&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;\s&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;+.*$&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 5&lt;/span&gt;&lt;span&gt;    (save-excursion
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 6&lt;/span&gt;&lt;span&gt;      (&lt;span style=&quot;color:#a6e22e&quot;&gt;beginning-of-line&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 7&lt;/span&gt;&lt;span&gt;      (if (&lt;span style=&quot;color:#a6e22e&quot;&gt;looking-at&lt;/span&gt; yaml-document-delimiter-re) &lt;span style=&quot;color:#ae81ff&quot;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 8&lt;/span&gt;&lt;span&gt;        (&lt;span style=&quot;color:#a6e22e&quot;&gt;forward-line&lt;/span&gt; &lt;span style=&quot;color:#ae81ff&quot;&gt;-1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 9&lt;/span&gt;&lt;span&gt;        (while (and (&lt;span style=&quot;color:#a6e22e&quot;&gt;looking-at&lt;/span&gt; yaml-blank-line-re)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;10&lt;/span&gt;&lt;span&gt;                    (&lt;span style=&quot;color:#a6e22e&quot;&gt;&amp;gt;&lt;/span&gt; (&lt;span style=&quot;color:#a6e22e&quot;&gt;point&lt;/span&gt;) (&lt;span style=&quot;color:#a6e22e&quot;&gt;point-min&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;11&lt;/span&gt;&lt;span&gt;          (&lt;span style=&quot;color:#a6e22e&quot;&gt;forward-line&lt;/span&gt; &lt;span style=&quot;color:#ae81ff&quot;&gt;-1&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;12&lt;/span&gt;&lt;span&gt;        (let ((li (&lt;span style=&quot;color:#a6e22e&quot;&gt;current-indentation&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;13&lt;/span&gt;&lt;span&gt;              (ll (&lt;span style=&quot;color:#a6e22e&quot;&gt;looking-at&lt;/span&gt; &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;^&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;\s&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;*-&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;\s&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;+.*$&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;14&lt;/span&gt;&lt;span&gt;          &lt;span style=&quot;color:#75715e&quot;&gt;;; 如果上一行的缩进大于当前行, 上一行是列表，当前行也是是列表 - 正常缩进&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;15&lt;/span&gt;&lt;span&gt;          &lt;span style=&quot;color:#75715e&quot;&gt;;; 如果上一行的缩进大于当前行, 上一行和当前行有一个不是列表 - 原有缩进&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;16&lt;/span&gt;&lt;span&gt;          &lt;span style=&quot;color:#75715e&quot;&gt;;; 如果上一行的缩进等于当前行, 上一行是字典，当前行是列表 - 正常缩进&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;17&lt;/span&gt;&lt;span&gt;          &lt;span style=&quot;color:#75715e&quot;&gt;;; 如果上一行的缩进等于当前行, 上一行是字典，当前行是不是列表 - 原有缩进&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;18&lt;/span&gt;&lt;span&gt;          &lt;span style=&quot;color:#75715e&quot;&gt;;; 如果上一行的缩进小于当前行, 上一行是字典 - 正常缩进&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;19&lt;/span&gt;&lt;span&gt;          &lt;span style=&quot;color:#75715e&quot;&gt;;; 如果上一行的缩进小于当前行, 上一行是列表，当前行也是列表 - 正常缩进&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;20&lt;/span&gt;&lt;span&gt;          &lt;span style=&quot;color:#75715e&quot;&gt;;; 如果上一行的缩进小于当前行, 上一行是列表，当前行是字典 - 错误/正常缩进&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;21&lt;/span&gt;&lt;span&gt;          (if (or (and (&lt;span style=&quot;color:#a6e22e&quot;&gt;&amp;gt;&lt;/span&gt; li ci) (or (not cl) (not ll))) (and (&lt;span style=&quot;color:#a6e22e&quot;&gt;=&lt;/span&gt; li ci) cm (not ll))) ci
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;22&lt;/span&gt;&lt;span&gt;            (&lt;span style=&quot;color:#a6e22e&quot;&gt;+&lt;/span&gt; li
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;23&lt;/span&gt;&lt;span&gt;               (if (&lt;span style=&quot;color:#a6e22e&quot;&gt;looking-at&lt;/span&gt; yaml-nested-map-re) yaml-indent-offset &lt;span style=&quot;color:#ae81ff&quot;&gt;0&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;24&lt;/span&gt;&lt;span&gt;               (if (&lt;span style=&quot;color:#a6e22e&quot;&gt;looking-at&lt;/span&gt; yaml-nested-sequence-re) yaml-indent-offset &lt;span style=&quot;color:#ae81ff&quot;&gt;0&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;25&lt;/span&gt;&lt;span&gt;               (if (&lt;span style=&quot;color:#a6e22e&quot;&gt;looking-at&lt;/span&gt; yaml-block-literal-re) yaml-indent-offset &lt;span style=&quot;color:#ae81ff&quot;&gt;0&lt;/span&gt;))))))))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;26&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;27&lt;/span&gt;&lt;span&gt;(defun maple/yaml-indent-region(func &lt;span style=&quot;color:#66d9ef&quot;&gt;&amp;amp;rest&lt;/span&gt; args)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;28&lt;/span&gt;&lt;span&gt;  (if (derived-mode-p &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#39;yaml-mode&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;29&lt;/span&gt;&lt;span&gt;      (letf (((&lt;span style=&quot;color:#a6e22e&quot;&gt;symbol-function&lt;/span&gt; &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#39;yaml-compute-indentation&lt;/span&gt;) &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#39;maple/yaml-compute-indentation&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;30&lt;/span&gt;&lt;span&gt;        (&lt;span style=&quot;color:#a6e22e&quot;&gt;apply&lt;/span&gt; func args))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;31&lt;/span&gt;&lt;span&gt;    (&lt;span style=&quot;color:#a6e22e&quot;&gt;apply&lt;/span&gt; func args)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;32&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;33&lt;/span&gt;&lt;span&gt;(advice-add &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#39;indent-region&lt;/span&gt; :around &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#39;maple/yaml-indent-region&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;</content>
        <category term="Tech/Linux/Emacs"></category>
    </entry>
    <entry xml:lang="zh">
      <title>Emacs笔记之minibuffer默认输入</title>
      <link href="https://honmaple.me/posts/2021/11/Emacs笔记之minibuffer默认输入/" rel="alternate"></link>
      <published>Thu, 25 Nov 2021 22:14:00 +0000</published>
      <updated>Fri, 24 Feb 2023 08:12:33 +0000</updated>
      <author>
        <name>honmaple</name>
      </author>
      <link rel="alternate" href="https://honmaple.me/posts/2021/11/Emacs笔记之minibuffer默认输入/" type="text/html"/>
      <id>https://honmaple.me/posts/2021/11/Emacs笔记之minibuffer默认输入/</id>
      <summary type="html">
&lt;blockquote&gt;
&lt;p&gt;
在使用 &lt;b&gt;evil-ex&lt;/b&gt;，也就是冒号+命令时，有一个非常有趣的功能，输入冒号后，&lt;b&gt;minibuffer&lt;/b&gt; 会显示上一次执行的命令，比如 &lt;code&gt;:wq&lt;/code&gt;, 确认可以直接执行这个命令，但是输入任意字符，就会把原先的 &lt;code&gt;wq&lt;/code&gt; 直接覆盖，接收新的命令输入
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;
我觉得这是一个非常有趣且有用的功能，像 &lt;code&gt;read-string&lt;/code&gt; 函数，如果我想要一个默认的输入，可以直接使用
&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;1&lt;/span&gt;&lt;span&gt;(let ((input (&lt;span style=&quot;color:#a6e22e&quot;&gt;read-string&lt;/span&gt; &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;prompt: &lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;默认内容&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;2&lt;/span&gt;&lt;span&gt;  (&lt;span style=&quot;color:#a6e22e&quot;&gt;message&lt;/span&gt; input))&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;
但我想覆盖这个默认, 则需要先把 &lt;code&gt;默认内容...&lt;/code&gt;&lt;/p&gt;</summary>
      <content type="html">
&lt;blockquote&gt;
&lt;p&gt;
在使用 &lt;b&gt;evil-ex&lt;/b&gt;，也就是冒号+命令时，有一个非常有趣的功能，输入冒号后，&lt;b&gt;minibuffer&lt;/b&gt; 会显示上一次执行的命令，比如 &lt;code&gt;:wq&lt;/code&gt;, 确认可以直接执行这个命令，但是输入任意字符，就会把原先的 &lt;code&gt;wq&lt;/code&gt; 直接覆盖，接收新的命令输入
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;
我觉得这是一个非常有趣且有用的功能，像 &lt;code&gt;read-string&lt;/code&gt; 函数，如果我想要一个默认的输入，可以直接使用
&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;1&lt;/span&gt;&lt;span&gt;(let ((input (&lt;span style=&quot;color:#a6e22e&quot;&gt;read-string&lt;/span&gt; &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;prompt: &lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;默认内容&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;2&lt;/span&gt;&lt;span&gt;  (&lt;span style=&quot;color:#a6e22e&quot;&gt;message&lt;/span&gt; input))&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;
但我想覆盖这个默认, 则需要先把 &lt;code&gt;默认内容&lt;/code&gt; 删除，再输入我想要的字符, 如果不想先删除默认再输入，还可以使用
&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;1&lt;/span&gt;&lt;span&gt;(let ((input (&lt;span style=&quot;color:#a6e22e&quot;&gt;read-string&lt;/span&gt; &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;prompt: &lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&quot;color:#66d9ef&quot;&gt;nil&lt;/span&gt; &lt;span style=&quot;color:#66d9ef&quot;&gt;nil&lt;/span&gt; &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;默认内容&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;2&lt;/span&gt;&lt;span&gt;  (&lt;span style=&quot;color:#a6e22e&quot;&gt;message&lt;/span&gt; input))&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;
但是这样的话我无法看到默认的内容，当然，也许可以把默认内容追加到 &lt;code&gt;prompt&lt;/code&gt; 里，我认为这样不太好看，不是吗
&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;1&lt;/span&gt;&lt;span&gt;(let* ((default &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;默认内容&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;2&lt;/span&gt;&lt;span&gt;       (input (&lt;span style=&quot;color:#a6e22e&quot;&gt;read-string&lt;/span&gt; (&lt;span style=&quot;color:#a6e22e&quot;&gt;format&lt;/span&gt; &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;prompt (default %s): &lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt; default) &lt;span style=&quot;color:#66d9ef&quot;&gt;nil&lt;/span&gt; &lt;span style=&quot;color:#66d9ef&quot;&gt;nil&lt;/span&gt; default)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;3&lt;/span&gt;&lt;span&gt;  (&lt;span style=&quot;color:#a6e22e&quot;&gt;message&lt;/span&gt; input))&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;
&lt;code&gt;evil-ex&lt;/code&gt; 提示我一个新的解决方式, 通过查看 &lt;code&gt;evil-ex&lt;/code&gt; 源码，可以发现它是使用 &lt;code&gt;minibuffer-with-setup-hook&lt;/code&gt; 和 &lt;code&gt;after-change-functions&lt;/code&gt; 在&lt;b&gt;minibuffer&lt;/b&gt;里插入新内容时先清理默认内容, 再插入新内容, 我简化了相关代码
&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 1&lt;/span&gt;&lt;span&gt;(let ((input (minibuffer-with-setup-hook &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#39;maple-input-setup&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 2&lt;/span&gt;&lt;span&gt;               (&lt;span style=&quot;color:#a6e22e&quot;&gt;read-string&lt;/span&gt; &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;prompt: &lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt; (&lt;span style=&quot;color:#a6e22e&quot;&gt;propertize&lt;/span&gt; &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;默认内容&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#39;face&lt;/span&gt; &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#39;shadow&lt;/span&gt;)))))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 3&lt;/span&gt;&lt;span&gt;  (&lt;span style=&quot;color:#a6e22e&quot;&gt;message&lt;/span&gt; input))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 4&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 5&lt;/span&gt;&lt;span&gt;(defun maple-input-setup()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 6&lt;/span&gt;&lt;span&gt;  (add-hook &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#39;after-change-functions&lt;/span&gt; &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#39;maple-input-update&lt;/span&gt; &lt;span style=&quot;color:#66d9ef&quot;&gt;nil&lt;/span&gt; &lt;span style=&quot;color:#66d9ef&quot;&gt;t&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 7&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 8&lt;/span&gt;&lt;span&gt;(defun maple-input-update(&lt;span style=&quot;color:#66d9ef&quot;&gt;&amp;amp;optional&lt;/span&gt; beg end len &lt;span style=&quot;color:#a6e22e&quot;&gt;string&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 9&lt;/span&gt;&lt;span&gt;  (let ((&lt;span style=&quot;color:#a6e22e&quot;&gt;string&lt;/span&gt; (&lt;span style=&quot;color:#a6e22e&quot;&gt;buffer-substring-no-properties&lt;/span&gt; beg end)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;10&lt;/span&gt;&lt;span&gt;    (delete-minibuffer-contents)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;11&lt;/span&gt;&lt;span&gt;    (&lt;span style=&quot;color:#a6e22e&quot;&gt;insert&lt;/span&gt; &lt;span style=&quot;color:#a6e22e&quot;&gt;string&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;12&lt;/span&gt;&lt;span&gt;    (remove-hook &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#39;after-change-functions&lt;/span&gt; &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#39;maple-input-update&lt;/span&gt; &lt;span style=&quot;color:#66d9ef&quot;&gt;t&lt;/span&gt;)))&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;
OK, 就这样
&lt;/p&gt;</content>
        <category term="Tech/Linux/Emacs"></category>
    </entry>
    <entry xml:lang="zh">
      <title>Emacs自动插入更新文件头——maple-header</title>
      <link href="https://honmaple.me/posts/2021/10/Emacs自动插入更新文件头——maple-header/" rel="alternate"></link>
      <published>Wed, 06 Oct 2021 14:57:51 +0000</published>
      <updated>Thu, 06 Apr 2023 13:11:13 +0000</updated>
      <author>
        <name>honmaple</name>
      </author>
      <link rel="alternate" href="https://honmaple.me/posts/2021/10/Emacs自动插入更新文件头——maple-header/" type="text/html"/>
      <id>https://honmaple.me/posts/2021/10/Emacs自动插入更新文件头——maple-header/</id>
      <summary type="html">
&lt;blockquote&gt;
&lt;p&gt;
一个简单的插件，可以在文件创建时自动插入文件头，或者文件更新时自动更新文件头信息，虽然已经用了好几年，这次把相关代码提取并精简一下做成了插件 &lt;a href=&quot;https://github.com/honmaple/emacs-maple-header&quot;&gt;maple-header&lt;/a&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;heading-1&quot;&gt;安装&lt;/h2&gt;
&lt;h3 id=&quot;heading-1.1&quot;&gt;使用quelpa&lt;/h3&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;1&lt;/span&gt;&lt;span&gt;(use-package maple-header
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;2&lt;/span&gt;&lt;span&gt;  :quelpa (:fetcher github :repo &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;honmaple/emacs-maple-header&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;3&lt;/span&gt;&lt;span&gt;  :hook (after-init &lt;span style=&quot;color:#f92672&quot;&gt;.&lt;/span&gt; maple-header-mode))&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;h3 id=&quot;heading-1.2&quot;&gt;克隆到本地&lt;/h3&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;1&lt;/span&gt;&lt;span&gt;git clone https://github...&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;</summary>
      <content type="html">
&lt;blockquote&gt;
&lt;p&gt;
一个简单的插件，可以在文件创建时自动插入文件头，或者文件更新时自动更新文件头信息，虽然已经用了好几年，这次把相关代码提取并精简一下做成了插件 &lt;a href=&quot;https://github.com/honmaple/emacs-maple-header&quot;&gt;maple-header&lt;/a&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;heading-1&quot;&gt;安装&lt;/h2&gt;
&lt;h3 id=&quot;heading-1.1&quot;&gt;使用quelpa&lt;/h3&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;1&lt;/span&gt;&lt;span&gt;(use-package maple-header
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;2&lt;/span&gt;&lt;span&gt;  :quelpa (:fetcher github :repo &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;honmaple/emacs-maple-header&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;3&lt;/span&gt;&lt;span&gt;  :hook (after-init &lt;span style=&quot;color:#f92672&quot;&gt;.&lt;/span&gt; maple-header-mode))&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;h3 id=&quot;heading-1.2&quot;&gt;克隆到本地&lt;/h3&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;1&lt;/span&gt;&lt;span&gt;git clone https://github.com/honmaple/emacs-maple-header --depth=1 ~/.emacs/site-lisp/maple-header&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;h2 id=&quot;heading-2&quot;&gt;配置&lt;/h2&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;1&lt;/span&gt;&lt;span&gt;(use-package maple-header
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;2&lt;/span&gt;&lt;span&gt;  :ensure &lt;span style=&quot;color:#66d9ef&quot;&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;3&lt;/span&gt;&lt;span&gt;  :hook (after-init &lt;span style=&quot;color:#f92672&quot;&gt;.&lt;/span&gt; maple-header-mode))&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;h3 id=&quot;heading-2.1&quot;&gt;基础配置&lt;/h3&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;1&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color:#75715e&quot;&gt;;; 更新文件头时搜索的文件函数, 9代表只会搜索前9行&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;2&lt;/span&gt;&lt;span&gt;(setq maple-header:lines &lt;span style=&quot;color:#ae81ff&quot;&gt;9&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;3&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color:#75715e&quot;&gt;;; 创建新文件时是否自动插入文件头信息&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;4&lt;/span&gt;&lt;span&gt;(setq maple-header:auto-insert &lt;span style=&quot;color:#66d9ef&quot;&gt;t&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;5&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color:#75715e&quot;&gt;;; 更新文件时是否自动更新文件头信息&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;6&lt;/span&gt;&lt;span&gt;(setq maple-header:auto-update &lt;span style=&quot;color:#66d9ef&quot;&gt;t&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;h3 id=&quot;heading-2.2&quot;&gt;自定义模版&lt;/h3&gt;
&lt;p&gt;
   比如我要自定义&lt;b&gt;Python&lt;/b&gt;文件的文件头
&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;1&lt;/span&gt;&lt;span&gt;(add-to-list &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#39;maple-header:auto-insert-alist&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;2&lt;/span&gt;&lt;span&gt;             &lt;span style=&quot;color:#f92672&quot;&gt;&amp;#39;&lt;/span&gt;((python-mode &lt;span style=&quot;color:#f92672&quot;&gt;.&lt;/span&gt; &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;Python program&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;) &lt;span style=&quot;color:#66d9ef&quot;&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;3&lt;/span&gt;&lt;span&gt;               &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;#!/usr/bin/env python&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;\n&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;4&lt;/span&gt;&lt;span&gt;               &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;# -*- coding: utf-8 -*-&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;\n&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;))&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;h3 id=&quot;heading-2.3&quot;&gt;自定义更新&lt;/h3&gt;
&lt;p&gt;
   目前内置了 &lt;b&gt;filename, email, modify&lt;/b&gt; 三个字段, 可以通过调用 &lt;b&gt;maple-header:update-xxx&lt;/b&gt; 手动更新指定的字段, 如果需要增加新的或者覆盖原字段,可以使用
&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;1&lt;/span&gt;&lt;span&gt;(add-to-list &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#39;maple-header:auto-update-alist&lt;/span&gt; &lt;span style=&quot;color:#f92672&quot;&gt;&amp;#39;&lt;/span&gt;(author &lt;span style=&quot;color:#f92672&quot;&gt;.&lt;/span&gt; custom-update-author))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;2&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;3&lt;/span&gt;&lt;span&gt;(defun custom-update-author(&lt;span style=&quot;color:#66d9ef&quot;&gt;&amp;amp;optional&lt;/span&gt; current-line)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;4&lt;/span&gt;&lt;span&gt;  (interactive)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;5&lt;/span&gt;&lt;span&gt;  (maple-header:update-action
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;6&lt;/span&gt;&lt;span&gt;   &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;.*&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;\\&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;(Author:&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;\\&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;\\&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;(.*&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;\\&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;7&lt;/span&gt;&lt;span&gt;   &lt;span style=&quot;color:#a6e22e&quot;&gt;user-full-name&lt;/span&gt; current-line))&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;
   使用 &lt;b&gt;maple-header:update&lt;/b&gt; 会更新所有字段(包括：&lt;b&gt;filename，email，modify，author&lt;/b&gt;), 如果只需要更新部分，需要修改为
&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;1&lt;/span&gt;&lt;span&gt;(setq maple-header:auto-update-alist
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;2&lt;/span&gt;&lt;span&gt;      &lt;span style=&quot;color:#f92672&quot;&gt;&amp;#39;&lt;/span&gt;((filename &lt;span style=&quot;color:#f92672&quot;&gt;.&lt;/span&gt; maple-header:update-filename)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;3&lt;/span&gt;&lt;span&gt;        (modify &lt;span style=&quot;color:#f92672&quot;&gt;.&lt;/span&gt; maple-header:update-modify)))&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;h2 id=&quot;heading-3&quot;&gt;相关文章&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;
 &lt;a href=&quot;https://honmaple.me/articles/2018/01/emacs自动添加文件头.html&quot;&gt;emacs自动添加文件头&lt;/a&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
 &lt;a href=&quot;https://honmaple.me/articles/2018/01/emacs自动更新文件头.html&quot;&gt;emacs自动更新文件头&lt;/a&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;</content>
        <category term="Tech/Linux/Emacs"></category>
    </entry>
    <entry xml:lang="zh">
      <title>Emacs快速创建侧边栏——maple-explorer</title>
      <link href="https://honmaple.me/posts/2019/11/Emacs快速创建侧边栏——maple-explorer/" rel="alternate"></link>
      <published>Sat, 09 Nov 2019 23:02:12 +0000</published>
      <updated>Wed, 03 Apr 2024 13:04:05 +0000</updated>
      <author>
        <name>honmaple</name>
      </author>
      <link rel="alternate" href="https://honmaple.me/posts/2019/11/Emacs快速创建侧边栏——maple-explorer/" type="text/html"/>
      <id>https://honmaple.me/posts/2019/11/Emacs快速创建侧边栏——maple-explorer/</id>
      <summary type="html">
&lt;p&gt;
闲着没事又造了一个轮子，:smile:
&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;
&lt;b&gt;maple-explorer&lt;/b&gt; 是一个用于快速创建类似neotree文件浏览，或者类似maple-imenu的变量函数浏览的侧边栏的插件，让每个人都能写一个属于自己的侧边栏
&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;https://github.com/honmaple/emacs-maple-explorer&quot;&gt;emacs-maple-explorer&lt;/a&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;
 快速创建一个侧边栏: 只需要定义一个&lt;code&gt;maple-explorer-NAME-list&lt;/code&gt;的函数，并且返回一个列表
&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;1&lt;/span&gt;&lt;span&gt;(&lt;span style=&quot;color:#a6e22e&quot;&gt;list&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;2&lt;/span&gt;&lt;span&gt; :name name
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;3&lt;/span&gt;&lt;span&gt; :value value
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;4&lt;/span&gt;&lt;span&gt; :face face
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;5&lt;/span&gt;&lt;span&gt; :click click
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;6&lt;/span&gt;&lt;span&gt; :status &lt;span style=&quot;color:#e6db74&quot;&gt;&#39;close...&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/li&gt;&lt;/ul&gt;</summary>
      <content type="html">
&lt;p&gt;
闲着没事又造了一个轮子，:smile:
&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;
&lt;b&gt;maple-explorer&lt;/b&gt; 是一个用于快速创建类似neotree文件浏览，或者类似maple-imenu的变量函数浏览的侧边栏的插件，让每个人都能写一个属于自己的侧边栏
&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;https://github.com/honmaple/emacs-maple-explorer&quot;&gt;emacs-maple-explorer&lt;/a&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;
 快速创建一个侧边栏: 只需要定义一个&lt;code&gt;maple-explorer-NAME-list&lt;/code&gt;的函数，并且返回一个列表
&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;1&lt;/span&gt;&lt;span&gt;(&lt;span style=&quot;color:#a6e22e&quot;&gt;list&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;2&lt;/span&gt;&lt;span&gt; :name name
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;3&lt;/span&gt;&lt;span&gt; :value value
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;4&lt;/span&gt;&lt;span&gt; :face face
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;5&lt;/span&gt;&lt;span&gt; :click click
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;6&lt;/span&gt;&lt;span&gt; :status &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#39;close&lt;/span&gt; &lt;span style=&quot;color:#75715e&quot;&gt;;; or &amp;#39;open&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;7&lt;/span&gt;&lt;span&gt; :children &lt;span style=&quot;color:#f92672&quot;&gt;&amp;#39;&lt;/span&gt;((child1 child2 &lt;span style=&quot;color:#f92672&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#f92672&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#f92672&quot;&gt;.&lt;/span&gt;))&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;
  其中child1，child2格式与父列表格式一致，child1中也可以嵌套下一组children，比如我定义一个名为aaa的list的函数:
&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 1&lt;/span&gt;&lt;span&gt;(defun maple-explorer-aaa-list(&lt;span style=&quot;color:#66d9ef&quot;&gt;&amp;amp;optional&lt;/span&gt; isroot)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 2&lt;/span&gt;&lt;span&gt;  &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;Get recentf file list ISROOT mean first call.&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 3&lt;/span&gt;&lt;span&gt;  (&lt;span style=&quot;color:#a6e22e&quot;&gt;list&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 4&lt;/span&gt;&lt;span&gt;   :name &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;aaa&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 5&lt;/span&gt;&lt;span&gt;   :value &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;aaa&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 6&lt;/span&gt;&lt;span&gt;   :face &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#39;font-lock-constant-face&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 7&lt;/span&gt;&lt;span&gt;   :click &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#39;maple-explorer-fold&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 8&lt;/span&gt;&lt;span&gt;   :status &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#39;open&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 9&lt;/span&gt;&lt;span&gt;   :children
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;10&lt;/span&gt;&lt;span&gt;   (&lt;span style=&quot;color:#a6e22e&quot;&gt;list&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;11&lt;/span&gt;&lt;span&gt;    (&lt;span style=&quot;color:#a6e22e&quot;&gt;list&lt;/span&gt; :name &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;aaa_child1&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;12&lt;/span&gt;&lt;span&gt;          :face &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#39;font-lock-keyword-face&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;13&lt;/span&gt;&lt;span&gt;          :click (lambda() (interactive) (&lt;span style=&quot;color:#a6e22e&quot;&gt;message&lt;/span&gt; &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;bbb&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;14&lt;/span&gt;&lt;span&gt;    (&lt;span style=&quot;color:#a6e22e&quot;&gt;list&lt;/span&gt; :name &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;aaa_child2&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;15&lt;/span&gt;&lt;span&gt;          :face &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#39;font-lock-comment-face&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;16&lt;/span&gt;&lt;span&gt;          :click (lambda() (interactive) (&lt;span style=&quot;color:#a6e22e&quot;&gt;message&lt;/span&gt; &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;aaaa&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;))))))&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;
  定义好后只要使用 &lt;code&gt;(maple-explorer-define aaa)&lt;/code&gt; 就能快速创建一个&lt;code&gt;maple-explorer-aaa&lt;/code&gt;的函数，使用它就能打开一个侧边栏，效果是这样的
&lt;/p&gt;

&lt;p&gt;
  
  &lt;a class=&quot;mx-auto block w-fit max-w-full no-underline&quot; href=&quot;https://s.libforest.com/images/2019/11/emacs-maple-explorer-01.png-show&quot; data-img-lightbox data-gallery=&quot;page-images&quot; data-type=&quot;image&quot;&gt;
    &lt;img data-src=&quot;https://s.libforest.com/images/2019/11/emacs-maple-explorer-01.png-thumb&quot;
         alt=&quot;emacs-maple-explorer-01.png&quot;
         decoding=&quot;async&quot;
         class=&quot;lazy mx-auto cursor-zoom-in rounded-md &quot;&gt;
  &lt;/a&gt;
  &lt;link rel=&quot;stylesheet&quot; href=&quot;https://honmaple.me/libs/glightbox/glightbox.min.css&quot;&gt;
  &lt;script src=&quot;https://honmaple.me/libs/vanilla-lazyload/lazyload.min.js&quot; defer&gt;&lt;/script&gt;
  &lt;script src=&quot;https://honmaple.me/libs/glightbox/glightbox.min.js&quot; defer&gt;&lt;/script&gt;
    &lt;script src=&quot;https://honmaple.me/js/lazyload.js&quot; defer&gt;&lt;/script&gt;
    &lt;script src=&quot;https://honmaple.me/js/lightbox.js&quot; defer&gt;&lt;/script&gt;

&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
 自定义内容显示: maple-explorer提供了一个&lt;code&gt;maple-explorer-NAME-name-function&lt;/code&gt;的变量，可用于自定义内容的显示，比如对于一个文件列表，我可以增加自定义图标
&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 1&lt;/span&gt;&lt;span&gt;(defun maple-explorer-icon (str icon)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 2&lt;/span&gt;&lt;span&gt;  &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;The ICON of maple-explorer STR.&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 3&lt;/span&gt;&lt;span&gt;  (&lt;span style=&quot;color:#a6e22e&quot;&gt;format&lt;/span&gt; &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;%s %s&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt; (&lt;span style=&quot;color:#a6e22e&quot;&gt;propertize&lt;/span&gt; &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;\t&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#39;display&lt;/span&gt; icon) str))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 4&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 5&lt;/span&gt;&lt;span&gt;(defun maple-explorer-icon-file-name(info)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 6&lt;/span&gt;&lt;span&gt;  &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;Custom maple-explorer-file INFO icon name.&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 7&lt;/span&gt;&lt;span&gt;  (let ((name  (&lt;span style=&quot;color:#a6e22e&quot;&gt;plist-get&lt;/span&gt; info :name))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 8&lt;/span&gt;&lt;span&gt;        (value (&lt;span style=&quot;color:#a6e22e&quot;&gt;plist-get&lt;/span&gt; info :value)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 9&lt;/span&gt;&lt;span&gt;    (&lt;span style=&quot;color:#a6e22e&quot;&gt;plist-put&lt;/span&gt; info :indent &lt;span style=&quot;color:#ae81ff&quot;&gt;5&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;10&lt;/span&gt;&lt;span&gt;    (cond ((or (string= name &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;) (string= name &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;..&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;11&lt;/span&gt;&lt;span&gt;           (maple-explorer-icon name (all-the-icons-faicon &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;folder&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;12&lt;/span&gt;&lt;span&gt;          ((&lt;span style=&quot;color:#a6e22e&quot;&gt;file-directory-p&lt;/span&gt; value)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;13&lt;/span&gt;&lt;span&gt;           (maple-explorer-icon
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;14&lt;/span&gt;&lt;span&gt;            name
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;15&lt;/span&gt;&lt;span&gt;            (if (maple-explorer--is-open info)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;16&lt;/span&gt;&lt;span&gt;                (all-the-icons-faicon &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;folder-open&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;17&lt;/span&gt;&lt;span&gt;              (all-the-icons-faicon &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;folder&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;))))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;18&lt;/span&gt;&lt;span&gt;          (&lt;span style=&quot;color:#66d9ef&quot;&gt;t&lt;/span&gt; (maple-explorer-icon name (all-the-icons-icon-for-file value))))))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;19&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;20&lt;/span&gt;&lt;span&gt;(setq maple-explorer-file-name-function &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#39;maple-explorer-icon-file-name&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;
  自定义之前是这样的
&lt;/p&gt;

&lt;p&gt;
  
  &lt;a class=&quot;mx-auto block w-fit max-w-full no-underline&quot; href=&quot;https://s.libforest.com/images/2019/11/emacs-maple-explorer-02.png-show&quot; data-img-lightbox data-gallery=&quot;page-images&quot; data-type=&quot;image&quot;&gt;
    &lt;img data-src=&quot;https://s.libforest.com/images/2019/11/emacs-maple-explorer-02.png-thumb&quot;
         alt=&quot;emacs-maple-explorer-02.png&quot;
         decoding=&quot;async&quot;
         class=&quot;lazy mx-auto cursor-zoom-in rounded-md &quot;&gt;
  &lt;/a&gt;

  自定义之后是这样的
&lt;/p&gt;

&lt;p&gt;
  
  &lt;a class=&quot;mx-auto block w-fit max-w-full no-underline&quot; href=&quot;https://s.libforest.com/images/2019/11/emacs-maple-explorer-03.png-show&quot; data-img-lightbox data-gallery=&quot;page-images&quot; data-type=&quot;image&quot;&gt;
    &lt;img data-src=&quot;https://s.libforest.com/images/2019/11/emacs-maple-explorer-03.png-thumb&quot;
         alt=&quot;emacs-maple-explorer-03.png&quot;
         decoding=&quot;async&quot;
         class=&quot;lazy mx-auto cursor-zoom-in rounded-md &quot;&gt;
  &lt;/a&gt;

&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
 更多信息
  &lt;b&gt;maple-explorer&lt;/b&gt;目前已实现了
&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;1&lt;/span&gt;&lt;span&gt;maple-explorer-file      ;; 文件浏览
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;2&lt;/span&gt;&lt;span&gt;maple-explorer-imenu     ;; 函数变量名浏览
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;3&lt;/span&gt;&lt;span&gt;maple-explorer-buffer    ;; 已打开buffer浏览
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;4&lt;/span&gt;&lt;span&gt;maple-explorer-recentf   ;; 最近文件浏览
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;5&lt;/span&gt;&lt;span&gt;maple-explorer-project   ;; 已打开的项目浏览&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;
  欢迎各位emacs同道测试
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;</content>
        <category term="Tech/Linux/Emacs"></category>
    </entry>
    <entry xml:lang="zh">
      <title>Emacs下一键执行代码(可输入)——maple-run</title>
      <link href="https://honmaple.me/posts/2019/09/Emacs下一键执行代码(可输入)——maple-run/" rel="alternate"></link>
      <published>Tue, 17 Sep 2019 04:31:25 +0000</published>
      <updated>Wed, 03 Apr 2024 13:04:05 +0000</updated>
      <author>
        <name>honmaple</name>
      </author>
      <link rel="alternate" href="https://honmaple.me/posts/2019/09/Emacs下一键执行代码(可输入)——maple-run/" type="text/html"/>
      <id>https://honmaple.me/posts/2019/09/Emacs下一键执行代码(可输入)——maple-run/</id>
      <summary type="html">
&lt;p&gt;
之前一直使用&lt;b&gt;quickrun&lt;/b&gt;来执行一些代码片段，但&lt;b&gt;quickrun&lt;/b&gt;有一个问题就是无法输入，比如python代码
&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;1&lt;/span&gt;&lt;span&gt;a &lt;span style=&quot;color:#f92672&quot;&gt;=&lt;/span&gt; input(&lt;span style=&quot;color:#e6db74&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;aaaaa: &lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;2&lt;/span&gt;&lt;span&gt;print(a)&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;
需要建立一个&lt;b&gt;qrinput&lt;/b&gt;的文件，太过麻烦，所以我平时测试一些需要输入的python代码时会使用
&lt;/p&gt;

&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;1&lt;/span&gt;&lt;span&gt;(defun maple/run-python ()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;2&lt;/span&gt;&lt;span&gt;  (interactive)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;3&lt;/span&gt;&lt;span&gt;  (or (python-shell-get-process) (&lt;span style=&quot;color:#a6e22e&quot;&gt;call-interactively&lt;/span&gt; &lt;span style=&quot;color:#e6db74&quot;&gt;&#39;run...&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;</summary>
      <content type="html">
&lt;p&gt;
之前一直使用&lt;b&gt;quickrun&lt;/b&gt;来执行一些代码片段，但&lt;b&gt;quickrun&lt;/b&gt;有一个问题就是无法输入，比如python代码
&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;1&lt;/span&gt;&lt;span&gt;a &lt;span style=&quot;color:#f92672&quot;&gt;=&lt;/span&gt; input(&lt;span style=&quot;color:#e6db74&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;aaaaa: &lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;2&lt;/span&gt;&lt;span&gt;print(a)&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;
需要建立一个&lt;b&gt;qrinput&lt;/b&gt;的文件，太过麻烦，所以我平时测试一些需要输入的python代码时会使用
&lt;/p&gt;

&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;1&lt;/span&gt;&lt;span&gt;(defun maple/run-python ()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;2&lt;/span&gt;&lt;span&gt;  (interactive)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;3&lt;/span&gt;&lt;span&gt;  (or (python-shell-get-process) (&lt;span style=&quot;color:#a6e22e&quot;&gt;call-interactively&lt;/span&gt; &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#39;run-python&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;4&lt;/span&gt;&lt;span&gt;  (if (use-region-p)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;5&lt;/span&gt;&lt;span&gt;      (python-shell-send-region (&lt;span style=&quot;color:#a6e22e&quot;&gt;region-beginning&lt;/span&gt;) (&lt;span style=&quot;color:#a6e22e&quot;&gt;region-end&lt;/span&gt;) &lt;span style=&quot;color:#66d9ef&quot;&gt;t&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;6&lt;/span&gt;&lt;span&gt;    (python-shell-send-buffer &lt;span style=&quot;color:#66d9ef&quot;&gt;t&lt;/span&gt;)))&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;
但退出&lt;b&gt;python shell&lt;/b&gt;又需要手动输入&lt;code&gt;exit()&lt;/code&gt;，我是一个怕麻烦的人，所以写了一个可供输入的 &lt;a href=&quot;https://github.com/honmaple/emacs-maple-run&quot;&gt;emacs-maple-run&lt;/a&gt;
来一键执行当前buffer的代码(后面发现quickrun其实也可以通过&lt;b&gt;quickrun-shell&lt;/b&gt;来提供实时输入，不过使用的是eshell)
&lt;/p&gt;

&lt;p&gt;
目前只加了python,go,lua,html的执行命令，自定义只需要使用
&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;1&lt;/span&gt;&lt;span&gt;(add-to-list &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#39;maple-run:alist&lt;/span&gt; &lt;span style=&quot;color:#f92672&quot;&gt;&amp;#39;&lt;/span&gt;(python-mode :command &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;python %F&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;2&lt;/span&gt;&lt;span&gt;(add-to-list &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#39;maple-run:alist&lt;/span&gt; &lt;span style=&quot;color:#f92672&quot;&gt;&amp;#39;&lt;/span&gt;(c-mode :command &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;gcc %F -o %b &amp;amp;&amp;amp; ./%b&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;3&lt;/span&gt;&lt;span&gt;(add-to-list &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#39;maple-run:alist&lt;/span&gt; &lt;span style=&quot;color:#f92672&quot;&gt;&amp;#39;&lt;/span&gt;((html-mode web-mode) :command browse-url-of-file))&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;
另外，&lt;b&gt;maple-run&lt;/b&gt;也提供了一个非常方便的函数 &lt;code&gt;(maple-run:script process-name program prgram-args)&lt;/code&gt; 来供用户自定义命令，比如:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;
 打开一个&lt;b&gt;bash shell&lt;/b&gt;
&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;1&lt;/span&gt;&lt;span&gt;(maple-run:script &lt;span style=&quot;color:#66d9ef&quot;&gt;nil&lt;/span&gt; &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;bash&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
 打开一个&lt;b&gt;ipython shell&lt;/b&gt;
&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;1&lt;/span&gt;&lt;span&gt;(maple-run:script &lt;span style=&quot;color:#66d9ef&quot;&gt;nil&lt;/span&gt; &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;ipython&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
 执行golang代码
&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;1&lt;/span&gt;&lt;span&gt;(maple-run:script &lt;span style=&quot;color:#66d9ef&quot;&gt;nil&lt;/span&gt; &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;go&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;run&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt; (&lt;span style=&quot;color:#a6e22e&quot;&gt;buffer-file-name&lt;/span&gt;))&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
 默认的执行方式
&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;1&lt;/span&gt;&lt;span&gt;(maple-run:script &lt;span style=&quot;color:#66d9ef&quot;&gt;nil&lt;/span&gt; &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;bash&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;-c&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;python file.py&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;/ul&gt;</content>
        <category term="Tech/Linux/Emacs"></category>
    </entry>
    <entry xml:lang="zh">
      <title>Emacs环境隔离之——maple-env</title>
      <link href="https://honmaple.me/posts/2019/07/Emacs环境隔离之——maple-env/" rel="alternate"></link>
      <published>Mon, 15 Jul 2019 13:34:27 +0000</published>
      <updated>Wed, 03 Apr 2024 13:04:05 +0000</updated>
      <author>
        <name>honmaple</name>
      </author>
      <link rel="alternate" href="https://honmaple.me/posts/2019/07/Emacs环境隔离之——maple-env/" type="text/html"/>
      <id>https://honmaple.me/posts/2019/07/Emacs环境隔离之——maple-env/</id>
      <summary type="html">
&lt;p&gt;
在使用Emacs时，会有很多依赖，比如:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;
 Python依赖于&lt;code&gt;flake8&lt;/code&gt;，&lt;code&gt;isort&lt;/code&gt;，&lt;code&gt;python-language-server&lt;/code&gt;等
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
 Golang依赖于&lt;code&gt;golang.org/x/tools/cmd/gopls&lt;/code&gt;，&lt;code&gt;github.com/haya14busa/gopkgs/cmd/gopkgs&lt;/code&gt;等
&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
想要安装这些依赖，必须手动进行安装，&lt;b&gt;use-package&lt;/b&gt;用户可使用&lt;b&gt;ensure-system-package&lt;/b&gt;，但非常不幸的是，这些依赖很大程度上会污染我的电脑环境，毕竟像&lt;code&gt;python...&lt;/code&gt;&lt;/p&gt;</summary>
      <content type="html">
&lt;p&gt;
在使用Emacs时，会有很多依赖，比如:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;
 Python依赖于&lt;code&gt;flake8&lt;/code&gt;，&lt;code&gt;isort&lt;/code&gt;，&lt;code&gt;python-language-server&lt;/code&gt;等
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
 Golang依赖于&lt;code&gt;golang.org/x/tools/cmd/gopls&lt;/code&gt;，&lt;code&gt;github.com/haya14busa/gopkgs/cmd/gopkgs&lt;/code&gt;等
&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
想要安装这些依赖，必须手动进行安装，&lt;b&gt;use-package&lt;/b&gt;用户可使用&lt;b&gt;ensure-system-package&lt;/b&gt;，但非常不幸的是，这些依赖很大程度上会污染我的电脑环境，毕竟像&lt;code&gt;python-language-server&lt;/code&gt;，&lt;code&gt;flake8&lt;/code&gt;这类的package，我除了在Emacs里会用到，平时根本用不到（除非同时使用Emacs和其它编辑器或IDE）
&lt;/p&gt;

&lt;p&gt;
所以，我写了一个&lt;b&gt;maple-env&lt;/b&gt;用来实现Emacs依赖环境隔离，使用方式:
&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;
 安装
&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;1&lt;/span&gt;&lt;span&gt;git clone https://github.com/honmaple/emacs-maple-env ~/.emacs/site-lisp/maple-env&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
 配置
&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 1&lt;/span&gt;&lt;span&gt;(use-package maple-env
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 2&lt;/span&gt;&lt;span&gt;  :ensure &lt;span style=&quot;color:#66d9ef&quot;&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 3&lt;/span&gt;&lt;span&gt;  :hook (after-init &lt;span style=&quot;color:#f92672&quot;&gt;.&lt;/span&gt; maple-env-mode)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 4&lt;/span&gt;&lt;span&gt;  :config
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 5&lt;/span&gt;&lt;span&gt;  (setq maple-env:python-packages
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 6&lt;/span&gt;&lt;span&gt;        &lt;span style=&quot;color:#f92672&quot;&gt;&amp;#39;&lt;/span&gt;(&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;yapf&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;flake8&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;isort&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;python-language-server&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 7&lt;/span&gt;&lt;span&gt;        maple-env:golang-packages
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 8&lt;/span&gt;&lt;span&gt;        &lt;span style=&quot;color:#f92672&quot;&gt;&amp;#39;&lt;/span&gt;(&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;github.com/rogpeppe/godef&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 9&lt;/span&gt;&lt;span&gt;          &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;github.com/golang/lint/golint&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;10&lt;/span&gt;&lt;span&gt;          &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;github.com/haya14busa/gopkgs/cmd/gopkgs&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;11&lt;/span&gt;&lt;span&gt;          &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;golang.org/x/tools/cmd/gopls&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;12&lt;/span&gt;&lt;span&gt;        maple-env:npm-packages
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;13&lt;/span&gt;&lt;span&gt;        &lt;span style=&quot;color:#f92672&quot;&gt;&amp;#39;&lt;/span&gt;(&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;js-beautify&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;14&lt;/span&gt;&lt;span&gt;  &lt;span style=&quot;color:#75715e&quot;&gt;;; 手动调用(maple-env:init)以安装依赖环境&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;15&lt;/span&gt;&lt;span&gt;  )&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
更多自定义详见&lt;b&gt;customize-group maple-env&lt;/b&gt;
&lt;/p&gt;</content>
        <category term="Tech/Linux/Emacs"></category>
    </entry>
    <entry xml:lang="zh">
      <title>elisp生成渐变XPM图片</title>
      <link href="https://honmaple.me/posts/2019/07/elisp生成渐变XPM图片/" rel="alternate"></link>
      <published>Fri, 12 Jul 2019 18:21:04 +0000</published>
      <updated>Tue, 23 Sep 2025 20:13:26 +0000</updated>
      <author>
        <name>honmaple</name>
      </author>
      <link rel="alternate" href="https://honmaple.me/posts/2019/07/elisp生成渐变XPM图片/" type="text/html"/>
      <id>https://honmaple.me/posts/2019/07/elisp生成渐变XPM图片/</id>
      <summary type="html">
&lt;blockquote&gt;
&lt;p&gt;
无意中看到 &lt;a href=&quot;https://github.com/dbordak/telephone-line&quot;&gt;telephone-line&lt;/a&gt; 有一种渐变颜色的效果，看起来很棒，但&lt;b&gt;telephone-line&lt;/b&gt;的源码有些难懂，所以自己动手实现类似的效果
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;heading-1&quot;&gt;渐变颜色&lt;/h2&gt;
&lt;p&gt;
   渐变颜色的实现可使用&lt;code&gt;color-gradient&lt;/code&gt;
&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;1&lt;/span&gt;&lt;span&gt;(color-gradient
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;2&lt;/span&gt;&lt;span&gt; &lt;span style=&quot;color:#f92672&quot;&gt;&amp;#39;&lt;/span&gt;(&lt;span style=&quot;color:#ae81ff&quot;&gt;0&lt;/span&gt; &lt;span style=&quot;color:#ae81ff&quot;&gt;0&lt;/span&gt; &lt;span style=&quot;color:#ae81ff&quot;&gt;0&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;3&lt;/span&gt;&lt;span&gt; (color-name-to-rgb &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;red&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;) &lt;span style=&quot;color:#ae81ff&quot;&gt;10&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;
   实现原理是对红(R)、绿(G)、蓝(B)三个颜色通道分别取 &lt;b&gt;n...&lt;/b&gt;&lt;/p&gt;</summary>
      <content type="html">
&lt;blockquote&gt;
&lt;p&gt;
无意中看到 &lt;a href=&quot;https://github.com/dbordak/telephone-line&quot;&gt;telephone-line&lt;/a&gt; 有一种渐变颜色的效果，看起来很棒，但&lt;b&gt;telephone-line&lt;/b&gt;的源码有些难懂，所以自己动手实现类似的效果
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;heading-1&quot;&gt;渐变颜色&lt;/h2&gt;
&lt;p&gt;
   渐变颜色的实现可使用&lt;code&gt;color-gradient&lt;/code&gt;
&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;1&lt;/span&gt;&lt;span&gt;(color-gradient
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;2&lt;/span&gt;&lt;span&gt; &lt;span style=&quot;color:#f92672&quot;&gt;&amp;#39;&lt;/span&gt;(&lt;span style=&quot;color:#ae81ff&quot;&gt;0&lt;/span&gt; &lt;span style=&quot;color:#ae81ff&quot;&gt;0&lt;/span&gt; &lt;span style=&quot;color:#ae81ff&quot;&gt;0&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;3&lt;/span&gt;&lt;span&gt; (color-name-to-rgb &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;red&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;) &lt;span style=&quot;color:#ae81ff&quot;&gt;10&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;
   实现原理是对红(R)、绿(G)、蓝(B)三个颜色通道分别取 &lt;b&gt;n + 2&lt;/b&gt; 个过渡值，&lt;b&gt;n&lt;/b&gt; 为中间颜色过渡状态，所以对于&lt;code&gt;red&lt;/code&gt;、&lt;code&gt;#000&lt;/code&gt;、&lt;code&gt;#a0a0a0&lt;/code&gt;等颜色需要转化为RGB色彩模式
&lt;/p&gt;

&lt;h2 id=&quot;heading-2&quot;&gt;生成XPM图片&lt;/h2&gt;
&lt;p&gt;
   XPM图片格式参考 &lt;a href=&quot;https://en.wikipedia.org/wiki/X_PixMap&quot;&gt;https://en.wikipedia.org/wiki/X_PixMap&lt;/a&gt;(XPM3)
&lt;/p&gt;

&lt;p&gt;
   大概是这样的
&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 1&lt;/span&gt;&lt;span&gt;/* XPM */
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 2&lt;/span&gt;&lt;span&gt;static char * XFACE[] = {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 3&lt;/span&gt;&lt;span&gt;/* &amp;lt;Values&amp;gt; */
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 4&lt;/span&gt;&lt;span&gt;/* &amp;lt;width/columns&amp;gt; &amp;lt;height/rows&amp;gt; &amp;lt;colors&amp;gt; &amp;lt;chars per pixel&amp;gt;*/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 5&lt;/span&gt;&lt;span&gt;&amp;#34;48 4 2 1&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 6&lt;/span&gt;&lt;span&gt;/* &amp;lt;Colors&amp;gt; */
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 7&lt;/span&gt;&lt;span&gt;&amp;#34;a c #ffffff&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 8&lt;/span&gt;&lt;span&gt;&amp;#34;b c #000000&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 9&lt;/span&gt;&lt;span&gt;/* &amp;lt;Pixels&amp;gt; */
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;10&lt;/span&gt;&lt;span&gt;&amp;#34;abaabaababaaabaabababaabaabaababaabaaababaabaaab&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;11&lt;/span&gt;&lt;span&gt;&amp;#34;abaabaababaaabaabababaabaabaababaabaaababaabaaab&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;12&lt;/span&gt;&lt;span&gt;&amp;#34;abaabaababaaabaabababaabaabaababaabaaababaabaaab&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;13&lt;/span&gt;&lt;span&gt;&amp;#34;abaabaababaaabaabababaabaabaababaabaaababaabaaab&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;14&lt;/span&gt;&lt;span&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;
   渐变颜色XPM图片原理就是使用不同的字符代表不同状态的渐变颜色，当所使用的字符数越多，渐变效果越好，但同时XPM图片的宽度也就越大
&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;
 &lt;b&gt;生成不同字符&lt;/b&gt;
&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;1&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color:#75715e&quot;&gt;;; 0～9&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;2&lt;/span&gt;&lt;span&gt;(&lt;span style=&quot;color:#a6e22e&quot;&gt;mapcar&lt;/span&gt; &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#39;number-to-string&lt;/span&gt; (number-sequence &lt;span style=&quot;color:#ae81ff&quot;&gt;0&lt;/span&gt; &lt;span style=&quot;color:#ae81ff&quot;&gt;9&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;3&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color:#75715e&quot;&gt;;; a~z&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;4&lt;/span&gt;&lt;span&gt;(&lt;span style=&quot;color:#a6e22e&quot;&gt;mapcar&lt;/span&gt; &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#39;char-to-string&lt;/span&gt; (number-sequence &lt;span style=&quot;color:#e6db74&quot;&gt;?a&lt;/span&gt; &lt;span style=&quot;color:#e6db74&quot;&gt;?z&lt;/span&gt;))&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
 &lt;b&gt;不同字符对应不同颜色&lt;/b&gt;
&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;1&lt;/span&gt;&lt;span&gt;(let ((number &lt;span style=&quot;color:#ae81ff&quot;&gt;-1&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;2&lt;/span&gt;&lt;span&gt;  (&lt;span style=&quot;color:#a6e22e&quot;&gt;mapconcat&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;3&lt;/span&gt;&lt;span&gt;   (lambda(x)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;4&lt;/span&gt;&lt;span&gt;     (setq number (&lt;span style=&quot;color:#a6e22e&quot;&gt;+&lt;/span&gt; number &lt;span style=&quot;color:#ae81ff&quot;&gt;1&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;5&lt;/span&gt;&lt;span&gt;     (&lt;span style=&quot;color:#a6e22e&quot;&gt;format&lt;/span&gt; &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;\&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;%s c %s&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;\&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt; (&lt;span style=&quot;color:#a6e22e&quot;&gt;nth&lt;/span&gt; number maple-xpm-chars) (&lt;span style=&quot;color:#a6e22e&quot;&gt;apply&lt;/span&gt; &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#39;color-rgb-to-hex&lt;/span&gt; x)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;6&lt;/span&gt;&lt;span&gt;   (color-gradient
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;7&lt;/span&gt;&lt;span&gt;    (color-name-to-rgb color1)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;8&lt;/span&gt;&lt;span&gt;    (color-name-to-rgb color2) width) &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;))&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;heading-3&quot;&gt;效果显示&lt;/h2&gt;
&lt;p&gt;
   
  &lt;a class=&quot;mx-auto block w-fit max-w-full no-underline&quot; href=&quot;https://s.libforest.com/images/2019/07/xpm-gradient.png-show&quot; data-img-lightbox data-gallery=&quot;page-images&quot; data-type=&quot;image&quot;&gt;
    &lt;img data-src=&quot;https://s.libforest.com/images/2019/07/xpm-gradient.png-thumb&quot;
         alt=&quot;xpm-gradient.png&quot;
         decoding=&quot;async&quot;
         class=&quot;lazy mx-auto cursor-zoom-in rounded-md &quot;&gt;
  &lt;/a&gt;
  &lt;link rel=&quot;stylesheet&quot; href=&quot;https://honmaple.me/libs/glightbox/glightbox.min.css&quot;&gt;
  &lt;script src=&quot;https://honmaple.me/libs/vanilla-lazyload/lazyload.min.js&quot; defer&gt;&lt;/script&gt;
  &lt;script src=&quot;https://honmaple.me/libs/glightbox/glightbox.min.js&quot; defer&gt;&lt;/script&gt;
    &lt;script src=&quot;https://honmaple.me/js/lazyload.js&quot; defer&gt;&lt;/script&gt;
    &lt;script src=&quot;https://honmaple.me/js/lightbox.js&quot; defer&gt;&lt;/script&gt;

&lt;/p&gt;

&lt;p&gt;
   &lt;a href=&quot;https://github.com/honmaple/emacs-maple-xpm&quot;&gt;完整代码及更多XPM图片&lt;/a&gt;
&lt;/p&gt;</content>
        <category term="Tech/Linux/Emacs"></category>
    </entry>
</feed>
