<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Yggdroot (Yggdroot)</title>
    <link>https://ruby-china.org/Yggdroot</link>
    <description/>
    <language>en-us</language>
    <item>
      <title>用 C++14 写了个模糊查找命令行工具</title>
      <description>&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/Yggdroot/d137a17f-d386-4574-b29c-8a23b8355bc7.gif!large" title="" alt=""&gt;
&lt;img src="https://l.ruby-china.com/photo/Yggdroot/3cb2b9ac-2899-4221-845f-9f706338cb8d.gif!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/Yggdroot/Yoyo-leaf" rel="nofollow" target="_blank"&gt;https://github.com/Yggdroot/Yoyo-leaf&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;速度快&lt;/li&gt;
&lt;li&gt;查找准确&lt;/li&gt;
&lt;li&gt;持续更新中&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;欢迎批评指正。&lt;/p&gt;</description>
      <author>Yggdroot</author>
      <pubDate>Thu, 30 Dec 2021 17:21:02 +0800</pubDate>
      <link>https://ruby-china.org/topics/42043</link>
      <guid>https://ruby-china.org/topics/42043</guid>
    </item>
    <item>
      <title>Vim 的模糊查找插件 LeaderF 新功能介绍 (二)</title>
      <description>&lt;h2 id="前言"&gt;前言&lt;/h2&gt;
&lt;p&gt;本文介绍自《&lt;a href="https://ruby-china.org/topics/37961" title=""&gt;vim 的模糊查找插件 LeaderF 新功能介绍&lt;/a&gt;》以后，LeaderF 增加的一些新的功能。&lt;/p&gt;
&lt;h2 id="异步grep Leaderf rg"&gt;异步 grep &lt;code&gt;Leaderf rg&lt;/code&gt;
&lt;/h2&gt;
&lt;p&gt;此功能已经在《&lt;a href="https://ruby-china.org/topics/38001" title=""&gt;vim 的 grep 插件 Leaderf rg：grep 和模糊匹配的完美结合&lt;/a&gt;》做了介绍。
&lt;strong&gt;补充一点&lt;/strong&gt;：应很多用户的要求，现在支持使用&lt;code&gt;Leaderf rg {pattern}&lt;/code&gt;来搜索了，不必使用&lt;code&gt;Leaderf rg -e {pattern}&lt;/code&gt;了。当然，如果想指定多个 pattern，还是需要加上&lt;code&gt;-e&lt;/code&gt;, 比如：&lt;code&gt;Leaderf rg -e foo -e bar&lt;/code&gt;。&lt;/p&gt;
&lt;h2 id="使用gtags导航 Leaderf gtags"&gt;使用 gtags 导航 &lt;code&gt;Leaderf gtags&lt;/code&gt;
&lt;/h2&gt;
&lt;p&gt;此功能已经在《&lt;a href="https://ruby-china.org/topics/38482" title=""&gt;Leaderf gtags：模糊匹配与最强静态符号索引工具的完美结合&lt;/a&gt;》做了介绍。&lt;/p&gt;
&lt;h2 id="增强使用vimL给LeaderF写扩展的功能"&gt;增强使用 vimL 给 LeaderF 写扩展的功能&lt;/h2&gt;
&lt;p&gt;此前只可以为 vim 写，现在也可以为 neovim 写了。具体内容参见：&lt;a href="https://github.com/Yggdroot/LeaderF/issues/144#issuecomment-540008950" rel="nofollow" target="_blank"&gt;https://github.com/Yggdroot/LeaderF/issues/144#issuecomment-540008950&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="Leaderf {cmd} --recall"&gt;&lt;code&gt;Leaderf {cmd} --recall&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;这个命令是在 LeaderF 窗口关闭的情况下，召回最后的搜索结果，&lt;code&gt;{cmd}&lt;/code&gt;可以是 LeaderF 目前支持的所有命令，像 file, mru, rg, gtags 等。例如：使用 &lt;code&gt;Leaderf file --recall&lt;/code&gt; 
&lt;img src="https://l.ruby-china.com/photo/2019/f19423dd-7746-4832-8ff7-4789d1cb0114.gif!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Leaderf --recall&lt;/code&gt; 是召回上一个命令的最后搜索结果。例如，刚使用完&lt;code&gt;Leaderf file&lt;/code&gt;，执行&lt;code&gt;Leaderf --recall&lt;/code&gt; 相当于执行&lt;code&gt;Leaderf file --recall&lt;/code&gt;, 刚使用完&lt;code&gt;Leaderf rg -e foo&lt;/code&gt;, 执行&lt;code&gt;Leaderf --recall&lt;/code&gt; 相当于执行&lt;code&gt;Leaderf rg --recall&lt;/code&gt;。
&lt;img src="https://l.ruby-china.com/photo/2019/bedf79ce-7fa0-4daf-8fb0-36d238aa8ed6.gif!large" title="" alt=""&gt;&lt;/p&gt;
&lt;h2 id="Leaderf file 根据当前buffer名字查询文件"&gt;
&lt;code&gt;Leaderf file&lt;/code&gt; 根据当前 buffer 名字查询文件&lt;/h2&gt;
&lt;p&gt;打开&lt;code&gt;Leaderf file&lt;/code&gt;时，如果没有输入任何查询字符，文件列表会按照最匹配当前 buffer 路径名字来排序。这在某些场景比较有用，比如当前 buffer 名字是&lt;code&gt;foo.go&lt;/code&gt;，想切换到&lt;code&gt;foo_test.go&lt;/code&gt;。
&lt;img src="https://l.ruby-china.com/photo/2019/f09349ac-9c8a-4af1-9740-590ef02b8f9c.gif!large" title="" alt=""&gt;&lt;/p&gt;
&lt;h2 id="Leaderf file 在搜索结果中不显示当前buffer的名字"&gt;
&lt;code&gt;Leaderf file&lt;/code&gt; 在搜索结果中不显示当前 buffer 的名字&lt;/h2&gt;
&lt;p&gt;只要 &lt;code&gt;let g:Lf_IgnoreCurrentBufferName = 1&lt;/code&gt;，缺省会显示。&lt;/p&gt;
&lt;h2 id="使用popup window / floating window 预览"&gt;使用 popup window / floating window 预览&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;let g:Lf_PreviewInPopup = 1&lt;/code&gt; 就可以启用这个功能，缺省未启用。
&lt;code&gt;g:Lf_PreviewHorizontalPosition&lt;/code&gt; 指定 popup window / floating window 的位置。
&lt;code&gt;g:Lf_PreviewPopupWidth&lt;/code&gt; 指定 popup window / floating window 的宽度。
&lt;img src="https://l.ruby-china.com/photo/2019/37cf2469-c5d4-4682-80d8-47aca1a75b26.gif!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2019/e8a02815-83cb-412b-a218-5c1ff81254ba.gif!large" title="" alt=""&gt;&lt;/p&gt;</description>
      <author>Yggdroot</author>
      <pubDate>Mon, 28 Oct 2019 18:05:07 +0800</pubDate>
      <link>https://ruby-china.org/topics/39191</link>
      <guid>https://ruby-china.org/topics/39191</guid>
    </item>
    <item>
      <title>`Leaderf gtags`：模糊匹配与最强静态符号索引工具的完美结合</title>
      <description>&lt;h2 id="Gtags"&gt;Gtags&lt;/h2&gt;
&lt;p&gt;Gtags 也就是&lt;a href="https://www.gnu.org/software/global/global.html" rel="nofollow" target="_blank" title=""&gt;GNU GLOBAL&lt;/a&gt;，是一个非常强大的源码符号索引工具。它通过建立索引数据库，不但可以查找函数的定义，还可以查找函数的所有引用（被调用的地方）；而且它还可以增量地更新索引数据库，当代码有所改变时，它可以在很短的时间内更新索引数据库，保持索引数据库和代码同步。&lt;br&gt;
韦大的 &lt;a href="https://zhuanlan.zhihu.com/p/36279445" rel="nofollow" target="_blank" title=""&gt;Vim 8 中 C/C++ 符号索引：GTags 篇&lt;/a&gt; 对 gtags 有比较详细的介绍，本文再做一些补充。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;GLOBAL-6.6.3 released
Gtags 的最新版本已经是 6.6.3，&lt;a href="http://lists.gnu.org/archive/html/info-global/2018-12/msg00000.html" rel="nofollow" target="_blank" title=""&gt;该版本&lt;/a&gt; fix 了韦大文中提到的 Windows 下面文件名大小写的 bug。&lt;/li&gt;
&lt;li&gt;在 Linux 上，不配置&lt;code&gt;let $GTAGSCONF = '/path/to/share/gtags/gtags.conf'&lt;/code&gt;也可以正常工作。&lt;/li&gt;
&lt;li&gt;当项目文件的路径包含非 ASCII 字符时，使用 pygments 会报&lt;code&gt;UnicodeEncodeError: 'latin-1' codec can't encode characters in position 5-8: ordinal not in range(256)&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="自动生成Gtags索引数据库"&gt;自动生成 Gtags 索引数据库&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/Yggdroot/LeaderF" rel="nofollow" target="_blank" title=""&gt;LeaderF&lt;/a&gt; 可以自己管理 gtags 数据库（GTAGS，GRTAGS，GPATH），它不会在你的项目目录下生成任何额外的文件或目录。gtags 数据库文件存储在&lt;code&gt;$HOME/.LfCache/gtags/%PATH%OF%YOUR%PROJECT/&lt;/code&gt;下面， &lt;code&gt;%PATH%OF%YOUR%PROJECT&lt;/code&gt; 是把你项目路径中的 &lt;code&gt;\&lt;/code&gt; 或 &lt;code&gt;/&lt;/code&gt; 替换成 &lt;code&gt;%&lt;/code&gt;。&lt;br&gt;
只要设置&lt;code&gt;let g:Lf_GtagsAutoGenerate = 1&lt;/code&gt;，LeaderF 就会在打开第一个文件时自动生成 gtags 数据库。当代码有更改并且已经有 gtags 数据库生成时，更改的代码会自动同步到 gtags 数据库（即使&lt;code&gt;g:Lf_GtagsAutoGenerate&lt;/code&gt;是 0）。&lt;br&gt;
只有在项目根目录下有&lt;code&gt;g:Lf_RootMarkers&lt;/code&gt;（默认值是&lt;code&gt;['.git', '.hg', '.svn']&lt;/code&gt;）里面指定的文件或目录时，LeaderF 才会自动生成 gtags 数据库；否则只能手动生成 gtags 数据库：&lt;code&gt;Leaderf gtags --update&lt;/code&gt;，但是当代码有更改时，gtags 数据库依然可以自动更新。&lt;/p&gt;
&lt;h2 id="Leaderf gtags 使用介绍"&gt;Leaderf gtags 使用介绍&lt;/h2&gt;
&lt;p&gt;具体使用方法可以用&lt;code&gt;:Leaderf gtags -h&lt;/code&gt;来查看。&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;usage:
Leaderf[!] gtags &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;-h&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--remove&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--recall&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
Leaderf[!] gtags &lt;span class="nt"&gt;--update&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--gtagsconf&lt;/span&gt; &amp;lt;FILE&amp;gt;] &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--gtagslabel&lt;/span&gt; &amp;lt;LABEL&amp;gt;] &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--accept-dotfiles&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
                 &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--skip-unreadable&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--skip-symlink&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&amp;lt;TYPE&amp;gt;]] &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--gtagslibpath&lt;/span&gt; &amp;lt;PATH&amp;gt; &lt;span class="o"&gt;[&lt;/span&gt;&amp;lt;PATH&amp;gt; ...]]
