<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Ictye Blog</title>
    <link>http://northgreen.github.io/</link>
    <description>一个专注编程开发的技术博客</description>
    <language>zh-cn</language>
    <copyright>All rights reserved 2026, Ictye</copyright>
    <lastBuildDate>Tue, 16 Jun 2026 12:05:29 GMT</lastBuildDate>
    <generator>Hexo</generator>
    <image>
      <url>http://northgreen.github.io/image/icon/vista_messenger.jpg</url>
      <title>Ictye Blog</title>
      <link>http://northgreen.github.io/</link>
    </image>
    <atom:link href="http://northgreen.github.io/rss2.xml" rel="self" type="application/rss+xml"/>
    <item>
      <title>对于nvim中async冲突的补丁</title>
      <link>http://northgreen.github.io/2026/06/16/%E5%AF%B9%E4%BA%8Envim%E4%B8%ADasync%E5%86%B2%E7%AA%81%E7%9A%84%E8%A1%A5%E4%B8%81/</link>
      <description>
        <![CDATA[<p>应该是近期，<code>refactoring.nvim</code>更改使用了<code>async.nvim</code>作为它使用的async实现
而其他的比如<code>nvim-ufo</code>使用了<code>promise-async</code>作为as]]>
      </description>
      <author>Ictye</author>
      <category domain="http://northgreen.github.io/tags/nvim-linux/">nvim linux</category>
      <pubDate>Tue, 16 Jun 2026 11:53:55 GMT</pubDate>
      <content:encoded>
        <![CDATA[<p>应该是近期，<code>refactoring.nvim</code>更改使用了<code>async.nvim</code>作为它使用的async实现而其他的比如<code>nvim-ufo</code>使用了<code>promise-async</code>作为async的实现</p><p>算是比较典型的依赖冲突，解决方案也就是提前拦截require了（比较本的方法，实际上如果作为插件的实现不应该这么做，不过这里是要打个猴子补丁）</p><p>大概就是这样</p><figure class="highlight lua"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><code class="hljs lua"><span class="hljs-keyword">local</span> data = vim.fn.stdpath(<span class="hljs-string">&#x27;data&#x27;</span>)<br><span class="hljs-keyword">local</span> paths = &#123;<br>  async_nvim = data .. <span class="hljs-string">&#x27;/lazy/async.nvim/lua/async.lua&#x27;</span>,<br>  promise = data .. <span class="hljs-string">&#x27;/lazy/promise-async/lua/async.lua&#x27;</span>,<br>&#125;<br><span class="hljs-keyword">local</span> <span class="hljs-built_in">loaded</span> = &#123;&#125;<br><span class="hljs-keyword">local</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">load</span><span class="hljs-params">(kind)</span></span><br>  <span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> <span class="hljs-built_in">loaded</span>[kind] <span class="hljs-keyword">then</span> <span class="hljs-built_in">loaded</span>[kind] = <span class="hljs-built_in">dofile</span>(paths[kind]) <span class="hljs-keyword">end</span><br>  <span class="hljs-keyword">return</span> <span class="hljs-built_in">loaded</span>[kind]<br><span class="hljs-keyword">end</span><br><br><span class="hljs-keyword">local</span> orig_require = <span class="hljs-built_in">_G</span>.<span class="hljs-built_in">require</span><br><span class="hljs-built_in">_G</span>.<span class="hljs-built_in">require</span> = <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(modname, ...)</span></span><br>  <span class="hljs-keyword">if</span> modname ~= <span class="hljs-string">&#x27;async&#x27;</span> <span class="hljs-keyword">then</span> <span class="hljs-keyword">return</span> orig_require(modname, ...) <span class="hljs-keyword">end</span><br><br>  <span class="hljs-keyword">for</span> lvl = <span class="hljs-number">2</span>, <span class="hljs-number">16</span> <span class="hljs-keyword">do</span><br>    <span class="hljs-keyword">local</span> info = <span class="hljs-built_in">debug</span>.<span class="hljs-built_in">getinfo</span>(lvl, <span class="hljs-string">&#x27;S&#x27;</span>)<br>    <span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> info <span class="hljs-keyword">then</span> <span class="hljs-keyword">break</span> <span class="hljs-keyword">end</span><br>    <span class="hljs-keyword">local</span> src = info.source <span class="hljs-keyword">or</span> <span class="hljs-string">&#x27;&#x27;</span><br>    <span class="hljs-keyword">if</span> src:<span class="hljs-built_in">find</span>(<span class="hljs-string">&#x27;refactoring&#x27;</span>, <span class="hljs-number">1</span>, <span class="hljs-literal">true</span>) <span class="hljs-keyword">then</span> <span class="hljs-keyword">return</span> <span class="hljs-built_in">load</span>(<span class="hljs-string">&#x27;async_nvim&#x27;</span>) <span class="hljs-keyword">end</span><br>    <span class="hljs-keyword">if</span> src:<span class="hljs-built_in">find</span>(<span class="hljs-string">&#x27;nvim-ufo&#x27;</span>, <span class="hljs-number">1</span>, <span class="hljs-literal">true</span>) <span class="hljs-keyword">then</span> <span class="hljs-keyword">return</span> <span class="hljs-built_in">load</span>(<span class="hljs-string">&#x27;promise&#x27;</span>) <span class="hljs-keyword">end</span><br><br>    <span class="hljs-keyword">if</span> src:<span class="hljs-built_in">find</span>(<span class="hljs-string">&#x27;fundo&#x27;</span>, <span class="hljs-number">1</span>, <span class="hljs-literal">true</span>) <span class="hljs-keyword">then</span> <span class="hljs-keyword">return</span> <span class="hljs-built_in">load</span>(<span class="hljs-string">&#x27;promise&#x27;</span>) <span class="hljs-keyword">end</span><br>    <span class="hljs-keyword">if</span> src:<span class="hljs-built_in">find</span>(<span class="hljs-string">&#x27;promise-async&#x27;</span>, <span class="hljs-number">1</span>, <span class="hljs-literal">true</span>) <span class="hljs-keyword">then</span> <span class="hljs-keyword">return</span> <span class="hljs-built_in">load</span>(<span class="hljs-string">&#x27;promise&#x27;</span>) <span class="hljs-keyword">end</span><br>  <span class="hljs-keyword">end</span><br>  <span class="hljs-keyword">return</span> <span class="hljs-built_in">load</span>(<span class="hljs-string">&#x27;async_nvim&#x27;</span>)<br><span class="hljs-keyword">end</span><br></code></pre></td></tr></table></figure><p>保存后确保在lazy或者其他插件管理器加载之前加载这个</p>]]>
      </content:encoded>
    </item>
    <item>
      <title>nvim下一些很方便的ex命令</title>
      <link>http://northgreen.github.io/2026/06/04/nvim%E4%B8%8B%E4%B8%80%E4%BA%9B%E5%BE%88%E6%96%B9%E4%BE%BF%E7%9A%84ex%E5%91%BD%E4%BB%A4/</link>
      <description>
        <![CDATA[<p>关于vim（主要用的还是用的nvim）的Ex命令其实算是比较容易被忽略的一个东西</p>
<p>这些东西有时候堪称魔法一般的东，虽说在当时行编辑器的时候这些命令更像是活命的神技</p>
<p>通常情况下来说，ex命令大概由以下组成</p>
<figure]]>
      </description>
      <author>Ictye</author>
      <category domain="http://northgreen.github.io/tags/Linux/">Linux</category>
      <category domain="http://northgreen.github.io/tags/nvim/">nvim</category>
      <pubDate>Thu, 04 Jun 2026 04:45:03 GMT</pubDate>
      <content:encoded>
        <![CDATA[<p>关于vim（主要用的还是用的nvim）的Ex命令其实算是比较容易被忽略的一个东西</p><p>这些东西有时候堪称魔法一般的东，虽说在当时行编辑器的时候这些命令更像是活命的神技</p><p>通常情况下来说，ex命令大概由以下组成</p><figure class="highlight ex"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs ex"><span class="hljs-symbol">:</span>[range] &lt;command&gt; [args]<br></code></pre></td></tr></table></figure><p>表示在range上执行具有args的命令command</p><h2 id="关于vim中的神秘符文">关于vim中的神秘符文</h2><p>vim/nvim 中很容易出现一些令人看不懂的符号，在这里的话列出一部分（混个眼熟）</p><h3 id="关于一些范围的表示">关于一些范围的表示</h3><p>比较常见的就是在visual模式下的两个：<code>'‘&lt;</code>和<code>'&gt;</code>分别代表区间的开始和结束大部分情况下，这个东西都是在visual模式下触发才注意到的</p><p>实际上，这个ex命令的范围可以是：</p><ul><li>某一行：<code>1</code>（指定行号）,<code>0</code>(文件开头)，<code>$</code>末行，<code>’a</code>（某个标记，大写的话是跨文件）</li><li>一个范围，通常是由逗号分割开的两个指定的行号，也可以是<code>%</code>代指从头到尾</li><li>搜索的结果：由<code>\\</code>（向下搜索）或者<code>??</code>（向上搜索）指定，遵循vim拓展的正则语法（大概还是正则），具体的放到了底下说除此之外也可以使用<code>+</code>和<code>-</code>指定偏移的范围</li></ul><h3 id="其他的一些符号">其他的一些符号</h3><p>这里列举一些可能会有用的符号（说不定哪里用上了）</p><ul><li><code>!</code>：放开头是执行命令，如果和命令结合通常代表强制写入，作为子参数也可以说把内容传入给它然后执行，也可以对选中范围进行过滤（奇怪的知识点）</li><li><code>&gt;</code>：重定向输入</li><li><code>&gt;&gt;</code>：追加重定向</li><li><code>&lt;</code>：重定向输出后三个其实比较好理解，和bash里面用的其实差不多，很多时候是为了筛选和分离什么的（什么vim神技巧）</li></ul><h2 id="关于常见的ex命令">关于常见的ex命令</h2><p>关于这些ex命令，很多都是从ed，ex这一路子传下来的，很多命令一个命令就有很多作用,通常来说这些命令的help文档相当。。。。。</p><p>Eg. Writing</p><figure class="highlight vhdl"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br></pre></td><td class="code"><pre><code class="hljs vhdl"><br>==============================================================================<br><span class="hljs-number">4</span>. Writing*writing* *save-<span class="hljs-keyword">file</span>*<br><br><span class="hljs-literal">Note</span>: <span class="hljs-keyword">When</span> the <span class="hljs-symbol">&#x27;write</span>&#x27; option <span class="hljs-keyword">is</span> off, you are <span class="hljs-keyword">not</span> able <span class="hljs-keyword">to</span> write any <span class="hljs-keyword">file</span>.<br><br>*:w* *:write*<br>*E502* *E503* *E504* *E505*<br>*E512* *E514* *E667* *E949*<br>:w[rite] [++opt]Write the whole <span class="hljs-keyword">buffer</span> <span class="hljs-keyword">to</span> the current <span class="hljs-keyword">file</span>.  This <span class="hljs-keyword">is</span><br>the normal way <span class="hljs-keyword">to</span> save changes <span class="hljs-keyword">to</span> a <span class="hljs-keyword">file</span>.  Fails <span class="hljs-keyword">when</span><br><span class="hljs-symbol">&#x27;readonly</span>&#x27; <span class="hljs-keyword">is</span> set <span class="hljs-keyword">or</span> <span class="hljs-keyword">when</span> there <span class="hljs-keyword">is</span> another reason why<br>the <span class="hljs-keyword">file</span> can<span class="hljs-symbol">&#x27;t</span> be written, such as <span class="hljs-keyword">when</span> the parent<br>directory doesn<span class="hljs-symbol">&#x27;t</span> exist (<span class="hljs-keyword">use</span> |++p| <span class="hljs-keyword">to</span> avoid that).<br><span class="hljs-keyword">For</span> ++opt see |++opt|, but only ++p, ++bin, ++nobin,<br>++ff <span class="hljs-keyword">and</span> ++enc are effective.<br><br><br>:w[rite]! [++opt]Like <span class="hljs-string">&quot;:write&quot;</span>, but forcefully write <span class="hljs-keyword">when</span> <span class="hljs-symbol">&#x27;readonly</span>&#x27; <span class="hljs-keyword">is</span><br>set <span class="hljs-keyword">or</span> there <span class="hljs-keyword">is</span> another reason why writing was<br>refused.<br><span class="hljs-literal">Note</span>: This may change the permission <span class="hljs-keyword">and</span> ownership <span class="hljs-keyword">of</span><br>the <span class="hljs-keyword">file</span> <span class="hljs-keyword">and</span> break (symbolic) links.  Add the <span class="hljs-string">&#x27;W&#x27;</span> flag<br><span class="hljs-keyword">to</span> <span class="hljs-symbol">&#x27;cpoptions</span>&#x27; <span class="hljs-keyword">to</span> avoid this.<br><br>:[<span class="hljs-keyword">range</span>]w[rite][!] [++opt]<br>Write the specified lines <span class="hljs-keyword">to</span> the current <span class="hljs-keyword">file</span>.  This<br><span class="hljs-keyword">is</span> unusual, because the <span class="hljs-keyword">file</span> will <span class="hljs-keyword">not</span> contain <span class="hljs-keyword">all</span><br>lines <span class="hljs-keyword">in</span> the <span class="hljs-keyword">buffer</span>.<br><br>*:w_f* *:write_f*<br>......&lt;&lt;省略大概<span class="hljs-number">100</span>多行<br></code></pre></td></tr></table></figure><p>基本上是一个命令有很多用法，而帮助文档需要尽可能详尽地讲清楚（但是越看越糊涂）导致的</p><p>对于这个blog的话更多是面向已经很熟悉nvim/vim的,不太可能r,w,d,i这些基础的命令也不知道，这个blog的话只讲一些奇怪神技（</p><h3 id="执行，过滤以及外部命令（-符号）">执行，过滤以及外部命令（!符号）</h3><p>没错，第一个讲的符号就是!符号</p><p>是一个很典型的在vim中出现二义性的符号，很多时候能写出容易让人看不懂的东西</p><p>OK，先说一下它的正常的用法：</p><figure class="highlight vim"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs vim">:w!  -&gt; 强制<br>:!bash -&gt;执行命令<br></code></pre></td></tr></table></figure><p>这两个是比较基本的，然后就是很少会有初学教程会提到的用法：</p><figure class="highlight vim"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs vim">:[<span class="hljs-built_in">range</span>]!<span class="hljs-symbol">&lt;command&gt;</span><br>eg.<br>:%xxd -&gt;变为<span class="hljs-number">16</span>进制视图<br>:%xxd -r -&gt;变回来<br>:‘&lt;,<span class="hljs-string">&#x27;&gt;!xargs bash -c -&gt;将选中的命令当作bash命令执行并且替换成指定的结果</span><br></code></pre></td></tr></table></figure><p>可能不是很能被理解，实际上是运行指定的命令然后将范围内的的内容以stdin的形式发送给这个程序并且使用这个程序的stdout替换给定的范围内的命令</p><p>可能说的比较绕其实也就是：「范围内的内容」-&gt; 「这个命令」-&gt;「粘贴回来」</p><p>再配合<code>xargs</code>等命令总会有点奇怪的用法（</p><h3 id="对于w，e这些命令的参数">对于w，e这些命令的参数</h3><p>其实这个文档讲的比较详细不过用的比较少一点，这里直接贴出来不作过多的解释</p><p>经常用来临时覆盖一些文件的设置比如临时保存为其他的编码什么的其实这方面是很有用的</p><figure class="highlight pgsql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><code class="hljs pgsql">The [++opt] argument can be used <span class="hljs-keyword">to</span> <span class="hljs-keyword">set</span> <span class="hljs-keyword">some</span> <span class="hljs-keyword">options</span> <span class="hljs-keyword">for</span> one command, <span class="hljs-keyword">and</span> <span class="hljs-keyword">to</span><br>specify the behavior <span class="hljs-keyword">for</span> bad characters.  The form <span class="hljs-keyword">is</span>: &gt;<br>++&#123;optname&#125;<br><span class="hljs-keyword">Or</span>: &gt;<br>++&#123;optname&#125;=&#123;<span class="hljs-keyword">value</span>&#125;<br><br><span class="hljs-keyword">Where</span> &#123;optname&#125; <span class="hljs-keyword">is</span> one <span class="hljs-keyword">of</span>:    *++ff* *++enc* *++bin* *++nobin* *++edit*<br>    ff     <span class="hljs-keyword">or</span>  fileformat   overrides <span class="hljs-string">&#x27;fileformat&#x27;</span><br>    enc    <span class="hljs-keyword">or</span>  <span class="hljs-keyword">encoding</span>    overrides <span class="hljs-string">&#x27;fileencoding&#x27;</span><br>    bin    <span class="hljs-keyword">or</span>  binary    sets <span class="hljs-string">&#x27;binary&#x27;</span><br>    nobin  <span class="hljs-keyword">or</span>  nobinary    resets <span class="hljs-string">&#x27;binary&#x27;</span><br>    bad    specifies behavior <span class="hljs-keyword">for</span> bad characters<br>    edit    <span class="hljs-keyword">for</span> |:<span class="hljs-keyword">read</span>|: keeps <span class="hljs-keyword">options</span> <span class="hljs-keyword">as</span> <span class="hljs-keyword">if</span> editing a file<br>    p    <span class="hljs-keyword">for</span> |:<span class="hljs-keyword">write</span>|: creates the fil<span class="hljs-string">e&#x27;s parent directory</span><br><span class="hljs-string"></span><br><span class="hljs-string">&#123;value&#125; cannot contain whitespace.  It can be any valid value for the options.</span><br><span class="hljs-string">Examples: &gt;</span><br><span class="hljs-string">:e ++ff=unix</span><br><span class="hljs-string">This edits the same file again with &#x27;</span>fileformat<span class="hljs-string">&#x27; set to &quot;unix&quot;. &gt;</span><br><span class="hljs-string"></span><br><span class="hljs-string">:w ++enc=latin1 newfile</span><br><span class="hljs-string">This writes the current buffer to &quot;newfile&quot; in latin1 format.</span><br><span class="hljs-string"></span><br><span class="hljs-string">The message given when writing a file will show &quot;[converted]&quot; when</span><br><span class="hljs-string">&#x27;</span>fileencoding<span class="hljs-string">&#x27; or the value specified with ++enc differs from &#x27;</span><span class="hljs-keyword">encoding</span><span class="hljs-string">&#x27;.</span><br><span class="hljs-string"></span><br><span class="hljs-string">There may be several ++opt arguments, separated by whitespace.  They must all</span><br><span class="hljs-string">appear before any |+cmd| argument.</span><br></code></pre></td></tr></table></figure><h3 id="匹配">匹配</h3><p>这一部分应该放到开头说的，不过这样子的开头可能有点啰嗦</p><p>这就另一个vim很有趣的东西基本上符合正则表达式的比如说常见的通配什么的</p><p>不过的话一些特殊的符号比如说是括号方括号什么的需要换成<code>\(</code>这样子的（否则vim默认是认为你想要搜索的是普通字符）或者直接使用very magic模式（开头加入<code>\v</code>）</p><p>实际上的话vim的这个虽然大体上遵循正则的模式但是其实这个东西是它自己实现的一套引擎，而不是PCRE标准（挖坑）</p>]]>
      </content:encoded>
    </item>
    <item>
      <title>关于Linux下的剪切板</title>
      <link>http://northgreen.github.io/2026/05/26/%E5%85%B3%E4%BA%8ELinux%E4%B8%8B%E7%9A%84%E5%89%AA%E5%88%87%E6%9D%BF/</link>
      <description>
        <![CDATA[<p>Linux下的剪切板的方案的话话其实也就是两种：主选取（PRIMARY）和真正的剪切板（wl-clipboard）</p>
<h2]]>
      </description>
      <author>Ictye</author>
      <category domain="http://northgreen.github.io/tags/Linux/">Linux</category>
      <pubDate>Tue, 26 May 2026 06:17:52 GMT</pubDate>
      <content:encoded>
        <![CDATA[<p>Linux下的剪切板的方案的话话其实也就是两种：主选取（PRIMARY）和真正的剪切板（wl-clipboard）</p><h2 id="剪切板">剪切板</h2><p>这个东西的话wayland下的话提供者还是桌面环境实现的协议以及wl-clipboard提供工具来操作，其实很多时候用的剪切命令什么的（C-c；C-v） 这些都是它</p><p>这个cli东西其实同时提供了两个命令：<code>wl-copy</code>和<code>wl-paste</code>来在命令行实现剪切和粘贴（一个接受管道输入到剪切板，另一个在调用的时候输出内容），其实这个东西没有什么特别好说的</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><code class="hljs sh"><br><span class="hljs-variable">$wl</span>-<span class="hljs-built_in">paste</span> -h<br>Usage:<br>wl-paste [options]<br>Paste content from the Wayland clipboard.<br><br>Options:<br>-n, --no-newlineDo not append a newline character.<br>-l, --list-typesInstead of pasting, list the offered types.<br>-p, --primaryUse the <span class="hljs-string">&quot;primary&quot;</span> clipboard.<br>-w, --watch <span class="hljs-built_in">command</span>Run a <span class="hljs-built_in">command</span> each <span class="hljs-keyword">time</span> the selection changes.<br>-t, --<span class="hljs-built_in">type</span> mime/typeOverride the inferred MIME <span class="hljs-built_in">type</span> <span class="hljs-keyword">for</span> the content.<br>-s, --seat seat-namePick the seat to work with.<br>-v, --versionDisplay version info.<br>-h, --<span class="hljs-built_in">help</span>Display this message.<br>Mandatory arguments to long options are mandatory <span class="hljs-keyword">for</span> short options too.<br><br>See wl-clipboard(1) <span class="hljs-keyword">for</span> more details.<br></code></pre></td></tr></table></figure><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><code class="hljs sh"><span class="hljs-variable">$wl</span>-copy -h<br><br>Usage:<br>wl-copy [options] text to copy<br>wl-copy [options] &lt; file-to-copy<br><br>Copy content to the Wayland clipboard.<br><br>Options:<br>-o, --paste-onceOnly serve one <span class="hljs-built_in">paste</span> request and <span class="hljs-keyword">then</span> <span class="hljs-built_in">exit</span>.<br>-f, --foregroundStay <span class="hljs-keyword">in</span> the foreground instead of forking.<br>-c, --clearInstead of copying, clear the clipboard.<br>-p, --primaryUse the <span class="hljs-string">&quot;primary&quot;</span> clipboard.<br>-n, --trim-newlineDo not copy the trailing newline character.<br>-t, --<span class="hljs-built_in">type</span> mime/typeOverride the inferred MIME <span class="hljs-built_in">type</span> <span class="hljs-keyword">for</span> the content.<br>    --sensitiveHint that the content is sensitive.<br>-s, --seat seat-namePick the seat to work with.<br>-v, --versionDisplay version info.<br>-h, --<span class="hljs-built_in">help</span>Display this message.<br>Mandatory arguments to long options are mandatory <span class="hljs-keyword">for</span> short options too.<br><br>See wl-clipboard(1) <span class="hljs-keyword">for</span> more details.<br></code></pre></td></tr></table></figure><p>更多的自己看manpage（</p><h2 id="PRIMARY缓冲区">PRIMARY缓冲区</h2><p>这个东西的话比较冷门一些，大部分人从Windows转到Linux都不太会知道的东西（甚至我也是看了wiki才知道的）当你选中文字的时候，就会将这一段内容自动地放入这个缓冲区里，并且当你按下中键的时候就会将选中的东西粘贴进去，属于是和剪切板并行的另外一套机制，很久了，但是现在的桌面环境仍然保留它</p><p>对于操作这东西的命令其实上面的有提到（没错，还是wl-copy/paste）</p><h2 id="剪切板管理器">剪切板管理器</h2><p>看完上面的到这里可能问题其实更多了，毕竟Winsows下可能是真实感觉到剪切板这么个东西，尤其是比较新生代的可能入手win10以上都是有剪切板历史的显示的，这就会有一种『能看到剪切板』的错觉</p><p>但是实际上再往上的是没有这个东西的，很多时候是靠像是CopyQ来实现这个剪切板历史的</p><p>没错，这里提到的CopyQ，其实在Linux下也可以作为代替的剪切板历史的方案之一，除此之外还有很多其他的提供者（甚至你自己使用rofi和一个常驻的脚本也能实现），这种把剪切板里的内容显示出来的才是剪切板管理器，实际上无论是剪切板还是PRIMARY选区，这些机制其实还是桌面环境实现的（</p><p>嗯，感觉差不多说的很详细了（）也就到这里了</p>]]>
      </content:encoded>
    </item>
    <item>
      <title>关于让Agent自进化以及更好的编码的经验与个人总结的最佳实践</title>
      <link>http://northgreen.github.io/2026/05/19/%E5%85%B3%E4%BA%8E%E8%AE%A9Agent%E8%87%AA%E8%BF%9B%E5%8C%96%E4%BB%A5%E5%8F%8A%E6%9B%B4%E5%A5%BD%E7%9A%84%E7%BC%96%E7%A0%81%E7%9A%84%E7%BB%8F%E9%AA%8C/</link>
      <description>
        <![CDATA[<p>最近的话还是不可避免地大规模地使用ai工具进行编码工作，总体上来说的话这东西很大程度上加快了新的功能的迭代速度
不过的话市面上的其实都不是非常满意，很大程度上这种工具是需要你深度自定义，拥有自己的工作流的（也有可能是我走
的路线是AI赋能加速工作流的路线）</p>
<h2]]>
      </description>
      <author>Ictye</author>
      <category domain="http://northgreen.github.io/tags/Agent/">Agent</category>
      <category domain="http://northgreen.github.io/tags/AI/">AI</category>
      <pubDate>Tue, 19 May 2026 15:00:19 GMT</pubDate>
      <content:encoded>
        <![CDATA[<p>最近的话还是不可避免地大规模地使用ai工具进行编码工作，总体上来说的话这东西很大程度上加快了新的功能的迭代速度不过的话市面上的其实都不是非常满意，很大程度上这种工具是需要你深度自定义，拥有自己的工作流的（也有可能是我走的路线是AI赋能加速工作流的路线）</p><h2 id="概述AI编码工具的使用">概述AI编码工具<sup class="footnote-ref"><a href="#fn1" id="fnref1">[1]</a></sup>的使用</h2><blockquote><p>文化工作者一定要有文化<sup class="footnote-ref"><a href="#fn2" id="fnref2">[2]</a></sup></p></blockquote><p>这方面比较值得注意到是自己也需要对做的东西有基本的认知的（如果没有你也可以让AI帮你有），经典的谬误是小白也能使用这种工具完成这方面的项目</p><p>这方面固然是现在更多工具努力的方向，但是这件事情本身存在一个盲点就是小白不可能会知道AI写出来的是什么东西，AI提出的方案也大概率不会懂，AI写出什么就是什么了而不会对AI工具产生的一些隐患产生一丝一毫的察觉</p><p>换句话说，现在的AI工具并不对它写出来的东西的质量和安全性进行担保，而生产级项目忽略这两个将会是一个巨大的灾难</p><blockquote><p>其实即使AI工具担保了这些，对于小白来说很大概率因为规范和安全意识的缺失也会酿成大错，经典的死法就是密码上传github,对于这种完全阻止不了，对于教育铺开这些东西想都不用想，一眼假的诈骗网站和流氓软件还有那么多人中招甚至解压缩都不会的让它们有这种意识还不如直接教毛驴用ai工具</p></blockquote><p>除此之外，AI工具也有以下几点痛点，这些东西其他大佬也都在反复提及：</p><ul><li>AI没有从工作中学习</li><li>过度编码</li><li>喜欢把一个文件堆成屎</li><li>经常把好的功能改坏</li><li>审美太差</li><li>不喜欢遵守一些项目里面已有的规范</li></ul><p>如果你是比较喜欢抄作业的你可以先参考我的<code>AGENTS.md</code>(也借鉴了很多其他的项目)<a href="https://northgreen.github.io/ictye-public-note/%E4%B8%80%E4%B8%AA%E8%87%AA%E7%94%A8%E7%9A%84AGENTS.md">https://northgreen.github.io/ictye-public-note/一个自用的AGENTS.md</a></p><h2 id="对于更好的编码">对于更好的编码</h2><p>对于解决AI不遵守规范的事情，我个人建议是直接对AI立下规矩 这里是直接告诉AI如何提问，遇到违背事实的时候应该怎么做 最重要的是，当AI发现有不对的地方的时候，应该让它坦诚地说出来而不是隐瞒</p><p>其实相反的，对于操作者来说，如果AI有什么偏离你预定的东西或者有你不喜欢的行为也应该及时地归纳并且写入到AGENTS.md (虽说如果不勤快地整理的话就可能让整个文档看起来一团糟)</p><p>然后是对于如何约束AI写代码的事情：虽说如果不约束ai也有可能写好的代码但是ai写好的代码又不太可能</p><p>首先代码规范固然重要，这方面写一个skill然后强制AI每次编码的时候读取它就可以（这方面对于人来说，其实叫做最佳实践同样的，AI也是需要最佳时间才能写好项目的）个人的方向是</p><ul><li>通用的编码规范比如oop规范和函数式规范</li><li>另外再加上前端规范等等总的来说就能够有很好的效果了</li></ul><p>然后就是一些其他大佬提过的：</p><ul><li>红绿测试</li><li>编码之前思考</li><li>简单至上</li><li>精准修改</li></ul><h2 id="对于更好的工作流">对于更好的工作流</h2><p>首先要明确的是人要把控开发方向而不是让工具去把控开发方向，即使让AI自己头脑风暴，也有很打概率并不会把一件事情做的很好（上面说的审美太差也是这个原因）</p><p>首先一定要先让AI制定计划然后经过审阅再去做（这方面借鉴了其他人的插件完成的） 或者说是一定要先对齐需求再执行</p><p>然后AI写出来的东西也应该看个大概，至少是要知道做了什么的程度</p><p>不过尽管如此，是无法阻止AI犯错的，AI犯错这件事并不是AI能力的事情而是一个工作流程的事情，要做的事情也很简单，就是让AI也使用VCS，管理自己的版本</p><p>除此之外，就是多AGENT分工，让主agent负责调度，而其他agent负责各个任务，值得注意的是，一定要用负责review的agent，就像是裁判不能是运动员一样，自己制定规则自己实施100%会导致AI自我信心爆棚而不去发现真正的问题</p><h2 id="让AI学习">让AI学习</h2><p>不过光有这些其实并不充足，如果AI不能够从中学习的话该有的问题永远会有</p><p>好在这方面已经有openclaw和hermes的实践，这些经验可以直接归纳到ai coding工具里</p><p>这里通过一些图记忆插件以及自己制作的一些拓展，也大概实现了这两个：</p><ul><li>让AI记住发生过什么</li><li>让AI总结经验</li></ul><p>大概就是提醒AI在任务完成之后，进行复盘，遇到什么坑有什么新的发现都写到记忆里，有什么更好的工作方式就归纳成skill</p><p>不过其实比较想要尽力地去做的点是如何让AI也能归纳用户画像，虽说这个还是没有做到</p><hr class="footnotes-sep"><section class="footnotes"><ol class="footnotes-list"><li id="fn1" class="footnote-item"><p>这里的AI编码工具无特殊说明指的都是是opencode，但是很多东西可以泛化到其他工具的 <a href="#fnref1" class="footnote-backref">↩︎</a></p></li><li id="fn2" class="footnote-item"><p>金正恩说的一句话，感觉和这里的主题很契合 <a href="#fnref2" class="footnote-backref">↩︎</a></p></li></ol></section>]]>
      </content:encoded>
    </item>
    <item>
      <title>Obsidian 特性全面测试</title>
      <link>http://northgreen.github.io/2026/05/12/obsidian-features/</link>
      <description>
        <![CDATA[<p>本文用于全面测试博客中已实现的 Obsidian 兼容特性。每个章节对应一项特性，请逐项确认渲染是否正确。</p>
<hr>
<h2 id="1-高亮（text）">1. 高亮（<mark>text</mark>）</h2>
<p>Obsidian 使用]]>
      </description>
      <author>Ictye</author>
      <category domain="http://northgreen.github.io/categories/%E6%B5%8B%E8%AF%95/">测试</category>
      <category domain="http://northgreen.github.io/tags/obsidian/">obsidian</category>
      <category domain="http://northgreen.github.io/tags/%E6%B5%8B%E8%AF%95/">测试</category>
      <category domain="http://northgreen.github.io/tags/markdown/">markdown</category>
      <pubDate>Tue, 12 May 2026 16:00:00 GMT</pubDate>
      <content:encoded>
        <![CDATA[<p>本文用于全面测试博客中已实现的 Obsidian 兼容特性。每个章节对应一项特性，请逐项确认渲染是否正确。</p><hr><h2 id="1-高亮（text）">1. 高亮（<mark>text</mark>）</h2><p>Obsidian 使用 <code>==text==</code> 语法来实现文本高亮。以下是一些测试用例：</p><ul><li>这是普通文本，这是 <mark>高亮文本</mark>，这是普通文本。</li><li>多个高亮：<mark>第一个高亮</mark> 和 <mark>第二个高亮</mark> 相邻。</li><li>行内高亮混合：<strong>粗体</strong> 和 <mark>高亮</mark> 和 <em>斜体</em> 同时使用。</li><li>长句中的高亮：这个句子中只有 <mark>这几个字</mark> 被高亮标记出来。</li></ul><hr><h2 id="2-Emoji">2. Emoji</h2><p>Obsidian 支持通过 <code>:emoji_name:</code> 语法插入 Emoji。以下是一些常用 Emoji：</p><ul><li>😄 微笑</li><li>❤️ 爱心</li><li>🚀 火箭</li><li>🔥 火焰</li><li>⭐ 星星</li><li>👍 点赞</li><li>👏 鼓掌</li><li>👋 挥手</li><li>🐛 虫子</li><li>💻 电脑</li><li>📖 书籍</li><li>💡 灯泡（灵感）</li></ul><p>组合使用：🚀 🔥 ⭐ 这应该显示三个连续的 Emoji。</p><hr><h2 id="3-数学公式">3. 数学公式</h2><h3 id="行内公式">行内公式</h3><p>行内公式使用 <code>$...$</code> 包裹：</p><ul><li>爱因斯坦的质能方程：$E = mc^2$</li><li>勾股定理：$a^2 + b^2 = c^2$</li><li>欧拉公式：$e^{i\pi} + 1 = 0$</li><li>希腊字母：$\alpha, \beta, \gamma, \delta, \epsilon$</li><li>高斯积分：$\int_{-\infty}^{\infty} e^{-x^2} dx = \sqrt{\pi}$</li><li>导数：$\frac{d}{dx}e^x = e^x$</li></ul><h3 id="块级公式">块级公式</h3><p>块级公式使用 <code>$$...$$</code> 包裹：</p><p>$$\sum_{i=1}^{n} x_i = \frac{n(n+1)}{2}$$</p><p>$$\lim_{n \to \infty} \left(1 + \frac{1}{n}\right)^n = e$$</p><p>$$\oint_C \mathbf{E} \cdot d\mathbf{l} = -\frac{d}{dt} \int_S \mathbf{B} \cdot d\mathbf{A}$$</p><hr><h2 id="4-脚注">4. 脚注</h2><p>Obsidian 支持使用 <code>[^n]</code> 语法添加脚注。</p><p>这是一个带有脚注的句子<sup class="footnote-ref"><a href="#fn1" id="fnref1">[1]</a></sup>。这里还有一个脚注<sup class="footnote-ref"><a href="#fn2" id="fnref2">[2]</a></sup>。</p><p>脚注也可以出现在句子中间<sup class="footnote-ref"><a href="#fn3" id="fnref3">[3]</a></sup>，像这样。</p><hr><h2 id="5-Wikilink-双向链接">5. Wikilink 双向链接</h2><p>Obsidian 的 Wikilink 语法使用 <code>&lt;span class=&quot;wikilink-broken&quot; data-wikilink=&quot;双括号&quot;&gt;[[双括号]]&lt;/span&gt;</code> 实现内部链接。</p><h3 id="基础链接">基础链接</h3><ul><li><span class="wikilink-broken" data-wikilink="Hello World">[[Hello World]]</span> — 指向已存在的「Hello World」文章</li><li><a href="/2026/05/12/qwq/vev/test/">test</a> — 指向已存在的「test」页面</li><li><a href="/about.html">About</a> — 指向已存在的「About」页面</li></ul><h3 id="带别名的链接">带别名的链接</h3><ul><li><span class="wikilink-broken" data-wikilink="Hello World">[[Hello World]]</span> — 显示别名「点我回首页」，实际指向 Hello World</li><li><a href="/about.html">关于页面</a> — 显示别名「关于页面」，实际指向 About</li></ul><h3 id="带标题锚点的链接">带标题锚点的链接</h3><ul><li><span class="wikilink-broken" data-wikilink="Hello World">[[Hello World]]</span> — 指向 Hello World 文章的 Welcome 标题</li><li><a href="/2026/05/12/qwq/vev/test/#Section">test</a> — 指向 test 文章的 Section 标题</li></ul><h3 id="损坏的链接（断链）">损坏的链接（断链）</h3><ul><li><span class="wikilink-broken" data-wikilink="不存在的页面">[[不存在的页面]]</span> — 此页面不存在，应显示为红色虚线边框的断链样式</li><li><span class="wikilink-broken" data-wikilink="这是一个不存在的页面">[[这是一个不存在的页面]]</span> — 带别名的断链</li></ul><hr><h2 id="6-Embed-嵌入">6. Embed 嵌入</h2><p>Obsidian 使用 <code>&lt;span class=&quot;embed-broken&quot; data-embed=&quot;Page&quot;&gt;![Page]&lt;/span&gt;</code> 语法嵌入其他页面内容。</p><h3 id="嵌入已有页面">嵌入已有页面</h3><div class="wikilink-embed"><div class="wikilink-embed-header"><a href="/about.html"><svg viewBox="0 0 24 24" width="16" height="16" fill="currentColor"><path d="M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"/></svg> About</a></div><div class="wikilink-embed-body"><p><a href="/about.html">查看 About</a></p></div></div><p>上面是 About 页面的嵌入内容。</p><p><span class="embed-broken" data-embed="Hello World">![Hello World]</span></p><p>上面是 Hello World 文章的嵌入内容。</p><h3 id="嵌入不存在的页面（断链嵌入）">嵌入不存在的页面（断链嵌入）</h3><p><span class="embed-broken" data-embed="不存在的页面">![不存在的页面]</span></p><p>上面应该显示为错误嵌入样式。</p><hr><h2 id="7-Callout-警告框（12-种类型全覆盖）">7. Callout 警告框（12 种类型全覆盖）</h2><p>以下是全部 12 种 Callout 类型的完整测试：</p><h3 id="7-1-Note">7.1 Note</h3><div class="callout callout-note"><div class="callout-title"><i class="ri-information-line"></i>笔记提示</div><div class="callout-content"><p>这是一条 note 类型的 callout。它用于显示一般的笔记信息。这里还有第三行内容以供测试。</p></div></div><h3 id="7-2-Tip">7.2 Tip</h3><div class="callout callout-tip"><div class="callout-title"><i class="ri-lightbulb-line"></i>小贴士</div><div class="callout-content"><p>这是一条 tip 类型的 callout。它用于给用户提供实用的建议和小技巧。记得在合适的时候使用这个类型。</p></div></div><h3 id="7-3-Warning">7.3 Warning</h3><div class="callout callout-warning"><div class="callout-title"><i class="ri-alert-line"></i>注意事项</div><div class="callout-content"><p>这是一条 warning 类型的 callout。用于提醒用户注意潜在的问题。请仔细阅读这里的每一条内容。</p></div></div><h3 id="7-4-Danger">7.4 Danger</h3><div class="callout callout-danger"><div class="callout-title"><i class="ri-error-warning-line"></i>危险警告</div><div class="callout-content"><p>这是一条 danger 类型的 callout。用于显示高风险或不可逆操作的警告。请务必在操作前确认所有条件。</p></div></div><h3 id="7-5-Info">7.5 Info</h3><div class="callout callout-info"><div class="callout-title"><i class="ri-information-line"></i>信息来源</div><div class="callout-content"><p>这是一条 info 类型的 callout。用于提供额外的背景信息或参考资料。更多详情请查阅官方文档。</p></div></div><h3 id="7-6-Question">7.6 Question</h3><div class="callout callout-question"><div class="callout-title"><i class="ri-question-line"></i>思考问题</div><div class="callout-content"><p>这是一条 question 类型的 callout。用于提出值得思考的问题。为什么 callout 的样式如此重要？</p></div></div><h3 id="7-7-Example">7.7 Example</h3><div class="callout callout-example"><div class="callout-title"><i class="ri-flask-line"></i>代码示例</div><div class="callout-content"><p>这是一条 example 类型的 callout。用于展示实际的代码或操作示例。</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs javascript"><span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">&quot;Hello from callout!&quot;</span>);<br></code></pre></td></tr></table></figure></div></div><h3 id="7-8-Quote">7.8 Quote</h3><div class="callout callout-quote"><div class="callout-title"><i class="ri-double-quotes-l"></i>名人名言</div><div class="callout-content"><p>这是一条 quote 类型的 callout。用于引用名人名言或重要文献。「学而不思则罔，思而不学则殆。」—— 孔子</p></div></div><h3 id="7-9-Todo">7.9 Todo</h3><div class="callout callout-todo"><div class="callout-title"><i class="ri-checkbox-circle-line"></i>待办事项</div><div class="callout-content"><p>这是一条 todo 类型的 callout。</p><ul><li>[x] 实现高亮语法</li><li>[x] 实现 Emoji</li><li>[ ] 完善测试文章</li><li>[ ] 部署到生产环境</li></ul></div></div><h3 id="7-10-Important">7.10 Important</h3><div class="callout callout-important"><div class="callout-title"><i class="ri-star-line"></i>重要提示</div><div class="callout-content"><p>这是一条 important 类型的 callout。用于标记最关键、最需要关注的信息。请优先阅读此处的全部内容。</p></div></div><h3 id="7-11-Summary">7.11 Summary</h3><div class="callout callout-summary"><div class="callout-title"><i class="ri-file-list-3-line"></i>内容摘要</div><div class="callout-content"><p>这是一条 summary 类型的 callout。用于对前文内容进行概括性总结。本文全面测试了博客的 Obsidian 特性兼容性。</p></div></div><h3 id="7-12-Abstract">7.12 Abstract</h3><div class="callout callout-abstract"><div class="callout-title"><i class="ri-file-list-2-line"></i>文章摘要</div><div class="callout-content"><p>这是一条 abstract 类型的 callout。类似于 summary，用于展示文章的概要信息。本文涵盖了高亮、Emoji、数学公式、脚注、Wikilink、嵌入、Callout、Mermaid 图表等多种特性。</p></div></div><hr><h2 id="8-Mermaid-图表">8. Mermaid 图表</h2><h3 id="8-1-流程图-Flowchart">8.1 流程图 (Flowchart)</h3><div class="mermaid">graph TD    A[开始] --> B{判断}    B -->|是| C[处理]    B -->|否| D[结束]    C --> D</div><h3 id="8-2-时序图-Sequence-Diagram">8.2 时序图 (Sequence Diagram)</h3><div class="mermaid">sequenceDiagram    Alice->>John: 你好 John    John->>Alice: 你好 Alice    Alice->>John: 今天天气不错    John->>Alice: 是啊，适合出门散步</div><h3 id="8-3-甘特图-Gantt-Chart">8.3 甘特图 (Gantt Chart)</h3><div class="mermaid">gantt    title 项目计划    dateFormat  YYYY-MM-DD    section 开发    需求分析     :a1, 2026-01-01, 30d    编码实现     :a2, after a1, 20d    单元测试     :a3, after a2, 15d    section 部署    测试环境     :b1, after a3, 7d    生产环境     :b2, after b1, 3d</div><h3 id="8-4-类图-Class-Diagram">8.4 类图 (Class Diagram)</h3><div class="mermaid">classDiagram    Animal <|-- Duck    Animal <|-- Fish    Animal <|-- Zebra    Animal : +int age    Animal : +String gender    Animal: +isMammal()    Animal: +mate()    class Duck{        +String beakColor        +swim()        +quack()    }    class Fish{        -int sizeInFeet        -canEat()    }    class Zebra{        +bool is_wild        +run()    }</div><hr><h2 id="9-普通引用">9. 普通引用</h2><p>以下是一条普通的引用，它<strong>不应该</strong>被渲染为 callout 样式：</p><blockquote><p>这是一条普通的引用，不是 callout。它应该显示为普通的引用样式，带有左侧的引用竖线。这里的文本没有任何特殊的图标或背景颜色。</p></blockquote><hr><h2 id="10-代码块语法高亮">10. 代码块语法高亮</h2><h3 id="JavaScript">JavaScript</h3><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><code class="hljs javascript"><span class="hljs-keyword">function</span> <span class="hljs-title function_">greet</span>(<span class="hljs-params">name</span>) &#123;<br>  <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">`Hello, <span class="hljs-subst">$&#123;name&#125;</span>!`</span>);<br>&#125;<br><br><span class="hljs-comment">// 斐波那契数列</span><br><span class="hljs-keyword">function</span> <span class="hljs-title function_">fibonacci</span>(<span class="hljs-params">n</span>) &#123;<br>  <span class="hljs-keyword">if</span> (n &lt;= <span class="hljs-number">1</span>) <span class="hljs-keyword">return</span> n;<br>  <span class="hljs-keyword">return</span> <span class="hljs-title function_">fibonacci</span>(n - <span class="hljs-number">1</span>) + <span class="hljs-title function_">fibonacci</span>(n - <span class="hljs-number">2</span>);<br>&#125;<br><br><span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-title function_">fibonacci</span>(<span class="hljs-number">10</span>)); <span class="hljs-comment">// 输出: 55</span><br></code></pre></td></tr></table></figure><h3 id="Python">Python</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">def</span> <span class="hljs-title function_">fibonacci</span>(<span class="hljs-params">n</span>):<br>    <span class="hljs-keyword">if</span> n &lt;= <span class="hljs-number">1</span>:<br>        <span class="hljs-keyword">return</span> n<br>    <span class="hljs-keyword">return</span> fibonacci(n-<span class="hljs-number">1</span>) + fibonacci(n-<span class="hljs-number">2</span>)<br><br><span class="hljs-comment"># 列表推导式示例</span><br>squares = [x**<span class="hljs-number">2</span> <span class="hljs-keyword">for</span> x <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-number">10</span>)]<br><span class="hljs-built_in">print</span>(squares)  <span class="hljs-comment"># 输出: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]</span><br><br><span class="hljs-comment"># 装饰器示例</span><br><span class="hljs-keyword">def</span> <span class="hljs-title function_">decorator</span>(<span class="hljs-params">func</span>):<br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">wrapper</span>(<span class="hljs-params">*args, **kwargs</span>):<br>        <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;调用前&quot;</span>)<br>        result = func(*args, **kwargs)<br>        <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;调用后&quot;</span>)<br>        <span class="hljs-keyword">return</span> result<br>    <span class="hljs-keyword">return</span> wrapper<br><br><span class="hljs-meta">@decorator</span><br><span class="hljs-keyword">def</span> <span class="hljs-title function_">say_hello</span>():<br>    <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;你好！&quot;</span>)<br></code></pre></td></tr></table></figure><h3 id="CSS">CSS</h3><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><code class="hljs css"><span class="hljs-selector-class">.container</span> &#123;<br>  <span class="hljs-attribute">display</span>: flex;<br>  <span class="hljs-attribute">justify-content</span>: center;<br>  <span class="hljs-attribute">align-items</span>: center;<br>  <span class="hljs-attribute">min-height</span>: <span class="hljs-number">100vh</span>;<br>  <span class="hljs-attribute">background</span>: <span class="hljs-built_in">linear-gradient</span>(<span class="hljs-number">135deg</span>, <span class="hljs-number">#667eea</span> <span class="hljs-number">0%</span>, <span class="hljs-number">#764ba2</span> <span class="hljs-number">100%</span>);<br>&#125;<br><br><span class="hljs-selector-class">.card</span> &#123;<br>  <span class="hljs-attribute">padding</span>: <span class="hljs-number">2rem</span>;<br>  <span class="hljs-attribute">border-radius</span>: <span class="hljs-number">8px</span>;<br>  <span class="hljs-attribute">box-shadow</span>: <span class="hljs-number">0</span> <span class="hljs-number">10px</span> <span class="hljs-number">30px</span> <span class="hljs-built_in">rgba</span>(<span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0.1</span>);<br>&#125;<br></code></pre></td></tr></table></figure><h3 id="没有指定语言的代码块">没有指定语言的代码块</h3><figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs">这是一段没有指定语言的纯文本代码块。<br>它应该使用默认的代码块样式进行渲染。<br>前后应该有代码块的背景色和边框。<br></code></pre></td></tr></table></figure><hr><h2 id="11-列表和表格">11. 列表和表格</h2><h3 id="无序列表">无序列表</h3><ul><li>第一项</li><li>第二项</li><li>第三项<ul><li>嵌套项 A</li><li>嵌套项 B<ul><li>更深嵌套 i</li><li>更深嵌套 ii</li></ul></li></ul></li><li>第四项</li></ul><h3 id="有序列表">有序列表</h3><ol><li>第一步：准备工作</li><li>第二步：执行任务</li><li>第三步：检查结果<ol><li>子步骤 A</li><li>子步骤 B</li></ol></li><li>第四步：收尾工作</li></ol><h3 id="Markdown-表格">Markdown 表格</h3><table><thead><tr><th>特性</th><th>状态</th><th>优先级</th><th>备注</th></tr></thead><tbody><tr><td>高亮 (==)</td><td>✅ 已实现</td><td>高</td><td>markdown-it-mark</td></tr><tr><td>Emoji</td><td>✅ 已实现</td><td>中</td><td>markdown-it-emoji</td></tr><tr><td>数学公式</td><td>✅ 已实现</td><td>高</td><td>MathJax</td></tr><tr><td>脚注</td><td>✅ 已实现</td><td>中</td><td>markdown-it-footnote</td></tr><tr><td>Wikilink</td><td>✅ 已实现</td><td>高</td><td>自定义脚本</td></tr><tr><td>Embed</td><td>✅ 已实现</td><td>高</td><td>自定义脚本</td></tr><tr><td>Callout</td><td>✅ 已实现</td><td>高</td><td>markdown-it-container</td></tr><tr><td>Mermaid</td><td>✅ 已实现</td><td>中</td><td>CDN + 初始化脚本</td></tr><tr><td>普通引用</td><td>✅ 原生支持</td><td>—</td><td>标准 Markdown</td></tr><tr><td>代码高亮</td><td>✅ 原生支持</td><td>—</td><td>Hexo 内置</td></tr></tbody></table><hr><h2 id="12-综合混合测试">12. 综合混合测试</h2><p>以下是一个混合多种语法的复杂段落：</p><div class="callout callout-info"><div class="callout-title"><i class="ri-information-line"></i>混合语法示例</div><div class="callout-content"><p>这个 callout 内部包含了多种语法：</p><ul><li>这是 <mark>高亮文字</mark> 和 ⭐ Emoji 的组合</li><li>数学公式：$x^2 + y^2 = z^2$</li><li>内部链接：<span class="wikilink-broken" data-wikilink="Hello World">[[Hello World]]</span></li><li>嵌入页面：<a href="/about.html" class="embed-inline">About</a></li></ul><p>这是一个完整的 <strong>多功能混合段落</strong>，用于测试复杂场景下的渲染兼容性。</p></div></div><p>以及一个带 Mermaid 和代码块的 callout：</p><div class="callout callout-example"><div class="callout-title"><i class="ri-flask-line"></i>综合示例</div><div class="callout-content"><p>下方是一个 Mermaid 流程图：</p><div class="mermaid">graph LR    A[输入] --> B[处理]    B --> C[输出]</div><p>以及一段代码：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;Hello from hybrid test!&quot;</span>)<br></code></pre></td></tr></table></figure></div></div><hr><p><em>测试文章结束。请逐项检查以上所有特性的渲染效果，确保每个特性都按预期显示。</em></p><hr class="footnotes-sep"><section class="footnotes"><ol class="footnotes-list"><li id="fn1" class="footnote-item"><p>这是第一条脚注的定义，包含详细的补充说明。 <a href="#fnref1" class="footnote-backref">↩︎</a></p></li><li id="fn2" class="footnote-item"><p>这是第二条脚注，用于解释某个术语的具体含义。 <a href="#fnref2" class="footnote-backref">↩︎</a></p></li><li id="fn3" class="footnote-item"><p>这是第三条脚注，位于句子中间的情况。 <a href="#fnref3" class="footnote-backref">↩︎</a></p></li></ol></section>]]>
      </content:encoded>
    </item>
    <item>
      <title>test</title>
      <link>http://northgreen.github.io/2026/05/12/qwq/vev/test/</link>
      <description>
        <![CDATA[<p><span class="wikilink-broken" data-wikilink="Hello World">[[Hello]]>
      </description>
      <author>Ictye</author>
      <pubDate>Tue, 12 May 2026 03:37:27 GMT</pubDate>
      <content:encoded>
        <![CDATA[<p><span class="wikilink-broken" data-wikilink="Hello World">[[Hello World]]</span></p>]]>
      </content:encoded>
    </item>
  </channel>
</rss>