Leaderf[!] gtags &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--current-buffer&lt;/span&gt; | &lt;span class="nt"&gt;--all-buffers&lt;/span&gt; | &lt;span class="nt"&gt;--all&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--result&lt;/span&gt; &amp;lt;FORMAT&amp;gt;] &lt;span class="o"&gt;[&lt;/span&gt;COMMON_OPTIONS]
Leaderf[!] gtags &lt;span class="nt"&gt;-d&lt;/span&gt; &amp;lt;PATTERN&amp;gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--auto-jump&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&amp;lt;TYPE&amp;gt;]] &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;-i&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--literal&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--path-style&lt;/span&gt; &amp;lt;FORMAT&amp;gt;] &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;-S&lt;/span&gt; &amp;lt;DIR&amp;gt;]
                 &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--append&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--match-path&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--gtagsconf&lt;/span&gt; &amp;lt;FILE&amp;gt;] &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--gtagslabel&lt;/span&gt; &amp;lt;LABEL&amp;gt;] &lt;span class="o"&gt;[&lt;/span&gt;COMMON_OPTIONS]
Leaderf[!] gtags &lt;span class="nt"&gt;-r&lt;/span&gt; &amp;lt;PATTERN&amp;gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--auto-jump&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&amp;lt;TYPE&amp;gt;]] &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;-i&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--literal&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--path-style&lt;/span&gt; &amp;lt;FORMAT&amp;gt;] &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;-S&lt;/span&gt; &amp;lt;DIR&amp;gt;]
                 &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--append&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--match-path&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--gtagsconf&lt;/span&gt; &amp;lt;FILE&amp;gt;] &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--gtagslabel&lt;/span&gt; &amp;lt;LABEL&amp;gt;] &lt;span class="o"&gt;[&lt;/span&gt;COMMON_OPTIONS]
Leaderf[!] gtags &lt;span class="nt"&gt;-s&lt;/span&gt; &amp;lt;PATTERN&amp;gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;-i&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--literal&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--path-style&lt;/span&gt; &amp;lt;FORMAT&amp;gt;] &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;-S&lt;/span&gt; &amp;lt;DIR&amp;gt;] &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--append&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
                 &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--match-path&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--gtagsconf&lt;/span&gt; &amp;lt;FILE&amp;gt;] &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--gtagslabel&lt;/span&gt; &amp;lt;LABEL&amp;gt;] &lt;span class="o"&gt;[&lt;/span&gt;COMMON_OPTIONS]
Leaderf[!] gtags &lt;span class="nt"&gt;-g&lt;/span&gt; &amp;lt;PATTERN&amp;gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;-i&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--literal&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--path-style&lt;/span&gt; &amp;lt;FORMAT&amp;gt;] &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;-S&lt;/span&gt; &amp;lt;DIR&amp;gt;] &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--append&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
                 &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--match-path&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--gtagsconf&lt;/span&gt; &amp;lt;FILE&amp;gt;] &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--gtagslabel&lt;/span&gt; &amp;lt;LABEL&amp;gt;] &lt;span class="o"&gt;[&lt;/span&gt;COMMON_OPTIONS]
Leaderf[!] gtags &lt;span class="nt"&gt;--by-context&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;-i&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--literal&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--path-style&lt;/span&gt; &amp;lt;FORMAT&amp;gt;] &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;-S&lt;/span&gt; &amp;lt;DIR&amp;gt;] &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--append&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
                 &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--match-path&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--gtagsconf&lt;/span&gt; &amp;lt;FILE&amp;gt;] &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--gtagslabel&lt;/span&gt; &amp;lt;LABEL&amp;gt;] &lt;span class="o"&gt;[&lt;/span&gt;COMMON_OPTIONS]

&lt;span class="o"&gt;[&lt;/span&gt;COMMON_OPTIONS]: &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--reverse&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--stayOpen&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--input&lt;/span&gt; &amp;lt;INPUT&amp;gt; | &lt;span class="nt"&gt;--cword&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
                  &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--top&lt;/span&gt; | &lt;span class="nt"&gt;--bottom&lt;/span&gt; | &lt;span class="nt"&gt;--left&lt;/span&gt; | &lt;span class="nt"&gt;--right&lt;/span&gt; | &lt;span class="nt"&gt;--belowright&lt;/span&gt; | &lt;span class="nt"&gt;--aboveleft&lt;/span&gt; | &lt;span class="nt"&gt;--fullScreen&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
                  &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--nameOnly&lt;/span&gt; | &lt;span class="nt"&gt;--fullPath&lt;/span&gt; | &lt;span class="nt"&gt;--fuzzy&lt;/span&gt; | &lt;span class="nt"&gt;--regexMode&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--nowrap&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;


optional arguments:
  &lt;span class="nt"&gt;-h&lt;/span&gt;, &lt;span class="nt"&gt;--help&lt;/span&gt;            show this &lt;span class="nb"&gt;help &lt;/span&gt;message and &lt;span class="nb"&gt;exit

&lt;/span&gt;specific arguments:
  &lt;span class="nt"&gt;--update&lt;/span&gt;              Create tag files &lt;span class="k"&gt;if &lt;/span&gt;tag files &lt;span class="k"&gt;do &lt;/span&gt;not exist, update the tag files otherwise.
  &lt;span class="nt"&gt;--remove&lt;/span&gt;              Remove the tag files generated.
  &lt;span class="nt"&gt;--accept-dotfiles&lt;/span&gt;     Accept files and directories whose names begin with a dot. By default, gtags
                        ignores them.
  &lt;span class="nt"&gt;--skip-unreadable&lt;/span&gt;     Skip unreadable files.
  &lt;span class="nt"&gt;--gtagsconf&lt;/span&gt; &amp;lt;FILE&amp;gt;    Set environment variable GTAGSCONF to &amp;lt;FILE&amp;gt;.
  &lt;span class="nt"&gt;--gtagslabel&lt;/span&gt; &amp;lt;LABEL&amp;gt;  Set environment variable GTAGSLABEL to &amp;lt;LABEL&amp;gt;.
  &lt;span class="nt"&gt;--skip-symlink&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&amp;lt;TYPE&amp;gt;]
                        Skip symbolic links. If &lt;span class="nb"&gt;type &lt;/span&gt;is &lt;span class="s1"&gt;'f'&lt;/span&gt; &lt;span class="k"&gt;then &lt;/span&gt;skip only symbolic links &lt;span class="k"&gt;for &lt;/span&gt;file, &lt;span class="k"&gt;else
                        if&lt;/span&gt; &lt;span class="s1"&gt;'d'&lt;/span&gt; &lt;span class="k"&gt;then &lt;/span&gt;skip only symbolic links &lt;span class="k"&gt;for &lt;/span&gt;directory. The default value of &lt;span class="nb"&gt;type &lt;/span&gt;is
                        &lt;span class="s1"&gt;'a'&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;all symbolic links&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
  &lt;span class="nt"&gt;--gtagslibpath&lt;/span&gt; &amp;lt;PATH&amp;gt; &lt;span class="o"&gt;[&lt;/span&gt;&amp;lt;PATH&amp;gt; ...]
                        Specify the paths to search &lt;span class="k"&gt;for &lt;/span&gt;library functions.
  &lt;span class="nt"&gt;-d&lt;/span&gt; &amp;lt;PATTERN&amp;gt;, &lt;span class="nt"&gt;--definition&lt;/span&gt; &amp;lt;PATTERN&amp;gt;
                        Show locations of definitions.
  &lt;span class="nt"&gt;-r&lt;/span&gt; &amp;lt;PATTERN&amp;gt;, &lt;span class="nt"&gt;--reference&lt;/span&gt; &amp;lt;PATTERN&amp;gt;
                        Show reference to a symbol which has definitions.
  &lt;span class="nt"&gt;-s&lt;/span&gt; &amp;lt;PATTERN&amp;gt;, &lt;span class="nt"&gt;--symbol&lt;/span&gt; &amp;lt;PATTERN&amp;gt;
                        Show reference to a symbol which has no definition.
  &lt;span class="nt"&gt;-g&lt;/span&gt; &amp;lt;PATTERN&amp;gt;, &lt;span class="nt"&gt;--grep&lt;/span&gt; &amp;lt;PATTERN&amp;gt;
                        Show all lines which match to the &amp;lt;PATTERN&amp;gt;.
  &lt;span class="nt"&gt;--by-context&lt;/span&gt;          Decide tag &lt;span class="nb"&gt;type &lt;/span&gt;by context at cursor position. If the context is a definition of
                        the pattern &lt;span class="k"&gt;then &lt;/span&gt;use &lt;span class="nt"&gt;-r&lt;/span&gt;, &lt;span class="k"&gt;else if &lt;/span&gt;there is at least one definition of the pattern
                        &lt;span class="k"&gt;then &lt;/span&gt;use &lt;span class="nt"&gt;-d&lt;/span&gt;, &lt;span class="k"&gt;else &lt;/span&gt;use &lt;span class="nt"&gt;-s&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt; Regular expression is not allowed &lt;span class="k"&gt;for &lt;/span&gt;pattern.
  &lt;span class="nt"&gt;-i&lt;/span&gt;, &lt;span class="nt"&gt;--ignore-case&lt;/span&gt;     Ignore &lt;span class="k"&gt;case&lt;/span&gt; distinctions &lt;span class="k"&gt;in &lt;/span&gt;the pattern.
  &lt;span class="nt"&gt;--literal&lt;/span&gt;             Execute literal search instead of regular expression search.
  &lt;span class="nt"&gt;--path-style&lt;/span&gt; &amp;lt;FORMAT&amp;gt;
                        Show path names using &amp;lt;FORMAT&amp;gt;, which may be one of: &lt;span class="sb"&gt;`&lt;/span&gt;relative&lt;span class="sb"&gt;`&lt;/span&gt;, &lt;span class="sb"&gt;`&lt;/span&gt;absolute&lt;span class="sb"&gt;`&lt;/span&gt;,
                        &lt;span class="sb"&gt;`&lt;/span&gt;shorter&lt;span class="sb"&gt;`&lt;/span&gt;, &lt;span class="sb"&gt;`&lt;/span&gt;abslib&lt;span class="sb"&gt;`&lt;/span&gt; or &lt;span class="sb"&gt;`&lt;/span&gt;through&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="sb"&gt;`&lt;/span&gt;relative&lt;span class="sb"&gt;`&lt;/span&gt; means relative path. &lt;span class="sb"&gt;`&lt;/span&gt;absolute&lt;span class="sb"&gt;`&lt;/span&gt;
                        means absolute path. &lt;span class="sb"&gt;`&lt;/span&gt;shorter&lt;span class="sb"&gt;`&lt;/span&gt; means the shorter one of relative and absolute
                        path. &lt;span class="sb"&gt;`&lt;/span&gt;abslib&lt;span class="sb"&gt;`&lt;/span&gt; means absolute path &lt;span class="k"&gt;for &lt;/span&gt;libraries &lt;span class="o"&gt;(&lt;/span&gt;GTAGSLIBPATH&lt;span class="p"&gt;)&lt;/span&gt; and relative path
                        &lt;span class="k"&gt;for &lt;/span&gt;the rest. &lt;span class="sb"&gt;`&lt;/span&gt;through&lt;span class="sb"&gt;`&lt;/span&gt; means the relative path from the project root directory
                        &lt;span class="o"&gt;(&lt;/span&gt;internal format of GPATH&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt; The default is &lt;span class="sb"&gt;`&lt;/span&gt;relative&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
  &lt;span class="nt"&gt;-S&lt;/span&gt; &amp;lt;DIR&amp;gt;, &lt;span class="nt"&gt;--scope&lt;/span&gt; &amp;lt;DIR&amp;gt;
                        Show only tags which exist under &amp;lt;DIR&amp;gt; directory.
  &lt;span class="nt"&gt;--recall&lt;/span&gt;              Recall last search. If the result window is closed, reopen it.
  &lt;span class="nt"&gt;--match-path&lt;/span&gt;          Match the file path when fuzzy searching.
  &lt;span class="nt"&gt;--append&lt;/span&gt;              Append to the previous search results.
  &lt;span class="nt"&gt;--current-buffer&lt;/span&gt;      Show tags &lt;span class="k"&gt;in &lt;/span&gt;current buffer.
  &lt;span class="nt"&gt;--all-buffers&lt;/span&gt;         Show tags &lt;span class="k"&gt;in &lt;/span&gt;all listed buffers.
  &lt;span class="nt"&gt;--all&lt;/span&gt;                 Show tags &lt;span class="k"&gt;in &lt;/span&gt;the whole project.
  &lt;span class="nt"&gt;--result&lt;/span&gt; &amp;lt;FORMAT&amp;gt;     Show result using format, which may be one of: &lt;span class="sb"&gt;`&lt;/span&gt;ctags&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;default&lt;span class="o"&gt;)&lt;/span&gt;, &lt;span class="sb"&gt;`&lt;/span&gt;ctags-x&lt;span class="sb"&gt;`&lt;/span&gt;,
                        &lt;span class="sb"&gt;`&lt;/span&gt;ctags-mod&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
  &lt;span class="nt"&gt;--auto-jump&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&amp;lt;TYPE&amp;gt;]  Jump to the tag directly when there is only one match. &amp;lt;TYPE&amp;gt; can be &lt;span class="s1"&gt;'h'&lt;/span&gt;, &lt;span class="s1"&gt;'v'&lt;/span&gt; or
                        &lt;span class="s1"&gt;'t'&lt;/span&gt;, which mean jump to a horizontally, vertically &lt;span class="nb"&gt;split &lt;/span&gt;window, or a new tabpage
                        respectively. If &amp;lt;TYPE&amp;gt; is omitted, jump to a position &lt;span class="k"&gt;in &lt;/span&gt;current window.

common arguments:
  &lt;span class="nt"&gt;--reverse&lt;/span&gt;             show results &lt;span class="k"&gt;in &lt;/span&gt;bottom-up order
  &lt;span class="nt"&gt;--stayOpen&lt;/span&gt;            don&lt;span class="s1"&gt;'t quit LeaderF after accepting an entry
  --input &amp;lt;INPUT&amp;gt;       specifies INPUT as the pattern inputted in advance
  --cword               current word under cursor is inputted in advance
  --top                 the LeaderF window is at the top of the screen
  --bottom              the LeaderF window is at the bottom of the screen
  --left                the LeaderF window is at the left of the screen
  --right               the LeaderF window is at the right of the screen
  --belowright          the LeaderF window is at the belowright of the screen
  --aboveleft           the LeaderF window is at the aboveleft of the screen
  --fullScreen          the LeaderF window takes up the full screen
  --nameOnly            LeaderF is in NameOnly mode by default
  --fullPath            LeaderF is in FullPath mode by default
  --fuzzy               LeaderF is in Fuzzy mode by default
  --regexMode           LeaderF is in Regex mode by default
  --nowrap              long lines in the LeaderF window won'&lt;/span&gt;t wrap
  &lt;span class="nt"&gt;--next&lt;/span&gt;                Jump to the next result.
  &lt;span class="nt"&gt;--previous&lt;/span&gt;            Jump to the previous result.

If &lt;span class="o"&gt;[!]&lt;/span&gt; is given, enter normal mode directly.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;注意&lt;/strong&gt;：如果&lt;code&gt;:Leaderf&lt;/code&gt;后面有感叹号，会直接进入 normal 模式；如果没有感叹号，则是输入模式，此时可以输入字符来进行模糊匹配过滤。可以用 tab 键在两个模式间来回切换。&lt;/p&gt;
&lt;h3 id="手动生成gtags数据库"&gt;手动生成 gtags 数据库&lt;/h3&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;Leaderf[!] gtags &lt;span class="nt"&gt;--update&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--gtagsconf&lt;/span&gt; &amp;lt;FILE&amp;gt;] &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--gtagslabel&lt;/span&gt; &amp;lt;LABEL&amp;gt;] &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--accept-dotfiles&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
                 &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--skip-unreadable&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--skip-symlink&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&amp;lt;TYPE&amp;gt;]] &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--gtagslibpath&lt;/span&gt; &amp;lt;PATH&amp;gt; &lt;span class="o"&gt;[&lt;/span&gt;&amp;lt;PATH&amp;gt; ...]]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;此命令完全异步，不会卡住你的 UI。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;--gtagsconf &amp;lt;FILE&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;用来指定 &lt;a href="https://www.mankier.com/5/gtags.conf" rel="nofollow" target="_blank" title=""&gt;gtags.conf&lt;/a&gt; 文件的路径，一般情况下不需要指定，默认值就可以很好地工作。对于 Windows 上，如果相对于&lt;code&gt;gtags.exe&lt;/code&gt;所在路径有&lt;code&gt;../share/gtags/gtags.conf&lt;/code&gt;，也不需要指定该选项。如果需要用户自己特有的针对 gtags 的配置，可以指定用户的配置文件。&lt;/p&gt;

&lt;p&gt;也可以在&lt;code&gt;vimrc&lt;/code&gt;里设置&lt;code&gt;g:Lf_Gtagsconf&lt;/code&gt;达到同样的目的。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;--gtagslabel &amp;lt;LABEL&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;用来指定 gtagslabel，如果不指定，默认值是 &lt;code&gt;'default'&lt;/code&gt;。&lt;code&gt;&amp;lt;LABEL&amp;gt;&lt;/code&gt;是 &lt;a href="https://fossies.org/linux/global/gtags.conf" rel="nofollow" target="_blank" title=""&gt;gtags.conf&lt;/a&gt; 中的：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;default&lt;br&gt;
使用内置 parser，只支持 6 种语言（C，C++，Java，PHP4，Yacc，汇编）。&lt;/li&gt;
&lt;li&gt;ctags&lt;br&gt;
使用 exuberant-ctags 作为语言 parser，支持 40+ 种语言，只能生成定义索引不能生成引用索引。&lt;/li&gt;
&lt;li&gt;new-ctags&lt;br&gt;
使用 universal-ctags 作为语言 parser，支持 100+ 种语言，只能生成定义索引不能生成引用索引。虽然貌似 universal-ctags 已经&lt;a href="https://github.com/universal-ctags/ctags/pull/680" rel="nofollow" target="_blank" title=""&gt;支持&lt;/a&gt;生成引用 tags，但是依然不能配合 gtags 工作（见&lt;a href="https://github.com/universal-ctags/ctags/issues/1453" rel="nofollow" target="_blank" title=""&gt;这里&lt;/a&gt;），我也试了各种操作都没成功，也许是因为&lt;a href="https://github.com/universal-ctags/ctags/pull/569" rel="nofollow" target="_blank" title=""&gt;这个 PR&lt;/a&gt;没有被 merge。&lt;/li&gt;
&lt;li&gt;pygments&lt;br&gt;
使用&lt;a href="http://pygments.org" rel="nofollow" target="_blank" title=""&gt;pygments&lt;/a&gt;作为语言 parser，号称支持 300+ 种语言。&lt;/li&gt;
&lt;li&gt;native-pygments&lt;br&gt;
对于原生支持的 6 种语言使用内置 parser，其他语言使用 pygments 作为 parser。&lt;/li&gt;
&lt;li&gt;等等&lt;br&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;也可以在&lt;code&gt;vimrc&lt;/code&gt;里设置&lt;code&gt;g:Lf_Gtagslabel&lt;/code&gt;达到同样的目的。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;--gtagslibpath &amp;lt;PATH&amp;gt; [&amp;lt;PATH&amp;gt; ...]&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;用来指定项目所用 library 的 Paths，这样就可以生成 library 的索引，查找定义或引用时可以跳转到 library 代码中去。后面指定的路径还可以是一个或多个其他项目路径，跳转时可以跳到其他项目中的文件。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="查找tags"&gt;查找 tags&lt;/h3&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;Leaderf[!] gtags &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--current-buffer&lt;/span&gt; | &lt;span class="nt"&gt;--all-buffers&lt;/span&gt; | &lt;span class="nt"&gt;--all&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--result&lt;/span&gt; &amp;lt;FORMAT&amp;gt;] &lt;span class="o"&gt;[&lt;/span&gt;COMMON_OPTIONS]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;此命令可以列出当前 buffer、所有打开的 buffer 或者整个项目的 tags。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;Leaderf[!] gtags&lt;/code&gt;等同于&lt;code&gt;Leaderf[!] gtags --all&lt;/code&gt;，列出整个项目的 tags。&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--result &amp;lt;FORMAT&amp;gt;&lt;/code&gt; 指定显示格式，可以是&lt;code&gt;ctags&lt;/code&gt;(default), &lt;code&gt;ctags-x&lt;/code&gt;或者&lt;code&gt;ctags-mod&lt;/code&gt;。

&lt;ul&gt;
&lt;li&gt;ctags 格式&lt;br&gt;
&lt;img src="https://l.ruby-china.com/photo/2019/73eeaf61-8300-4c93-b656-fff6aaff374c.png!large" title="" alt="ctags格式"&gt;
&lt;/li&gt;
&lt;li&gt;ctags-x 格式
&lt;img src="https://l.ruby-china.com/photo/2019/98bae137-38f8-4d09-a0f5-2fdd1609c6f4.png!large" title="" alt="ctags-x格式"&gt;
&lt;/li&gt;
&lt;li&gt;ctags-mod 格式
&lt;img src="https://l.ruby-china.com/photo/2019/3dec830b-2f7c-461e-8984-f24b242710f3.png!large" title="" alt="ctags-mod格式"&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="查找定义、引用"&gt;查找定义、引用&lt;/h3&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;Leaderf[!] gtags &lt;span class="nt"&gt;-d&lt;/span&gt; &amp;lt;PATTERN&amp;gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--auto-jump&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&amp;lt;TYPE&amp;gt;]] &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;-i&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--literal&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--path-style&lt;/span&gt; &amp;lt;FORMAT&amp;gt;] &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;-S&lt;/span&gt; &amp;lt;DIR&amp;gt;]
                 &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--append&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--match-path&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--gtagsconf&lt;/span&gt; &amp;lt;FILE&amp;gt;] &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--gtagslabel&lt;/span&gt; &amp;lt;LABEL&amp;gt;] &lt;span class="o"&gt;[&lt;/span&gt;COMMON_OPTIONS]
Leaderf[!] gtags &lt;span class="nt"&gt;-r&lt;/span&gt; &amp;lt;PATTERN&amp;gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--auto-jump&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&amp;lt;TYPE&amp;gt;]] &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;-i&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--literal&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--path-style&lt;/span&gt; &amp;lt;FORMAT&amp;gt;] &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;-S&lt;/span&gt; &amp;lt;DIR&amp;gt;]
                 &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--append&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--match-path&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--gtagsconf&lt;/span&gt; &amp;lt;FILE&amp;gt;] &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--gtagslabel&lt;/span&gt; &amp;lt;LABEL&amp;gt;] &lt;span class="o"&gt;[&lt;/span&gt;COMMON_OPTIONS]
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;&amp;lt;PATTERN&amp;gt;&lt;/code&gt;可以是正则表达式。&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--auto-jump [&amp;lt;TYPE&amp;gt;]&lt;/code&gt; 意思是如果只有一个结果直接跳过去。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="其他"&gt;其他&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;Leaderf[!] gtags -g &amp;lt;PATTERN&amp;gt;&lt;/code&gt;功能已被&lt;code&gt;Leaderf rg&lt;/code&gt;包含。&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Leaderf gtags --next&lt;/code&gt; 和 &lt;code&gt;Leaderf gtags --previous&lt;/code&gt;相当于 quickfix 的&lt;code&gt;:cnext&lt;/code&gt;和&lt;code&gt;:cprevious&lt;/code&gt;命令，在 LeaderF 结果窗口关闭的情况下也可以使用。&lt;/li&gt;
&lt;li&gt;更多内容请参考&lt;code&gt;:Leaderf gtags -h&lt;/code&gt; 和 doc。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="使用示例"&gt;使用示例&lt;/h2&gt;&lt;pre class="highlight viml"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;g:Lf_GtagsAutoGenerate&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;g:Lf_Gtagslabel&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'native-pygments'&lt;/span&gt;
&lt;span class="nb"&gt;noremap&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;leader&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;fr &lt;span class="p"&gt;:&amp;lt;&lt;/span&gt;C&lt;span class="p"&gt;-&lt;/span&gt;U&lt;span class="p"&gt;&amp;gt;&amp;lt;&lt;/span&gt;C&lt;span class="p"&gt;-&lt;/span&gt;R&lt;span class="p"&gt;&amp;gt;=&lt;/span&gt;&lt;span class="nb"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Leaderf! gtags -r %s --auto-jump"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;expand&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;cword&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;))&amp;lt;&lt;/span&gt;CR&lt;span class="p"&gt;&amp;gt;&amp;lt;&lt;/span&gt;CR&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nb"&gt;noremap&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;leader&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;fd &lt;span class="p"&gt;:&amp;lt;&lt;/span&gt;C&lt;span class="p"&gt;-&lt;/span&gt;U&lt;span class="p"&gt;&amp;gt;&amp;lt;&lt;/span&gt;C&lt;span class="p"&gt;-&lt;/span&gt;R&lt;span class="p"&gt;&amp;gt;=&lt;/span&gt;&lt;span class="nb"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Leaderf! gtags -d %s --auto-jump"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;expand&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;cword&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;))&amp;lt;&lt;/span&gt;CR&lt;span class="p"&gt;&amp;gt;&amp;lt;&lt;/span&gt;CR&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nb"&gt;noremap&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;leader&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="k"&gt;fo&lt;/span&gt; &lt;span class="p"&gt;:&amp;lt;&lt;/span&gt;C&lt;span class="p"&gt;-&lt;/span&gt;U&lt;span class="p"&gt;&amp;gt;&amp;lt;&lt;/span&gt;C&lt;span class="p"&gt;-&lt;/span&gt;R&lt;span class="p"&gt;&amp;gt;=&lt;/span&gt;&lt;span class="nb"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Leaderf! gtags --recall %s"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&amp;lt;&lt;/span&gt;CR&lt;span class="p"&gt;&amp;gt;&amp;lt;&lt;/span&gt;CR&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nb"&gt;noremap&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;leader&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;fn &lt;span class="p"&gt;:&amp;lt;&lt;/span&gt;C&lt;span class="p"&gt;-&lt;/span&gt;U&lt;span class="p"&gt;&amp;gt;&amp;lt;&lt;/span&gt;C&lt;span class="p"&gt;-&lt;/span&gt;R&lt;span class="p"&gt;&amp;gt;=&lt;/span&gt;&lt;span class="nb"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Leaderf gtags --next %s"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&amp;lt;&lt;/span&gt;CR&lt;span class="p"&gt;&amp;gt;&amp;lt;&lt;/span&gt;CR&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nb"&gt;noremap&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;leader&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nb"&gt;fp&lt;/span&gt; &lt;span class="p"&gt;:&amp;lt;&lt;/span&gt;C&lt;span class="p"&gt;-&lt;/span&gt;U&lt;span class="p"&gt;&amp;gt;&amp;lt;&lt;/span&gt;C&lt;span class="p"&gt;-&lt;/span&gt;R&lt;span class="p"&gt;&amp;gt;=&lt;/span&gt;&lt;span class="nb"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Leaderf gtags --previous %s"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&amp;lt;&lt;/span&gt;CR&lt;span class="p"&gt;&amp;gt;&amp;lt;&lt;/span&gt;CR&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;</description>
      <author>Yggdroot</author>
      <pubDate>Mon, 06 May 2019 17:50:15 +0800</pubDate>
      <link>https://ruby-china.org/topics/38482</link>
      <guid>https://ruby-china.org/topics/38482</guid>
    </item>
    <item>
      <title>Vim 的 grep 插件`Leaderf rg`：grep 和模糊匹配的完美结合</title>
      <description>&lt;h2 id="前言"&gt;前言&lt;/h2&gt;
&lt;p&gt;vim 有很多著名的 grep 插件，我使用过的有 ack.vim，ag.vim 和 ctrlsf.vim，它们应该也是目前用户最多的几个了。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;ack.vim&lt;br&gt;
起步比较早，早期后端 grep 工具是 ack，后来也支持 ag(the_silver_searcher)，pt(the_platinum_searcher)，rg(ripgrep) 等工具了。它是一个比较传统的 grep 插件，不支持异步，要等到 grep 结束后才能显示结果，在大的项目中 grep 会卡好一阵子。它貌似也不再维护，我 N 久前提交的 pull request 还挂在那，它最近的代码更新在 11 个月前。&lt;/li&gt;
&lt;li&gt;ag.vim&lt;br&gt;
它其实是抄袭 ack.vim，没错，是抄袭。在早期 ack.vim 还不支持 ag 时，它的作者在 ack.vim 代码的基础上稍微改了改，支持了 ag。后来被 ack.vim 的作者给怼了，就放弃了对 ag.vim 的维护。目前功能上小于 ack.vim。&lt;/li&gt;
&lt;li&gt;ctrlsf.vim&lt;br&gt;
这是国人开发的一个插件，后端 grep 工具支持 ack/ag/pt/rg，同时也支持异步，不过需要 Vim 8.0.1039+ 或者 NeoVim 才支持异步。这个插件很好用，在我开发&lt;code&gt;Leaderf rg&lt;/code&gt;之前一直使用的是它。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;Leaderf rg&lt;/code&gt;顾名思义，后端基于 rg，由于是&lt;a href="https://github.com/Yggdroot/LeaderF" rel="nofollow" target="_blank" title=""&gt;LeaderF&lt;/a&gt;的子功能，基因上就决定它完美支持异步。同时 LeaderF 又是一个非著名的模糊查找插件，这使它可以在 grep 结果的基础上再通过模糊匹配的方式进行二次过滤，来帮助用户更快地锁定目标，这是目前上面提到的插件所不具备的。&lt;/p&gt;
&lt;h2 id="为什么选择rg(ripgrep)"&gt;为什么选择 rg(ripgrep)&lt;/h2&gt;
&lt;p&gt;快速 grep 工具目前有 ag, rg, pt, sift, ucg 等。&lt;br&gt;
我选择 rg 有以下几点原因：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;速度比较快，rg 的 README 上有作者的对比，我实测也是 rg 快点。&lt;/li&gt;
&lt;li&gt;Windows 上 bug 少（bug 到目前还没发现），ag 和 pt 都遇到过 bug。&lt;/li&gt;
&lt;li&gt;作者很活跃，提的 issue 能很快得到回复。&lt;/li&gt;
&lt;li&gt;rg 功能相对多些，可以从&lt;code&gt;rg --help&lt;/code&gt; 看出来。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="Leaderf rg 使用介绍"&gt;
&lt;code&gt;Leaderf rg&lt;/code&gt; 使用介绍&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;Leaderf rg&lt;/code&gt;的使用也比较简单，只要&lt;code&gt;Leaderf[!]&lt;/code&gt; + &lt;code&gt;rg命令和选项（同命令行上一样）&lt;/code&gt;就可以了。
具体使用方法可以用&lt;code&gt;:Leaderf rg -h&lt;/code&gt;来查看。&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;usage: Leaderf[!] rg [-h] [-e &amp;lt;PATTERN&amp;gt;...] [-F] [-i] [-L] [-P] [-S] [-s] [-v]
                     [-w] [-x] [--hidden] [--no-config] [--no-ignore]
                     [--no-ignore-global] [--no-ignore-parent]
                     [--no-ignore-vcs] [--no-pcre2-unicode] [-E &amp;lt;ENCODING&amp;gt;]
                     [-M &amp;lt;NUM&amp;gt;] [-m &amp;lt;NUM&amp;gt;] [--max-depth &amp;lt;NUM&amp;gt;]
                     [--max-filesize &amp;lt;NUM+SUFFIX?&amp;gt;]
                     [--path-separator &amp;lt;SEPARATOR&amp;gt;] [--sort &amp;lt;SORTBY&amp;gt;]
                     [--sortr &amp;lt;SORTBY&amp;gt;] [-f &amp;lt;PATTERNFILE&amp;gt;...] [-g &amp;lt;GLOB&amp;gt;...]
                     [--iglob &amp;lt;GLOB&amp;gt;...] [--ignore-file &amp;lt;PATH&amp;gt;...]
                     [--type-add &amp;lt;TYPE_SPEC&amp;gt;...] [-t &amp;lt;TYPE&amp;gt;...] [-T &amp;lt;TYPE&amp;gt;...]
                     [--current-buffer | --all-buffers] [--recall] [--append]
                     [--reverse] [--stayOpen] [--input &amp;lt;INPUT&amp;gt; | --cword]
                     [--top | --bottom | --left | --right | --belowright | --aboveleft | --fullScreen]
                     [--nameOnly | --fullPath | --fuzzy | --regexMode] [--nowrap]
                     [&amp;lt;PATH&amp;gt; [&amp;lt;PATH&amp;gt; ...]]

optional arguments:
  -h, --help            show this help message and exit

specific arguments:
  -e &amp;lt;PATTERN&amp;gt;..., --regexp &amp;lt;PATTERN&amp;gt;...
                        A pattern to search for. This option can be provided multiple times, where all
                        patterns given are searched.
  -F, --fixed-strings   Treat the pattern as a literal string instead of a regular expression.
  -i, --ignore-case     Searches case insensitively.
  -L, --follow          Follow symbolic links while traversing directories.
  -P, --pcre2           When this flag is present, rg will use the PCRE2 regex engine instead of its
                        default regex engine.
  -S, --smart-case      Searches case insensitively if the pattern is all lowercase, case sensitively
                        otherwise.
  -s, --case-sensitive  Searches case sensitively.
  -v, --invert-match    Invert matching. Show lines that do not match the given patterns.
  -w, --word-regexp     Only show matches surrounded by word boundaries. This is roughly equivalent to
                        putting \b before and after all of the search patterns.
  -x, --line-regexp     Only show matches surrounded by line boundaries.
  --hidden              Search hidden files and directories. By default, hidden files and directories
                        are skipped.
  --no-config           Never read configuration files. When this flag is present, rg will not respect
                        the RIPGREP_CONFIG_PATH environment variable.
  --no-ignore           Don't respect ignore files (.gitignore, .ignore, etc.). This implies
                        --no-ignore-parent and --no-ignore-vcs.
  --no-ignore-global    Don't respect ignore files that come from 'global' sources such as git's
                        `core.excludesFile` configuration option (which defaults to
                        `$HOME/.config/git/ignore`).
  --no-ignore-parent    Don't respect ignore files (.gitignore, .ignore, etc.) in parent directories.
  --no-ignore-vcs       Don't respect version control ignore files (.gitignore, etc.).
  --no-pcre2-unicode    When PCRE2 matching is enabled, this flag will disable
                        Unicode mode, which is otherwise enabled by default.
  -E &amp;lt;ENCODING&amp;gt;, --encoding &amp;lt;ENCODING&amp;gt;
                        Specify the text encoding that rg will use on all files searched.
  -M &amp;lt;NUM&amp;gt;, --max-columns &amp;lt;NUM&amp;gt;
                        Don't print lines longer than this limit in bytes.
  -m &amp;lt;NUM&amp;gt;, --max-count &amp;lt;NUM&amp;gt;
                        Limit the number of matching lines per file searched to NUM.
  --max-depth &amp;lt;NUM&amp;gt;     Limit the depth of directory traversal to NUM levels beyond the paths given.
  --max-filesize &amp;lt;NUM+SUFFIX?&amp;gt;
                        Ignore files larger than NUM in size. This does not apply to directories.
  --path-separator &amp;lt;SEPARATOR&amp;gt;
                        Set the path separator to use when printing file paths.
  --sort &amp;lt;SORTBY&amp;gt;       This flag enables sorting of results in ascending order.
  --sortr &amp;lt;SORTBY&amp;gt;      This flag enables sorting of results in descending order.
  -f &amp;lt;PATTERNFILE&amp;gt;..., --file &amp;lt;PATTERNFILE&amp;gt;...
                        Search for patterns from the given file, with one pattern per line.
                        (This option can be provided multiple times.)
  -g &amp;lt;GLOB&amp;gt;..., --glob &amp;lt;GLOB&amp;gt;...
                        Include or exclude files and directories for searching that match the given
                        glob.(This option can be provided multiple times.)
  --iglob &amp;lt;GLOB&amp;gt;...     Include or exclude files and directories for searching that match the given glob.
                        Globs are matched case insensitively.(This option can be provided multiple times.)
  --ignore-file &amp;lt;PATH&amp;gt;...
                        Specifies a path to one or more .gitignore format rules files.
  --type-add &amp;lt;TYPE_SPEC&amp;gt;...
                        Add a new glob for a particular file type.
  -t &amp;lt;TYPE&amp;gt;..., --type &amp;lt;TYPE&amp;gt;...
                        Only search files matching TYPE. Multiple type flags may be provided.
  -T &amp;lt;TYPE&amp;gt;..., --type-not &amp;lt;TYPE&amp;gt;...
                        Do not search files matching TYPE. Multiple type-not flags may be provided.
  &amp;lt;PATH&amp;gt;                A file or directory to search. Directories are searched recursively. Paths
                        specified on the command line override glob and ignore rules.
  --current-buffer      Searches in current buffer.
  --all-buffers         Searches in all listed buffers.
  --recall              Recall last search. If the result window is closed, reopen it.
  --append              Append to the previous search results.

common arguments:
  --reverse             show results in bottom-up order
  --stayOpen            don't quit LeaderF after accepting an entry
  --input &amp;lt;INPUT&amp;gt;       specifies INPUT as the pattern inputted in advance
  --cword               current word under cursor is inputted in advance
  --top                 the LeaderF window is at the top of the screen
  --bottom              the LeaderF window is at the bottom of the screen
  --left                the LeaderF window is at the left of the screen
  --right               the LeaderF window is at the right of the screen
  --belowright          the LeaderF window is at the belowright of the screen
  --aboveleft           the LeaderF window is at the aboveleft of the screen
  --fullScreen          the LeaderF window takes up the full screen
  --nameOnly            LeaderF is in NameOnly mode by default
  --fullPath            LeaderF is in FullPath mode by default
  --fuzzy               LeaderF is in Fuzzy mode by default
  --regexMode           LeaderF is in Regex mode by default
  --nowrap              long lines in the LeaderF window won't wrap

If [!] is given, enter normal mode directly.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;注意&lt;/strong&gt;：如果&lt;code&gt;:Leaderf&lt;/code&gt;后面有感叹号，会直接进入 normal 模式；如果没有感叹号，则是输入模式，此时可以输入字符来进行模糊匹配过滤。可以用 tab 键在两个模式间来回切换。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Leaderf rg&lt;/code&gt;基本支持 rg 所有的必要选项，用户如果对 rg 命令比较熟悉，可以在 vim 命令行内输入&lt;code&gt;:Leaderf&lt;/code&gt;, 然后手敲 rg 命令，命令选项还可以通过 tab 来补全。
当然，更聪明的做法是定义一些快捷键。例如：&lt;/p&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;&lt;span class="c"&gt;" search word under cursor, the pattern is treated as regex, and enter normal mode directly&lt;/span&gt;
&lt;span class="nb"&gt;noremap&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;C&lt;span class="p"&gt;-&lt;/span&gt;F&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;:&amp;lt;&lt;/span&gt;C&lt;span class="p"&gt;-&lt;/span&gt;U&lt;span class="p"&gt;&amp;gt;&amp;lt;&lt;/span&gt;C&lt;span class="p"&gt;-&lt;/span&gt;R&lt;span class="p"&gt;&amp;gt;=&lt;/span&gt;&lt;span class="nb"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Leaderf! rg -e %s "&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;expand&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;cword&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;))&amp;lt;&lt;/span&gt;CR&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;" search word under cursor, the pattern is treated as regex,&lt;/span&gt;
&lt;span class="c"&gt;" append the result to previous search results.&lt;/span&gt;
&lt;span class="nb"&gt;noremap&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;C&lt;span class="p"&gt;-&lt;/span&gt;G&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;:&amp;lt;&lt;/span&gt;C&lt;span class="p"&gt;-&lt;/span&gt;U&lt;span class="p"&gt;&amp;gt;&amp;lt;&lt;/span&gt;C&lt;span class="p"&gt;-&lt;/span&gt;R&lt;span class="p"&gt;&amp;gt;=&lt;/span&gt;&lt;span class="nb"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Leaderf! rg --append -e %s "&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;expand&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;cword&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;))&amp;lt;&lt;/span&gt;CR&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;" search word under cursor literally only in current buffer&lt;/span&gt;
&lt;span class="nb"&gt;noremap&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;C&lt;span class="p"&gt;-&lt;/span&gt;B&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;:&amp;lt;&lt;/span&gt;C&lt;span class="p"&gt;-&lt;/span&gt;U&lt;span class="p"&gt;&amp;gt;&amp;lt;&lt;/span&gt;C&lt;span class="p"&gt;-&lt;/span&gt;R&lt;span class="p"&gt;&amp;gt;=&lt;/span&gt;&lt;span class="nb"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Leaderf! rg -F --current-buffer -e %s "&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;expand&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;cword&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;))&amp;lt;&lt;/span&gt;CR&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;" search word under cursor literally in all listed buffers&lt;/span&gt;
&lt;span class="nb"&gt;noremap&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;C&lt;span class="p"&gt;-&lt;/span&gt;D&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;:&amp;lt;&lt;/span&gt;C&lt;span class="p"&gt;-&lt;/span&gt;U&lt;span class="p"&gt;&amp;gt;&amp;lt;&lt;/span&gt;C&lt;span class="p"&gt;-&lt;/span&gt;R&lt;span class="p"&gt;&amp;gt;=&lt;/span&gt;&lt;span class="nb"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Leaderf! rg -F --all-buffers -e %s "&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;expand&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;cword&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;))&amp;lt;&lt;/span&gt;CR&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;" search visually selected text literally, don't quit LeaderF after accepting an entry&lt;/span&gt;
xnoremap gf &lt;span class="p"&gt;:&amp;lt;&lt;/span&gt;C&lt;span class="p"&gt;-&lt;/span&gt;U&lt;span class="p"&gt;&amp;gt;&amp;lt;&lt;/span&gt;C&lt;span class="p"&gt;-&lt;/span&gt;R&lt;span class="p"&gt;&amp;gt;=&lt;/span&gt;&lt;span class="nb"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Leaderf! rg -F --stayOpen -e %s "&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; leaderf#Rg#&lt;span class="k"&gt;visual&lt;/span&gt;&lt;span class="p"&gt;())&amp;lt;&lt;/span&gt;CR&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;" recall last search. If the result window is closed, reopen it.&lt;/span&gt;
&lt;span class="nb"&gt;noremap&lt;/span&gt; &lt;span class="k"&gt;go&lt;/span&gt; &lt;span class="p"&gt;:&amp;lt;&lt;/span&gt;C&lt;span class="p"&gt;-&lt;/span&gt;U&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Leaderf&lt;span class="p"&gt;!&lt;/span&gt; rg &lt;span class="p"&gt;--&lt;/span&gt;recall&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;CR&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;


&lt;span class="c"&gt;" search word under cursor in *.h and *.cpp files.&lt;/span&gt;
&lt;span class="nb"&gt;noremap&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;Leader&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="k"&gt;a&lt;/span&gt; &lt;span class="p"&gt;:&amp;lt;&lt;/span&gt;C&lt;span class="p"&gt;-&lt;/span&gt;U&lt;span class="p"&gt;&amp;gt;&amp;lt;&lt;/span&gt;C&lt;span class="p"&gt;-&lt;/span&gt;R&lt;span class="p"&gt;&amp;gt;=&lt;/span&gt;&lt;span class="nb"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Leaderf! rg -e %s -g *.h -g *.cpp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;expand&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;cword&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;))&amp;lt;&lt;/span&gt;CR&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="c"&gt;" the same as above&lt;/span&gt;
&lt;span class="nb"&gt;noremap&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;Leader&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="k"&gt;a&lt;/span&gt; &lt;span class="p"&gt;:&amp;lt;&lt;/span&gt;C&lt;span class="p"&gt;-&lt;/span&gt;U&lt;span class="p"&gt;&amp;gt;&amp;lt;&lt;/span&gt;C&lt;span class="p"&gt;-&lt;/span&gt;R&lt;span class="p"&gt;&amp;gt;=&lt;/span&gt;&lt;span class="nb"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Leaderf! rg -e %s -g *.{h,cpp}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;expand&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;cword&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;))&amp;lt;&lt;/span&gt;CR&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;" search word under cursor in cpp and java files.&lt;/span&gt;
&lt;span class="nb"&gt;noremap&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;Leader&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="k"&gt;b&lt;/span&gt; &lt;span class="p"&gt;:&amp;lt;&lt;/span&gt;C&lt;span class="p"&gt;-&lt;/span&gt;U&lt;span class="p"&gt;&amp;gt;&amp;lt;&lt;/span&gt;C&lt;span class="p"&gt;-&lt;/span&gt;R&lt;span class="p"&gt;&amp;gt;=&lt;/span&gt;&lt;span class="nb"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Leaderf! rg -e %s -t cpp -t java"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;expand&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;cword&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;))&amp;lt;&lt;/span&gt;CR&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;" search word under cursor in cpp files, exclude the *.hpp files&lt;/span&gt;
&lt;span class="nb"&gt;noremap&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;Leader&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="k"&gt;c&lt;/span&gt; &lt;span class="p"&gt;:&amp;lt;&lt;/span&gt;C&lt;span class="p"&gt;-&lt;/span&gt;U&lt;span class="p"&gt;&amp;gt;&amp;lt;&lt;/span&gt;C&lt;span class="p"&gt;-&lt;/span&gt;R&lt;span class="p"&gt;&amp;gt;=&lt;/span&gt;&lt;span class="nb"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Leaderf! rg -e %s -t cpp -g !*.hpp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;expand&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;cword&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;))&amp;lt;&lt;/span&gt;CR&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;参考&lt;/strong&gt;：rg 的&lt;a href="https://docs.rs/globset/0.3.0/globset/#syntax" rel="nofollow" target="_blank" title=""&gt;glob 语法&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;顺便说一下，直接在 vim 命令行敲&lt;code&gt;:Leaderf rg&lt;/code&gt;，就会有传说中的&lt;code&gt;"grep on the fly"&lt;/code&gt;的功能哦，同时支持 fuzzy 和 regex 两种模式。&lt;/p&gt;
&lt;h2 id="会不会支持ag等其他grep工具"&gt;会不会支持 ag 等其他 grep 工具&lt;/h2&gt;
&lt;p&gt;不会。&lt;br&gt;
首先，ripgrep 已经足够强大，基本不存在别的工具有而 ripgrep 没有的功能。其次，ripgrep 有编译好的 Windows、Linux 和 MacOS 上的&lt;a href="https://github.com/BurntSushi/ripgrep/releases" rel="nofollow" target="_blank" title=""&gt;binary&lt;/a&gt;，可以在这些平台上很容易安装。再者，由于作者比较懒，不想再实现重复的功能。&lt;/p&gt;</description>
      <author>Yggdroot</author>
      <pubDate>Mon, 14 Jan 2019 22:07:21 +0800</pubDate>
      <link>https://ruby-china.org/topics/38001</link>
      <guid>https://ruby-china.org/topics/38001</guid>
    </item>
    <item>
      <title>vim 的模糊查找插件 LeaderF 新功能介绍</title>
      <description>&lt;h2 id="前言"&gt;前言&lt;/h2&gt;
&lt;p&gt;上一篇文章《&lt;a href="https://ruby-china.org/topics/34055" title=""&gt;让人相见恨晚的 vim 插件：模糊查找神器 LeaderF&lt;/a&gt;》概括性的介绍了&lt;a href="https://github.com/Yggdroot/LeaderF" rel="nofollow" target="_blank" title=""&gt;LeaderF&lt;/a&gt;的基本功能，本篇对 LeaderF 的新功能做一下介绍。&lt;/p&gt;
&lt;h2 id="统一的命令接口"&gt;统一的命令接口&lt;/h2&gt;
&lt;p&gt;随着 LeaderF 功能的不断增多，LeaderF 的命令也在不断的增加，给开发和使用都带来一些不便。于是，LeaderF 提供了一个统一的命令接口，就像 shell 命令一样，不同的命令选项组合，带来不同的功能。&lt;br&gt;
可以通过&lt;code&gt;:Leaderf -h&lt;/code&gt;来查看具体使用方法。&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;usage: Leaderf[!] [-h] [--reverse] [--stayOpen] [--input &amp;lt;INPUT&amp;gt; | --cword]
                  [--top | --bottom | --left | --right | --belowright | --aboveleft | --fullScreen]
                  [--nameOnly | --fullPath | --fuzzy | --regexMode] [--nowrap]
                  {file,tag,function,mru,searchHistory,cmdHistory,help,line,colorscheme,self,bufTag,buffer,rg}
                  ...

optional arguments:
  -h, --help            show this help message and exit
  --reverse             show results in bottom-up order
  --stayOpen            don't quit LeaderF after accepting an entry
  --input &amp;lt;INPUT&amp;gt;       specifies INPUT as the pattern inputted in advance
  --cword               current word under cursor is inputted in advance
  --top                 the LeaderF window is at the top of the screen
  --bottom              the LeaderF window is at the bottom of the screen
  --left                the LeaderF window is at the left of the screen
  --right               the LeaderF window is at the right of the screen
  --belowright          the LeaderF window is at the belowright of the screen
  --aboveleft           the LeaderF window is at the aboveleft of the screen
  --fullScreen          the LeaderF window takes up the full screen
  --nameOnly            LeaderF is in NameOnly mode by default
  --fullPath            LeaderF is in FullPath mode by default
  --fuzzy               LeaderF is in Fuzzy mode by default
  --regexMode           LeaderF is in Regex mode by default
  --nowrap              long lines in the LeaderF window won't wrap

subcommands:

  {file,tag,function,mru,searchHistory,cmdHistory,help,line,colorscheme,self,bufTag,buffer,rg}
    file                search files
    tag                 navigate tags using the tags file
    function            navigate functions or methods in the buffer
    mru                 search most recently used files
    searchHistory       execute the search command in the history
    cmdHistory          execute the command in the history
    help                navigate the help tags
    line                search a line in the buffer
    colorscheme         switch between colorschemes
    self                execute the commands of itself
    bufTag              navigate tags in the buffer
    buffer              search buffers
    rg                  grep using rg

If [!] is given, enter normal mode directly.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这样就可以用&lt;code&gt;:Leaderf &amp;lt;subcommand&amp;gt; [options]&lt;/code&gt;来执行 LeaderF 的命令了。例如：&lt;/p&gt;
&lt;table class="table table-bordered table-striped"&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;th&gt;Before&lt;/th&gt;
&lt;th style="text-align:center;"&gt;&lt;/th&gt;
&lt;th&gt;Now&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:LeaderfFile&lt;/code&gt;&lt;/td&gt;
&lt;td style="text-align:center;"&gt;&amp;lt;=&amp;gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;:Leaderf file&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:LeaderfBuffer&lt;/code&gt;&lt;/td&gt;
&lt;td style="text-align:center;"&gt;&amp;lt;=&amp;gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;:Leaderf buffer&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:LeaderfMru&lt;/code&gt;&lt;/td&gt;
&lt;td style="text-align:center;"&gt;&amp;lt;=&amp;gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;:Leaderf mru&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:LeaderfMruCwd&lt;/code&gt;&lt;/td&gt;
&lt;td style="text-align:center;"&gt;&amp;lt;=&amp;gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;:Leaderf mru --cwd&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;...&lt;/td&gt;
&lt;td style="text-align:center;"&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;每个子命令都有专有的命令选项，可以用&lt;code&gt;:Leaderf &amp;lt;subcommand&amp;gt; -h&lt;/code&gt;来查看。例如，&lt;code&gt;Leaderf mru -h&lt;/code&gt;:&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;usage: Leaderf[!] mru [-h] [--cwd] [--no-split-path] [--reverse] [--stayOpen]
                      [--input &amp;lt;INPUT&amp;gt; | --cword]
                      [--top | --bottom | --left | --right | --belowright | --aboveleft | --fullScreen]
                      [--nameOnly | --fullPath | --fuzzy | --regexMode]
                      [--nowrap]

optional arguments:
  -h, --help       show this help message and exit

specific arguments:
  --cwd            search MRU in current working directory
  --no-split-path  do not split the path

common arguments:
  --reverse        show results in bottom-up order
  --stayOpen       don't quit LeaderF after accepting an entry
  --input &amp;lt;INPUT&amp;gt;  specifies INPUT as the pattern inputted in advance
  --cword          current word under cursor is inputted in advance
  --top            the LeaderF window is at the top of the screen
  --bottom         the LeaderF window is at the bottom of the screen
  --left           the LeaderF window is at the left of the screen
  --right          the LeaderF window is at the right of the screen
  --belowright     the LeaderF window is at the belowright of the screen
  --aboveleft      the LeaderF window is at the aboveleft of the screen
  --fullScreen     the LeaderF window takes up the full screen
  --nameOnly       LeaderF is in NameOnly mode by default
  --fullPath       LeaderF is in FullPath mode by default
  --fuzzy          LeaderF is in Fuzzy mode by default
  --regexMode      LeaderF is in Regex mode by default
  --nowrap         long lines in the LeaderF window won't wrap

If [!] is given, enter normal mode directly.
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="自下而上显示结果"&gt;自下而上显示结果&lt;/h2&gt;
&lt;p&gt;好多从 ctrlp.vim 转过来的朋友说不习惯 LeaderF 自上而下显示结果的方式，想要 LeaderF 也能像 ctrlp 一样自下而上（最优结果在最下面）显示结果，为了回馈各位朋友对 LeaderF 的支持，现在 LeaderF 也添加了自下而上显示搜索结果的功能：
&lt;img src="https://l.ruby-china.com/photo/2018/43bf65dd-4891-457d-9e62-46dd0d43dcb1.gif!large" title="" alt="LeaderF_reverse_order"&gt;&lt;/p&gt;

&lt;p&gt;只需要在命令后面加上&lt;code&gt;--reverse&lt;/code&gt;即可，或者也可以一劳永逸，在 vimrc 里面加上
&lt;code&gt;let g:Lf_ReverseOrder = 1&lt;/code&gt; 。&lt;/p&gt;
&lt;h2 id="And 模式"&gt;And 模式&lt;/h2&gt;
&lt;p&gt;LeaderF 支持用空格（可以用&lt;code&gt;g:Lf_AndDelimiter&lt;/code&gt;来修改）作为 And 操作符来进行模糊匹配。当匹配已经匹配到字符串末尾时，可以通过敲空格和一个子串来匹配字符串的前面部分，进行快速过滤。&lt;br&gt;
&lt;strong&gt;NOTE:&lt;/strong&gt; 空格分隔的每个子串都是对整个字符串的模糊匹配，而不是精确匹配。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2018/12784bd8-ff20-481a-8cba-1523ae275452.gif!large" title="" alt="And模式"&gt;&lt;/p&gt;
&lt;h2 id="模糊匹配历史"&gt;模糊匹配历史&lt;/h2&gt;
&lt;p&gt;可以通过上下键来翻看模糊匹配历史：
&lt;img src="https://l.ruby-china.com/photo/2018/ef874a77-05ce-470d-829e-4351a3286af0.gif!large" title="" alt="翻看历史"&gt;&lt;/p&gt;
&lt;h2 id="总结"&gt;总结&lt;/h2&gt;
&lt;p&gt;LeaderF 精益求精，永无止境。&lt;/p&gt;</description>
      <author>Yggdroot</author>
      <pubDate>Sun, 30 Dec 2018 17:26:36 +0800</pubDate>
      <link>https://ruby-china.org/topics/37961</link>
      <guid>https://ruby-china.org/topics/37961</guid>
    </item>
    <item>
      <title>LeaderF 支持自下而上显示搜索结果了！</title>
      <description>&lt;p&gt;好多从 ctrlp.vim 转过来的朋友说不习惯 LeaderF 自上而下显示结果的方式，想要 LeaderF 也能像 ctrlp 一样自下而上（最优结果在最下面）显示结果，为了回馈各位朋友对 LeaderF 的支持，现在 LeaderF 也添加了自下而上显示搜索结果的功能：&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2018/2ccf0b9b-5458-465c-a670-e45fea286c5a.gif!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;只需要在命令后面加上&lt;code&gt;--reverse&lt;/code&gt;即可，或者也可以一劳永逸，在 vimrc 里面加上
&lt;code&gt;let g:Lf_ReverseOrder = 1&lt;/code&gt; 。&lt;/p&gt;</description>
      <author>Yggdroot</author>
      <pubDate>Wed, 03 Oct 2018 12:22:38 +0800</pubDate>
      <link>https://ruby-china.org/topics/37585</link>
      <guid>https://ruby-china.org/topics/37585</guid>
    </item>
    <item>
      <title>如何使用 Python 编写 vim 插件</title>
      <description>&lt;h2 id="前言"&gt;前言&lt;/h2&gt;
&lt;p&gt;vim 是个伟大的编辑器，不仅在于她特立独行的编辑方式，还在于她强大的扩展能力。然而，vim 自身用于写插件的语言 vimL 功能有很大的局限性，实现功能复杂的插件往往力不从心，而且运行效率也不高。幸好，vim 早就想到了这一点，她提供了很多外部语言接口，比如 Python，ruby，lua，Perl 等，可以很方便的编写 vim 插件。本文主要介绍如何使用 Python 编写 vim 插件。&lt;/p&gt;
&lt;h2 id="准备工作"&gt;准备工作&lt;/h2&gt;&lt;h3 id="1. 编译vim，使vim支持Python"&gt;1. 编译 vim，使 vim 支持 Python&lt;/h3&gt;
&lt;p&gt;在编译之前，&lt;code&gt;configure&lt;/code&gt;的时候加上&lt;code&gt;--enable-pythoninterp&lt;/code&gt;和&lt;code&gt;--enable-python3interp&lt;/code&gt;选项，使之分别支持 Python2 和 Python3
编译好之后，可以通过&lt;code&gt;vim --version | grep +python&lt;/code&gt;来查看是否已经支持 Python，结果中应该包含&lt;code&gt;+python&lt;/code&gt;和 &lt;code&gt;+python3&lt;/code&gt;，当然也可以编译成只支持 Python2 或 Python3。&lt;/p&gt;

&lt;p&gt;现在好多平台都有直接编译好的版本，已经包含 Python 支持，直接下载就可以了：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Windows：可以在&lt;a href="https://github.com/vim/vim-win32-installer/releases" rel="nofollow" target="_blank" title=""&gt;这里&lt;/a&gt;下载。&lt;/li&gt;
&lt;li&gt;Mac OS：可以直接&lt;code&gt;brew install vim&lt;/code&gt;来安装。&lt;/li&gt;
&lt;li&gt;Linux：也有快捷的安装方式，就不赘言了。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="2. 如何让Python能正常工作"&gt;2. 如何让 Python 能正常工作&lt;/h3&gt;
&lt;p&gt;虽然 vim 已经支持 Python，但是可能&lt;code&gt;:echo has("python")&lt;/code&gt;或&lt;code&gt;:echo has("python3")&lt;/code&gt;的结果仍是&lt;code&gt;0&lt;/code&gt;，说明 Python 还不能正常工作。&lt;br&gt;
此时需要检查：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;系统上是否装了 Python?&lt;/li&gt;
&lt;li&gt;Python 是 32 位还是 64 位跟 vim 是否匹配？&lt;/li&gt;
&lt;li&gt;Python 的版本跟编译时的版本是否一致（编译时的版本可以使用&lt;code&gt;:version&lt;/code&gt;查看）&lt;/li&gt;
&lt;li&gt;通过&lt;code&gt;pythondll&lt;/code&gt;和&lt;code&gt;pythonthreedll&lt;/code&gt;来分别指定 Python2 和 Python3 所使用的动态库。
例如，可以在 vimrc 里添加
&lt;code&gt;set pythondll=/Users/yggdroot/.python2.7.6/lib/libpython2.7.so&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;经此 4 步，99% 能让 Python 工作起来，剩下的 1% 就看人品了。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;补充一点&lt;/strong&gt;：
对于 neovim，执行&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pip2 install --user --upgrade neovim
pip3 install --user --upgrade neovim
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;就可以添加 Python2 和 Python3 的支持，具体参见&lt;code&gt;:h provider-python&lt;/code&gt;。&lt;/p&gt;
&lt;h2 id="从hello world开始"&gt;从 hello world 开始&lt;/h2&gt;
&lt;p&gt;在命令行窗口执行&lt;code&gt;:pyx print("hello world!")&lt;/code&gt;，输出“hello world！”，说明 Python 工作正常，此时我们已经可以使用 Python 来作为 vim 的&lt;code&gt;EX&lt;/code&gt;命令了。&lt;/p&gt;
&lt;h2 id="操作vim像vimL一样容易"&gt;操作 vim 像 vimL 一样容易&lt;/h2&gt;
&lt;p&gt;怎么用 Python 来访问 vim 的信息以及操作 vim 呢？很简单，vim 的 Python 接口提供了一个叫 vim 的模块（module）。vim 模块是 Python 和 vim 沟通的桥梁，通过它，Python 可以访问 vim 的一切信息以及操作 vim，就像使用 vimL 一样。所以写脚本，首先要&lt;code&gt;import vim&lt;/code&gt;。&lt;/p&gt;
&lt;h3 id="vim模块"&gt;vim 模块&lt;/h3&gt;
&lt;p&gt;vim 模块提供了两个非常有用的函数接口：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;vim.command(str)&lt;/code&gt;
执行 vim 中的命令&lt;code&gt;str&lt;/code&gt;(ex-mode)，返回值为 None，例如：&lt;/p&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;%s/\s\+$//g&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;set shiftwidth=4&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;normal! dd&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;vim.eval(str)&lt;/code&gt;
求 vim 表达式&lt;code&gt;str&lt;/code&gt;的值，（什么是 vim 表达式，参见&lt;code&gt;:h expr&lt;/code&gt;），返回结果类型为：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;string&lt;/code&gt;: 如果 vim 表达式的值的类型是&lt;code&gt;string&lt;/code&gt;或&lt;code&gt;number&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;list&lt;/code&gt;：如果 vim 表达式的值的类型是一个 vim list（&lt;code&gt;:h list&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;dictionary&lt;/code&gt;：如果 vim 表达式的值的类型是一个 vim dictionary（&lt;code&gt;:h dict&lt;/code&gt;）&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;例如：&lt;/p&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="n"&gt;sw&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;eval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;amp;shiftwidth&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;eval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;expand(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;%:p&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;eval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;@a&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;vim 模块还提供了一些有用的对象：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Tabpage&lt;/code&gt;对象（&lt;code&gt;:h python-tabpage&lt;/code&gt;）&lt;br&gt;
一个&lt;code&gt;Tabpage&lt;/code&gt;对象对应 vim 的一个 Tabpage。&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Window&lt;/code&gt;对象（&lt;code&gt;:h python-window&lt;/code&gt;）&lt;br&gt;
一个&lt;code&gt;Window&lt;/code&gt;对象对应 vim 的一个 Window。&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Buffer&lt;/code&gt;对象（&lt;code&gt;:h python-buffer&lt;/code&gt;）&lt;br&gt;
一个&lt;code&gt;Buffer&lt;/code&gt;对象对应 vim 的一个 buffer，Buffer 对象提供了一些属性和方法，可以很方便操作 buffer。&lt;br&gt;
例如 (假定&lt;code&gt;b&lt;/code&gt;是当前的 buffer) :&lt;/p&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;            &lt;span class="c1"&gt;# write the buffer file name
&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;hello!!!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;       &lt;span class="c1"&gt;# replace the top line
&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;[:]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;             &lt;span class="c1"&gt;# delete the whole buffer
&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="k"&gt;del&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;[:]&lt;/span&gt;                &lt;span class="c1"&gt;# delete the whole buffer
&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;a line&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt;   &lt;span class="c1"&gt;# add a line at the top
&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="k"&gt;del&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;                &lt;span class="c1"&gt;# delete a line (the third)
&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bottom&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;      &lt;span class="c1"&gt;# add a line at the bottom
&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;              &lt;span class="c1"&gt;# number of lines
&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;py &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mark&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;a&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# named mark
&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;        &lt;span class="c1"&gt;# a sub-range of the buffer
&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;vars&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;foo&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bar&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;   &lt;span class="c1"&gt;# assign b:foo variable
&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ff&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;dos&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="c1"&gt;# set fileformat
&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="k"&gt;del&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ar&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;     &lt;span class="c1"&gt;# same as :set autoread&amp;lt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;vim.current&lt;/code&gt;对象（&lt;code&gt;:h python-current&lt;/code&gt;）&lt;br&gt;
&lt;code&gt;vim.current&lt;/code&gt;对象提供了一些属性，可以方便的访问“&lt;strong&gt;当前&lt;/strong&gt;”的 vim 对象&lt;/p&gt;
&lt;table class="table table-bordered table-striped"&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;th&gt;属性&lt;/th&gt;
&lt;th&gt;含义&lt;/th&gt;
&lt;th&gt;类型&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;vim.current.line&lt;/td&gt;
&lt;td&gt;The current line (RW)&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;vim.current.buffer&lt;/td&gt;
&lt;td&gt;The current buffer (RW)&lt;/td&gt;
&lt;td&gt;Buffer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;vim.current.window&lt;/td&gt;
&lt;td&gt;The current window (RW)&lt;/td&gt;
&lt;td&gt;Window&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;vim.current.tabpage&lt;/td&gt;
&lt;td&gt;The current tab page (RW)&lt;/td&gt;
&lt;td&gt;TabPage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;vim.current.range&lt;/td&gt;
&lt;td&gt;The current line range (RO)&lt;/td&gt;
&lt;td&gt;Range&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="python访问vim中的变量"&gt;python 访问 vim 中的变量&lt;/h3&gt;
&lt;p&gt;访问 vim 中的变量，可以通过前面介绍的&lt;code&gt;vim.eval(str)&lt;/code&gt;来访问，例如：&lt;/p&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;eval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;v:version&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;但是，还有更&lt;strong&gt;pythonic&lt;/strong&gt;的方法：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;预定义 vim 变量（&lt;code&gt;v:var&lt;/code&gt;）&lt;br&gt;
可以通过&lt;code&gt;vim.vvars&lt;/code&gt;来访问预定义 vim 变量，&lt;code&gt;vim.vvars&lt;/code&gt;是个类似&lt;code&gt;Dictionary&lt;/code&gt;的对象。&lt;br&gt;
例如，访问&lt;code&gt;v:version&lt;/code&gt;：&lt;/p&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vvars&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;version&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;全局变量（&lt;code&gt;g:var&lt;/code&gt;）&lt;br&gt;
可以通过&lt;code&gt;vim.vars&lt;/code&gt;来访问全局变量，&lt;code&gt;vim.vars&lt;/code&gt;也是个类似&lt;code&gt;Dictionary&lt;/code&gt;的对象。&lt;br&gt;
例如，改变全局变量&lt;code&gt;g:global_var&lt;/code&gt;的值：&lt;/p&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;vars&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;global_var&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;123&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;tabpage 变量（&lt;code&gt;t:var&lt;/code&gt;）&lt;br&gt;
例如：&lt;/p&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tabpage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;vars&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;var&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Tabpage&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;window 变量（&lt;code&gt;w:var&lt;/code&gt;）&lt;br&gt;
例如：&lt;/p&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;vars&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;var&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Window&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;buffer 变量（&lt;code&gt;b:var&lt;/code&gt;）&lt;br&gt;
例如：&lt;/p&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;buffer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;vars&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;var&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Buffer&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="python访问vim中的选项（options）"&gt;python 访问 vim 中的选项（&lt;code&gt;options&lt;/code&gt;）&lt;/h3&gt;
&lt;p&gt;访问 vim 中的选项，可以通过前面介绍的&lt;code&gt;vim.command(str)&lt;/code&gt;和&lt;code&gt;vim.eval(str)&lt;/code&gt;来访问，例如：&lt;/p&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;set shiftwidth=4&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;eval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;amp;shiftwidth&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;当然，还有更&lt;strong&gt;pythonic&lt;/strong&gt;的方法：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;全局选项设置（&lt;code&gt;:h python-options&lt;/code&gt;）&lt;br&gt;
例如：&lt;/p&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;autochdir&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;注意&lt;/strong&gt;：如果是&lt;code&gt;window-local&lt;/code&gt;或者&lt;code&gt;buffer-local&lt;/code&gt;选项，此种方法会报&lt;code&gt;KeyError&lt;/code&gt;异常。对于&lt;code&gt;window-local&lt;/code&gt;和&lt;code&gt;buffer-local&lt;/code&gt;选项，请往下看。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;window-local&lt;/code&gt;选项设置&lt;br&gt;
例如：&lt;/p&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;number&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;buffer-local&lt;/code&gt;选项设置&lt;br&gt;
例如：&lt;/p&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;buffer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;shiftwidth&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="两种方式写vim插件"&gt;两种方式写 vim 插件&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;内嵌式&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;py[thon] &amp;lt;&amp;lt; {endmarker}
{script}
{endmarker}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;{script}&lt;/code&gt;中的内容为 Python 代码，&lt;code&gt;{endmarker}&lt;/code&gt;是一个标记符号，可以是任何字符串，不过&lt;code&gt;{endmarker}&lt;/code&gt;前面不能有任何的空白字符，也就是要顶格写。
例如，写一个函数，打印出当前 buffer 所有的行 (&lt;code&gt;Demo.vim&lt;/code&gt;)：&lt;/p&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;&lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt; Demo&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;py&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&amp;lt;&lt;/span&gt; EOF
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="k"&gt;vim&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="nb"&gt;line&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="k"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;current&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;buffer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="nb"&gt;line&lt;/span&gt;
EOF
&lt;span class="k"&gt;endfunction&lt;/span&gt;
&lt;span class="k"&gt;call&lt;/span&gt; Demo&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;运行&lt;code&gt;:source %&lt;/code&gt;查看结果。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;独立式&lt;br&gt;
把 Python 代码写到&lt;code&gt;*.py&lt;/code&gt;中，vimL 只用来定义全局变量、map、command 等，&lt;a href="https://github.com/Yggdroot/LeaderF" rel="nofollow" target="_blank" title=""&gt;LeaderF&lt;/a&gt;就是采用这种方式。个人更喜欢这种方式，可以把全部精力集中在写 Python 代码上。&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="异步"&gt;异步&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;多线程&lt;br&gt;
可以通过 Python 的&lt;code&gt;threading&lt;/code&gt;模块来实现多线程。但是，线程里面只能实现与 vim 无关的逻辑，任何试图在线程里面操作 vim 的行为都可能（也许用“肯定会”更合适）导致 vim 崩溃，甚至包括只&lt;strong&gt;读&lt;/strong&gt;一个 vim 选项。虽然如此，也比 vimL 好多了，毕竟聊胜于无。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;subprocess&lt;br&gt;
可以通过 Python 的&lt;code&gt;subprocess&lt;/code&gt;模块来调用外部命令。&lt;br&gt;
例如：&lt;/p&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;subprocess&lt;/span&gt;
&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Popen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ls -l&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;shell&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stdout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PIPE&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;stdout&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;也就是说，从支持 Python 起，vim 就已经支持异步了（虽然直到 vim7.4 才基本没有 bug），Neovim 所增加的异步功能，对用 Python 写插件的小伙伴来说，没有任何吸引力。好多 Neovim 粉竟以引入异步（job）而引以为傲，它什么时候能引入真正的多线程支持我才会服它。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="案例"&gt;案例&lt;/h2&gt;
&lt;p&gt;著名的补全插件 YCM 和模糊查找神器&lt;a href="https://github.com/Yggdroot/LeaderF" rel="nofollow" target="_blank" title=""&gt;LeaderF&lt;/a&gt;都是使用 Python 编写的。&lt;/p&gt;
&lt;h2 id="缺陷"&gt;缺陷&lt;/h2&gt;
&lt;p&gt;由于 GIL 的原因，Python 线程无法并行处理；而 vim 又不支持 Python 的进程（&lt;a href="https://github.com/vim/vim/issues/906" rel="nofollow" target="_blank"&gt;https://github.com/vim/vim/issues/906&lt;/a&gt;），计算密集型任务想利用多核来提高性能已不可能。&lt;/p&gt;
&lt;h2 id="奇技淫巧"&gt;奇技淫巧&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;把 buffer 中所有单词首字母变为大写字母&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;:%pydo return line.title()
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;把 buffer 中所有的行镜像显示&lt;/p&gt;

&lt;p&gt;例如，把&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;vim is very useful
123 456 789
abc def ghi
who am I
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;变为&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;lufesu yrev si miv
987 654 321
ihg fed cba
I ma ohw
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可以执行此命令：&lt;code&gt;:%pydo return line[::-1]&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="总结"&gt;总结&lt;/h2&gt;
&lt;p&gt;以上只是简单的介绍，更详细的资料可以参考&lt;code&gt;:h python&lt;/code&gt;。&lt;/p&gt;</description>
      <author>Yggdroot</author>
      <pubDate>Tue, 28 Nov 2017 12:39:58 +0800</pubDate>
      <link>https://ruby-china.org/topics/34640</link>
      <guid>https://ruby-china.org/topics/34640</guid>
    </item>
    <item>
      <title>让人相见恨晚的 vim 插件：模糊查找神器 LeaderF</title>
      <description>&lt;p&gt;提到 vim 的模糊查找插件，很多人第一反应是 ctrlp.vim，ctrlp 知名度很高，但跟其它的同类插件相比，它的唯一优点是用 vimL 编写（这让它的性能是所有同类插件中最差的）。本文向大家推荐一款模糊查找插件——[LeaderF][1]，无论是从性能还是匹配精度上，都远远超越 ctrlp。&lt;/p&gt;
&lt;h2 id="[LeaderF][1]是什么？"&gt;[LeaderF][1] 是什么？&lt;/h2&gt;
&lt;p&gt;LeaderF 是一个用 Python 写的 vim 插件，可以在成千上万数十万个文件中，通过模糊查找的方式，快速找到目标文件。它还有很多衍生功能：快速打开或定位某个 buffer、最近使用的文件（mru）、tags（包括函数、类、变量等）、命令历史、文件中的某一行、vim 的 help、marks 等等。&lt;/p&gt;
&lt;h3 id="查找文件"&gt;查找文件&lt;/h3&gt;
&lt;p&gt;文件查找是 vimer 的常用操作，海量文件中快速定位目标文件是很多 vimer 迫切需要的功能，所以就有了 ctrlp 这样的插件。但 ctrlp 性能不佳，而且有时候把目标文件名都输入进搜索栏还是找不到目标文件，最大的问题是它的模糊匹配算法不佳，经常排在前面的跟所要找的相去甚远。LeaderF 采用异步检索和精心设计的模糊匹配算法完美地解决了这些问题，当你在根目录 (&lt;code&gt;/&lt;/code&gt;) 按下搜索命令，再也没有想剁手的冲动了; 查找文件时，用更少的键击次数就可以找到目标文件，延长你的键盘使用寿命 :)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;异步检索&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2017/12c48018-5f84-4e6a-ac4b-c9811a1f8c46.gif!large" title="" alt=""&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;模糊查找&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2017/ae142de0-177c-460c-907f-da0e1c402d98.gif!large" title="" alt=""&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;正则表达式查找&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2017/d66fe4ac-242b-4bdc-81a5-e5c9c74448b7.gif!large" title="" alt=""&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;多字节字符查找（中文查找）&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2017/69206fb6-a2c4-4e90-9ad8-df8b7b227eb7.gif!large" title="" alt=""&gt;&lt;/p&gt;
&lt;h3 id="快速定位tags（包括函数、类、变量等）"&gt;快速定位 tags（包括函数、类、变量等）&lt;/h3&gt;
&lt;p&gt;有了它，tagbar 可以淘汰掉了：&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2017/3909a488-5db4-46d1-a506-0a2a875c970e.gif!large" title="" alt=""&gt;&lt;/p&gt;
&lt;h3 id="查找历史命令"&gt;查找历史命令&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2017/772abe06-5bb8-46f8-a230-7c61f81fa472.gif!large" title="" alt=""&gt;&lt;/p&gt;
&lt;h3 id="切换Colorscheme"&gt;切换 Colorscheme&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2017/39ac8c9a-5b5e-443a-a33a-72036988eb7a.gif!large" title="" alt=""&gt;&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;当然还有其他功能就不一一展示了，感兴趣的小伙伴可以查看 [这里][2]。&lt;/p&gt;
&lt;h3 id="你不知道的细节"&gt;你不知道的细节&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;智能大小写（smartcase）&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;如果输入的搜索字符都是小写字母，则匹配是大小写不敏感的；如果输入大写字母，则只匹配大写字母，小写字母仍然是大小写不敏感的。例如，输入&lt;code&gt;abcDef&lt;/code&gt;，可以匹配如下字符串：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;abcDef
AbcDef
abcDEf
aBcDeF
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;但不能匹配：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;abcdef
Abcdef
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;注意&lt;/strong&gt;：&lt;code&gt;abc&lt;/code&gt;和&lt;code&gt;ef&lt;/code&gt;仍然是大小写不敏感的
这样可以通过大写字母，在搜索过程中快速缩小搜索范围。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;同时打开多个文件&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2017/dbc60bd9-fe3a-42ce-b67a-2003ad5f8d8a.gif!large" title="" alt=""&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;细化搜索结果&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2017/ba9afd55-1ea7-4f37-b97f-3aec52499e24.gif!large" title="" alt=""&gt;&lt;/p&gt;
&lt;h3 id="开箱即用"&gt;开箱即用&lt;/h3&gt;
&lt;p&gt;上面所有的功能都不需要额外的配置，只要装好 LeaderF 插件就可以使用了，不像有的插件，配置就像一门新的脚本语言。&lt;/p&gt;
&lt;h2 id="最后"&gt;最后&lt;/h2&gt;
&lt;p&gt;LeaderF 还支持写扩展程序，[这里][3] 是一个样例。&lt;/p&gt;

&lt;p&gt;友情链接：[LeaderF，也許是 Vim 最好的模糊查詢插件][4]&lt;/p&gt;

&lt;p&gt;[1]: &lt;a href="https://github.com/Yggdroot/LeaderF" rel="nofollow" target="_blank"&gt;https://github.com/Yggdroot/LeaderF&lt;/a&gt;
  [2]: &lt;a href="https://github.com/Yggdroot/LeaderF/blob/master/README.md" rel="nofollow" target="_blank"&gt;https://github.com/Yggdroot/LeaderF/blob/master/README.md&lt;/a&gt;
  [3]: &lt;a href="https://github.com/Yggdroot/LeaderF-marks" rel="nofollow" target="_blank"&gt;https://github.com/Yggdroot/LeaderF-marks&lt;/a&gt;
  [4]: &lt;a href="https://0x3f.org/post/leaderf-currently-the-best-fuzzy-finder-of-vim/" rel="nofollow" target="_blank"&gt;https://0x3f.org/post/leaderf-currently-the-best-fuzzy-finder-of-vim/&lt;/a&gt;&lt;/p&gt;</description>
      <author>Yggdroot</author>
      <pubDate>Thu, 07 Sep 2017 16:45:08 +0800</pubDate>
      <link>https://ruby-china.org/topics/34055</link>
      <guid>https://ruby-china.org/topics/34055</guid>
    </item>
  </channel>
</rss>
