<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7045570</id><updated>2026-03-24T07:37:15.177+08:00</updated><category term="[知]"/><category term="Software"/><category term="OpenSource"/><category term="Vim"/><category term="[言]"/><category term="[见]"/><category term="Mac"/><category term="BI"/><category term="Hyperion"/><category term="KM"/><category term="Web Service"/><category term="Web Design"/><category term="MindMap"/><category term="[人]"/><category term="Coffee"/><title type='text'>语虚</title><subtitle type='html'>良辰美景奈何天 赏心乐事谁家院 原来姹紫嫣红开遍 似这般都付于断井残垣</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://yyq123.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7045570/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://yyq123.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/7045570/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>YYQ</name><uri>http://www.blogger.com/profile/00702527262114879030</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>395</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7045570.post-4004938586689640733</id><published>2026-02-28T22:07:00.001+08:00</published><updated>2026-02-28T22:07:25.138+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="[知]"/><category scheme="http://www.blogger.com/atom/ns#" term="OpenSource"/><category scheme="http://www.blogger.com/atom/ns#" term="Software"/><category scheme="http://www.blogger.com/atom/ns#" term="Vim"/><title type='text'>VIM学习笔记 标签页面板(Tabpanel)</title><content type='html'>&lt;p&gt;在&lt;a href=&quot;https://github.com/vim/vim/commit/be5bd4d6292fddcc103091407792730aaa48cc48&quot; style=&quot;scrollbar-color: unset !important; scrollbar-gutter: unset !important; scrollbar-width: unset !important;&quot;&gt;patch 9.1.1391&lt;/a&gt;中，Vim引入了新的UI元素——标签页面板（&lt;a href=&quot;https://vimhelp.org/tabpage.txt.html#tabpanel&quot; style=&quot;scrollbar-color: unset !important; scrollbar-gutter: unset !important; scrollbar-width: unset !important;&quot;&gt;tabpanel&lt;/a&gt;），用于在窗口垂直侧边栏上显示标签页。&lt;/p&gt;&lt;h2 class=&quot;article&quot; style=&quot;border-bottom: 1px solid lightgray; border-left: 6px solid lightgray; font-size: 1.1em; padding: 0px 0px 3px 5px; scrollbar-color: unset !important; scrollbar-gutter: unset !important; scrollbar-width: unset !important;&quot;&gt;&lt;a id=&quot;opt-showtabpanel&quot; style=&quot;scrollbar-color: unset !important; scrollbar-gutter: unset !important; scrollbar-width: unset !important;&quot;&gt;显示/隐藏标签页面板&lt;/a&gt;&lt;/h2&gt;&lt;p style=&quot;scrollbar-color: unset !important; scrollbar-gutter: unset !important; scrollbar-width: unset !important;&quot;&gt;通过设置showtabpanel选项，可以选择显示或隐藏标签页面板。默认情况下，showtabpanel缺省值为0，将不显示标签页面板。&lt;/p&gt;&lt;p style=&quot;scrollbar-color: unset !important; scrollbar-gutter: unset !important; scrollbar-width: unset !important;&quot;&gt;使用以下命令，将始终显示标签页面板：&lt;/p&gt;&lt;p style=&quot;scrollbar-color: unset !important; scrollbar-gutter: unset !important; scrollbar-width: unset !important; text-indent: 2em;&quot;&gt;&lt;code class=&quot;inset&quot; style=&quot;color: #993300; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-weight: bold; margin: 0px 0.2em; padding: 0px; scrollbar-color: unset !important; scrollbar-gutter: unset !important; scrollbar-width: unset !important;&quot;&gt;:set showtabpanel=2&lt;/code&gt;&lt;/p&gt;&lt;p style=&quot;scrollbar-color: unset !important; scrollbar-gutter: unset !important; scrollbar-width: unset !important;&quot;&gt;使用以下命令，将在至少有两个标签页时才会显示标签页面板：&lt;/p&gt;&lt;p style=&quot;scrollbar-color: unset !important; scrollbar-gutter: unset !important; scrollbar-width: unset !important; text-indent: 2em;&quot;&gt;&lt;code class=&quot;inset&quot; style=&quot;color: #993300; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-weight: bold; margin: 0px 0.2em; padding: 0px; scrollbar-color: unset !important; scrollbar-gutter: unset !important; scrollbar-width: unset !important;&quot;&gt;:set showtabpanel=1&lt;/code&gt;&lt;/p&gt;&lt;p style=&quot;scrollbar-color: unset !important; scrollbar-gutter: unset !important; scrollbar-width: unset !important;&quot;&gt;使用以下命令，将关闭标签页面板：&lt;/p&gt;&lt;p style=&quot;scrollbar-color: unset !important; scrollbar-gutter: unset !important; scrollbar-width: unset !important; text-indent: 2em;&quot;&gt;&lt;code class=&quot;inset&quot; style=&quot;color: #993300; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-weight: bold; margin: 0px 0.2em; padding: 0px; scrollbar-color: unset !important; scrollbar-gutter: unset !important; scrollbar-width: unset !important;&quot;&gt;:set showtabpanel=0&lt;/code&gt;&lt;/p&gt;&lt;h2 class=&quot;article&quot; style=&quot;border-bottom: 1px solid lightgray; border-left: 6px solid lightgray; font-size: 1.1em; padding: 0px 0px 3px 5px; scrollbar-color: unset !important; scrollbar-gutter: unset !important; scrollbar-width: unset !important;&quot;&gt;&lt;a id=&quot;opt-tabpanelopt&quot; style=&quot;scrollbar-color: unset !important; scrollbar-gutter: unset !important; scrollbar-width: unset !important;&quot;&gt;标签页面板选项&lt;/a&gt;&lt;/h2&gt;&lt;p style=&quot;scrollbar-color: unset !important; scrollbar-gutter: unset !important; scrollbar-width: unset !important;&quot;&gt;通过设置tabpanelopt选项，可以定制标签页面板：&lt;/p&gt;&lt;ul style=&quot;scrollbar-color: unset !important; scrollbar-gutter: unset !important; scrollbar-width: unset !important;&quot;&gt;&lt;li style=&quot;scrollbar-color: unset !important; scrollbar-gutter: unset !important; scrollbar-width: unset !important;&quot;&gt;&lt;i style=&quot;scrollbar-color: unset !important; scrollbar-gutter: unset !important; scrollbar-width: unset !important;&quot;&gt;align&lt;/i&gt;，决定标签页面板显示在窗口的左侧或右侧；&lt;/li&gt;&lt;li style=&quot;scrollbar-color: unset !important; scrollbar-gutter: unset !important; scrollbar-width: unset !important;&quot;&gt;&lt;i style=&quot;scrollbar-color: unset !important; scrollbar-gutter: unset !important; scrollbar-width: unset !important;&quot;&gt;columns&lt;/i&gt;，指定标签页面板的宽度；&lt;/li&gt;&lt;li style=&quot;scrollbar-color: unset !important; scrollbar-gutter: unset !important; scrollbar-width: unset !important;&quot;&gt;&lt;i style=&quot;scrollbar-color: unset !important; scrollbar-gutter: unset !important; scrollbar-width: unset !important;&quot;&gt;vert&lt;/i&gt;，指定标签页面板和窗口显示部分间是否显示垂直分割符。&lt;/li&gt;&lt;/ul&gt;&lt;p style=&quot;scrollbar-color: unset !important; scrollbar-gutter: unset !important; scrollbar-width: unset !important;&quot;&gt;使用以下命令，将在屏幕左侧显示宽度为15的标签页面板：&lt;/p&gt;&lt;p style=&quot;scrollbar-color: unset !important; scrollbar-gutter: unset !important; scrollbar-width: unset !important; text-indent: 2em;&quot;&gt;&lt;code class=&quot;inset&quot; style=&quot;color: #993300; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-weight: bold; margin: 0px 0.2em; padding: 0px; scrollbar-color: unset !important; scrollbar-gutter: unset !important; scrollbar-width: unset !important;&quot;&gt;:set tabpanelopt=vert,align:left,columns:15&lt;/code&gt;&lt;/p&gt;&lt;p style=&quot;scrollbar-color: unset !important; scrollbar-gutter: unset !important; scrollbar-width: unset !important;&quot;&gt;通过设置fillchars选项，可以定义标签页面板的垂直分隔符：&lt;/p&gt;&lt;p style=&quot;scrollbar-color: unset !important; scrollbar-gutter: unset !important; scrollbar-width: unset !important; text-indent: 2em;&quot;&gt;&lt;code class=&quot;inset&quot; style=&quot;color: #993300; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-weight: bold; margin: 0px 0.2em; padding: 0px; scrollbar-color: unset !important; scrollbar-gutter: unset !important; scrollbar-width: unset !important;&quot;&gt;:set fillchars+=tpl_vert:\|&lt;/code&gt;&lt;/p&gt;&lt;h2 class=&quot;article&quot; style=&quot;border-bottom: 1px solid lightgray; border-left: 6px solid lightgray; font-size: 1.1em; padding: 0px 0px 3px 5px; scrollbar-color: unset !important; scrollbar-gutter: unset !important; scrollbar-width: unset !important;&quot;&gt;&lt;a id=&quot;tpl-highlight&quot; style=&quot;scrollbar-color: unset !important; scrollbar-gutter: unset !important; scrollbar-width: unset !important;&quot;&gt;标签面板配色方案&lt;/a&gt;&lt;/h2&gt;&lt;p style=&quot;scrollbar-color: unset !important; scrollbar-gutter: unset !important; scrollbar-width: unset !important;&quot;&gt;默认情况下，gVim使用GUI风格的配色方案：&lt;/p&gt;&lt;p style=&quot;scrollbar-color: unset !important; scrollbar-gutter: unset !important; scrollbar-width: unset !important;&quot;&gt;&lt;a href=&quot;https://yyq123.github.io/learn-vim/images/guioptions-e.png&quot; style=&quot;scrollbar-color: unset !important; scrollbar-gutter: unset !important; scrollbar-width: unset !important;&quot; title=&quot;guioptions+e&quot;&gt;&lt;img alt=&quot;guioptions+e&quot; src=&quot;https://yyq123.github.io/learn-vim/images/guioptions-e.png&quot; style=&quot;scrollbar-color: unset !important; scrollbar-gutter: unset !important; scrollbar-width: unset !important;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;scrollbar-color: unset !important; scrollbar-gutter: unset !important; scrollbar-width: unset !important;&quot;&gt;使用以下命令，可以设置gVim的&lt;a href=&quot;http://yyq123.github.io/learn-vim/learn-vi-15-Tabs.html&quot; style=&quot;scrollbar-color: unset !important; scrollbar-gutter: unset !important; scrollbar-width: unset !important;&quot; title=&quot;Tabs&quot;&gt;标签页&lt;/a&gt;（tabline）和标签面板（tabpanel）都使用现有的&lt;a href=&quot;https://tinyurl.com/vim-ColorScheme&quot; style=&quot;scrollbar-color: unset !important; scrollbar-gutter: unset !important; scrollbar-width: unset !important;&quot; title=&quot;Color Scheme&quot;&gt;配色方案&lt;/a&gt;：&lt;/p&gt;&lt;p style=&quot;scrollbar-color: unset !important; scrollbar-gutter: unset !important; scrollbar-width: unset !important; text-indent: 2em;&quot;&gt;&lt;code class=&quot;inset&quot; style=&quot;color: #993300; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-weight: bold; margin: 0px 0.2em; padding: 0px; scrollbar-color: unset !important; scrollbar-gutter: unset !important; scrollbar-width: unset !important;&quot;&gt;:set guioptions-=e&lt;/code&gt;&lt;/p&gt;&lt;p style=&quot;scrollbar-color: unset !important; scrollbar-gutter: unset !important; scrollbar-width: unset !important;&quot;&gt;&lt;a href=&quot;https://yyq123.github.io/learn-vim/images/guioptions--e.png.png&quot; style=&quot;scrollbar-color: unset !important; scrollbar-gutter: unset !important; scrollbar-width: unset !important;&quot; title=&quot;guioptions-e&quot;&gt;&lt;img alt=&quot;guioptions-e&quot; src=&quot;https://yyq123.github.io/learn-vim/images/guioptions--e.png&quot; style=&quot;scrollbar-color: unset !important; scrollbar-gutter: unset !important; scrollbar-width: unset !important;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;scrollbar-color: unset !important; scrollbar-gutter: unset !important; scrollbar-width: unset !important;&quot;&gt;将以下代码添加到vimrc启动文件中，可以进一步定制标签页和标签面板的配色：&lt;/p&gt;&lt;pre class=&quot;block&quot; style=&quot;background: rgb(244, 244, 244); border-color: rgb(221, 221, 221) rgb(221, 221, 221) rgb(221, 221, 221) lightgray; border-image: initial; border-style: solid; border-width: 1px 1px 1px 3px; break-inside: avoid; color: #666666; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-size: 0.8em; font-weight: bold; line-height: 1.2; margin-bottom: 1.2em; max-width: 100%; overflow-wrap: break-word; overflow: auto; padding: 1em 1.5em; scrollbar-color: unset !important; scrollbar-gutter: unset !important; scrollbar-width: unset !important;&quot;&gt;&lt;code class=&quot;inset&quot; style=&quot;color: #993300; display: block; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; margin: 0px 0.2em; overflow-wrap: normal; padding: 0px; scrollbar-color: unset !important; scrollbar-gutter: unset !important; scrollbar-width: unset !important;&quot;&gt;hi TabLine      guifg=#c5c8c6 guibg=#303030 gui=none ctermfg=254 ctermbg=236 cterm=none
hi TabLineSel   guifg=#c5c8c6 guibg=#1d1f21 gui=bold ctermfg=254 ctermbg=236 cterm=bold
hi TabLineFill  guifg=#c5c8c6 guibg=#303030 gui=none ctermfg=254 ctermbg=236 cterm=none
hi VertSplit	guifg=#3a3a3a guibg=#1d1f21 gui=none ctermfg=254 ctermbg=236 cterm=none&lt;/code&gt;&lt;/pre&gt;&lt;p style=&quot;scrollbar-color: unset !important; scrollbar-gutter: unset !important; scrollbar-width: unset !important;&quot;&gt;由于Tabpanel相关高亮组已经默认链接至Tabline，所以只需要定义Tabline相关高亮组即可：&lt;/p&gt;&lt;p style=&quot;scrollbar-color: unset !important; scrollbar-gutter: unset !important; scrollbar-width: unset !important;&quot;&gt;&lt;a href=&quot;https://yyq123.github.io/learn-vim/images/tabpanel_highlight_group_link.png&quot; style=&quot;scrollbar-color: unset !important; scrollbar-gutter: unset !important; scrollbar-width: unset !important;&quot; title=&quot;tabpanel_highlight_group_link&quot;&gt;&lt;img alt=&quot;tabpanel_highlight_group_link&quot; src=&quot;https://yyq123.github.io/learn-vim/images/tabpanel_highlight_group_link.png&quot; style=&quot;scrollbar-color: unset !important; scrollbar-gutter: unset !important; scrollbar-width: unset !important;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;scrollbar-color: unset !important; scrollbar-gutter: unset !important; scrollbar-width: unset !important;&quot;&gt;以下为标签页面板的显示效果：&lt;/p&gt;&lt;p style=&quot;scrollbar-color: unset !important; scrollbar-gutter: unset !important; scrollbar-width: unset !important;&quot;&gt;&lt;a href=&quot;https://yyq123.github.io/learn-vim/images/tabpanel.png&quot; style=&quot;scrollbar-color: unset !important; scrollbar-gutter: unset !important; scrollbar-width: unset !important;&quot; title=&quot;tabpanel&quot;&gt;&lt;img alt=&quot;tabpanel&quot; src=&quot;https://yyq123.github.io/learn-vim/images/tabpanel.png&quot; style=&quot;scrollbar-color: unset !important; scrollbar-gutter: unset !important; scrollbar-width: unset !important;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;scrollbar-color: unset !important; scrollbar-gutter: unset !important; scrollbar-width: unset !important;&quot;&gt;&lt;span style=&quot;color: royalblue; font-weight: bold; margin-left: 0.2em; scrollbar-color: unset !important; scrollbar-gutter: unset !important; scrollbar-width: unset !important;&quot;&gt;？&lt;/span&gt;使用&lt;code class=&quot;inset&quot; style=&quot;color: #993300; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-weight: bold; margin: 0px 0.2em; padding: 0px; scrollbar-color: unset !important; scrollbar-gutter: unset !important; scrollbar-width: unset !important;&quot;&gt;:help tabpanel&lt;/code&gt;命令，可以查看更多帮助信息。&lt;/p&gt;&lt;p style=&quot;border-top: 1px solid lightgray; scrollbar-color: unset !important; scrollbar-gutter: unset !important; scrollbar-width: unset !important;&quot;&gt;&lt;span style=&quot;float: right; scrollbar-color: unset !important; scrollbar-gutter: unset !important; scrollbar-width: unset !important;&quot;&gt;Ver: 260228&amp;nbsp;|&amp;nbsp;&lt;a href=&quot;mailto:yyq123@gmail.com&quot; style=&quot;scrollbar-color: unset !important; scrollbar-gutter: unset !important; scrollbar-width: unset !important;&quot;&gt;YYQ&lt;/a&gt;&lt;/span&gt;&lt;span style=&quot;scrollbar-color: unset !important; scrollbar-gutter: unset !important; scrollbar-width: unset !important;&quot;&gt;&amp;lt;&lt;a href=&quot;http://yyq123.github.io/learn-vim/learn-vi-15-Tabs.html&quot; style=&quot;scrollbar-color: unset !important; scrollbar-gutter: unset !important; scrollbar-width: unset !important;&quot; title=&quot;标签页(Tab)&quot;&gt;上一篇&lt;/a&gt;&amp;nbsp;|&lt;a href=&quot;http://yyq123.github.com/learn-vim/learn-vi-00-00-TOC.html&quot; style=&quot;scrollbar-color: unset !important; scrollbar-gutter: unset !important; scrollbar-width: unset !important;&quot; title=&quot;笔记列表&quot;&gt;&amp;nbsp;目录&amp;nbsp;&lt;/a&gt;|&amp;nbsp;&lt;a href=&quot;http://yyq123.github.io/learn-vim/SetOption.html&quot; style=&quot;scrollbar-color: unset !important; scrollbar-gutter: unset !important; scrollbar-width: unset !important;&quot; title=&quot;设置选项(Set Options)&quot;&gt;下一篇&lt;/a&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://yyq123.blogspot.com/feeds/4004938586689640733/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='http://yyq123.blogspot.com/2026/02/vim-tabpanel.html#comment-form' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7045570/posts/default/4004938586689640733'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7045570/posts/default/4004938586689640733'/><link rel='alternate' type='text/html' href='http://yyq123.blogspot.com/2026/02/vim-tabpanel.html' title='VIM学习笔记 标签页面板(Tabpanel)'/><author><name>YYQ</name><uri>http://www.blogger.com/profile/00702527262114879030</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7045570.post-6275848324226878426</id><published>2026-01-31T19:45:00.001+08:00</published><updated>2026-01-31T19:45:09.789+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="[知]"/><category scheme="http://www.blogger.com/atom/ns#" term="OpenSource"/><category scheme="http://www.blogger.com/atom/ns#" term="Software"/><category scheme="http://www.blogger.com/atom/ns#" term="Vim"/><title type='text'>VIM学习笔记 编辑CSV数据文件</title><content type='html'>&lt;p&gt;&lt;a href=&quot;https://fileinfo.com/extension/csv&quot; title=&quot;.CSV File Extension&quot;&gt;CSV&lt;/a&gt;是一种以逗号分隔值的文本文件，常用于电子表格程序，如 Microsoft Excel 或 OpenOffice Calc。CSV 文件中的每一行代表数据库中的一行，而每行数据又由一个或多个以逗号分隔的字段组成。&lt;/p&gt;&lt;p&gt;针对典型的CSV数据处理场景，以下将结合Vim内置命令、操作系统命令和&lt;a href=&quot;http://github.com/chrisbra/csv.vim&quot; style=&quot;font-weight: bold;&quot; title=&quot;csv.vim&quot;&gt;csv.vim&lt;/a&gt;插件进行操作演示。&lt;/p&gt;&lt;p&gt;您也可以使用&lt;a href=&quot;https://kutt.it/vim-rb-csv&quot; title=&quot;Rainbow-CSV&quot;&gt;Rainbow CSV&lt;/a&gt;等其他插件执行类似操作。&lt;/p&gt;&lt;h2 class=&quot;article&quot; style=&quot;border-bottom: 1px solid lightgray; border-left: 6px solid lightgray; font-size: 1.1em; padding: 0px 0px 3px 5px;&quot;&gt;&lt;a id=&quot;install&quot;&gt;安装配置&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;推荐使用&lt;a href=&quot;https://yyq123.github.io/learn-vim/learn-vim-plugin-minpac.html&quot; title=&quot;插件管理器(minpac)&quot;&gt;minpac&lt;/a&gt;等插件管理器，来安装GitHub上的&lt;a href=&quot;http://github.com/chrisbra/csv.vim&quot; title=&quot;csv.vim&quot;&gt;csv.vim&lt;/a&gt;插件。（请参阅官方&lt;a href=&quot;https://github.com/chrisbra/csv.vim?tab=readme-ov-file#installation&amp;quot;&quot; title=&quot;installation&quot;&gt;安装文档&lt;/a&gt;）&lt;/p&gt;&lt;h2 class=&quot;article&quot; style=&quot;border-bottom: 1px solid lightgray; border-left: 6px solid lightgray; font-size: 1.1em; padding: 0px 0px 3px 5px;&quot;&gt;&lt;a id=&quot;frozen-headers&quot;&gt;固定标题行&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;通过以下步骤，将文件拆分在两个水平窗口中显示并绑定滚动，可以保持标题行始终置顶显示：&lt;/p&gt;&lt;ol&gt;&lt;li&gt;打开CSV文件，使用&lt;code class=&quot;inset&quot; style=&quot;color: #993300; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-weight: bold; margin: 0px 0.2em; padding: 0px;&quot;&gt;:set nowrap&lt;/code&gt;命令，取消折行显示；&lt;/li&gt;&lt;li&gt;使用&lt;code class=&quot;inset&quot; style=&quot;color: #993300; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-weight: bold; margin: 0px 0.2em; padding: 0px;&quot;&gt;:sp&lt;/code&gt;命令，水平分割窗口，然后点击&lt;kbd style=&quot;color: #404040; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-weight: bold; margin: 0px; padding: 0px 0.5em;&quot;&gt;1Ctrl-w_&lt;/kbd&gt;快捷键，调整窗口尺寸仅显示首行；&lt;/li&gt;&lt;li&gt;点击&lt;kbd style=&quot;color: #404040; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-weight: bold; margin: 0px; padding: 0px 0.5em;&quot;&gt;Ctrl-wj&lt;/kbd&gt;快捷键，跳转到下一窗口；&lt;/li&gt;&lt;li&gt;使用&lt;code class=&quot;inset&quot; style=&quot;color: #993300; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-weight: bold; margin: 0px 0.2em; padding: 0px;&quot;&gt;:set scrollopt=hor&lt;/code&gt;命令，显示横向滚动条；使用&lt;code class=&quot;inset&quot; style=&quot;color: #993300; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-weight: bold; margin: 0px 0.2em; padding: 0px;&quot;&gt;:set scrollbind&lt;/code&gt;命令，绑定滚动；&lt;/li&gt;&lt;li&gt;点击&lt;kbd style=&quot;color: #404040; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-weight: bold; margin: 0px; padding: 0px 0.5em;&quot;&gt;Ctrl-wk&lt;/kbd&gt;快捷键，跳转到上一窗口；&lt;/li&gt;&lt;li&gt;使用&lt;code class=&quot;inset&quot; style=&quot;color: #993300; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-weight: bold; margin: 0px 0.2em; padding: 0px;&quot;&gt;:set scrollbind&lt;/code&gt;命令，绑定滚动；&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;此时在文件中左右移动，标题行与内容将自动同步对齐：&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://yyq123.github.io/learn-vim/images/CSV-Frozen-Headers.png&quot; title=&quot;CSV-Frozen-Headers.png&quot;&gt;&lt;img alt=&quot;CSV-Frozen-Headers.png&quot; src=&quot;https://yyq123.github.io/learn-vim/images/CSV-Frozen-Headers.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;使用&lt;a href=&quot;https://github.com/chrisbra/csv.vim&quot; title=&quot;csv.vim&quot;&gt;csv.vim&lt;/a&gt;插件，执行以下命令可以固定标题行：&lt;/p&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;&lt;code class=&quot;inset&quot; style=&quot;color: #993300; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-weight: bold; margin: 0px 0.2em; padding: 0px;&quot;&gt;:Header&lt;/code&gt;&lt;/p&gt;&lt;p&gt;执行以下命令可以取消固定标题行：&lt;/p&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;&lt;code class=&quot;inset&quot; style=&quot;color: #993300; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-weight: bold; margin: 0px 0.2em; padding: 0px;&quot;&gt;:Header!&lt;/code&gt;&lt;/p&gt;&lt;h2 class=&quot;article&quot; style=&quot;border-bottom: 1px solid lightgray; border-left: 6px solid lightgray; font-size: 1.1em; padding: 0px 0px 3px 5px;&quot;&gt;&lt;a id=&quot;column&quot;&gt;按列对齐&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;假设有以下逗号分割的CSV文件，如下图红线所示，数据列没有对齐：&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://yyq123.github.io/learn-vim/images/CSV-Column-Align-Before.png&quot; title=&quot;CSV-Column-Align-Before&quot;&gt;&lt;img alt=&quot;CSV-Column-Align-Before&quot; height=&quot;84&quot; src=&quot;https://yyq123.github.io/learn-vim/images/CSV-Column-Align-Before.png&quot; width=&quot;550&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;在Linux中，使用&lt;a href=&quot;https://kutt.it/vim-filter&quot; title=&quot;filter&quot;&gt;过滤器(Filter)&lt;/a&gt;执行外部&lt;a href=&quot;http://man.he.net/?topic=column&amp;amp;section=all&quot; title=&quot;column&quot;&gt;column&lt;/a&gt;命令来按列对齐：&lt;/p&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;&lt;code class=&quot;inset&quot; style=&quot;color: #993300; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-weight: bold; margin: 0px 0.2em; padding: 0px;&quot;&gt;:%!column -t&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://yyq123.github.io/learn-vim/images/CSV-Column-Align-After.png&quot; title=&quot;CSV-Column-Align-After&quot;&gt;&lt;img alt=&quot;CSV-Column-Align-After&quot; height=&quot;77&quot; src=&quot;https://yyq123.github.io/learn-vim/images/CSV-Column-Align-After.png&quot; width=&quot;550&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;使用&lt;a href=&quot;https://github.com/chrisbra/csv.vim&quot; title=&quot;csv.vim&quot;&gt;csv.vim&lt;/a&gt;插件，执行以下命令可以按列对齐：&lt;/p&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;&lt;code class=&quot;inset&quot; style=&quot;color: #993300; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-weight: bold; margin: 0px 0.2em; padding: 0px;&quot;&gt;:%ArrangeColumn&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://yyq123.github.io/learn-vim/images/plugin_csv_ArrangeColumn.png&quot; title=&quot;plugin_csv_ArrangeColumn&quot;&gt;&lt;img alt=&quot;plugin_csv_ArrangeColumn&quot; height=&quot;55&quot; src=&quot;https://yyq123.github.io/learn-vim/images/plugin_csv_ArrangeColumn.png&quot; width=&quot;550&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;h2 class=&quot;article&quot; style=&quot;border-bottom: 1px solid lightgray; border-left: 6px solid lightgray; font-size: 1.1em; padding: 0px 0px 3px 5px;&quot;&gt;&lt;a id=&quot;sort&quot;&gt;&lt;/a&gt;按列排序&lt;/h2&gt;&lt;p&gt;调用外部&lt;a href=&quot;https://www.gnu.org/software/coreutils/manual/html_node/sort-invocation.html&quot; title=&quot;sort&quot;&gt;sort&lt;/a&gt;命令，可以按照第2列进行排序：&lt;/p&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;&lt;code class=&quot;inset&quot; style=&quot;color: #993300; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-weight: bold; margin: 0px 0.2em; padding: 0px;&quot;&gt;:%!sort -t &#39;,&#39; -k2&lt;/code&gt;&lt;/p&gt;&lt;p&gt;使用&lt;a href=&quot;https://github.com/chrisbra/csv.vim&quot; title=&quot;csv.vim&quot;&gt;csv.vim&lt;/a&gt;插件，执行以下命令可以按照第2列进行排序：&lt;/p&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;&lt;code class=&quot;inset&quot; style=&quot;color: #993300; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-weight: bold; margin: 0px 0.2em; padding: 0px;&quot;&gt;:Sort 2&lt;/code&gt;&lt;/p&gt;&lt;h2 class=&quot;article&quot; style=&quot;border-bottom: 1px solid lightgray; border-left: 6px solid lightgray; font-size: 1.1em; padding: 0px 0px 3px 5px;&quot;&gt;&lt;a id=&quot;merge-columns&quot;&gt;&lt;/a&gt;按列合并&lt;/h2&gt;&lt;p&gt;假设names.txt文件，包含姓名信息：&lt;/p&gt;&lt;pre class=&quot;block&quot; style=&quot;background: rgb(244, 244, 244); border-color: rgb(221, 221, 221) rgb(221, 221, 221) rgb(221, 221, 221) lightgray; border-image: initial; border-style: solid; border-width: 1px 1px 1px 3px; break-inside: avoid; color: #666666; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-size: 0.8em; font-weight: bold; line-height: 1.2; margin-bottom: 1.2em; max-width: 100%; overflow-wrap: break-word; overflow: auto; padding: 1em 1.5em;&quot;&gt;Jason
Cameron
Tim&lt;/pre&gt;&lt;p&gt;假设numbers.txt文件，包含电话信息：&lt;/p&gt;&lt;pre class=&quot;block&quot; style=&quot;background: rgb(244, 244, 244); border-color: rgb(221, 221, 221) rgb(221, 221, 221) rgb(221, 221, 221) lightgray; border-image: initial; border-style: solid; border-width: 1px 1px 1px 3px; break-inside: avoid; color: #666666; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-size: 0.8em; font-weight: bold; line-height: 1.2; margin-bottom: 1.2em; max-width: 100%; overflow-wrap: break-word; overflow: auto; padding: 1em 1.5em;&quot;&gt;555-1234
555-9876
555-2468&lt;/pre&gt;&lt;p&gt;使用以下Linux命令，可以将多个文件按列合并：&lt;/p&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;&lt;code class=&quot;inset&quot; style=&quot;color: #993300; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-weight: bold; margin: 0px 0.2em; padding: 0px;&quot;&gt;$ paste names.txt numbers.txt&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://yyq123.github.io/learn-vim/images/CSV-Column-Merge-paste.png&quot; title=&quot;CSV-Column-Merge-paste&quot;&gt;&lt;img alt=&quot;CSV-Column-Merge-paste&quot; src=&quot;https://yyq123.github.io/learn-vim/images/CSV-Column-Merge-paste.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;h2 class=&quot;article&quot; style=&quot;border-bottom: 1px solid lightgray; border-left: 6px solid lightgray; font-size: 1.1em; padding: 0px 0px 3px 5px;&quot;&gt;&lt;a id=&quot;merge-files&quot;&gt;按行合并&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;在Windows中，使用copy命令可以合并多个文件：&lt;/p&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;&lt;code class=&quot;inset&quot; style=&quot;color: #993300; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-weight: bold; margin: 0px 0.2em; padding: 0px;&quot;&gt;$ copy *.csv merged-filname.csv&lt;/code&gt;&lt;/p&gt;&lt;p&gt;在Linux中，使用cat命令可以合并多个文件：&lt;/p&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;&lt;code class=&quot;inset&quot; style=&quot;color: #993300; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-weight: bold; margin: 0px 0.2em; padding: 0px;&quot;&gt;$ cat *.csv &amp;gt; merged-file.csv&lt;/code&gt;&lt;/p&gt;&lt;h2 class=&quot;article&quot; style=&quot;border-bottom: 1px solid lightgray; border-left: 6px solid lightgray; font-size: 1.1em; padding: 0px 0px 3px 5px;&quot;&gt;&lt;a id=&quot;split-files&quot;&gt;拆分文件&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;调用外部&lt;a href=&quot;https://www.gnu.org/software/coreutils/manual/html_node/split-invocation.html&quot;&gt;split&lt;/a&gt;命令，可以按照制定行数拆分成多个文件：&lt;/p&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;&lt;code class=&quot;inset&quot; style=&quot;color: #993300; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-weight: bold; margin: 0px 0.2em; padding: 0px;&quot;&gt;$ split -l200 passengers.csv --verbose&lt;/code&gt;&lt;/p&gt;&lt;pre class=&quot;block&quot; style=&quot;background: rgb(244, 244, 244); border-color: rgb(221, 221, 221) rgb(221, 221, 221) rgb(221, 221, 221) lightgray; border-image: initial; border-style: solid; border-width: 1px 1px 1px 3px; break-inside: avoid; color: #666666; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-size: 0.8em; font-weight: bold; line-height: 1.2; margin-bottom: 1.2em; max-width: 100%; overflow-wrap: break-word; overflow: auto; padding: 1em 1.5em;&quot;&gt;creating file ‘xaa’
creating file ‘xab’
creating file ‘xac’
creating file ‘xad’
creating file ‘xae’&lt;/pre&gt;&lt;p&gt;调用外部&amp;nbsp;&lt;a href=&quot;https://www.gnu.org/software/coreutils/manual/html_node/wc-invocation.html&quot;&gt;wc&lt;/a&gt;.命令，可以统计文件包含的行数，以验证拆分的结果：&lt;/p&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;&lt;code class=&quot;inset&quot; style=&quot;color: #993300; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-weight: bold; margin: 0px 0.2em; padding: 0px;&quot;&gt;$ wc -l xa*&lt;/code&gt;&lt;/p&gt;&lt;pre class=&quot;block&quot; style=&quot;background: rgb(244, 244, 244); border-color: rgb(221, 221, 221) rgb(221, 221, 221) rgb(221, 221, 221) lightgray; border-image: initial; border-style: solid; border-width: 1px 1px 1px 3px; break-inside: avoid; color: #666666; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-size: 0.8em; font-weight: bold; line-height: 1.2; margin-bottom: 1.2em; max-width: 100%; overflow-wrap: break-word; overflow: auto; padding: 1em 1.5em;&quot;&gt;200 xaa
200 xab
200 xac
200 xad
 92 xae
892 total&lt;/pre&gt;&lt;h2 class=&quot;article&quot; style=&quot;border-bottom: 1px solid lightgray; border-left: 6px solid lightgray; font-size: 1.1em; padding: 0px 0px 3px 5px;&quot;&gt;&lt;a id=&quot;del-empty-lines&quot;&gt;删除空行&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;使用以下&lt;a href=&quot;https://kutt.it/vim-Global&quot; title=&quot;Global Command&quot;&gt;全局命令&lt;/a&gt;，可以删除所有空行：&lt;/p&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;&lt;code class=&quot;inset&quot; style=&quot;color: #993300; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-weight: bold; margin: 0px 0.2em; padding: 0px;&quot;&gt;:%g/^ *$/d&lt;/code&gt;&lt;/p&gt;&lt;p&gt;在Linux中，使用以下任一命令都可以删除所有空行：&lt;/p&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;&lt;code class=&quot;inset&quot; style=&quot;color: #993300; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-weight: bold; margin: 0px 0.2em; padding: 0px;&quot;&gt;$ sed &#39;/^$/d&#39; old.csv &amp;gt; new.csv&lt;/code&gt;&lt;/p&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;&lt;code class=&quot;inset&quot; style=&quot;color: #993300; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-weight: bold; margin: 0px 0.2em; padding: 0px;&quot;&gt;$ grep . old.csv &amp;gt; new.csv&lt;/code&gt;&lt;/p&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;&lt;code class=&quot;inset&quot; style=&quot;color: #993300; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-weight: bold; margin: 0px 0.2em; padding: 0px;&quot;&gt;$ awk NF old.csv &amp;gt; new.csv&lt;/code&gt;&lt;/p&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;&lt;code class=&quot;inset&quot; style=&quot;color: #993300; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-weight: bold; margin: 0px 0.2em; padding: 0px;&quot;&gt;$ cat old.csv | tr -s &#39;\n&#39; new.csv&lt;/code&gt;&lt;/p&gt;&lt;h2 class=&quot;article&quot; style=&quot;border-bottom: 1px solid lightgray; border-left: 6px solid lightgray; font-size: 1.1em; padding: 0px 0px 3px 5px;&quot;&gt;&lt;a id=&quot;del-duplicate-lines&quot;&gt;删除重复行&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;使用&lt;a href=&quot;https://kutt.it/vim-sort&quot; title=&quot;sort&quot;&gt;sort&lt;/a&gt;命令，将删除重复行并对文本进行排序（请注意，这将改变文本行的原有顺序）：&lt;/p&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;&lt;code class=&quot;inset&quot; style=&quot;color: #993300; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-weight: bold; margin: 0px 0.2em; padding: 0px;&quot;&gt;:sort u&lt;/code&gt;&lt;/p&gt;&lt;p&gt;使用以下&lt;a href=&quot;https://kutt.it/vim-Global&quot; title=&quot;Global Command&quot;&gt;全局命令&lt;/a&gt;，可以删除所有重复行：&lt;/p&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;&lt;code class=&quot;inset&quot; style=&quot;color: #993300; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-weight: bold; margin: 0px 0.2em; padding: 0px;&quot;&gt;:g/^\(.*\)$\n\1$/d&lt;/code&gt;&lt;/p&gt;&lt;p&gt;在Linux中，使用&lt;a href=&quot;https://kutt.it/vim-filter&quot; title=&quot;filter&quot;&gt;过滤器(Filter)&lt;/a&gt;执行外部&lt;a href=&quot;https://linux.die.net/man/1/uniq&quot; title=&quot;uniq&quot;&gt;uniq&lt;/a&gt;命令可以删除所有重复行：&lt;/p&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;&lt;code class=&quot;inset&quot; style=&quot;color: #993300; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-weight: bold; margin: 0px 0.2em; padding: 0px;&quot;&gt;:%!uniq&lt;/code&gt;&lt;/p&gt;&lt;h2 class=&quot;article&quot; style=&quot;border-bottom: 1px solid lightgray; border-left: 6px solid lightgray; font-size: 1.1em; padding: 0px 0px 3px 5px;&quot;&gt;&lt;a id=&quot;info&quot;&gt;数据统计&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;使用以下命令，可以查找并计数行内的逗号数量&lt;/p&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;&lt;code class=&quot;inset&quot; style=&quot;color: #993300; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-weight: bold; margin: 0px 0.2em; padding: 0px;&quot;&gt;:s/,/,/gn&lt;/code&gt;&lt;/p&gt;&lt;p&gt;使用&lt;a href=&quot;https://github.com/chrisbra/csv.vim&quot; title=&quot;csv.vim&quot;&gt;csv.vim&lt;/a&gt;插件，执行以下命令可以显示当前行的列数：&lt;/p&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;&lt;code class=&quot;inset&quot; style=&quot;color: #993300; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-weight: bold; margin: 0px 0.2em; padding: 0px;&quot;&gt;:NrColumns!&lt;/code&gt;&lt;/p&gt;&lt;p style=&quot;border-top: 1px solid lightgray;&quot;&gt;&lt;span style=&quot;float: right;&quot;&gt;Ver: 260128&amp;nbsp;|&amp;nbsp;&lt;a href=&quot;mailto:yyq123@gmail.com&quot;&gt;YYQ&lt;/a&gt;&lt;/span&gt;&amp;lt;&lt;a href=&quot;https://kutt.it/vim-minpac&quot; title=&quot;插件管理器(minpac)&quot;&gt;上一篇&lt;/a&gt;&amp;nbsp;|&lt;a href=&quot;https://yyq123.github.com/learn-vim/learn-vi-00-00-TOC.html&quot; title=&quot;笔记列表&quot;&gt;&amp;nbsp;目录&amp;nbsp;&lt;/a&gt;|&amp;nbsp;&lt;a href=&quot;https://kutt.it/vim-rb-csv&quot; title=&quot;Rainbow CSV数据编辑&quot;&gt;下一篇&lt;/a&gt;&amp;gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://yyq123.blogspot.com/feeds/6275848324226878426/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='http://yyq123.blogspot.com/2026/01/vim-csv.html#comment-form' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7045570/posts/default/6275848324226878426'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7045570/posts/default/6275848324226878426'/><link rel='alternate' type='text/html' href='http://yyq123.blogspot.com/2026/01/vim-csv.html' title='VIM学习笔记 编辑CSV数据文件'/><author><name>YYQ</name><uri>http://www.blogger.com/profile/00702527262114879030</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7045570.post-2240247352856716694</id><published>2026-01-31T19:39:00.000+08:00</published><updated>2026-01-31T19:39:09.883+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="[知]"/><category scheme="http://www.blogger.com/atom/ns#" term="OpenSource"/><category scheme="http://www.blogger.com/atom/ns#" term="Software"/><category scheme="http://www.blogger.com/atom/ns#" term="Vim"/><title type='text'>VIM学习笔记 Rainbow CSV数据编辑</title><content type='html'>&lt;p&gt;使用&lt;a href=&quot;https://github.com/mechatroner/rainbow_csv&quot; style=&quot;font-weight: bold;&quot; title=&quot;rainbow_csv&quot;&gt;Rainbow CSV&lt;/a&gt;插件，可以为编辑&lt;a href=&quot;https://kutt.it/vim-CSV&quot; title=&quot;CSV&quot;&gt;CSV&lt;/a&gt;数据文件提供语法高亮、按列对齐和复杂查询等高级功能。&lt;/p&gt;&lt;h2 class=&quot;article&quot; style=&quot;border-bottom: 1px solid lightgray; border-left: 6px solid lightgray; font-size: 1.1em; padding: 0px 0px 3px 5px;&quot;&gt;&lt;a id=&quot;install&quot;&gt;安装配置&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;推荐使用&lt;a href=&quot;https://yyq123.github.io/learn-vim/learn-vim-plugin-minpac.html&quot; title=&quot;插件管理器(minpac)&quot;&gt;minpac&lt;/a&gt;等插件管理器，来安装GitHub上的&lt;a href=&quot;https://github.com/mechatroner/rainbow_csv&quot;&gt;Rainbow CSV&lt;/a&gt;插件。（请参阅官方&lt;a href=&quot;https://github.com/mechatroner/rainbow_csv?tab=readme-ov-file#installation&amp;quot;&quot; title=&quot;installation&quot;&gt;安装文档&lt;/a&gt;）&lt;/p&gt;&lt;h2 class=&quot;article&quot; style=&quot;border-bottom: 1px solid lightgray; border-left: 6px solid lightgray; font-size: 1.1em; padding: 0px 0px 3px 5px;&quot;&gt;&lt;a id=&quot;highlight&quot;&gt;多重高亮显示&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;安装Rainbow CSV插件之后，打开CSV文件将自动以不同的颜色显示不同的列，以提高数据的可读性：&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://yyq123.github.io/learn-vim/images/rainbow_csv_color.png&quot; title=&quot;rainbow_csv_color&quot;&gt;&lt;img alt=&quot;rainbow_csv_color&quot; src=&quot;http://yyq123.github.io/learn-vim/images/rainbow_csv_color.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;h2 class=&quot;article&quot; style=&quot;border-bottom: 1px solid lightgray; border-left: 6px solid lightgray; font-size: 1.1em; padding: 0px 0px 3px 5px;&quot;&gt;&lt;a id=&quot;align&quot;&gt;按列对齐&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;使用以下命令，可以将数据按列对齐：&lt;/p&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;&lt;code class=&quot;inset&quot; style=&quot;color: #993300; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-weight: bold; margin: 0px 0.2em; padding: 0px;&quot;&gt;:RainbowAlign&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://yyq123.github.io/learn-vim/images/rainbow_csv_align.png&quot; title=&quot;rainbow_csv_align&quot;&gt;&lt;img alt=&quot;rainbow_csv_align&quot; src=&quot;http://yyq123.github.io/learn-vim/images/rainbow_csv_align.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;请注意，插件是通过新增空格来实现按列对齐，如果您此时保存文件，那么新增的空格也将被保存到原文件中。&lt;/p&gt;&lt;p&gt;使用以下命令，可以删除由:RainbowAlign命令新增的空格，以恢复文件原貌：&lt;/p&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;&lt;code class=&quot;inset&quot; style=&quot;color: #993300; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-weight: bold; margin: 0px 0.2em; padding: 0px;&quot;&gt;:RainbowShrink&lt;/code&gt;&lt;/p&gt;&lt;h2 class=&quot;article&quot; style=&quot;border-bottom: 1px solid lightgray; border-left: 6px solid lightgray; font-size: 1.1em; padding: 0px 0px 3px 5px;&quot;&gt;&lt;a id=&quot;query&quot;&gt;数据查询&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;使用类似SQL的&lt;a href=&quot;https://rbql.org/&quot; title=&quot;Rainbow Query Language&quot;&gt;RBQL&lt;/a&gt;查询语言，可以对CSV文件进行灵活的数据处理，甚至包括连接查询和更新。&lt;/p&gt;&lt;p&gt;使用以下命令，将按照第8列的倒序，显示第1列和第8列：&lt;/p&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;&lt;code class=&quot;inset&quot; style=&quot;color: #993300; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-weight: bold; margin: 0px 0.2em; padding: 0px;&quot;&gt;Select a1, a8 order by a8 desc&lt;/code&gt;&lt;/p&gt;&lt;p&gt;如下图所示，随着光标移动，可以在状态上查看当前列的序号和名称：&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://yyq123.github.io/learn-vim/images/rainbow_csv_column_info.png&quot; title=&quot;rainbow_csv_column_info&quot;&gt;&lt;img alt=&quot;rainbow_csv_column_info&quot; src=&quot;https://yyq123.github.io/learn-vim/images/rainbow_csv_column_info.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;使用以下命令，可以将查询结果复制回原文件并覆盖原有内容：&lt;/p&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;&lt;code class=&quot;inset&quot; style=&quot;color: #993300; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-weight: bold; margin: 0px 0.2em; padding: 0px;&quot;&gt;:RainbowCopyBack&lt;/code&gt;&lt;/p&gt;&lt;p&gt;关于&lt;a href=&quot;https://rbql.org/&quot; title=&quot;Rainbow Query Language&quot;&gt;RBQL&lt;/a&gt;查询语言的更多信息，可以查看&lt;a href=&quot;https://github.com/mechatroner/RBQL/blob/master/README.md#rbql-rainbow-query-language-description&quot; title=&quot;documentation&quot;&gt;在线文档&lt;/a&gt;。&lt;/p&gt;&lt;p style=&quot;border-top: 1px solid lightgray;&quot;&gt;&lt;span style=&quot;float: right;&quot;&gt;Ver: 251013&amp;nbsp;|&amp;nbsp;&lt;a href=&quot;mailto:yyq123@gmail.com&quot;&gt;YYQ&lt;/a&gt;&lt;/span&gt;&amp;lt;&lt;a href=&quot;https://kutt.it/vim-CSV&quot; title=&quot;CSV&quot;&gt;上一篇&lt;/a&gt;&amp;nbsp;|&lt;a href=&quot;http://yyq123.github.com/learn-vim/learn-vi-00-00-TOC.html&quot; title=&quot;笔记列表&quot;&gt;&amp;nbsp;目录&amp;nbsp;&lt;/a&gt;|&amp;nbsp;&lt;a href=&quot;https://kutt.it/vim-minpac&quot; title=&quot;插件管理器(minpac)&quot;&gt;下一篇&lt;/a&gt;&amp;gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://yyq123.blogspot.com/feeds/2240247352856716694/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='http://yyq123.blogspot.com/2026/01/vim-rainbow-csv.html#comment-form' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7045570/posts/default/2240247352856716694'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7045570/posts/default/2240247352856716694'/><link rel='alternate' type='text/html' href='http://yyq123.blogspot.com/2026/01/vim-rainbow-csv.html' title='VIM学习笔记 Rainbow CSV数据编辑'/><author><name>YYQ</name><uri>http://www.blogger.com/profile/00702527262114879030</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7045570.post-8227488950796019023</id><published>2025-07-26T22:28:00.000+08:00</published><updated>2025-07-26T22:28:26.889+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="[知]"/><category scheme="http://www.blogger.com/atom/ns#" term="OpenSource"/><category scheme="http://www.blogger.com/atom/ns#" term="Software"/><category scheme="http://www.blogger.com/atom/ns#" term="Vim"/><category scheme="http://www.blogger.com/atom/ns#" term="Web Design"/><title type='text'>VIM学习笔记 网页验证(W3C Validation)</title><content type='html'>&lt;p&gt;符合标准的网页开发，可谓是不作恶的底线了。通过生产具有可读性的高质量代码，促成在不同浏览器中达成一致的显示效果，并且关照不同用户群体的可访问性（accessibility）。&lt;/p&gt;&lt;p&gt;可以使用&lt;a href=&quot;https://validator.w3.org/&quot; title=&quot;W3C Markup Validation Service&quot;&gt;W3C Markup Validation Service&lt;/a&gt;，在线验证网页是否符合标准；也可以使用&lt;a href=&quot;https://www.gueury.com/mozilla/&quot; title=&quot;Html Validator&quot;&gt;Html Validator&lt;/a&gt;插件，在浏览器中验证网页。而更高效的方式，则是使用&lt;a href=&quot;https://validator.github.io/validator/&quot; title=&quot;Nu Html Checker (v.Nu) Chat roomr&quot;&gt;Nu Html Checker (v.Nu)&lt;/a&gt;开源工具，它可以在命令行中离线批量验证多个文件。&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://yyq123.github.io/learn-vim/images/vnu_github.png&quot; title=&quot;vnu_github&quot;&gt;&lt;img alt=&quot;vnu_github&quot; height=&quot;250&quot; src=&quot;https://yyq123.github.io/learn-vim/images/vnu_github.png&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;h2 class=&quot;article&quot; style=&quot;border-bottom: 1px solid lightgray; border-left: 6px solid lightgray; font-size: 1.1em; padding: 0px 0px 3px 5px;&quot;&gt;&lt;a id=&quot;install&quot;&gt;安装运行&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;可以直接从&lt;a href=&quot;https://github.com/validator/validator/releases&quot; title=&quot;Download Validator&quot;&gt;GitHub&lt;/a&gt;下载各平台下的可运行程序。&lt;/p&gt;&lt;p&gt;如果您已经安装了Java运行环境，那么可以下载&lt;kbd style=&quot;color: #404040; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-weight: bold; margin: 0px; padding: 0px 0.5em;&quot;&gt;&amp;nbsp;vnu.jar&lt;/kbd&gt;文件直接运行。&lt;/p&gt;&lt;p&gt;如果您没有安装过Java运行环境，那么可以下载相应操作系统的预编译包，比如&lt;kbd style=&quot;color: #404040; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-weight: bold; margin: 0px; padding: 0px 0.5em;&quot;&gt;vnu.windows.zip&lt;/kbd&gt;，其中内置了的Java系统。&lt;/p&gt;&lt;p&gt;将vnu所在目录，增加到path环境变量中：&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://yyq123.github.io/learn-vim/images/vnu_windows_path.png&quot; title=&quot;vnu_windows_path&quot;&gt;&lt;img alt=&quot;vnu_windows_path&quot; src=&quot;https://yyq123.github.io/learn-vim/images/vnu_windows_path.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;在命令行中，执行以下命令，可以显示帮助信息即说明安装成功。&lt;/p&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;&lt;code class=&quot;inset&quot; style=&quot;color: #993300; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-weight: bold; margin: 0px 0.2em; padding: 0px;&quot;&gt;$ vnu --help&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://yyq123.github.io/learn-vim/images/vnu_cmd_help.png&quot; title=&quot;vnu_cmd_help&quot;&gt;&lt;img alt=&quot;vnu_cmd_help&quot; height=&quot;232&quot; src=&quot;https://yyq123.github.io/learn-vim/images/vnu_cmd_help.png&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;a href=&quot;#&quot; title=&quot;&quot;&gt;&lt;/a&gt;&lt;p&gt;在Mac操作系统下，可以通过&lt;a href=&quot;https://brew.sh/&quot; title=&quot;Homebrew&quot;&gt;Homebrew&lt;/a&gt;进行安装：&lt;/p&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;&lt;code class=&quot;inset&quot; style=&quot;color: #993300; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-weight: bold; margin: 0px 0.2em; padding: 0px;&quot;&gt;$ brew install vnu&lt;/code&gt;&lt;/p&gt;&lt;h2 class=&quot;article&quot; style=&quot;border-bottom: 1px solid lightgray; border-left: 6px solid lightgray; font-size: 1.1em; padding: 0px 0px 3px 5px;&quot;&gt;&lt;a id=&quot;usage&quot;&gt;验证网页&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;使用以下命令，可以验证在线网页：&lt;/p&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;&lt;code class=&quot;inset&quot; style=&quot;color: #993300; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-weight: bold; margin: 0px 0.2em; padding: 0px;&quot;&gt;$ vnu https://yyq123.github.io/learn-vim/learn-vi-00-00-TOC.html&lt;/code&gt;&lt;/p&gt;&lt;p&gt;使用以下命令，可以验证指定文件：&lt;/p&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;&lt;code class=&quot;inset&quot; style=&quot;color: #993300; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-weight: bold; margin: 0px 0.2em; padding: 0px;&quot;&gt;$ vnu filename.html&lt;/code&gt;&lt;/p&gt;&lt;p&gt;使用以下命令，可以验证多个文件文件：&lt;/p&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;&lt;code class=&quot;inset&quot; style=&quot;color: #993300; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-weight: bold; margin: 0px 0.2em; padding: 0px;&quot;&gt;$ vnu filename1.html filename2.html&lt;/code&gt;&lt;/p&gt;&lt;p&gt;使用以下命令，可以验证当前目录下所有网页文件：&lt;/p&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;&lt;code class=&quot;inset&quot; style=&quot;color: #993300; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-weight: bold; margin: 0px 0.2em; padding: 0px;&quot;&gt;$ vnu --asciiquotes --skip-non-html .&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;--asciiquotes&lt;/em&gt;选项，指定在输出信息中使用ASCII编码的引号（替代默认的Unicode编码的引号）；&lt;/p&gt;&lt;p&gt;&lt;em&gt;--skip-non-html&lt;/em&gt;选项，仅验证所有扩展名为html、htm、xhtml或xht的网页文件。&lt;/p&gt;&lt;p&gt;默认情况下，命令按照&lt;a class=&quot;internal present&quot; href=&quot;/validator/validator/wiki/Output-%C2%BB-GNU&quot;&gt;GNU error format&lt;/a&gt;格式输出。也可以使用&lt;a href=&quot;https://github.com/validator/validator/wiki/Service-%C2%BB-Common-params#out&quot; title=&quot;--format&quot;&gt;--format&lt;/a&gt;选项，指定、xml、json或text格式。&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://yyq123.github.io/learn-vim/images/vnu_cmd_out.png&quot; title=&quot;vnu_cmd_out&quot;&gt;&lt;img alt=&quot;vnu_cmd_out&quot; height=&quot;124&quot; src=&quot;https://yyq123.github.io/learn-vim/images/vnu_cmd_out.png&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;使用&lt;em&gt;--errors-only&lt;/em&gt;选项，将仅显示错误信息，而忽略info和warning信息：&lt;/p&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;&lt;code class=&quot;inset&quot; style=&quot;color: #993300; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-weight: bold; margin: 0px 0.2em; padding: 0px;&quot;&gt;$ vnu --errors-only filename.html&lt;/code&gt;&lt;/p&gt;&lt;h2 class=&quot;article&quot; style=&quot;border-bottom: 1px solid lightgray; border-left: 6px solid lightgray; font-size: 1.1em; padding: 0px 0px 3px 5px;&quot;&gt;&lt;a id=&quot;vim-shell&quot;&gt;在Vim中调用vnu&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;在Vim中，可以直接调用vnu来验证当前文件，将在弹出的操作系统命令行中显示输出信息，需要点击回车键来关闭命令行窗口并返回到Vim：&lt;/p&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;&lt;code class=&quot;inset&quot; style=&quot;color: #993300; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-weight: bold; margin: 0px 0.2em; padding: 0px;&quot;&gt;:!vnu --asciiquotes %&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://yyq123.github.io/learn-vim/images/vnu_vim_shell.png&quot; title=&quot;vnu_vim_shell&quot;&gt;&lt;img alt=&quot;vnu_vim_shell&quot; src=&quot;http://yyq123.github.io/learn-vim/images/vnu_vim_shell.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;h2 class=&quot;article&quot; style=&quot;border-bottom: 1px solid lightgray; border-left: 6px solid lightgray; font-size: 1.1em; padding: 0px 0px 3px 5px;&quot;&gt;&lt;a id=&quot;vim-compiler&quot;&gt;使用vnu进行编译&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;请将以下代码，保存至&lt;kbd style=&quot;color: #404040; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-weight: bold; margin: 0px; padding: 0px 0.5em;&quot;&gt;~/.vim/after/compiler/w3c-html-validator.vim&lt;/kbd&gt;：&lt;/p&gt;&lt;pre class=&quot;block&quot; style=&quot;background: rgb(244, 244, 244); border-color: rgb(221, 221, 221) rgb(221, 221, 221) rgb(221, 221, 221) lightgray; border-image: initial; border-style: solid; border-width: 1px 1px 1px 3px; break-inside: avoid; color: #666666; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-size: 0.8em; font-weight: bold; line-height: 1.2; margin-bottom: 1.2em; max-width: 100%; overflow-wrap: break-word; overflow: auto; padding: 1em 1.5em;&quot;&gt;&lt;code class=&quot;inset&quot; style=&quot;color: #993300; display: block; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; margin: 0px 0.2em; overflow-wrap: normal; padding: 0px;&quot;&gt;let current_compiler = &quot;w3c-html-validator&quot;
CompilerSet makeprg=vnu\ $*\ --asciiquotes\ &#39;%&#39;
CompilerSet errorformat=\&quot;file:%f\&quot;:%[0-9]%#\.%c-%l\.%[0-9]%#:\ %m&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;在&lt;a href=&quot;https://kutt.it/vim-vimrc&quot; title=&quot;vimrc&quot;&gt;vimrc&lt;/a&gt;配置文件中，指定新建的编译器：&lt;/p&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;&lt;code class=&quot;inset&quot; style=&quot;color: #993300; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-weight: bold; margin: 0px 0.2em; padding: 0px;&quot;&gt;autocmd FileType html,xhtml compiler w3c-html-validator&lt;/code&gt;&lt;/p&gt;&lt;p&gt;再次打开HTML文件，使用以下命令即可使用vnu进行验证，并在&lt;a href=&quot;https://kutt.it/vim-QuickFix&quot; title=&quot;QuickFix&quot;&gt;QuickFix&lt;/a&gt;中显示输出信息：&lt;/p&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;&lt;code class=&quot;inset&quot; style=&quot;color: #993300; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-weight: bold; margin: 0px 0.2em; padding: 0px;&quot;&gt;:make&lt;/code&gt;&lt;/p&gt;&lt;p&gt;如果已经打开了多个文件，那么使用以下命令则可以对&lt;a href=&quot;https://kutt.it/vim-arg&quot; title=&quot;Arguments&quot;&gt;参数&lt;/a&gt;（Arguments）列表中的所有文件中进行验证：&lt;/p&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;&lt;code class=&quot;inset&quot; style=&quot;color: #993300; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-weight: bold; margin: 0px 0.2em; padding: 0px;&quot;&gt;:make ##&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://yyq123.github.io/learn-vim/images/vnu_make_quickfix.png&quot; title=&quot;vnu_make_quickfix&quot;&gt;&lt;img alt=&quot;vnu_make_quickfix&quot; height=&quot;98&quot; src=&quot;https://yyq123.github.io/learn-vim/images/vnu_make_quickfix.png&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;border-top: 1px solid lightgray;&quot;&gt;&lt;span style=&quot;float: right;&quot;&gt;Ver: 250726&amp;nbsp;|&amp;nbsp;&lt;a href=&quot;mailto:yyq123@gmail.com&quot;&gt;YYQ&lt;/a&gt;&lt;/span&gt;&amp;lt;&lt;a href=&quot;http://yyq123.github.io/learn-vim/learn-vi-601-WebDesign-HTMLTag-Input.html&quot; title=&quot;网页开发-输入网页标签&quot;&gt;上一篇&lt;/a&gt;&amp;nbsp;|&lt;a href=&quot;http://yyq123.github.com/learn-vim/learn-vi-00-00-TOC.html&quot; title=&quot;笔记列表&quot;&gt;&amp;nbsp;目录&amp;nbsp;&lt;/a&gt;|&amp;nbsp;&lt;a href=&quot;http://yyq123.github.io/learn-vim/learn-vi-605-WebDesign-Firefox.html&quot; title=&quot;网页开发-Firefox浏览器&quot;&gt;下一篇&lt;/a&gt;&amp;gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://yyq123.blogspot.com/feeds/8227488950796019023/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='http://yyq123.blogspot.com/2025/07/vim-w3c-validation.html#comment-form' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7045570/posts/default/8227488950796019023'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7045570/posts/default/8227488950796019023'/><link rel='alternate' type='text/html' href='http://yyq123.blogspot.com/2025/07/vim-w3c-validation.html' title='VIM学习笔记 网页验证(W3C Validation)'/><author><name>YYQ</name><uri>http://www.blogger.com/profile/00702527262114879030</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7045570.post-1589097050707982340</id><published>2025-07-21T22:09:00.003+08:00</published><updated>2025-07-21T22:09:35.769+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="[知]"/><category scheme="http://www.blogger.com/atom/ns#" term="OpenSource"/><category scheme="http://www.blogger.com/atom/ns#" term="Software"/><category scheme="http://www.blogger.com/atom/ns#" term="Vim"/><title type='text'>VIM学习笔记 快捷键速查表(vim-which-key)</title><content type='html'>&lt;p&gt;&amp;nbsp;&lt;span style=&quot;font-family: Times;&quot;&gt;Vim提供了一种不依赖鼠标的快速高效的编辑体验，通过大量的键盘快捷键，可以快速地进行文本移动、编辑、修改等操作。然而如何记忆和使用种类繁多的快捷键，也形成了另一种挑战。&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;font-family: Times;&quot;&gt;打开&lt;a href=&quot;http://yyq123.github.io/learn-vim/learn-vi-59-vimrc.html&quot; title=&quot;vimrc&quot;&gt;vimrc&lt;/a&gt;配置文件，然后使用以下命令，可以列示所有F功能键的当前定义：&lt;/p&gt;&lt;p style=&quot;font-family: Times; text-indent: 2em;&quot;&gt;&lt;code class=&quot;inset&quot; style=&quot;color: #993300; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-weight: bold; margin: 0px 0.2em; padding: 0px;&quot;&gt;:for i in range(1, 12) | execute(&quot;map &amp;lt;F&quot;.i.&quot;&amp;gt;&quot;) | endfor&lt;/code&gt;&lt;/p&gt;&lt;p style=&quot;font-family: Times;&quot;&gt;&lt;a href=&quot;https://yyq123.github.io/learn-vim/images/map_list_FunKey.png&quot; title=&quot;map_list_FunKey&quot;&gt;&lt;img alt=&quot;map_list_FunKey&quot; src=&quot;https://yyq123.github.io/learn-vim/images/map_list_FunKey.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;font-family: Times;&quot;&gt;使用以下命令，可以将键盘映射（和修改过的选项），写入到当前目录下的&lt;kbd style=&quot;color: #404040; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-weight: bold; margin: 0px; padding: 0px 0.5em;&quot;&gt;_exrc&lt;/kbd&gt;文件：&lt;/p&gt;&lt;p style=&quot;font-family: Times; text-indent: 2em;&quot;&gt;&lt;code class=&quot;inset&quot; style=&quot;color: #993300; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-weight: bold; margin: 0px 0.2em; padding: 0px;&quot;&gt;:mk&lt;/code&gt;&lt;/p&gt;&lt;p style=&quot;font-family: Times;&quot;&gt;&lt;a href=&quot;https://yyq123.github.io/learn-vim/images/map_list_mk_exrc.png&quot; title=&quot;map_list_mk_exrc&quot;&gt;&lt;img alt=&quot;map_list_mk_exrc&quot; src=&quot;https://yyq123.github.io/learn-vim/images/map_list_mk_exrc.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;font-family: Times;&quot;&gt;更高效的方式，则是使用&lt;a href=&quot;https://github.com/liuchengxu/vim-which-key&quot; style=&quot;font-weight: bold;&quot; title=&quot;vim-which-key&quot;&gt;vim-which-key&lt;/a&gt;插件，可以在弹出窗口（popup）中列示当前所有快捷键的定义，大大减轻了记忆各种快捷键的负担。&lt;/p&gt;&lt;h2 class=&quot;article&quot; style=&quot;border-bottom: 1px solid lightgray; border-left: 6px solid lightgray; font-family: Times; font-size: 1.1em; padding: 0px 0px 3px 5px;&quot;&gt;&lt;a id=&quot;install&quot;&gt;安装配置&lt;/a&gt;&lt;/h2&gt;&lt;p style=&quot;font-family: Times;&quot;&gt;推荐使用&lt;a href=&quot;https://yyq123.github.io/learn-vim/learn-vim-plugin-minpac.html&quot; title=&quot;插件管理器(minpac)&quot;&gt;minpac&lt;/a&gt;等插件管理器，来安装GitHub上的&lt;a href=&quot;https://github.com/liuchengxu/vim-which-key&quot; title=&quot;vim-which-key&quot;&gt;vim-which-key&lt;/a&gt;插件。（请参阅官方&lt;a href=&quot;https://github.com/liuchengxu/vim-which-key?tab=readme-ov-file#installation&quot; title=&quot;installation&quot;&gt;安装文档&lt;/a&gt;）&lt;/p&gt;&lt;p style=&quot;font-family: Times;&quot;&gt;假设使用逗号键，作为&lt;a href=&quot;https://kutt.it/vim-Leader&quot; title=&quot;leader&quot;&gt;前缀键（leader）&lt;/a&gt;：&lt;/p&gt;&lt;p style=&quot;font-family: Times; text-indent: 2em;&quot;&gt;&lt;code class=&quot;inset&quot; style=&quot;color: #993300; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-weight: bold; margin: 0px 0.2em; padding: 0px;&quot;&gt;let mapleader=&quot;,&quot;&lt;/code&gt;&lt;/p&gt;&lt;p style=&quot;font-family: Times;&quot;&gt;在&lt;a href=&quot;http://yyq123.github.io/learn-vim/learn-vi-59-vimrc.html&quot; title=&quot;vimrc&quot;&gt;vimrc&lt;/a&gt;配置文件中设置timeoutlen选项，指定在按下leader键后，如果在约定时间后没有进一步的按键操作，则会在弹出窗口中显示快捷键绑定信息：&lt;/p&gt;&lt;pre class=&quot;block&quot; style=&quot;background: rgb(244, 244, 244); border-color: rgb(221, 221, 221) rgb(221, 221, 221) rgb(221, 221, 221) lightgray; border-image: initial; border-style: solid; border-width: 1px 1px 1px 3px; break-inside: avoid; color: #666666; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-size: 0.8em; font-weight: bold; line-height: 1.2; margin-bottom: 1.2em; max-width: 100%; overflow-wrap: break-word; overflow: auto; padding: 1em 1.5em;&quot;&gt;&lt;code class=&quot;inset&quot; style=&quot;color: #993300; display: block; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; margin: 0px 0.2em; overflow-wrap: normal; padding: 0px;&quot;&gt;set timeoutlen=500
nnoremap &amp;lt;silent&amp;gt; &amp;lt;leader&amp;gt; :&amp;lt;c-u&amp;gt;WhichKey &#39;&amp;lt;Space&amp;gt;&#39;&amp;lt;CR&amp;gt;
nnoremap &amp;lt;silent&amp;gt; &amp;lt;localleader&amp;gt; :&amp;lt;c-u&amp;gt;WhichKey  &#39;,&#39;&amp;lt;CR&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 class=&quot;article&quot; style=&quot;border-bottom: 1px solid lightgray; border-left: 6px solid lightgray; font-family: Times; font-size: 1.1em; padding: 0px 0px 3px 5px;&quot;&gt;&lt;a id=&quot;dictionary&quot;&gt;定义快捷键字典&lt;/a&gt;&lt;/h2&gt;&lt;p style=&quot;font-family: Times;&quot;&gt;首先，需要创建一个空字典：&lt;/p&gt;&lt;pre class=&quot;block&quot; style=&quot;background: rgb(244, 244, 244); border-color: rgb(221, 221, 221) rgb(221, 221, 221) rgb(221, 221, 221) lightgray; border-image: initial; border-style: solid; border-width: 1px 1px 1px 3px; break-inside: avoid; color: #666666; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-size: 0.8em; font-weight: bold; line-height: 1.2; margin-bottom: 1.2em; max-width: 100%; overflow-wrap: break-word; overflow: auto; padding: 1em 1.5em;&quot;&gt;&lt;code class=&quot;inset&quot; style=&quot;color: #993300; display: block; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; margin: 0px 0.2em; overflow-wrap: normal; padding: 0px;&quot;&gt;let g:which_key_map = {}&lt;/code&gt;&lt;/pre&gt;&lt;p style=&quot;font-family: Times;&quot;&gt;vim-which-key插件能够自动识别已经存在的leader快捷键，你可以为其添加文字描述；使用&lt;kbd style=&quot;color: #404040; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-weight: bold; margin: 0px; padding: 0px 0.5em;&quot;&gt;&#39;name&#39;&lt;/kbd&gt;关键字，可以定义二级字典组，以便于为捷键分类显示。&lt;/p&gt;&lt;pre class=&quot;block&quot; style=&quot;background: rgb(244, 244, 244); border-color: rgb(221, 221, 221) rgb(221, 221, 221) rgb(221, 221, 221) lightgray; border-image: initial; border-style: solid; border-width: 1px 1px 1px 3px; break-inside: avoid; color: #666666; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-size: 0.8em; font-weight: bold; line-height: 1.2; margin-bottom: 1.2em; max-width: 100%; overflow-wrap: break-word; overflow: auto; padding: 1em 1.5em;&quot;&gt;&lt;code class=&quot;inset&quot; style=&quot;color: #993300; display: block; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; margin: 0px 0.2em; overflow-wrap: normal; padding: 0px;&quot;&gt;let g:which_key_map.s = { &#39;name&#39; : &#39;+source&#39; }
let g:which_key_map.s.v = &#39;Source-vimrc&#39;
let g:which_key_map.t = { &#39;name&#39; : &#39;+tab&#39; }
let g:which_key_map.t.v = &#39;Tab-vimrc&#39;&lt;/code&gt;&lt;/pre&gt;&lt;p style=&quot;font-family: Times;&quot;&gt;对于尚不存在的快捷键，也可以直接定义命令和描述：&lt;/p&gt;&lt;pre class=&quot;block&quot; style=&quot;background: rgb(244, 244, 244); border-color: rgb(221, 221, 221) rgb(221, 221, 221) rgb(221, 221, 221) lightgray; border-image: initial; border-style: solid; border-width: 1px 1px 1px 3px; break-inside: avoid; color: #666666; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-size: 0.8em; font-weight: bold; line-height: 1.2; margin-bottom: 1.2em; max-width: 100%; overflow-wrap: break-word; overflow: auto; padding: 1em 1.5em;&quot;&gt;&lt;code class=&quot;inset&quot; style=&quot;color: #993300; display: block; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; margin: 0px 0.2em; overflow-wrap: normal; padding: 0px;&quot;&gt;let g:which_key_map.f = {
      \ &#39;name&#39; : &#39;+file&#39; ,
      \ &#39;n&#39; : [&#39;fn&#39; , &#39;File Name to Clipboard&#39;] ,
      \ &#39;p&#39; : [&#39;fp&#39; , &#39;Path Name to Clipboard&#39;] ,
      \ }&lt;/code&gt;&lt;/pre&gt;&lt;p style=&quot;font-family: Times;&quot;&gt;更多vim-which-key插件配置代码，请参阅&lt;a href=&quot;https://gitlab.com/-/snippets/4870638&quot; title=&quot;实例&quot;&gt;实例&lt;/a&gt;。&lt;/p&gt;&lt;h2 class=&quot;article&quot; style=&quot;border-bottom: 1px solid lightgray; border-left: 6px solid lightgray; font-family: Times; font-size: 1.1em; padding: 0px 0px 3px 5px;&quot;&gt;&lt;a id=&quot;usage&quot;&gt;显示快捷键列表&lt;/a&gt;&lt;/h2&gt;&lt;p style=&quot;font-family: Times;&quot;&gt;在常规模式下点击前缀键（&lt;a href=&quot;https://kutt.it/vim-Leader&quot; title=&quot;leader&quot;&gt;leader&lt;/a&gt;），将在弹出窗口（popup）中显示一级菜单，其中“+”开头的菜单项表示包含子菜单：&lt;/p&gt;&lt;p style=&quot;font-family: Times;&quot;&gt;&lt;a href=&quot;https://yyq123.github.io/learn-vim/images/which-key-popup.png&quot; title=&quot;Popup&quot;&gt;&lt;img alt=&quot;Popup&quot; src=&quot;https://yyq123.github.io/learn-vim/images/which-key-popup.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;font-family: Times;&quot;&gt;点击“+”后的首字母，比如&quot;&lt;kbd style=&quot;color: #404040; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-weight: bold; margin: 0px; padding: 0px 0.5em;&quot;&gt;,b&lt;/kbd&gt;&quot;将显示缓冲区（buffer）子菜单下的快捷键信息：&lt;/p&gt;&lt;p style=&quot;font-family: Times;&quot;&gt;&lt;a href=&quot;https://yyq123.github.io/learn-vim/images/which-key-group.png&quot; title=&quot;Group&quot;&gt;&lt;img alt=&quot;Group&quot; src=&quot;https://yyq123.github.io/learn-vim/images/which-key-group.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;font-family: Times;&quot;&gt;点击退格键&lt;kbd style=&quot;color: #404040; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-weight: bold; margin: 0px; padding: 0px 0.5em;&quot;&gt;&amp;lt;BACKSPACE&amp;gt;&lt;/kbd&gt;，将返回上一级菜单；点击&lt;kbd style=&quot;color: #404040; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-weight: bold; margin: 0px; padding: 0px 0.5em;&quot;&gt;&amp;lt;ESC&amp;gt;&lt;/kbd&gt;键，将关闭弹出窗口并返回常规模式。&lt;/p&gt;&lt;p style=&quot;border-top: 1px solid lightgray; font-family: Times;&quot;&gt;&lt;span style=&quot;float: right;&quot;&gt;Ver: 250716&amp;nbsp;|&amp;nbsp;&lt;a href=&quot;mailto:yyq123@gmail.com&quot;&gt;YYQ&lt;/a&gt;&lt;/span&gt;&amp;lt;&lt;a href=&quot;http://yyq123.github.io/learn-vim/learn-vi-51-KeyMapping.html&quot; title=&quot;键盘映射 (Map)&quot;&gt;上一篇&lt;/a&gt;&amp;nbsp;|&lt;a href=&quot;http://yyq123.github.com/learn-vim/learn-vi-00-00-TOC.html&quot; title=&quot;笔记列表&quot;&gt;&amp;nbsp;目录&amp;nbsp;&lt;/a&gt;|&amp;nbsp;&lt;a href=&quot;http://yyq123.github.io/learn-vim/learn-vi-71-Shell.html&quot; title=&quot;运行外部命令(Shell Command)&quot;&gt;下一篇&lt;/a&gt;&amp;gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://yyq123.blogspot.com/feeds/1589097050707982340/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='http://yyq123.blogspot.com/2025/07/vim-which-key.html#comment-form' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7045570/posts/default/1589097050707982340'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7045570/posts/default/1589097050707982340'/><link rel='alternate' type='text/html' href='http://yyq123.blogspot.com/2025/07/vim-which-key.html' title='VIM学习笔记 快捷键速查表(vim-which-key)'/><author><name>YYQ</name><uri>http://www.blogger.com/profile/00702527262114879030</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7045570.post-867667460030331666</id><published>2025-06-16T14:26:00.000+08:00</published><updated>2025-06-16T14:26:35.008+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="[知]"/><category scheme="http://www.blogger.com/atom/ns#" term="OpenSource"/><category scheme="http://www.blogger.com/atom/ns#" term="Software"/><title type='text'>VIM学习笔记 工具箱-PDF查看器zathura</title><content type='html'>&lt;p&gt;&lt;a href=&quot;https://pwmt.org/projects/zathura/&quot; title=&quot;zathura&quot;&gt;zathura&lt;/a&gt;是一款高度可定制的简约文档查看器，适用于大多数Linux发行版。zathura是由PWMT社区开发的开源软件，它有以下两大特点：&lt;/p&gt;
	&lt;ul&gt;
		&lt;li&gt;以键盘为中心，使用vim习惯的键位绑定，类似vim的命令行模式，沉浸式的vim操作体验；&lt;/li&gt;
		&lt;li&gt;以文档为中心，极简的用户界面将最大化的屏幕空间留给文档本身，提供更专注的阅读体验。&lt;/li&gt;
	&lt;/ul&gt;
	&lt;p&gt;zathura提供以下主要特性：&lt;/p&gt;
	&lt;ul&gt;
		&lt;li&gt;支持PDF、Djvu、PostScript、Comic Book等多种文件格式；&lt;/li&gt;
		&lt;li&gt;支持书签（bookmark）；&lt;/li&gt;
		&lt;li&gt;类似vim的命令行/搜索行/状态栏；&lt;/li&gt;
		&lt;li&gt;使用鼠标双击进行链接跳转；&lt;/li&gt;
		&lt;li&gt;使用鼠标选择文本将自动拷贝至剪贴板；&lt;/li&gt;
		&lt;li&gt;支持SyncTeX技术，允许输入和输出同步，便于&lt;a href=&quot;http://yyq123.github.io/learn-vim/learn-vim-Latex.html&quot; title=&quot;Compile Code-Latex&quot;&gt;编辑LaTex文档&lt;/a&gt;；&lt;/li&gt;
	&lt;/ul&gt;

	&lt;h2 class=&quot;article&quot;&gt;&lt;a id=&quot;Install&quot;&gt;安装&lt;/a&gt;&lt;/h2&gt;
	&lt;p&gt;以Debian为例，使用以下命令安装zathura：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;$ sudo apt install zathura zathura-pdf-poppler zathura-djvu zathura-ps&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;针对其它平台的安装，请参阅&lt;a href=&quot;https://pwmt.org/projects/zathura/installation/&quot; title=&quot;zathura/installation&quot;&gt;官方文档&lt;/a&gt;。&lt;/p&gt;

	&lt;h2 class=&quot;article&quot;&gt;&lt;a id=&quot;Use&quot;&gt;使用&lt;/a&gt;&lt;/h2&gt;
	&lt;p&gt;在操作系统命令行环境下，使用以下命令即可查看文件：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;$ zathura filename.pdf&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;&lt;a href=&quot;https://yyq123.github.io/learn-vim/images/zathura_main_window.png&quot; title=&quot;zathura main window&quot;&gt;&lt;img src=&quot;https://yyq123.github.io/learn-vim/images/zathura_main_window.png&quot; alt=&quot;zathura main window&quot; width=&quot;550&quot; height=&quot;429&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
	&lt;p&gt;在默认阅读模式下，使用&lt;kbd&gt;F11&lt;/kbd&gt;键切换至全屏幕模式；使用&lt;kbd&gt;F5&lt;/kbd&gt;键切换至演示模式；使用&lt;kbd&gt;Tab&lt;/kbd&gt;键切换至目录模式。&lt;/p&gt;
	&lt;p&gt;&lt;a href=&quot;https://yyq123.github.io/learn-vim/images/zathura_mode_index.png&quot; title=&quot;zathura mode index&quot;&gt;&lt;img src=&quot;https://yyq123.github.io/learn-vim/images/zathura_mode_index.png&quot; alt=&quot;zathura mode index&quot; width=&quot;550&quot; height=&quot;429&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

	&lt;h2 class=&quot;article&quot;&gt;&lt;a id=&quot;Config&quot;&gt;配置&lt;/a&gt;&lt;/h2&gt;
	&lt;p&gt;通过编辑&lt;kbd&gt;~/.config/zathura/zathurarc&lt;/kbd&gt;配置文件，可以自定义系统选项：&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;&lt;code&gt;# show status bar and vertical scrollbar
set guioptions sv
# allowing to change the colors
set recolor true
set recolor-lightcolor &quot;#000000&quot;
set recolor-darkcolor &quot;#E0E0E0&quot;
set recolor-keephue true
# zoom and scroll step size
set zoom-step 20
set scroll-step 80
# copy selection to system clipboardset
set selection-clipboard clipboard
# enable incremental search
set incremental-search true
# shortcut - zoom
map &amp;lt;C-i&amp;gt; zoom in
map &amp;lt;C-o&amp;gt; zoom out&lt;/code&gt;&lt;/pre&gt;
	&lt;p&gt;更多配置选项，请参阅&lt;a href=&quot;https://pwmt.org/projects/zathura/documentation/&quot; title=&quot;zathura/documentation&quot;&gt;官方文档&lt;/a&gt;。&lt;/p&gt;

	&lt;h2 class=&quot;article&quot;&gt;&lt;a id=&quot;Shortcut&quot;&gt;快捷键&lt;/a&gt;&lt;/h2&gt;
&lt;table summary=&quot;Shotcut&quot; border=&quot;1&quot; frame=&quot;border&quot; rules=&quot;all&quot; cellspacing=&quot;0&quot; cellpadding=&quot;3&quot;&gt;
	&lt;tbody&gt;
		&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Document Navigation&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;文档导航&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;J&lt;/td&gt;&lt;td&gt;向下移动一行 Move the document display window one line down.&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;K&lt;/td&gt;&lt;td&gt;向上移动一行 Move the document display window one line up.&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;L&lt;/td&gt;&lt;td&gt;向右移动一列 Move the document display window one column to the right.&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;H&lt;/td&gt;&lt;td&gt;向左移动一列 Move the document display window one column to the left.&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;Ctrl + D&lt;/td&gt;&lt;td&gt;向下移动半页 Move the document display window half a page down.&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;Ctrl + U&lt;/td&gt;&lt;td&gt;向上移动半页 Move the document display window half a page up.&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;Ctrl + Y&lt;/td&gt;&lt;td&gt;向右移动半页 Move the document display window half a page to the right.&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;Ctrl + T&lt;/td&gt;&lt;td&gt;向左移动半页 Move the document display window half a page to the left.&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;Ctrl + B&lt;/td&gt;&lt;td&gt;向下移动一页 Move the document display window a full page down.&lt;/td&gt;&lt;/tr&gt;

		&lt;tr&gt;&lt;td&gt;Ctrl + F&lt;/td&gt;&lt;td&gt;向上移动一页 Move the document display window a full page up.&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;Y&lt;/td&gt;&lt;td&gt;向右移动一页 Move the document display window a full page to the right.&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;T&lt;/td&gt;&lt;td&gt;向左移动一页 Move the document display window a full page to the left.&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;GG&lt;/td&gt;&lt;td&gt;移动到第一页 Go to the first page of the current document.&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;Shift + G&lt;/td&gt;&lt;td&gt;移动到最后一页 Go to the last page of the current document.&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;5, then Shift + G&lt;/td&gt;&lt;td&gt;移动到第5页 Go to the fifth page of the current document.&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;Shift + H&lt;/td&gt;&lt;td&gt;移动到当前页首 Go to the top of the currently selected page.&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;Shift + L&lt;/td&gt;&lt;td&gt;移动到当前页尾 Go to the bottom of the currently selected page.&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;/&lt;/td&gt;&lt;td&gt;向前搜索 Open forward search prompt.&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;?&lt;/td&gt;&lt;td&gt;向后搜索 Open reverse search prompt.&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;N&lt;/td&gt;&lt;td&gt;移动到下一匹配处 Go to the next occurrence of the current search term.&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;Shift + N&lt;/td&gt;&lt;td&gt;移动到上一匹配处 Go back to the previous occurrence of the current search term.&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Interface Navigation&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;界面导航&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;A&lt;/td&gt;&lt;td&gt;适合窗口高度 Fit the height of the current page to the display window.&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;S&lt;/td&gt;&lt;td&gt;适合窗口宽度 Fit the width of the current page to the display window.&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;R&lt;/td&gt;&lt;td&gt;顺时针旋转90度 Rotate the current document by 90 degrees clockwise.&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;Ctrl + N&lt;/td&gt;&lt;td&gt;显示/隐藏 状态栏 Toggle status bar.&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;+&lt;/td&gt;&lt;td&gt;放大 Zoom in&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;-&lt;/td&gt;&lt;td&gt;缩小 Zoom out&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;=&lt;/td&gt;&lt;td&gt;恢复缩放比例 Revert the zoom level of the document at the currently selected page.&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;60 + =&lt;/td&gt;&lt;td&gt;缩放至指定比例 Set the current zoom level of the document to 60%.&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;Ctrl + R&lt;/td&gt;&lt;td&gt;反转显示颜色 Invert the colors.&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;Shift + R&lt;/td&gt;&lt;td&gt;重画屏幕 Refresh and redraw.&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;F5&lt;/td&gt;&lt;td&gt;演示模式 presentation mode.&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;F11&lt;/td&gt;&lt;td&gt;全屏幕模式 fullscreen mode.&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;Q&lt;/td&gt;&lt;td&gt;退出/结束当前进程 Terminate the current Zathura session.&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Linking and Indexing&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;链接和目录&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;Shift + F&lt;/td&gt;&lt;td&gt;高亮显示链接 Show all link hints.&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;F&lt;/td&gt;&lt;td&gt;跳转到指定链接 Load a link hint’s page to the document viewer. &lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;C&lt;/td&gt;&lt;td&gt;复制链接地址 Copy a link hint’s page to the system clipboard.&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;Tab&lt;/td&gt;&lt;td&gt;进入目录模式 Display the document’s content index.&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;J&lt;/td&gt;&lt;td&gt;下一目录项 Scroll one item down in the document’s content index.&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;K&lt;/td&gt;&lt;td&gt;上一目录项 Scroll one item up in the document’s content index.&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;L&lt;/td&gt;&lt;td&gt;展开当前目录 Display the current index item’s subitems.&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;H&lt;/td&gt;&lt;td&gt;折叠当前目录 Hide the current index item’s subitems.&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;Shift + L&lt;/td&gt;&lt;td&gt;展开所有目录 Display all the subitems in the document’s content index.&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;Shift + H&lt;/td&gt;&lt;td&gt;折叠所有目录 Hide all the subitems in the document’s content index.&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;Enter&lt;/td&gt;&lt;td&gt;跳转到目录指引的页 Load the page of the currently selected index entry.&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Presentation Mode&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;演示模式&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;Space&lt;/td&gt;&lt;td&gt;下一页 Go to the next document slide.&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;Shift + Space&lt;/td&gt;&lt;td&gt;上一页 Go back to the previous document slide.&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;F5&lt;/td&gt;&lt;td&gt;退出演示模式 Go back to the default Zathura mode.&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Fullscreen Mode&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;全屏幕模式&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;Shift + J&lt;/td&gt;&lt;td&gt;下一页 Move the document display window a full page down.&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;Shift + K&lt;/td&gt;&lt;td&gt;上一页 Move the document display window a full page up.&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;ZI&lt;/td&gt;&lt;td&gt;放大 Zoom in&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;ZO&lt;/td&gt;&lt;td&gt;缩小 Zoom out&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;Z0&lt;/td&gt;&lt;td&gt;恢复缩放 Reset the current zoom level.&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;60 + =&lt;/td&gt;&lt;td&gt;缩放至指定比例 Set the zoom level of the document to 60%.&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;F11&lt;/td&gt;&lt;td&gt;退出全屏幕模式 Go back to the default Zathura mode.&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Command Mode&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;命令模式&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;:&lt;/td&gt;&lt;td&gt;进入命令行 Open Zathura’s command prompt.&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;:close&lt;/td&gt;&lt;td&gt;关闭当前文档 Exit the current document without exiting Zathura.&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;:open {filename}&lt;/td&gt;&lt;td&gt;打开指定文档 Open a new document on the current Zathura window.&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;:blist&lt;/td&gt;&lt;td&gt;列示书签 List all the available bookmarks for the current session.&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;:bmark {name}&lt;/td&gt;&lt;td&gt;新增书签 Add the current page to the session’s bookmark index.&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;:bjump {name}&lt;/td&gt;&lt;td&gt;跳转至指定书签 Jump to a bookmark.&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;:bdelete {name}&lt;/td&gt;&lt;td&gt;删除书签 Delete bookmark&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;:exec&lt;/td&gt;&lt;td&gt;执行外部命令 Run an external shell command on the current document.&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;:info&lt;/td&gt;&lt;td&gt;显示文档信息 Print the document’s internal properties.&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;:print&lt;/td&gt;&lt;td&gt;打印文档 Send the current document to the machine’s print spool.&lt;/td&gt;&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;

	&lt;p style=&quot;border-top:1px solid lightgray&quot;&gt;&lt;span style=&quot;float:right&quot;&gt;Ver: 25.06.10&amp;nbsp;|&amp;nbsp;&lt;a href=&quot;mailto:yyq123@gmail.com&quot;&gt;YYQ&lt;/a&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;a title=&quot;在Windows下安装Vim&quot; href=&quot;http://yyq123.github.io/learn-vim/learn-vi-203-Install-Vim-Win.html&quot;&gt;上一篇&lt;/a&gt;&amp;nbsp;|&lt;a title=&quot;笔记列表&quot; href=&quot;http://yyq123.github.com/learn-vim/learn-vi-00-00-TOC.html&quot;&gt;&amp;nbsp;目录&amp;nbsp;&lt;/a&gt;|&amp;nbsp;&lt;a title=&quot;在Mac下安装Vim&quot; href=&quot;http://yyq123.github.io/learn-vim/learn-vi-202-Install-Vim-Mac.html&quot;&gt;下一篇&lt;/a&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://yyq123.blogspot.com/feeds/867667460030331666/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='http://yyq123.blogspot.com/2025/06/httpsyyq123.blogspot.com202506vim-pdf-zathura.html#comment-form' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7045570/posts/default/867667460030331666'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7045570/posts/default/867667460030331666'/><link rel='alternate' type='text/html' href='http://yyq123.blogspot.com/2025/06/httpsyyq123.blogspot.com202506vim-pdf-zathura.html' title='VIM学习笔记 工具箱-PDF查看器zathura'/><author><name>YYQ</name><uri>http://www.blogger.com/profile/00702527262114879030</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7045570.post-5006509338765748524</id><published>2025-06-07T23:03:00.000+08:00</published><updated>2025-06-07T23:03:33.989+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="[知]"/><category scheme="http://www.blogger.com/atom/ns#" term="OpenSource"/><category scheme="http://www.blogger.com/atom/ns#" term="Software"/><category scheme="http://www.blogger.com/atom/ns#" term="Vim"/><title type='text'>VIM学习笔记 编译文档(Compiling Latex)</title><content type='html'>	&lt;p&gt;LaTeX是一种用于生成高印刷质量的科技和数学类文档的排版系统，可以生成包含复杂表格和数学公式的复杂文档。&lt;/p&gt;
	&lt;p&gt;LaTeX文档是一个以&lt;kbd&gt;.tex&lt;/kbd&gt;扩展名的文本文件，可以使用任意文本编辑器（比如Vim)编辑；在编辑完成后，可以编译为更容易阅读的文档格式（比如PDF）。&lt;/p&gt;

	&lt;h2 class=&quot;article&quot;&gt;&lt;a id=&quot;TeX-Live&quot;&gt;TeX Live&lt;/a&gt;&lt;/h2&gt;
	&lt;p&gt;&lt;a href=&quot;https://tug.org/texlive/&quot; title=&quot;TeX Live&quot;&gt;TeX Live&lt;/a&gt;是一种免费的跨平台TeX文档制作系统。它包括所有与TeX相关的主要程序、宏包和字体，支持全球多种语言。许多Unix/GNU/Linux操作系统通过自己的包管理器提供TeX Live，但&lt;strong&gt;强烈推荐严格按照&lt;a href=&quot;https://tug.org/texlive/quickinstall.html&quot; title=&quot;Quick install for Unix&quot;&gt;官方文档&lt;/a&gt;进行手动安装&lt;/strong&gt;。（另：&lt;a href=&quot;https://tex.stackexchange.com/questions/1092/how-to-install-vanilla-texlive-on-debian-or-ubuntu&quot; title=&quot;How to install  TeXLive on Debian or Ubuntu?&quot;&gt;参考&lt;/a&gt;）&lt;/p&gt;
	&lt;p&gt;在安装之后，增加以下PATH路径：&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;&lt;code class=&quot;inset&quot;&gt;export PATH=$PATH:/usr/local/texlive/2025/bin/i386-linux
export INFOPATH=$INFOPATH:/usr/local/texlive/2025/texmf-dist/doc/info
export MANPATH=$MANPATH:/usr/local/texlive/2025/texmf-dist/doc/man&lt;/code&gt;&lt;/pre&gt;
	&lt;p&gt;同理，使用以下命令为sudo增加安全路径：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;$ sudo visudo&lt;/code&gt;&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;&lt;code class=&quot;inset&quot;&gt;Defaults secure_path=&quot;/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/texlive/2025/bin/i386-linux&quot;&lt;/code&gt;&lt;/pre&gt;
	&lt;p&gt;使用&lt;a href=&quot;https://tug.org/texlive/doc/tlmgr.html&quot; title=&quot;tlmgr&quot;&gt;tlmgr&lt;/a&gt;更新Tex Live系统以及安装的Packages：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;$ sudo tlmgr update --self&lt;/code&gt;&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;$ sudo tlmgr update --all&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;如果在使用过程中，仍然出现类似以下缺失包的报错信息：&lt;/p&gt;
	&lt;p&gt;&lt;code class=&quot;error&quot;&gt;! LaTeX Error: File `gb4e.sty&#39; not found.&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;那么可以使用以下命令，手动安装缺失的包：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;$ sudo tlmgr install gb4e&lt;/code&gt;&lt;/p&gt;

	&lt;h2 class=&quot;article&quot;&gt;&lt;a id=&quot;Latex-Edit&quot;&gt;编辑Latex文档&lt;/a&gt;&lt;/h2&gt;
	&lt;p&gt;Vim内置了&lt;a href=&quot;https://vimhelp.org/syntax.txt.html#latex-syntax&quot; title=&quot;latex-syntax&quot;&gt;Latex&lt;/a&gt;语法高亮度，可以很方便地编辑文档。&lt;/p&gt;
	&lt;p&gt;&lt;a href=&quot;https://yyq123.github.io/learn-vim/images/Latex-Syntax.png&quot; title=&quot;Latex-Syntax&quot;&gt;&lt;img src=&quot;https://yyq123.github.io/learn-vim/images/Latex-Syntax.png&quot; alt=&quot;Latex-Syntax&quot; width=&quot;500&quot; height=&quot;269&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

	&lt;h2 class=&quot;article&quot;&gt;&lt;a id=&quot;Latex-Compile&quot;&gt;编译Latex文档&lt;/a&gt;&lt;/h2&gt;
	&lt;p&gt;在Vim命令行中执行&lt;a href=&quot;https://tug.org/applications/pdftex/&quot; title=&quot;pdfTeX&quot;&gt;pdfTeX&lt;/a&gt;命令，可以将Latex源文件编译为更容易阅读的PDF文件：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:!pdflatex sample.tex
&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;默认情况下，将显示类似以下输出信息，并等待用户按回车键以返回到Vim：&lt;/p&gt;
	&lt;p&gt;&lt;code class=&quot;msg&quot;&gt;Output written on sample.pdf (1 page, 66919 bytes).&lt;br /&gt;
Transcript written on sample.log.&lt;br /&gt;
Press ENTER or type command to continue&lt;/code&gt;&lt;/p&gt;
	
	&lt;h2 class=&quot;article&quot;&gt;&lt;a id=&quot;Latex-View-PDF&quot;&gt;查看Latex输出文档&lt;/a&gt;&lt;/h2&gt;
	&lt;p&gt;命令执行成功后，将在同一目录下，生成一个同名的PDF文件。同时还会生成一些辅助文件，如sample.log，其中包含有关编译过程的详细信息。&lt;/p&gt;
	&lt;p&gt;使用以下命令，启动PDF查看器验证生成的输出结果：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:zathura sample.pdf&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;&lt;a href=&quot;https://yyq123.github.io/learn-vim/images/Latex-View-PDF.png&quot; title=&quot;Latex-View-PDF&quot;&gt;&lt;img src=&quot;https://yyq123.github.io/learn-vim/images/Latex-View-PDF.png&quot; alt=&quot;Latex-View-PDF&quot; width=&quot;500&quot; height=&quot;295&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
	&lt;h2 class=&quot;article&quot;&gt;&lt;a id=&quot;Latex-UDC&quot;&gt;自动化Latex编译和输出&lt;/a&gt;&lt;/h2&gt;
	&lt;p&gt;在vimrc启动文件中自定义以下命令：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:command Latex execute &quot;silent !pdflatex % &amp;gt; /dev/null &amp;amp;&amp;amp; zathura %:r.pdf &amp;gt; /dev/null 2&amp;gt;&amp;amp;1 &amp;amp;&quot; | redraw!&lt;/code&gt;&lt;/p&gt;
	&lt;ul&gt;
		&lt;li&gt;&lt;code&gt;silent&lt;/code&gt;，将避免显示诸如 “Press ENTER to continue” 等命令执行过程中的提示信息；&lt;/li&gt;
		&lt;li&gt;&lt;code&gt;pdlatex&lt;/code&gt;，将编译当前文件， &lt;code&gt; % &amp;gt; &lt;/code&gt;将标准输出重定向到&lt;code&gt;/dev/null&lt;/code&gt;而不是显示在屏幕上；&lt;/li&gt;
		&lt;li&gt;&lt;code&gt;zathura&lt;/code&gt;，用于查看生成的PDF文件，即以&lt;code&gt;%:r&lt;/code&gt;指定的当前文件名，以&lt;code&gt;.pdf&lt;/code&gt;指定的后缀扩展名；&lt;/li&gt;
		&lt;li&gt;&lt;code&gt;redraw&lt;/code&gt;，重画屏幕，以保证正常显示；&lt;/li&gt;
	&lt;/ul&gt;
	&lt;p&gt;在命令行中执行以下自定义命令，将自动化使用pdflatex来编译文档，并使用Zathura来显示生成的PDF文件：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:Latex&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;您也可以在vimrc启动文件中自定义以下快捷键：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:map &amp;lt;F2&amp;gt; :Latex &amp;lt;CR&amp;gt;&lt;/code&gt;&lt;/p&gt;

	&lt;p style=&quot;border-top:1px solid lightgray&quot;&gt;&lt;span style=&quot;float:right&quot;&gt;Ver: 25.06.07&amp;nbsp;|&amp;nbsp;&lt;a href=&quot;mailto:yyq123@gmail.com&quot;&gt;YYQ&lt;/a&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;a title=&quot;编译源码(Compile Code)-C&quot; href=&quot;http://yyq123.github.io/learn-vim/learn-vim-CompileCode-C.html&quot;&gt;上一篇&lt;/a&gt;&amp;nbsp;|&lt;a title=&quot;笔记列表&quot; href=&quot;http://yyq123.github.com/learn-vim/learn-vi-00-00-TOC.html&quot;&gt;&amp;nbsp;目录&amp;nbsp;&lt;/a&gt;|&amp;nbsp;&lt;a title=&quot;编译源码(Compile Code)-Java&quot; href=&quot;http://yyq123.github.io/learn-vim/learn-vim-CompileCode-Java.html&quot;&gt;下一篇&lt;/a&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
</content><link rel='replies' type='application/atom+xml' href='http://yyq123.blogspot.com/feeds/5006509338765748524/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='http://yyq123.blogspot.com/2025/06/vim-compiling-latex.html#comment-form' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7045570/posts/default/5006509338765748524'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7045570/posts/default/5006509338765748524'/><link rel='alternate' type='text/html' href='http://yyq123.blogspot.com/2025/06/vim-compiling-latex.html' title='VIM学习笔记 编译文档(Compiling Latex)'/><author><name>YYQ</name><uri>http://www.blogger.com/profile/00702527262114879030</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7045570.post-6072433587633925332</id><published>2025-04-29T18:53:00.003+08:00</published><updated>2025-04-29T18:53:48.283+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="[知]"/><category scheme="http://www.blogger.com/atom/ns#" term="OpenSource"/><category scheme="http://www.blogger.com/atom/ns#" term="Software"/><category scheme="http://www.blogger.com/atom/ns#" term="Vim"/><title type='text'>VIM学习笔记 使用Git Bash Shell环境</title><content type='html'>&lt;p&gt;Git Bash是将Git版本控制系统和Bash Shell集成至单一界面的工具，允许用户在Windows系统的命令行环境中使用Git命令，为熟悉Linux系统的开发人员提供无缝体验；同时还能利用Bash强大的脚本和命令行功能。&lt;/p&gt;

	&lt;h2 class=&quot;article&quot;&gt;&lt;a id=&quot;vim-GitBash-ConEmu&quot;&gt;集成Git Bash和ConEmu&lt;a id=&quot;ConEmu&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
	&lt;p&gt;如果您已经安装了&lt;a href=&quot;http://yyq123.github.io/learn-vim/learn-vi-803-Toolkit-Git.html&quot; title=&quot;版本控制(Toolkit-Git)&quot;&gt;Git&lt;/a&gt;和&lt;a href=&quot;http://yyq123.github.io/learn-vim/learn-vi-804-Toolkit-CLI-Win.html#ConEmu&quot; title=&quot;Windows命令行环境(Toolkit-CLI-Win)&quot;&gt;ConEmu&lt;/a&gt;，那么通过以下配置将可以在虚拟终端和Vim中调用Git Bash。&lt;/p&gt;
	&lt;p&gt;在ConEmu中，点击&lt;kbd&gt;Win+Alt+P&lt;/kbd&gt;快捷键以打开设置对话框。&lt;/p&gt;
	&lt;p&gt;&lt;a href=&quot;https://yyq123.github.io/learn-vim/images/ConEmu-Setting-Task-Git-Bash.png&quot; title=&quot;Git Bash&quot;&gt;&lt;img src=&quot;https://yyq123.github.io/learn-vim/images/ConEmu-Setting-Task-Git-Bash.png&quot; alt=&quot;Git Bash&quot; width=&quot;550&quot; height=&quot;371&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
	&lt;ol&gt;
		&lt;li&gt;在侧边栏中，选择&lt;em&gt;Startup&lt;/em&gt;下的&lt;em&gt;Tasks&lt;/em&gt;；&lt;/li&gt;
		&lt;li&gt;点击&lt;em&gt;+&lt;/em&gt;按钮，新增项目；&lt;/li&gt;
		&lt;li&gt;输入&quot;&lt;code class=&quot;inset&quot;&gt;Bash::git bash&lt;/code&gt;&quot;作为项目名称；&lt;/li&gt;
		&lt;li&gt;在&lt;em&gt;Task Parameters&lt;/em&gt;编辑框中，指定启动目录和图标文件：&lt;br /&gt;&lt;pre class=&quot;block&quot;&gt;&lt;code&gt;/single /Dir &quot;C:\&quot; /icon &quot;C:\Program Files\Git\mingw64\share\git\git-for-windows.ico&quot;&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
		&lt;li&gt;在&lt;em&gt;Commands&lt;/em&gt;编辑框中，指定Git Bash命令：&lt;br /&gt;&lt;pre class=&quot;block&quot;&gt;&lt;code&gt;&quot;%ProgramFiles%\Git\bin\sh.exe&quot; --login -i&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
		&lt;li&gt;点击&lt;em&gt;Save Settings&lt;/em&gt;按钮，保存设置。&lt;/li&gt;
	&lt;/ol&gt;
	&lt;p&gt;在ConEmu中，选择新建Git Bash终端窗口：&lt;/p&gt;
	&lt;p&gt;&lt;a href=&quot;https://yyq123.github.io/learn-vim/images/ConEmu-New-Console-Git-Bash.png&quot; title=&quot;New Console&quot;&gt;&lt;img src=&quot;https://yyq123.github.io/learn-vim/images/ConEmu-New-Console-Git-Bash.png&quot; alt=&quot;New Console&quot; width=&quot;550&quot; height=&quot;190&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
	&lt;p&gt;您可以在命令行环境下管理Git库：&lt;/p&gt;
	&lt;p&gt;&lt;a href=&quot;https://yyq123.github.io/learn-vim/images/ConEmu-Git-Bash-Command.png&quot; title=&quot;Command&quot;&gt;&lt;img src=&quot;https://yyq123.github.io/learn-vim/images/ConEmu-Git-Bash-Command.png&quot; alt=&quot;Command&quot; width=&quot;550&quot; height=&quot;211&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
	&lt;p&gt;除了Git命令，Git Bash也提供一系列Linux经典命令工具，您可以使用&lt;code class=&quot;inset&quot;&gt;$ help&lt;/code&gt;命令列出命令列表：&lt;/p&gt;
	&lt;p&gt;&lt;a href=&quot;https://yyq123.github.io/learn-vim/images/ConEmu-Git-Bash-Help.png&quot; title=&quot;Help&quot;&gt;&lt;img src=&quot;https://yyq123.github.io/learn-vim/images/ConEmu-Git-Bash-Help.png&quot; alt=&quot;Help&quot; width=&quot;550&quot; height=&quot;377&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

	&lt;h2 class=&quot;article&quot;&gt;&lt;a id=&quot;vim-GitBash-Shell&quot;&gt;配置Vim使用Git Bash&lt;/a&gt;&lt;/h2&gt;
	&lt;p&gt;通过以下命令，可以查询到Vim在Windows下，默认使用命令提示符 &quot;Command Prompt&quot;：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:set shell?&lt;/code&gt;&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;msg&quot;&gt;shell=C:\WINDOWS\system32\cmd.exe&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;在&lt;a href=&quot;http://yyq123.github.io/learn-vim/learn-vi-59-vimrc.html&quot; title=&quot;vimrc&quot;&gt;vimrc&lt;/a&gt;配置文件中设置以下函数：&lt;/p&gt;
&lt;pre class=&quot;block&quot;&gt;&lt;code&gt;fun! ShellGitBash()
	let $CHERE_INVOKING=1
	set shell=C:\PROGRA~1\Git\bin\sh.exe
	set shellcmdflag=--login\ -c
	set shellxquote=\&quot;
	set shellslash
	let $PATH .= &#39;;C:\PROGRA~1\Git\bin&#39;
endfun&lt;/code&gt;&lt;/pre&gt;
	&lt;p&gt;通过以下命令，则可切换至Git Bash的Shell环境：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:call ShellGitBash()&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;在Vim中使用&lt;code class=&quot;inset&quot;&gt;:terminal&lt;/code&gt;命令，即可打开Git Bash终端窗口：&lt;/p&gt;
	&lt;p&gt;&lt;a href=&quot;https://yyq123.github.io/learn-vim/images/Git-Bash-Vim-terminal.png&quot; title=&quot;terminal&quot;&gt;&lt;img src=&quot;https://yyq123.github.io/learn-vim/images/Git-Bash-Vim-terminal.png&quot; alt=&quot;terminal&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
	&lt;p&gt;你也可以在Vim&lt;a href=&quot;http://yyq123.github.io/learn-vim/learn-vi-46-CommandlineMode.html&quot; title=&quot;命令行模式(Command-line Mode)&quot;&gt;命令行模式&lt;/a&gt;下，使用&lt;code class=&quot;inset&quot;&gt;:!&lt;/code&gt;或&lt;code class=&quot;inset&quot;&gt;:shell&lt;/code&gt;命令，来&lt;a href=&quot;http://yyq123.github.io/learn-vim/learn-vi-71-Shell.html&quot; title=&quot;Shell&quot;&gt;执行bash命令&lt;/a&gt;。&lt;/p&gt;

	&lt;p style=&quot;border-top:1px solid lightgray&quot;&gt;&lt;span style=&quot;float:right&quot;&gt;Ver 25.04.28 &amp;nbsp;|&amp;nbsp;&lt;a href=&quot;mailto:yyq123@gmail.com&quot;&gt;YYQ&lt;/a&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;a href=&quot;http://yyq123.github.io/learn-vim/learn-vi-804-Toolkit-CLI-Win.html&quot; title=&quot;Windows命令行环境(Toolkit-CLI-Win)&quot;&gt;上一篇&lt;/a&gt;&amp;nbsp;|&lt;a title=&quot;笔记列表&quot; href=&quot;https://yyq123.github.io/learn-vim/learn-vi-00-00-TOC.html&quot;&gt;&amp;nbsp;目录&amp;nbsp;&lt;/a&gt;|&amp;nbsp;&lt;a href=&quot;http://yyq123.github.io/learn-vim/learn-vi-71-Shell.html&quot; title=&quot;Shell&quot;&gt;下一篇&lt;/a&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
</content><link rel='replies' type='application/atom+xml' href='http://yyq123.blogspot.com/feeds/6072433587633925332/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='http://yyq123.blogspot.com/2025/04/vim-git-bash-shell.html#comment-form' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7045570/posts/default/6072433587633925332'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7045570/posts/default/6072433587633925332'/><link rel='alternate' type='text/html' href='http://yyq123.blogspot.com/2025/04/vim-git-bash-shell.html' title='VIM学习笔记 使用Git Bash Shell环境'/><author><name>YYQ</name><uri>http://www.blogger.com/profile/00702527262114879030</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7045570.post-644938332449296582</id><published>2025-04-29T18:49:00.003+08:00</published><updated>2025-04-29T18:49:49.740+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="[知]"/><category scheme="http://www.blogger.com/atom/ns#" term="OpenSource"/><category scheme="http://www.blogger.com/atom/ns#" term="Software"/><category scheme="http://www.blogger.com/atom/ns#" term="Vim"/><title type='text'>VIM学习笔记 插件管理器(minpac)</title><content type='html'>&lt;p&gt;&lt;a href=&quot;https://raw.githubusercontent.com/vim/vim/master/runtime/doc/version8.txt&quot; title=&quot;packages&quot;&gt;Vim8&lt;/a&gt;引入了内置的&lt;a href=&quot;http://yyq123.github.io/learn-vim/learn-vim-packages.html&quot; title=&quot;packages&quot;&gt;packages&lt;/a&gt;软件包功能。而&lt;a href=&quot;https://github.com/k-takata/minpac&quot; title=&quot;minpac&quot;&gt;minpac&lt;/a&gt;则是构建于packages软件包功能之上的轻量化插件管理器。&lt;/p&gt;

	&lt;h2 class=&quot;article&quot;&gt;安装配置&lt;/h2&gt;
	&lt;p&gt;首先在操作系统中，为minpac创建安装目录：&lt;/p&gt;
	&lt;ul&gt;
		&lt;li&gt;Linux:&lt;br /&gt;&lt;code class=&quot;inset&quot;&gt;$ mkdir -p ~/.vim/pack/minpac/opt&lt;/code&gt;&lt;/li&gt;
		&lt;li&gt;Windows:&lt;br /&gt;&lt;code class=&quot;inset&quot;&gt;$ mkdir -p ~/vimfiles/pack/minpac/opt&lt;/code&gt;&lt;/li&gt;
	&lt;/ul&gt;
	&lt;p&gt;使用以下命令，将minpac作为手动载入的插件，安装在&lt;kbd&gt;opt&lt;/kbd&gt;目录中：&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;&lt;code&gt;$ cd ~/vimfiles/pack/minpac/opt
$ git clone https://github.com/k-takata/minpac.git&lt;/code&gt;&lt;/pre&gt;
	&lt;p&gt;在vimrc配置文件中，添加以下命令：&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;&lt;code class=&quot;inset&quot;&gt;packadd minpac
call minpac#init()&lt;/code&gt;&lt;/pre&gt;

	&lt;h2 class=&quot;article&quot;&gt;安装插件&lt;/h2&gt;
	&lt;p&gt;minpac支持源码托管在&lt;a href=&quot;https://github.com/&quot;&gt;GitHub&lt;/a&gt;的插件，你可以在&lt;a href=&quot;https://github.com/vim-scripts/&quot;&gt;github.com/vim-scripts/&lt;/a&gt;上找到&lt;a href=&quot;http://www.vim.org/&quot;&gt;vim官网&lt;/a&gt;里所有插件的镜像，也可以直接引用github.com的网址。&lt;/p&gt;
	&lt;p&gt;如果希望安装新插件，可以在vimrc配置文件中，添加以下minpac#add()命令：&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;&lt;code&gt;call minpac#add(&#39;lilydjwg/colorizer&#39;)
call minpac#add(&#39;kshenoy/vim-signature&#39;)
call minpac#add(&#39;yyq123/HTML-Editor&#39;)&lt;/code&gt;&lt;/pre&gt;
	&lt;p&gt;默认情况下，插件将被作为自动载入插件安装至&lt;kbd&gt;start&lt;/kbd&gt;目录。&lt;/p&gt;
	&lt;p&gt;通过在函数中指定&#39;type&#39;: &#39;opt&#39;选项，将minpac自身作为手动载入插件进行注册。&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;&lt;code&gt;call minpac#add(&#39;k-takata/minpac&#39;, {&#39;type&#39;:&#39;opt&#39;})&lt;/code&gt;&lt;/pre&gt;
	&lt;p&gt;然后使用以下命令，重新载入vimrc配置文件，并安装插件：&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;&lt;code&gt;:source ~/.vimrc
:call minpac#update()&lt;/code&gt;&lt;/pre&gt;
	&lt;p&gt;安装的插件将存放在&lt;kbd&gt;pack&lt;/kbd&gt;子目录中，目录结构如下：&lt;/p&gt;
	&lt;p&gt;&lt;img src=&quot;https://yyq123.github.io/learn-vim/images/minpac-Directory-Structure.png&quot; alt=&quot;Directory&quot; /&gt;&lt;/p&gt;

	&lt;h2 class=&quot;article&quot;&gt;卸载插件&lt;/h2&gt;
	&lt;p&gt;如果希望卸载插件，请先在vimrc文件中删除相关call minpac#add(&#39;&#39;)命令；然后重新载入vimrc文件，并执行以下命令：&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;&lt;code&gt;:call minpac#clean()&lt;/code&gt;&lt;/pre&gt;

	&lt;h2 class=&quot;article&quot;&gt;更新插件&lt;/h2&gt;
	&lt;p&gt;建议在vimrc文件中，增加以下命令映射以便于后续操作：&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;&lt;code&gt;&quot; minpac commands:
&quot; 安装和更新插件
command! PackUpdate call minpac#update()
&quot; 卸载插件
command! PackClean call minpac#clean()
&quot; 查看插件状态
command! PackStatus call minpac#status()&lt;/code&gt;&lt;/pre&gt;
	&lt;p&gt;然后就可以使用以下命令，批量更新所有已安装的插件：&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;&lt;code&gt;:PackUpdate&lt;/code&gt;&lt;/pre&gt;

	&lt;h2 class=&quot;article&quot;&gt;帮助信息&lt;/h2&gt;
	&lt;p&gt;使用以下命令，可以查看minpac的帮助信息：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:help minpac&lt;/code&gt;&lt;/p&gt;
	
	&lt;p style=&quot;border-top:1px solid lightgray&quot;&gt;&lt;span style=&quot;float:right&quot;&gt;Ver 25.4.22&amp;nbsp;|&amp;nbsp;&lt;a href=&quot;mailto:yyq123@gmail.com&quot;&gt;YYQ&lt;/a&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;a title=&quot;软件包(packages)&quot; href=&quot;http://yyq123.github.io/learn-vim/learn-vim-packages.html&quot;&gt;上一篇&lt;/a&gt;&amp;nbsp;|&lt;a title=&quot;笔记列表&quot; href=&quot;https://yyq123.github.io/learn-vim/learn-vi-00-00-TOC.html&quot;&gt;&amp;nbsp;目录&amp;nbsp;&lt;/a&gt;|&amp;nbsp;&lt;a title=&quot;运行外部命令(shell)&quot; href=&quot;http://yyq123.github.io/learn-vim/learn-vi-71-Shell.html&quot;&gt;下一篇&lt;/a&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;

</content><link rel='replies' type='application/atom+xml' href='http://yyq123.blogspot.com/feeds/644938332449296582/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='http://yyq123.blogspot.com/2025/04/vim-minpac.html#comment-form' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7045570/posts/default/644938332449296582'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7045570/posts/default/644938332449296582'/><link rel='alternate' type='text/html' href='http://yyq123.blogspot.com/2025/04/vim-minpac.html' title='VIM学习笔记 插件管理器(minpac)'/><author><name>YYQ</name><uri>http://www.blogger.com/profile/00702527262114879030</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7045570.post-6347952676469428912</id><published>2025-04-20T21:59:00.000+08:00</published><updated>2025-04-20T21:59:02.680+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="[知]"/><category scheme="http://www.blogger.com/atom/ns#" term="OpenSource"/><category scheme="http://www.blogger.com/atom/ns#" term="Software"/><category scheme="http://www.blogger.com/atom/ns#" term="Vim"/><title type='text'>VIM学习笔记 软件包(packages)</title><content type='html'>	&lt;p&gt;&lt;a href=&quot;https://raw.githubusercontent.com/vim/vim/master/runtime/doc/version8.txt&quot; title=&quot;packages&quot;&gt;Vim8&lt;/a&gt;引入了内置的&lt;a href=&quot;https://raw.githubusercontent.com/vim/vim/master/runtime/doc/version8.txt&quot; title=&quot;packages&quot;&gt;packages&lt;/a&gt;软件包功能。Vim软件包将创建一个或多个目录，用于安装和更新插件。和普通插件管理器相比，它主要有以下优点：&lt;/p&gt;
	
	&lt;ul&gt;
		&lt;li&gt;软件包可作为归档下载，并可解压到单独的目录。这样文件就不会和其它插件的文件混杂。也方便后续更新和删除。&lt;/li&gt;
		&lt;li&gt;软件包可以使用git等版本库进行更新。&lt;/li&gt;
		&lt;li&gt;软件包可包含相互依赖的多个插件。&lt;/li&gt;
		&lt;li&gt;软件包可包含启动时自动载入的插件和通过:packadd手动载入的插件。&lt;/li&gt;
	&lt;/ul&gt;
	&lt;p&gt;&lt;/p&gt;
	&lt;p&gt;任何位于&lt;kbd&gt;~/.vim/pack&lt;/kbd&gt;之下的目录，都将被视为软件包。一个软件包，可以将插件存储在&lt;kbd&gt;start&lt;/kbd&gt;或&lt;kbd&gt;opt&lt;/kbd&gt;子目录中：&lt;/p&gt;
	&lt;ul&gt;
		&lt;li&gt;&lt;kbd&gt;~/.vim/pack/*/start/{name}&lt;/kbd&gt;&lt;br /&gt;存储自动载入的插件&lt;/li&gt;
		&lt;li&gt;&lt;kbd&gt;~/.vim/pack/*/opt/{name}&lt;/kbd&gt;&lt;br /&gt;存储通过:packadd {name}命令手动载入的插件&lt;/li&gt;
	&lt;/ul&gt;
	&lt;p&gt;其中，&lt;code class=&quot;insert&quot;&gt;*&lt;/code&gt;可以为任意名称。&lt;/p&gt;
	&lt;p&gt;例如使用以下命令，创建以“plugins”命名的目录结构：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;mkdir -p ~/.vim/pack/plugins/start&lt;/code&gt;&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;mkdir -p ~/.vim/pack/plugins/opt&lt;/code&gt;&lt;/p&gt;

	&lt;h2 class=&quot;article&quot;&gt;安装配置&lt;/h2&gt;
	&lt;p&gt;可以clone或者使用子模块（&lt;a href=&quot;https://git-scm.com/book/en/v2/Git-Tools-Submodules&quot; title=&quot;Submodules&quot;&gt;Submodules&lt;/a&gt;）功能，将git库同步到本地软件包目录。这也意味着，您可以在Git库里集中管理&lt;kbd&gt;.vimrc&lt;/kbd&gt;配置文件和&lt;kbd&gt;.vim&lt;/kbd&gt;目录结构，并同步到不同的计算机里。&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;Git子模块允许你将一个Git仓库作为另一个Git仓库的子目录。 它能让你将另一个仓库克隆到自己的项目中，同时还保持提交的独立。&lt;/pre&gt;
	&lt;p&gt;为&lt;em&gt;pack&lt;/em&gt;目录创建git库：&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;&lt;code class=&quot;inset&quot;&gt;cd ~/.vim/pack
git init
git add *
git commit -m &quot;Initial commit&quot;
git submodule init
git remote add origin https://github.com/username/reponame.git
git push -u origin master&lt;/code&gt;&lt;/pre&gt;
	&lt;p&gt;目录结构如下，之后安装的插件将存放在&lt;kbd&gt;~/.vim/pack&lt;/kbd&gt;子目录中：&lt;/p&gt;
	&lt;p&gt;&lt;img src=&quot;https://yyq123.github.io/learn-vim/images/packages-directory-tree.png&quot; alt=&quot;packages Directory&quot; /&gt;&lt;/p&gt;

	&lt;h2 class=&quot;article&quot;&gt;安装插件&lt;/h2&gt;
	&lt;p&gt;软件包支持源码托管在&lt;a href=&quot;https://github.com/&quot;&gt;GitHub&lt;/a&gt;的插件，你可以在&lt;a href=&quot;https://github.com/vim-scripts/&quot;&gt;github.com/vim-scripts/&lt;/a&gt;上找到&lt;a href=&quot;http://www.vim.org/&quot;&gt;vim官网&lt;/a&gt;里所有插件的镜像，也可以直接引用github.com的网址。&lt;/p&gt;
	&lt;p&gt;如果希望安装新插件，可以执行以下命令安装指定的插件：&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;&lt;code&gt;$ git submodule add https://github.com/chrisbra/unicode.vim plugins/start/unicode&lt;/code&gt;&lt;/pre&gt;
	&lt;p&gt;&lt;img src=&quot;https://yyq123.github.io/learn-vim/images/packages-git-submodule-add.png&quot; alt=&quot;packages-git-submodule-add&quot; width=&quot;550&quot; height=&quot;116&quot; /&gt;&lt;/p&gt;
	&lt;p&gt;然后使用以下命令，来提交变更：&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;&lt;code&gt;$ git commit -m &quot;Added submodules&quot;
$ git push origin master&lt;/code&gt;&lt;/pre&gt;
	&lt;p&gt;使用以下命令，可以安装用于演示Vim8.2新功能的&lt;a href=&quot;https://github.com/vim/killersheep&quot; title=&quot;killersheep&quot;&gt;killersheep&lt;/a&gt;小游戏。&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;&lt;code&gt;$ git submodule add https://github.com/vim/killersheep plugins/opt/killersheep
$ git commit -m &quot;Added killersheep&quot;
$ git push origin master&lt;/code&gt;&lt;/pre&gt;
	&lt;p&gt;使用以下命令，手动载入插件：&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;&lt;code&gt;:packadd killersheep&lt;/code&gt;&lt;/pre&gt;
	&lt;p&gt;使用以下命令，启动游戏：&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;&lt;code&gt;:Kill&lt;/code&gt;&lt;/pre&gt;
	&lt;p&gt;&lt;img src=&quot;https://yyq123.github.io/learn-vim/images/packages-killersheep.png&quot; alt=&quot;packages-killersheep&quot; width=&quot;550&quot; height=&quot;415&quot; /&gt;&lt;/p&gt;

	&lt;h2 class=&quot;article&quot;&gt;卸载插件&lt;/h2&gt;
	&lt;p&gt;如果希望卸载插件，请先执行以下命令来移除git submodule：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;git submodule deinit -f -- ~/.vim/pack/plugins/opt/killersheep&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;然后使用以下命令，删除插件文件目录：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;rm -rf ~/.vim/pack/plugins/opt/killersheep&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;最后使用以下命令，从远处Git库中删除插件：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;git rm -rf ~/.vim/pack/plugins/opt/&lt;/code&gt;&lt;/p&gt;

	&lt;h2 class=&quot;article&quot;&gt;更新插件&lt;/h2&gt;
	&lt;p&gt;使用以下命令，可以更新指定插件&#39;unicode&#39;：&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;&lt;code class=&quot;inset&quot;&gt;$ cd ~/.vim/pack/plugins/start/unicode
$ git submodule update --remote --merge&lt;/code&gt;&lt;/pre&gt;
	&lt;p&gt;使用以下命令，可以批量更新所有已安装的插件：&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;&lt;code&gt;$ cd ~/.vim/pack
$ git submodule foreach git pull origin master&lt;/code&gt;&lt;/pre&gt;
	&lt;p&gt;请注意，如果有任何插件更新，请使用以下命令提交更新至Git repository：&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;&lt;code&gt;$ cd ~/.vim/pack
$ git commit -am &quot;Updated plugins.&quot;&lt;/code&gt;&lt;/pre&gt;

	&lt;h2 class=&quot;article&quot;&gt;帮助信息&lt;/h2&gt;
	&lt;p&gt;使用以下命令，可以查看packages的帮助信息：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:help packages&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;请注意，对于Vim内置的软件包功能：&lt;/p&gt;
	&lt;ul&gt;
		&lt;li&gt;仅仅负责载入插件，而需要用户自行下载、安装和更新插件，用户友好度欠佳；&lt;/li&gt;
		&lt;li&gt;调用git的clone和submodule，对于普通用户的门槛过高；&lt;/li&gt;
		&lt;li&gt;需要自行生成帮助文档（Help tags），例如以下命令将生成指定目录下的帮助文档：&lt;br /&gt;&lt;code class=&quot;inset&quot;&gt;:helptags ~/.vim/pack/plugins/start/reponame&lt;/code&gt;&lt;br /&gt;而以下命令则将生成所有帮助文档：&lt;br /&gt;&lt;code class=&quot;inset&quot;&gt;:helptags ALL&lt;/code&gt;&lt;/li&gt;
		
	&lt;/ul&gt;
	&lt;p&gt;如果您同时使用多台电脑，那么结合packages和git功能即可以实现插件配置的同步。当然,这过程中牵扯了诸多手工操作和git知识，平衡取舍还请各位自行斟酌。&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;&lt;code&gt;$ git clone https://github.com/username/reponame.git ~/.vim
$ cd ~/.vim
$ git submodule update --init
$ git commit -am &quot;Updated plugins.&quot;
$ git submodule foreach git pull origin master
$ git add .
$ git commit -m &quot;update submodules&quot;&lt;/code&gt;&lt;/pre&gt;
	
	&lt;table summary=&quot;Commands&quot; border=&quot;2&quot; frame=&quot;hsides&quot; rules=&quot;all&quot; cellspacing=&quot;0&quot; cellpadding=&quot;3&quot;&gt;
		&lt;caption&gt;命令小结&lt;/caption&gt;
		&lt;tr&gt;&lt;td&gt;&lt;code class=&quot;inset&quot;&gt;:packadd&gt;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;安装插件&lt;/td&gt;&lt;/tr&gt;
	&lt;/table&gt;

	&lt;p style=&quot;border-top:1px solid lightgray&quot;&gt;&lt;span style=&quot;float:right&quot;&gt;Ver 25.4.20&amp;nbsp;|&amp;nbsp;&lt;a href=&quot;mailto:yyq123@gmail.com&quot;&gt;YYQ&lt;/a&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;a title=&quot;插件管理器(Vundle)&quot; href=&quot;http://yyq123.github.io/learn-vim/learn-vi-101-plugin-vundle.html&quot;&gt;上一篇&lt;/a&gt;&amp;nbsp;|&lt;a title=&quot;笔记列表&quot; href=&quot;https://yyq123.github.io/learn-vim/learn-vi-00-00-TOC.html&quot;&gt;&amp;nbsp;目录&amp;nbsp;&lt;/a&gt;|&amp;nbsp;&lt;a title=&quot;运行外部命令(shell)&quot; href=&quot;http://yyq123.github.io/learn-vim/learn-vi-71-Shell.html&quot;&gt;下一篇&lt;/a&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
</content><link rel='replies' type='application/atom+xml' href='http://yyq123.blogspot.com/feeds/6347952676469428912/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='http://yyq123.blogspot.com/2025/04/vim-packages.html#comment-form' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7045570/posts/default/6347952676469428912'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7045570/posts/default/6347952676469428912'/><link rel='alternate' type='text/html' href='http://yyq123.blogspot.com/2025/04/vim-packages.html' title='VIM学习笔记 软件包(packages)'/><author><name>YYQ</name><uri>http://www.blogger.com/profile/00702527262114879030</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7045570.post-3316540623124868882</id><published>2021-10-24T19:22:00.000+08:00</published><updated>2021-10-24T19:22:00.599+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="[知]"/><category scheme="http://www.blogger.com/atom/ns#" term="OpenSource"/><category scheme="http://www.blogger.com/atom/ns#" term="Software"/><category scheme="http://www.blogger.com/atom/ns#" term="Vim"/><title type='text'>VIM学习笔记 选择模式 (Select Mode)</title><content type='html'>	&lt;p&gt;选择模式，可以理解为另一种可视化模式。在选择模式下，可以对选中的文本进行快速操作。比如先高亮选中文本，然后用&lt;kbd&gt;Backspace&lt;/kbd&gt;来删除这段文本；或者先高亮选中文本，然后用输入的内容来替换这些文本。执行操作之后，Vim将自动进入&lt;a href=&quot;http://yyq123.github.io/learn-vim/learn-vi-42-InsertMode.html&quot; title=&quot;插入模式(Insert Mode)&quot;&gt;插入模式(Insert Mode)&lt;/a&gt;。&lt;/p&gt;
	&lt;p&gt;选择模式与可视化模式的主要区别在于：在可视化模式下，可以选中文本，然后执行命令操作。也就是说，要用命令来结束可视化模式。而在选择模式下，命令仅限于&lt;kbd&gt;Backspace&lt;/kbd&gt;（用于删除操作）和可打印的字符（用于替换操作）。因为不需要输入命令，所以操作变得更为简单，但同时也存在很多限制。&lt;/p&gt;

	&lt;h2 class=&quot;article&quot;&gt;&lt;a id=&quot;selectmode-enter&quot;&gt;进入选择模式&lt;/a&gt;&lt;/h2&gt;
	&lt;p&gt;在常规模式下，可以使用以下命令进入选择模式。如果已经启用&lt;a href=&quot;http://yyq123.github.io/learn-vim/learn-vi-46-03-CMD-Options.html#opt-showmode&quot; title=&quot;命令相关选项 (Options-CMD)&quot;&gt;&#39;showmode&#39;&lt;/a&gt;选项，那么将在屏幕底部显示相应的选择模式名称：&lt;/p&gt;
	&lt;table summary=&quot;Commands&quot; border=&quot;1&quot; frame=&quot;border&quot; rules=&quot;all&quot; cellspacing=&quot;0&quot; cellpadding=&quot;3&quot;&gt;
		&lt;thead&gt;
		&lt;tr&gt;&lt;th style=&quot;white-space: nowrap&quot;&gt;命令&lt;/th&gt;&lt;th&gt;描述&lt;/th&gt;&lt;th&gt;模式名称&lt;/th&gt;&lt;/tr&gt;
		&lt;/thead&gt;
		&lt;tbody&gt;
		&lt;tr&gt;&lt;td&gt;&lt;code class=&quot;inset&quot;&gt;gh&lt;/code&gt;&lt;/td&gt;&lt;td&gt;进入字符选择模式&lt;/td&gt;&lt;td&gt;-- SELECT --&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;&lt;code class=&quot;inset&quot;&gt;gH&lt;/code&gt;&lt;/td&gt;&lt;td&gt;进入行选择模式&lt;/td&gt;&lt;td&gt;-- SELECT LINE --&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;&lt;code class=&quot;inset&quot;&gt;gCTRL-H&lt;/code&gt;&lt;/td&gt;&lt;td&gt;进入块选择模式&lt;/td&gt;&lt;td&gt;-- SELECT BLOCK --&lt;/td&gt;&lt;/tr&gt;
		&lt;/tbody&gt;
	&lt;/table&gt;
	&lt;p&gt;在&lt;a href=&quot;http://yyq123.github.io/learn-vim/learn-vi-45-VisualMode.html&quot; title=&quot;可视化模式(Visual Mode)&quot;&gt;可视化模式(Visual Mode)&lt;/a&gt;下，可以使用&lt;kbd&gt;Ctrl + g&lt;/kbd&gt;快捷键，进入选择模式。Vim将根据当前所处的可视化模式的类型，自动进入与之一致的字符/行/块选择模式。再次点击&lt;kbd&gt;ctrl-G&lt;/kbd&gt;键，将返回到可视化模式。&lt;/p&gt;
	&lt;p&gt;可以使用&lt;kbd&gt;ctrl-O&lt;/kbd&gt;命令从选择模式切换到可视化模式。&lt;/p&gt;

	&lt;h2 class=&quot;article&quot;&gt;&lt;a id=&quot;selectmode-operation&quot;&gt;选择模式下的操作&lt;/a&gt;&lt;/h2&gt;
	&lt;p&gt;在选择模式下移动光标比在正常模式下要困难一些。因为输入任何可打印字符和回车符，Vim就会删掉已选中的文本并进插入状态。所以要选择文本就只能使用方向键、CTRL以及功能键。&lt;/p&gt;
	&lt;p&gt;如果希望使用&lt;kbd&gt;Shift&lt;/kbd&gt;键来扩展选择，那么需要在&#39;keymodel&#39;选项中包含&quot;startsel&quot;： &lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:set keymodel=startsel,stopsel&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;如果要在选择模式下用鼠标来选择文本，需要设置以下选项：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:set selectmode=mouse&lt;/code&gt;&lt;/p&gt;

	&lt;h2 class=&quot;article&quot;&gt;&lt;a id=&quot;selectmode-exit&quot;&gt;退出选择模式&lt;/a&gt;&lt;/h2&gt;
	&lt;p&gt;使用&lt;kbd&gt;Esc&lt;/kbd&gt;或&lt;kbd&gt;Ctrl-[&lt;/kbd&gt;键，可以退出选择模式。

	&lt;h2 class=&quot;article&quot;&gt;&lt;a id=&quot;selectmode-help&quot;&gt;帮助信息&lt;/a&gt;&lt;/h2&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:help select-mode&lt;/code&gt;&lt;/p&gt;

	&lt;p style=&quot;border-top:1px solid lightgray&quot;&gt;&lt;span style=&quot;float:right&quot;&gt;Ver: 2.0&amp;nbsp;|&amp;nbsp;&lt;a href=&quot;mailto:yyq123@gmail.com&quot;&gt;YYQ&lt;/a&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;a title=&quot;插入模式(Insert Mode)&quot; href=&quot;http://yyq123.github.io/learn-vim/learn-vi-42-InsertMode.html&quot;&gt;上一篇&lt;/a&gt;&amp;nbsp;|&lt;a title=&quot;笔记列表&quot; href=&quot;http://yyq123.github.com/learn-vim/learn-vi-00-00-TOC.html&quot;&gt;&amp;nbsp;目录&amp;nbsp;&lt;/a&gt;|&amp;nbsp;&lt;a title=&quot;可视化模式(Visual Mode)&quot; href=&quot;http://yyq123.github.io/learn-vim/learn-vi-45-VisualMode.html&quot;&gt;下一篇&lt;/a&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://yyq123.blogspot.com/feeds/3316540623124868882/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='http://yyq123.blogspot.com/2021/10/vim-select-mode.html#comment-form' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7045570/posts/default/3316540623124868882'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7045570/posts/default/3316540623124868882'/><link rel='alternate' type='text/html' href='http://yyq123.blogspot.com/2021/10/vim-select-mode.html' title='VIM学习笔记 选择模式 (Select Mode)'/><author><name>YYQ</name><uri>http://www.blogger.com/profile/00702527262114879030</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7045570.post-6834606754941136097</id><published>2021-10-22T12:56:00.003+08:00</published><updated>2021-10-22T12:56:37.151+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="[知]"/><category scheme="http://www.blogger.com/atom/ns#" term="OpenSource"/><category scheme="http://www.blogger.com/atom/ns#" term="Software"/><category scheme="http://www.blogger.com/atom/ns#" term="Vim"/><title type='text'>VIM学习笔记 脚本-字典-实例(Script-Dictionary-Example)</title><content type='html'>	&lt;p&gt;可以将&lt;a href=&quot;http://yyq123.github.io/learn-vim/learn-vim-Script-Dictionary.html&quot; title=&quot;字典(Script-Dictionary)&quot;&gt;字典（Dictionary)&lt;/a&gt;，理解为存储了关于键-值的成对的二元数组。以下将演示在脚本中利用字典数据结构的实例。&lt;/p&gt;

	&lt;h2 class=&quot;article&quot;&gt;&lt;a id=&quot;script-dictionary-example-sort&quot;&gt;删除重复行&lt;/a&gt;&lt;/h2&gt;
	&lt;p&gt;在&lt;a href=&quot;http://yyq123.github.io/learn-vim/learn-vim-sort.html&quot; title=&quot;文本排序(sort)&quot;&gt;文本排序(sort)&lt;/a&gt;章节中，使用以下Vim内置的排序命令，可以去除文件中的重复行，同时原始行的顺序也将随之改变。对于重复的多行，将仅仅保留第一行，而其它的行将被删除。&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;&lt;code&gt;:%sort u&lt;/code&gt;&lt;/pre&gt;

	&lt;h2 class=&quot;article&quot;&gt;&lt;a id=&quot;script-dictionary-example-sort-udf-create&quot;&gt;创建自定义函数&lt;/a&gt;&lt;/h2&gt;
	&lt;p&gt;以下将&lt;a href=&quot;http://yyq123.github.io/learn-vim/learn-vi-93-ScriptUDF.html&quot; title=&quot;Script-User Defined Function&quot;&gt;自定义&lt;/a&gt;Uniq()函数，利用字典数据结构来去除重复行，同时保留原始的行顺序。&lt;/p&gt;
	&lt;p style=&quot;color:gray; font-size:0.6em&quot;&gt;&lt;a href=&quot;https://yyq123.github.io/learn-vim/images/Script-UDF-Uniq.png&quot; title=&quot;Script-UDF-Uniq&quot;&gt;&lt;img src=&quot;https://yyq123.github.io/learn-vim/images/Script-UDF-Uniq.png&quot; alt=&quot;Script-UDF-Uniq&quot; width=&quot;550&quot; height=&quot;244&quot; /&gt;&lt;/a&gt;&lt;/br&gt;Source code: &lt;a href=&quot;https://yyq123.github.io/learn-vim/samples/Uniq.vim&quot; title=&quot;Uniq.vim&quot;&gt;Uniq.vim&lt;/a&gt;&lt;/p&gt;
	&lt;p&gt;首先，新建一个空字典&quot;have_already_seen&quot;用于遍历指定区域内的所有行；而不重复的行将被加入到字典&quot;unique_lines&quot;中。&lt;/p&gt;
	&lt;p&gt;因为字典结构不会存储键为空的项目，所以在循环语句中，将为每行内容新增前导字符&#39;&amp;gt;&#39;，以确保行不为空。&lt;/p&gt;
	&lt;p&gt;函数将检查行是否已经作为键存在于字典&quot;have_already_seen&quot;中。如果已经存在，就忽略此行；如果不存在，则被加入字典&quot;unique_lines&quot;中。最后，字典&quot;unique_lines&quot;将仅仅包含所有唯一的行，并以原始的顺序排列；而重复的行，则会被删除。&lt;/p&gt;

	&lt;h2 class=&quot;article&quot;&gt;&lt;a id=&quot;script-dictionary-example-sort-udf-call&quot;&gt;调用自定义函数&lt;/a&gt;&lt;/h2&gt;
	&lt;p&gt;将以上代码添加到vimrc配置文件之后，使用以下命令，可以针对整个文件执行函数：&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;&lt;code&gt;:%call Uniq()&lt;/code&gt;&lt;/pre&gt;
	&lt;p&gt;也可以创建快捷键，针对指定的行范围（如可视化模式下选中的行）执行函数：&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;&lt;code&gt;vmap u :call Uniq()&amp;lt;CR&amp;gt;&lt;/code&gt;&lt;/pre&gt;
	&lt;p&gt;&lt;a href=&quot;https://yyq123.github.io/learn-vim/images/Script-Dictionary-Example-sort.png&quot; title=&quot;Script-Dictionary-Example-sort&quot;&gt;&lt;img src=&quot;https://yyq123.github.io/learn-vim/images/Script-Dictionary-Example-sort.png&quot; alt=&quot;Script-UDF-Uniq&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

	&lt;p style=&quot;border-top:1px solid lightgray&quot;&gt;&lt;span style=&quot;float:right&quot;&gt;Ver: 2.0&amp;nbsp;|&amp;nbsp;&lt;a href=&quot;mailto:yyq123@gmail.com&quot;&gt;YYQ&lt;/a&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;a title=&quot;字典(Dictionary)&quot; href=&quot;http://yyq123.github.io/learn-vim/learn-vim-Script-Dictionary&quot;&gt;上一篇&lt;/a&gt;&amp;nbsp;|&lt;a title=&quot;笔记列表&quot; href=&quot;http://yyq123.github.com/learn-vim/learn-vi-00-00-TOC.html&quot;&gt;&amp;nbsp;目录&amp;nbsp;&lt;/a&gt;|&amp;nbsp;&lt;a title=&quot;自定义函数(UDF)&quot; href=&quot;http://yyq123.github.io/learn-vim/learn-vi-93-ScriptUDF.html&quot;&gt;下一篇&lt;/a&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
</content><link rel='replies' type='application/atom+xml' href='http://yyq123.blogspot.com/feeds/6834606754941136097/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='http://yyq123.blogspot.com/2021/10/vim-script-dictionary-example.html#comment-form' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7045570/posts/default/6834606754941136097'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7045570/posts/default/6834606754941136097'/><link rel='alternate' type='text/html' href='http://yyq123.blogspot.com/2021/10/vim-script-dictionary-example.html' title='VIM学习笔记 脚本-字典-实例(Script-Dictionary-Example)'/><author><name>YYQ</name><uri>http://www.blogger.com/profile/00702527262114879030</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7045570.post-7660995749041488331</id><published>2021-09-09T13:48:00.001+08:00</published><updated>2021-09-09T13:49:09.607+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="[知]"/><category scheme="http://www.blogger.com/atom/ns#" term="OpenSource"/><category scheme="http://www.blogger.com/atom/ns#" term="Software"/><category scheme="http://www.blogger.com/atom/ns#" term="Vim"/><title type='text'>VIM学习笔记 脚本-字典(Script-Dictionary)</title><content type='html'>	&lt;p&gt;可以将字典（Dictionary)，理解为存储了关于键-值的成对的二元数组。如果你知道了键，就能快速地查找它对应的值。&lt;/p&gt;

	&lt;h2 class=&quot;article&quot;&gt;&lt;a id=&quot;script-dictionary-create&quot;&gt;创建字典&lt;/a&gt;&lt;/h2&gt;
	&lt;p&gt;使用以花括号包含逗号分隔的键-值列表，来创建字典。每个项目包含以冒号分隔的键和值。&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;&lt;code&gt;let flavor = {
\ &#39;01&#39;: &#39;guava&#39;,
\ &#39;02&#39;: &#39;mangosteen&#39;,
\ &#39;03&#39;: &#39;mango&#39;,
\ &#39;04&#39;: &#39;banana&#39;,
\ &#39;05&#39;: &#39;coconut&#39;,
\ &#39;06&#39;: &#39;passionfruit&#39;,
\ &#39;07&#39;: &#39;watermelon&#39;,
\ &#39;08&#39;: &#39;papya&#39;
}

&quot;创建空字典
let emptydict = {}&lt;/code&gt;&lt;/pre&gt;

	&lt;h2 class=&quot;article&quot;&gt;&lt;a id=&quot;script-dictionary-access&quot;&gt;访问字典&lt;/a&gt;&lt;/h2&gt;
	&lt;p&gt;可以使用以方括号包围的索引编号，来访问字典的值；而更直观的方式，是使用键的名称：&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;&lt;code&gt;let Dx = flavor[&#39;09&#39;]&lt;/code&gt;&lt;/pre&gt;
	&lt;p&gt;如果键只包含字母、数字和下划线，那么可以使用以点标记的形式进行访问。这种类似&amp;ldquo;表名.列名&amp;rdquo;的书写形式，非常类似于数据库的记录格式，显得更简洁也更易读：&lt;/p&gt;
&lt;pre class=&quot;block&quot;&gt;&lt;code&gt;let user = {}
let user.name = &#39;Bram&#39;
let user.acct = 123007&lt;/code&gt;&lt;/pre&gt;
	&lt;p&gt;如果键不存在，那么将显示以下报错信息：&lt;/p&gt;
	&lt;p&gt;&lt;code class=&quot;error&quot;&gt;E716: Key not present in Dictionary: 09&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;使用get()函数来访问字典的值，第一个参数指定字典，第二个参数指定需要查找的键。如果该键存在，将返回对应的值，如果指定的键不存在，则返回0。如果指定了第三个参数，那么在指定的键不存在时，则返回此参数值。&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;&lt;code&gt;echo get(flavor, &#39;08&#39;)          &quot;papya
echo get(flavor, &#39;09&#39;)          &quot;0
echo get(flavor, &#39;09&#39;, &#39;None&#39;)  &quot;None&lt;/code&gt;&lt;/pre&gt;

	&lt;h2 class=&quot;article&quot;&gt;&lt;a id=&quot;script-dictionary-add&quot;&gt;新增项目&lt;/a&gt;&lt;/h2&gt;
	&lt;p&gt;使用以下命令为新的键赋值，即可为字典新增项目：&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;&lt;code&gt;let diagnosis = {&#39;1&#39;:&#39;item1&#39;}&lt;/code&gt;&lt;/pre&gt;
	&lt;p&gt;使用extend()函数，可以为字典新增多个项目：&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;&lt;code&gt;call extend(diagnosis, {&#39;2&#39;:&#39;item2&#39;, &#39;3&#39;:&#39;item3&#39;})
&quot; &#39;1&#39;: &#39;item1&#39;, &#39;2&#39;: &#39;item2&#39;, &#39;3&#39;: &#39;item3&#39;&lt;/code&gt;&lt;/pre&gt;
	&lt;p&gt;使用extend()函数，也可以合并两个字典：&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;&lt;code&gt;let new_diagnosis = {&#39;0&#39;:&#39;new&#39;}
call extend(diagnosis, new_diagnosis)
&quot; &#39;0&#39;: &#39;new&#39;, &#39;1&#39;: &#39;item1&#39;, &#39;2&#39;: &#39;item2&#39;, &#39;3&#39;: &#39;item3&#39;&lt;/code&gt;&lt;/pre&gt;
	
	&lt;h2 class=&quot;article&quot;&gt;&lt;a id=&quot;script-dictionary-remove&quot;&gt;删除项目&lt;/a&gt;&lt;/h2&gt;
	&lt;p&gt;使用remove()函数，可以删除字典中的项目：&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;&lt;code&gt;let removed_value = remove(flavor, &#39;09&#39;)&lt;/code&gt;&lt;/pre&gt;
	&lt;p&gt;当需要删除多个项目时，使用filter()函数将更加高效。 与&lt;a href=&quot;http://yyq123.github.io/learn-vim/learn-vim-Script-List.html#script-list-filter&quot; title=&quot;filter()&quot;&gt;过滤&lt;/a&gt;列表项目类似，您可以使用v:val和v:key进行操作：&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;&lt;code&gt;&quot; 删除所有以0开头键值的项目
call filter(flavor, &#39;v:key[0] != &quot;0&quot;&#39;) 
&quot; 删除所有不包含指定内容的项目
call filter(flavor, &#39;v:val =~ &quot;mango&quot;&#39;) 
&quot; 删除所有键与值相同的项目
call filter(diagnosis, &#39;v:key != v:val&#39;)&lt;/code&gt;&lt;/pre&gt;

	&lt;h2 class=&quot;article&quot;&gt;&lt;a id=&quot;script-dictionary-fun&quot;&gt;字典和列表&lt;/a&gt;&lt;/h2&gt;
	&lt;p&gt;使用以下命令，可以获取字典中的键列表，值列表，和键-值列表：&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;&lt;code&gt;let dict = {&#39;key1&#39;:&#39;value1&#39;, &#39;key2&#39;:&#39;value2&#39;, &#39;key3&#39;:&#39;value3&#39;}
let keylist = keys(dict)
&quot; [&#39;key1&#39;, &#39;key2&#39;, &#39;key3&#39;]
let valuelist =	values(dict)
&quot; [&#39;value1&#39;, &#39;value2&#39;, &#39;value3&#39;]
let pairlist = items(dict)
&quot; [[&#39;key1&#39;:&#39;value1&#39;], [&#39;key2&#39;:&#39;value2&#39;], [&#39;key3&#39;:&#39;value3&#39;]]
&lt;/code&gt;&lt;/pre&gt;
	&lt;p&gt;大多数关于列表的函数，同样也适用于字典：&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;&lt;code&gt;let is_empty =	empty(dict)           &quot; 测试字典是否为空
let entry_count = len(dict)           &quot; 返回字典中包含项目的总数量	
let occurrences = count(dict, str)    &quot; 返回字典中值为str的项目的数量
let greatest = max(dict)              &quot; 返回最大值
let least = min(dict)                 &quot; 返回最小值&lt;/code&gt;&lt;/pre&gt;
	&lt;p&gt;使用map()函数操作数据，可以将其中的字符串格式化为首字母大写：&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;&lt;code&gt;let names = {&#39;u1&#39;: &#39;TOM&#39;, &#39;u2&#39;: &#39;jerry&#39;, &#39;u3&#39;: &#39;alEX&#39;}
call map( names, &#39;toupper(v:val[0]) . tolower(v:val[1:])&#39; )
&quot; {&#39;u1&#39;: &#39;Tom&#39;, &#39;u2&#39;: &#39;Jerry&#39;, &#39;u3&#39;: &#39;ALex&#39;}&lt;/code&gt;&lt;/pre&gt;
	&lt;p&gt;关于相关函数的使用说明，请参阅&lt;a href=&quot;http://yyq123.github.io/learn-vim/learn-vim-Script-List.html&quot; title=&quot;列表(Script-List)&quot;&gt;列表(List)&lt;/a&gt;章节。&lt;/p&gt;

	&lt;h2 class=&quot;article&quot;&gt;&lt;a id=&quot;script-dictionary-help&quot;&gt;帮助信息&lt;/a&gt;&lt;/h2&gt;
	&lt;p&gt;&lt;span style=&quot;font-weight:bold; color:#4169E1; margin-left:0.2em&quot;&gt;&amp;#65311;&lt;/span&gt;使用以下命令，可以查看字典相关的帮助信息：&lt;/p&gt;
	&lt;p&gt;&lt;code class=&quot;inset&quot;&gt;:help Dictionary&lt;/code&gt;&lt;br /&gt;&lt;code class=&quot;inset&quot;&gt;:help Dictionary-function&lt;/code&gt;&lt;/p&gt;

	&lt;table summary=&quot;Commands&quot; border=&quot;2&quot; frame=&quot;hsides&quot; rules=&quot;all&quot; cellspacing=&quot;0&quot; cellpadding=&quot;3&quot;&gt;
		&lt;caption&gt;函数小结&lt;/caption&gt;
		&lt;tr&gt;&lt;td&gt;&lt;code class=&quot;inset&quot;&gt;len()&lt;/code&gt;&lt;/td&gt;&lt;td&gt;字典的项目总数&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;&lt;code class=&quot;inset&quot;&gt;empty()&lt;/code&gt;&lt;/td&gt;&lt;td&gt;检查字典是否为空&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;&lt;code class=&quot;inset&quot;&gt;remove()&lt;/code&gt;&lt;/td&gt;&lt;td&gt;删除字典里一或多个项目&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;&lt;code class=&quot;inset&quot;&gt;copy()&lt;/code&gt;&lt;/td&gt;&lt;td&gt;建立字典的浅备份&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;&lt;code class=&quot;inset&quot;&gt;deepcopy()&lt;/code&gt;&lt;/td&gt;&lt;td&gt;建立字典的完整备份&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;&lt;code class=&quot;inset&quot;&gt;filter()&lt;/code&gt;&lt;/td&gt;&lt;td&gt;过滤指定的字典项目&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;&lt;code class=&quot;inset&quot;&gt;map()&lt;/code&gt;&lt;/td&gt;&lt;td&gt;改变每个字典项目&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;&lt;code class=&quot;inset&quot;&gt;max()&lt;/code&gt;&lt;/td&gt;&lt;td&gt;字典项目的最大值&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;&lt;code class=&quot;inset&quot;&gt;min()&lt;/code&gt;&lt;/td&gt;&lt;td&gt;字典项目的最小值&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;&lt;code class=&quot;inset&quot;&gt;count()&lt;/code&gt;&lt;/td&gt;&lt;td&gt;计算字典里某值的出现次数&lt;/td&gt;&lt;/tr&gt;
	&lt;/table&gt;

	&lt;p style=&quot;border-top:1px solid lightgray&quot;&gt;&lt;span style=&quot;float:right&quot;&gt;Ver: 2.0&amp;nbsp;|&amp;nbsp;&lt;a href=&quot;mailto:yyq123@gmail.com&quot;&gt;YYQ&lt;/a&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;a title=&quot;列表(Script-List)&quot; href=&quot;http://yyq123.github.io/learn-vim/learn-vim-Script-List.html&quot;&gt;上一篇&lt;/a&gt;&amp;nbsp;|&lt;a title=&quot;笔记列表&quot; href=&quot;http://yyq123.github.com/learn-vim/learn-vi-00-00-TOC.html&quot;&gt;&amp;nbsp;目录&amp;nbsp;&lt;/a&gt;|&amp;nbsp;&lt;a title=&quot;自定义函数(UDF)&quot; href=&quot;http://yyq123.github.io/learn-vim/learn-vi-93-ScriptUDF.html&quot;&gt;下一篇&lt;/a&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://yyq123.blogspot.com/feeds/7660995749041488331/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='http://yyq123.blogspot.com/2021/09/vim-script-dictionary.html#comment-form' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7045570/posts/default/7660995749041488331'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7045570/posts/default/7660995749041488331'/><link rel='alternate' type='text/html' href='http://yyq123.blogspot.com/2021/09/vim-script-dictionary.html' title='VIM学习笔记 脚本-字典(Script-Dictionary)'/><author><name>YYQ</name><uri>http://www.blogger.com/profile/00702527262114879030</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7045570.post-2859135819427096141</id><published>2021-01-20T18:50:00.000+08:00</published><updated>2021-01-20T18:50:19.276+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="[知]"/><category scheme="http://www.blogger.com/atom/ns#" term="OpenSource"/><category scheme="http://www.blogger.com/atom/ns#" term="Software"/><category scheme="http://www.blogger.com/atom/ns#" term="Vim"/><title type='text'>VIM学习笔记 脚本-列表(Script-List)</title><content type='html'>	&lt;p&gt;列表（List），是一组由逗号分隔的项目的有序序列。它与其它编程语言中的数组（Array）概念非常相似。可以使用索引号来访问列表项目。也可以在序列的任何位置上增加或者删除项目。&lt;/p&gt;
	&lt;p&gt;请注意下文中引号后的文字为命令执行的结果，以演示各个函数的功能。&lt;/p&gt;

	&lt;h2 class=&quot;article&quot;&gt;&lt;a id=&quot;script-list-create&quot;&gt;创建列表&lt;/a&gt;&lt;/h2&gt;
	&lt;p&gt;可以将一组由逗号分隔的项目放置在方括号之内，以创建一个列表。列表中的项目索引从0开始。可以使用[&lt;var&gt;n&lt;/var&gt;]形式，来引用特定的列表项目。&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;&lt;code&gt;let data = [1,2,3,4,5,6,&quot;seven&quot;]
echo data[0]                            &quot; 1
let data[1] = 42                        &quot; [1,42,3,4,5,6,&quot;seven&quot;]
let data[2] += 99                       &quot; [1,42,102,4,5,6,&quot;seven&quot;]
let data[6] .= &#39; samurai&#39;               &quot; [1,42,102,4,5,6,&quot;seven samurai&quot;]&lt;/code&gt;&lt;/pre&gt;
	&lt;p&gt;使用[&lt;var&gt;m:n&lt;/var&gt;]形式，可以引用指定范围的列表项目。&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;&lt;code&gt;let data = [-1,0,1,2,3,4,5]
let positive = data[2:6]                 &quot; [1,2,3,4,5]&lt;/code&gt;&lt;/pre&gt;
	&lt;p&gt;如果忽略索引的起始位置，那么将默认从列表首个项目开始；如果忽略索引的结束位置，那么将默认至列表最后一个项目。&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;&lt;code&gt;let middle = len(data)/2                 &quot; middle = 3
let first_half = data[: middle-1]        &quot; data[0 : middle-1]
echo first_half                          &quot; [-1,0,1]
let second_half	= data[middle :]         &quot; data[middle : len(data)-1]
echo first_half                          &quot; [2,3,4,5]&lt;/code&gt;&lt;/pre&gt;
	&lt;p&gt;使用range()函数，可以生成一个整数值的列表。 range(max)将生成从0到max-1的列表；range(min, max)将生成包含min和max在内的连续值列表；range(min, max, step)将从min到max，按照step指定的步长来生成列表。&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;&lt;code&gt;let seq_of_ints = range(5)               &quot; [0,1,2,3,4]
let seq_of_ints = range(1,5)             &quot; [1,2,3,4,5]
let seq_of_ints = range(1,10,2)          &quot; [1,3,5,7,9]&lt;/code&gt;&lt;/pre&gt;

	&lt;h2 class=&quot;article&quot;&gt;&lt;a id=&quot;script-list-nested&quot;&gt;列表嵌套&lt;/a&gt;&lt;/h2&gt;
	&lt;p&gt;除了数值和字符串之外，列表中也可以包含嵌套的列表。&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;&lt;code&gt;let pow = [
\   [ 1, 0, 0, 0  ],
\   [ 1, 1, 1, 1  ],
\   [ 1, 3, 9, 27 ]
\]

echo pow[2][3]     &quot; 27

&quot; [2]，指第3个嵌套列表
&quot; [3]，指嵌套列表中的第4个项目 &lt;/code&gt;&lt;/pre&gt;

	&lt;h2 class=&quot;article&quot;&gt;&lt;a id=&quot;script-list-assign&quot;&gt;引用列表&lt;/a&gt;&lt;/h2&gt;
	&lt;p&gt;将变量赋值为列表时，实际上是将变量指向列表；如果再次将该变量赋给其它变量，那么这两个变量都将指向同一个列表。也就是说，对于实际列表值的变更，将同时影响所有指向它的变量。&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;&lt;code&gt;let old_suffixes = [&#39;.c&#39;, &#39;.h&#39;, &#39;.py&#39;]
let new_suffixes = old_suffixes
let new_suffixes[2] = &#39;.js&#39;
echo old_suffixes      &quot; [&#39;.c&#39;, &#39;.h&#39;, &#39;.js&#39;]
echo new_suffixes      &quot; [&#39;.c&#39;, &#39;.h&#39;, &#39;.js&#39;]&lt;/code&gt;&lt;/pre&gt;

	&lt;h2 class=&quot;article&quot;&gt;&lt;a id=&quot;script-list-copy&quot;&gt;复制列表&lt;/a&gt;&lt;/h2&gt;
	&lt;p&gt;使用copy()函数复制列表，就可以使用不同的变量，来保存不同状态下的列表值。&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;&lt;code&gt;let old_suffixes = [&#39;.c&#39;, &#39;.h&#39;, &#39;.py&#39;]
let new_suffixes = copy(old_suffixes)
let new_suffixes[2] = &#39;.js&#39;
echo old_suffixes      &quot; [&#39;.c&#39;, &#39;.h&#39;, &#39;.py&#39;]
echo new_suffixes      &quot; [&#39;.c&#39;, &#39;.h&#39;, &#39;.js&#39;]&lt;/code&gt;&lt;/pre&gt;
	&lt;p&gt;请注意，copy()函数只会复制最顶层的列表，即列表的浅备份。如果顶层列表包含嵌套列表，那么嵌套的子列表，将仅仅被作为指向实际子列表的指针被复制。也就是说，对于实际子列表的更改，将同时影响所有指向它的变量。&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;&lt;code&gt;let pedantic_pow = copy(pow)
echo pow               &quot; [[1, 0, 0, 0], [1, 1, 1, 1], [1, 3, 9, 27]]
echo pedantic_pow      &quot; [[1, 0, 0, 0], [1, 1, 1, 1], [1, 3, 9, 27]]

let pedantic_pow[0][0] = &#39;vague&#39;
echo pow               &quot; [[&#39;vague&#39;, 0, 0, 0], [1, 1, 1, 1], [1, 3, 9, 27]]
echo pedantic_pow      &quot; [[&#39;vague&#39;, 0, 0, 0], [1, 1, 1, 1], [1, 3, 9, 27]]

&quot; also changes pow[0][0] due to shared nested list&lt;/code&gt;&lt;/pre&gt;
	&lt;p&gt;使用deepcopy()函数，则可以复制顶层列表及其包含的嵌套列表，即列表的完整备份。&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;&lt;code&gt;let pedantic_pow = deepcopy(pow)
echo pow               &quot; [[1, 0, 0, 0], [1, 1, 1, 1], [1, 3, 9, 27]]
echo pedantic_pow      &quot; [[1, 0, 0, 0], [1, 1, 1, 1], [1, 3, 9, 27]]

let pedantic_pow[0][0] = &#39;vague&#39;
echo pow               &quot; [[1, 0, 0, 0], [1, 1, 1, 1], [1, 3, 9, 27]]
echo pedantic_pow      &quot; [[&#39;vague&#39;, 0, 0, 0], [1, 1, 1, 1], [1, 3, 9, 27]]

&quot; pow[0][0] now unaffected; no nested list is shared&lt;/code&gt;&lt;/pre&gt;

	&lt;h2 class=&quot;article&quot;&gt;&lt;a id=&quot;script-list-split&quot;&gt;拆分列表&lt;/a&gt;&lt;/h2&gt;
	&lt;p&gt;使用split()函数，可以将字符串拆分为列表：&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;&lt;code&gt;let words = split(&quot;one two three&quot;)          &quot; 以空格为分隔符
echo words                                  &quot; [&#39;one&#39;, &#39;two&#39;, &#39;three&#39;]

let words = split(&quot;one:two three&quot;, &quot;:&quot;)     &quot; 以指定字符为分隔符
echo words                                  &quot; [&#39;one&#39;, &#39;two three&#39;]&lt;/code&gt;&lt;/pre&gt;

	&lt;h2 class=&quot;article&quot;&gt;&lt;a id=&quot;script-list-join&quot;&gt;合并列表&lt;/a&gt;&lt;/h2&gt;
	&lt;p&gt;使用join()函数，可以将列表中的项目合并为字符串：&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;&lt;code&gt;let list = [&#39;one&#39;, &#39;two&#39;, &#39;three&#39;]
let str = join(list)                        &quot; 使用空格连结列表项目
echo str                                    &quot; one two three
let str = join(list, &#39;;&#39;)                   &quot; 使用指定字符连结列表项目
echo str                                    &quot; one;two;three&lt;/code&gt;&lt;/pre&gt;

	&lt;h2 class=&quot;article&quot;&gt;&lt;a id=&quot;script-list-len&quot;&gt;列表长度和位置&lt;/a&gt;&lt;/h2&gt;
	&lt;p&gt;使用以下函数，可以计算列表的长度，以及在列表中所处的位置：&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;&lt;code&gt;let list = [1, 2, 3]
let list_length   = len(list)             &quot; 列表的项目总数
echo list_length                          &quot; 3
let greatest_elem = max(list)             &quot; 列表项目的最大值
echo greatest_elem                        &quot; 3
let least_elem    = min(list)             &quot; 列表项目的最小值
echo least_elem                           &quot; 1
let list_is_empty = empty(list)           &quot; 将列表置为空
echo list_is_empty                        &quot; 0

let week = [&#39;Sun&#39;,&#39;Mon&#39;,&#39;Tue&#39;,&#39;Wed&#39;,&#39;Thu&#39;,&#39;Fri&#39;,&#39;Sat&#39;,&#39;Sun&#39;]
let value_found   = index(week, &#39;Sun&#39;)    &quot; 第一次出现指定值的索引位置
echo value_found                          &quot; 0
let value_found   = index(week, &#39;sun&#39;)    &quot; 如果没有找到匹配值(区分大小写)将返回-1
echo value_found                          &quot; -1
let value_count   = count(week, &#39;Sun&#39;)    &quot; 出现指定值的次数
echo value_count                          &quot; 2
&lt;/code&gt;&lt;/pre&gt;

	&lt;h2 class=&quot;article&quot;&gt;&lt;a id=&quot;script-list-insert&quot;&gt;增加列表项目&lt;/a&gt;&lt;/h2&gt;
	&lt;pre class=&quot;block&quot;&gt;&lt;code&gt;call insert(list, newval)          &quot; 在列表开头增加新项目
call insert(list, newval, idx)     &quot; 在列表指定位置之前增加新项目
call    add(list, newval)          &quot; 在列表末尾增加新项目&lt;/code&gt;&lt;/pre&gt;

	&lt;h2 class=&quot;article&quot;&gt;&lt;a id=&quot;script-list-remove&quot;&gt;删除列表项目&lt;/a&gt;&lt;/h2&gt;
	&lt;pre class=&quot;block&quot;&gt;&lt;code&gt;call remove(list, idx)             &quot; 删除指定位置的项目
call remove(list, from, to)        &quot; 删除指定范围的项目&lt;/code&gt;&lt;/pre&gt;

	&lt;h2 class=&quot;article&quot;&gt;&lt;a id=&quot;script-list-sort&quot;&gt;排序列表项目&lt;/a&gt;&lt;/h2&gt;
	&lt;pre class=&quot;block&quot;&gt;&lt;code&gt;let list = [3, 2, 1]
call sort(list)                   &quot; 为列表排序
echo list                         &quot; [1, 2, 3]
call reverse(list)                &quot; 反转列表项目的排序
call list                         &quot; [3, 2, 1]&lt;/code&gt;&lt;/pre&gt;

	&lt;h2 class=&quot;article&quot;&gt;&lt;a id=&quot;script-list-filter&quot;&gt;过滤列表项目&lt;/a&gt;&lt;/h2&gt;
	&lt;p&gt;使用filter({expr1}, {expr2})函数，可以对{expr1}指定的列表中的每个项目计算{expr2}表达式，以过滤掉符合指定模式的项目。&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;&lt;code&gt;let data = [-1,0,1,2,3,4,5]
let positive = filter(copy(data), &#39;v:val &amp;gt;= 0&#39;)       &quot; 过滤掉负数
echo positive                                         &quot; [0,1,2,3,4,5]

let words = [&#39;Linux&#39;, &#39;Unix&#39;, &#39;Mac&#39;]
let nnix = filter(copy(words), &#39;v:val !~ &quot;.*nix&quot;&#39;)    &quot; 过滤包含nix的字符串
echo nnix                                             &quot; [&#39;Linux&#39;, &#39;Mac&#39;]

call filter(words, 0)                                 &quot; 过滤掉所有项目
echo words                                            &quot; []&lt;/code&gt;&lt;/pre&gt;

	&lt;h2 class=&quot;article&quot;&gt;&lt;a id=&quot;script-list-map&quot;&gt;修改列表项目&lt;/a&gt;&lt;/h2&gt;
	&lt;p&gt;使用map({expr1}, {expr2})函数，可以将{expr1}指定的列表中的每个项目替换为{expr2}表达式的的计算结果。&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;&lt;code&gt;let data = [-1,0,1,2,3,4,5]
let inc = map(copy(data), &#39;v:val + 1&#39;)                &quot; 为每个成员+1
echo inc                                              &quot; [0,1,2,3,4,5,6]

let words = [&#39;Linux&#39;, &#39;Unix&#39;, &#39;Mac&#39;]
let cap = map(copy(words), &#39;toupper(v:val)&#39;)          &quot; 将每个成员转换为大写
echo cap                                              &quot; [&#39;LINUX&#39;, &#39;UNIX&#39;, &#39;MAC&#39;]&lt;/code&gt;&lt;/pre&gt;

	&lt;h2 class=&quot;article&quot;&gt;&lt;a id=&quot;script-list-concatenate&quot;&gt;连结列表&lt;/a&gt;&lt;/h2&gt;
	&lt;p&gt;使用&lt;code&gt;+&lt;/code&gt;和&lt;code&gt;+=&lt;/code&gt;操作符，可以连结多个列表。&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;&lt;code&gt;let activities = [&#39;sleep&#39;, &#39;eat&#39;] + [&#39;drink&#39;]         &quot; [&#39;sleep&#39;, &#39;eat&#39;, &#39;drink&#39;]
let activities += [&#39;code&#39;]                            &quot; [&#39;sleep&#39;, &#39;eat&#39;, &#39;drink&#39;, &#39;code&#39;]&lt;/code&gt;&lt;/pre&gt;
	&lt;p&gt;请注意，操作符两侧必须均为列表。如果将列表与其它类型的数据连结，将会报错：&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;&lt;code&gt;let activities += &#39;code&#39;                              &quot; E734: Wrong variable type for +=&lt;/code&gt;&lt;/pre&gt;

	&lt;h2 class=&quot;article&quot;&gt;&lt;a id=&quot;script-list-faq&quot;&gt;常见问题&lt;/a&gt;&lt;/h2&gt;
	&lt;p&gt;请注意，所有列表相关的函数都将修改后的列表作为返回结果，同时参数中的列表也将被修改。而通常，我们会希望返回修改后的列表，但保持原始列表不变。因此，建议使用&lt;a href=&quot;#script-list-copu&quot; title=&quot;copy()&quot;&gt;copy()&lt;/a&gt;函数来复制原始列表作为参数，以避免其被修改。&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;&lt;code&gt;let new_values = map(values, &#39;v:val * v:val&#39;)             &quot; values和new_values均被修改
let new_values = map(&lt;mark&gt;copy&lt;/mark&gt;(values), &#39;v:val * v:val&#39;)       &quot; values保持不变

let sorted_list = reverse(sort(unsorted_list))            &quot; unsorted_list和sorted_list均被修改
let sorted_list = reverse(sort(&lt;mark&gt;copy&lt;/mark&gt;(unsorted_list)))      &quot; unsorted_list保持不变&lt;/code&gt;&lt;/pre&gt;

	&lt;h2 class=&quot;article&quot;&gt;&lt;a id=&quot;script-list-help&quot;&gt;帮助信息&lt;/a&gt;&lt;/h2&gt;
	&lt;p&gt;&lt;span style=&quot;font-weight:bold; color:#4169E1; margin-left:0.2em&quot;&gt;&amp;#65311;&lt;/span&gt;使用以下命令，可以查看列表相关的帮助信息：&lt;/p&gt;
	&lt;p&gt;&lt;code class=&quot;inset&quot;&gt;:help list&lt;/code&gt;&lt;br /&gt;&lt;code class=&quot;inset&quot;&gt;:help list-functions&lt;/code&gt;&lt;/p&gt;

	&lt;table summary=&quot;Commands&quot; border=&quot;2&quot; frame=&quot;hsides&quot; rules=&quot;all&quot; cellspacing=&quot;0&quot; cellpadding=&quot;3&quot;&gt;
		&lt;caption&gt;函数小结&lt;/caption&gt;
		&lt;tr&gt;&lt;td&gt;&lt;code class=&quot;inset&quot;&gt;len()&lt;/code&gt;&lt;/td&gt;&lt;td&gt;列表的项目总数&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;&lt;code class=&quot;inset&quot;&gt;empty()&lt;/code&gt;&lt;/td&gt;&lt;td&gt;检查列表是否为空&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;&lt;code class=&quot;inset&quot;&gt;insert()&lt;/code&gt;&lt;/td&gt;&lt;td&gt;在列表某处插入项目&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;&lt;code class=&quot;inset&quot;&gt;add()&lt;/code&gt;&lt;/td&gt;&lt;td&gt;在列表后附加项目&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;&lt;code class=&quot;inset&quot;&gt;remove()&lt;/code&gt;&lt;/td&gt;&lt;td&gt;删除列表里一或多个项目&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;&lt;code class=&quot;inset&quot;&gt;copy()&lt;/code&gt;&lt;/td&gt;&lt;td&gt;建立列表的浅备份&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;&lt;code class=&quot;inset&quot;&gt;deepcopy()&lt;/code&gt;&lt;/td&gt;&lt;td&gt;建立列表的完整备份&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;&lt;code class=&quot;inset&quot;&gt;filter()&lt;/code&gt;&lt;/td&gt;&lt;td&gt;过滤指定的列表项目&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;&lt;code class=&quot;inset&quot;&gt;map()&lt;/code&gt;&lt;/td&gt;&lt;td&gt;改变每个列表项目&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;&lt;code class=&quot;inset&quot;&gt;sort()&lt;/code&gt;&lt;/td&gt;&lt;td&gt;为列表项目排序&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;&lt;code class=&quot;inset&quot;&gt;reverse()&lt;/code&gt;&lt;/td&gt;&lt;td&gt;反转列表项目的顺序&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;&lt;code class=&quot;inset&quot;&gt;split()&lt;/code&gt;&lt;/td&gt;&lt;td&gt;分割字符串成为列表&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;&lt;code class=&quot;inset&quot;&gt;join()&lt;/code&gt;&lt;/td&gt;&lt;td&gt;合并列表项目成为字符串&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;&lt;code class=&quot;inset&quot;&gt;range()&lt;/code&gt;&lt;/td&gt;&lt;td&gt;返回数值序列的列表&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;&lt;code class=&quot;inset&quot;&gt;index()&lt;/code&gt;&lt;/td&gt;&lt;td&gt;列表里某值的索引&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;&lt;code class=&quot;inset&quot;&gt;max()&lt;/code&gt;&lt;/td&gt;&lt;td&gt;列表项目的最大值&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;&lt;code class=&quot;inset&quot;&gt;min()&lt;/code&gt;&lt;/td&gt;&lt;td&gt;列表项目的最小值&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;&lt;code class=&quot;inset&quot;&gt;count()&lt;/code&gt;&lt;/td&gt;&lt;td&gt;计算列表里某值的出现次数&lt;/td&gt;&lt;/tr&gt;
	&lt;/table&gt;

	&lt;p style=&quot;border-top:1px solid lightgray&quot;&gt;&lt;span style=&quot;float:right&quot;&gt;Ver: 2.0&amp;nbsp;|&amp;nbsp;&lt;a href=&quot;mailto:yyq123@gmail.com&quot;&gt;YYQ&lt;/a&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;a title=&quot;变量和表达式&quot; href=&quot;http://yyq123.github.io/learn-vim/learn-vi-91-ScriptVar.html&quot;&gt;上一篇&lt;/a&gt;&amp;nbsp;|&lt;a title=&quot;笔记列表&quot; href=&quot;http://yyq123.github.com/learn-vim/learn-vi-00-00-TOC.html&quot;&gt;&amp;nbsp;目录&amp;nbsp;&lt;/a&gt;|&amp;nbsp;&lt;a title=&quot;语句(Statements)&quot; href=&quot;http://yyq123.github.io/learn-vim/learn-vi-92-ScriptStatement.html&quot;&gt;下一篇&lt;/a&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://yyq123.blogspot.com/feeds/2859135819427096141/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='http://yyq123.blogspot.com/2021/01/vim-script-list.html#comment-form' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7045570/posts/default/2859135819427096141'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7045570/posts/default/2859135819427096141'/><link rel='alternate' type='text/html' href='http://yyq123.blogspot.com/2021/01/vim-script-list.html' title='VIM学习笔记 脚本-列表(Script-List)'/><author><name>YYQ</name><uri>http://www.blogger.com/profile/00702527262114879030</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7045570.post-4810103507656203741</id><published>2021-01-14T20:54:00.000+08:00</published><updated>2021-01-14T20:54:40.876+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="[知]"/><category scheme="http://www.blogger.com/atom/ns#" term="OpenSource"/><category scheme="http://www.blogger.com/atom/ns#" term="Software"/><category scheme="http://www.blogger.com/atom/ns#" term="Vim"/><title type='text'>VIM学习笔记 通道（channel）</title><content type='html'>	&lt;p&gt;假设使用以下命令，连续开启两个异步&lt;a href=&quot;http://yyq123.github.io/learn-vim/learn-vim-job.html&quot; title=&quot;作业(job)&quot;&gt;作业&lt;/a&gt;：&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;&lt;code&gt;:call job_start(&#39;cd ~/.vim/&#39;)
:call job_start(&#39;ls&#39;)&lt;/code&gt;&lt;/pre&gt;
	&lt;p&gt;这些作业之间，将是相互独立的。也就是说，连续执行这两条命令，并不能进入指定目录并列示文件。第一条命令，开启一个后台作业并使用&#39;cd&#39;命令进入目录；第二条命令，开启另一个独立的后台作业并使用&#39;ls&#39;命令列示当前目录的文件。&lt;/p&gt;

	&lt;h2 class=&quot;article&quot;&gt;&lt;a id=&quot;channel-overview&quot;&gt;通道概念&lt;/a&gt;&lt;/h2&gt;
	&lt;p&gt;利用Vim内置终端功能，可以改变当前目录并列示文件：&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;&lt;code&gt;:terminal
$ cd ~/.vim
$ ls&lt;/code&gt;&lt;/pre&gt;
	&lt;p&gt;也就是说，terminal命令开启了一个异步作业（即shell进程），它持续等待用户的输入，并解释执行键入的shell命令。vim利用通道（channel）来与后台异步作业进行通讯。借由此机制，vim可以获取外部命令的输出和状态，并执行回调函数进行响应。而随着外部命令的结束，通道也会自动关闭。&lt;/p&gt;

	&lt;h2 class=&quot;article&quot;&gt;&lt;a id=&quot;ch_opn&quot;&gt;开启通道&lt;/a&gt;&lt;/h2&gt;
	&lt;p&gt;使用ch_open({address} [, {options}])函数，可以开启通道：&lt;/p&gt;
	&lt;p&gt;&lt;code class=&quot;inset&quot;&gt;:let channel = ch_open(&#39;localhost:8765&#39;, {&#39;callback&#39;: &quot;MyHandler&quot;})&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;在通道选项&lt;var&gt;{options}&lt;/var&gt;中，模式&quot;mode&quot;规定了通讯的消息格式（即传输和读写字符串的格式）。共支持四种模式：&lt;/p&gt;
	&lt;ul&gt;
		&lt;li&gt;&lt;var&gt;NL&lt;/var&gt;，利用换行符（newline）来分隔消息。使用job_start()函数启动的作业，默认使用此模式；&lt;/li&gt;
		&lt;li&gt;&lt;var&gt;JSON&lt;/var&gt;，&lt;a href=&quot;https://www.json.org/&quot; title=&quot;json&quot;&gt;json&lt;/a&gt;数据交换格式。使用ch_open()函数开启的通道，默认使用json模式；&lt;/li&gt;
		&lt;li&gt;&lt;var&gt;JS&lt;/var&gt;，JavaScript风格的信息格式，效率比json更高；&lt;/li&gt;
		&lt;li&gt;&lt;var&gt;RAW&lt;/var&gt;，原始格式，完全由用户在回调函数中进行处理。&lt;/li&gt;
	&lt;/ul&gt;
	&lt;p&gt;至于应该使用何种模式的通道，则取决于另一端程序所提供的服务。对于简单通讯可以使用 NL 模式，而复杂的服务则推荐 JSON 模式。&lt;/p&gt;
	&lt;p&gt;模式的选择，也将影响&quot;callback&quot;回调函数的定义。一般形式为：&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;&lt;code&gt;func MyHandler(channel, msg)
   echo &quot;from the handler: &quot; . a:msg
endfunc&lt;/code&gt;&lt;/pre&gt;
	&lt;ul&gt;
		&lt;li&gt;&lt;var&gt;channel&lt;/var&gt;参数，是通道ID，即ch_open()的返回值，代表某个特定的通道；&lt;/li&gt;
		&lt;li&gt;&lt;var&gt;msg&lt;/var&gt;参数，即消息内容。如果是JSON或JS模式，将会自动解码为VimL数据类型，比如嵌套的字典或列表结构等；如果是NL模式，则将其转换为去除换行符的字符串；如果是RAW模式，则保留原始信息，其中的换行符也需要用户在回调函数中自行处理。&lt;/li&gt;
	&lt;/ul&gt;

	&lt;h2 class=&quot;article&quot;&gt;&lt;a id=&quot;channel-communicate&quot;&gt;通道交互&lt;/a&gt;&lt;/h2&gt;
	&lt;p&gt;开启通道并与另一端的程序建立连接之后，vim可以向对方发送请求，并等待回应，以此来协同工作。&lt;/p&gt;
	&lt;p&gt;针对不同模式的通道，需要使用不同的方式来发送信息：&lt;/p&gt;
	&lt;table summary=&quot;Commands&quot; border=&quot;1&quot; frame=&quot;border&quot; rules=&quot;all&quot; cellspacing=&quot;0&quot; cellpadding=&quot;3&quot; style=&quot;font-size:0.9em&quot;&gt;
		&lt;thead&gt;
		&lt;tr&gt;&lt;th&gt;JSON / JS&lt;/th&gt;&lt;th&gt;NL / RAW&lt;/th&gt;&lt;th&gt;描述&lt;/th&gt;&lt;/tr&gt;
		&lt;/thead&gt;
		&lt;tbody&gt;
		&lt;tr&gt;&lt;td&gt;&lt;code&gt;call ch_sendexpr(channel,{expr})&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;call ch_sendraw(channel,{string})&lt;/code&gt;&lt;/td&gt;&lt;td&gt;异步发送消息&lt;br /&gt;不等待响应&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;&lt;code&gt;call ch_sendexpr(channel,{expr},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&#39;callback&#39;:MyHandler})&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;call ch_sendraw(channel,{string},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&#39;callback&#39;:&#39;MyHandler&#39;})&lt;/code&gt;&lt;/td&gt;&lt;td&gt;异步发送消息&lt;br /&gt;指定回调函数来响应&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;&lt;code&gt;let response =&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ch_evalexpr(channel,{expr})&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;let response =&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ch_evalraw(channel,{string})&lt;/code&gt;&lt;/td&gt;&lt;td&gt;同步发送消息&lt;br /&gt;并等待对方响应&lt;/td&gt;&lt;/tr&gt;
		&lt;/tbody&gt;
	&lt;/table&gt;
	&lt;ul&gt;
		&lt;li&gt;&lt;var&gt;channel&lt;/var&gt;参数，即用于识别通道的唯一编号；&lt;/li&gt;
		&lt;li&gt;&lt;var&gt;expr&lt;/var&gt;参数，指定将要发送的VimL数值或数据结构，并交由vim编码成json或js风格的字符串；&lt;/li&gt;
		&lt;li&gt;&lt;var&gt;string&lt;/var&gt;参数，必须是字符串，而不能是其他复杂的VimL数据结构。&lt;/li&gt;
	&lt;/ul&gt;
	&lt;p&gt;Vim实际发送的消息，为[{channel},{expr}]组成的一个二元列表；通道彼端接收消息并进行处理之后，也将由通道返回[{channel},{response}]组成的二元列表；在同一请求回应中，通道编号是相同的，据此将返回值分发到对应的回调函数。如果在发送消息时没有指定回调函数，那么将使用在ch_open()中指定的回调函数。&lt;/p&gt;
	&lt;p&gt;同步发送消息，存在阻塞的风险，但其优点是程序逻辑简单，不必使用回调函数。如果另一端的服务程序运行在本地机器，并且执行的操作耗时较短时，可以考虑使用同步消息方式。根据通道选项&quot;timeout&quot;键的默认设定，阻塞时间超过2000毫秒 (即2秒)时，Vim将自动终止操作。在超时或出错时，ch_evalexpr()函数将返回空字符串。&lt;/p&gt;
	&lt;p&gt;请注意，JSON和JS模式的通道也可以使用ch_sendraw()和ch_evalraw()函数，但是需要调用json_encode()和json_decode()函数来自行处理编码和解码。&lt;/p&gt;

	&lt;h2 class=&quot;article&quot;&gt;&lt;a id=&quot;channel-&quot;&gt;通道状态&lt;/a&gt;&lt;/h2&gt;
	&lt;p&gt;使用ch_status()函数，可以返回指定通道的状态：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:echo ch_status(channel)&lt;/code&gt;&lt;/p&gt;
	&lt;table summary=&quot;job_status&quot; border=&quot;1&quot; frame=&quot;border&quot; rules=&quot;all&quot; cellspacing=&quot;0&quot; cellpadding=&quot;6&quot;&gt;
		&lt;thead&gt;
		&lt;tr&gt;&lt;th style=&quot;white-space: nowrap&quot;&gt;状态&lt;/th&gt;&lt;th&gt;描述&lt;/th&gt;&lt;/tr&gt;
		&lt;/thead&gt;
		&lt;tbody&gt;
		&lt;tr&gt;&lt;td&gt;fail&lt;/td&gt;&lt;td&gt;通道打开失败&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;open&lt;/td&gt;&lt;td&gt;通道可用&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;buffered&lt;/td&gt;&lt;td&gt;通道已关闭，但还有待读的数据&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;closed&lt;/td&gt;&lt;td&gt;通道已关闭&lt;/td&gt;&lt;/tr&gt;
		&lt;/tbody&gt;
	&lt;/table&gt;
	&lt;p&gt;使用ch_info()函数，可以返回指定通道的详细信息：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:echo ch_info(channel)&lt;/code&gt;&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;{&#39;status&#39;: &#39;open&#39;, &#39;id&#39;: 1, &#39;port&#39;: 8765, &#39;hostname&#39;: &#39;localhost&#39;, &#39;sock_io&#39;: &#39;socket&#39;, &#39;sock_mode&#39;: &#39;JSON&#39;, &#39;sock_timeout&#39;: 2000, &#39;sock_status&#39;: &#39;open&#39;}&lt;/pre&gt;
	&lt;p&gt;函数将返回包含详细信息的字典：&lt;/p&gt;
	&lt;table summary=&quot;job_info&quot; border=&quot;1&quot; frame=&quot;border&quot; rules=&quot;all&quot; cellspacing=&quot;0&quot; cellpadding=&quot;6&quot;&gt;
		&lt;thead&gt;
		&lt;tr&gt;&lt;th style=&quot;white-space: nowrap&quot;&gt;键&lt;/th&gt;&lt;th&gt;描述&lt;/th&gt;&lt;/tr&gt;
		&lt;/thead&gt;
		&lt;tbody&gt;
		&lt;tr&gt;&lt;td&gt;status&lt;/td&gt;&lt;td&gt;ch_status()返回值&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;id&lt;/td&gt;&lt;td&gt;通道号&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;port&lt;/td&gt;&lt;td&gt;地址的端口号&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;hostname&lt;/td&gt;&lt;td&gt;地址的机器名&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;sock_io&lt;/td&gt;&lt;td&gt;&quot;socket&quot;&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;sock_mode&lt;/td&gt;&lt;td&gt;&quot;NL&quot;、&quot;RAW&quot;、&quot;JSON&quot; 或 &quot;JS&quot;&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;sock_timeout&lt;/td&gt;&lt;td&gt;以毫秒为单位的超时&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;sock_status&lt;/td&gt;&lt;td&gt;&quot;open&quot; 或 &quot;closed&quot;&lt;/td&gt;&lt;/tr&gt;
		&lt;/tbody&gt;
	&lt;/table&gt;&lt;br /&gt;
	&lt;h2 class=&quot;article&quot;&gt;&lt;a id=channel-close&quot;&gt;关闭通道&lt;/a&gt;&lt;/h2&gt;
	&lt;p&gt;使用ch_close()函数，可以关闭指定的通道：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:call ch_close(channel)&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;使用套接字（socket）时，将关闭双向的套接字；使用管道 (stdin/stdout/stderr)时，将关闭所有的管道。&lt;/p&gt;

	&lt;h2 class=&quot;article&quot;&gt;&lt;a id=channel-example&quot;&gt;通道实例&lt;/a&gt;&lt;/h2&gt;
	&lt;p&gt;在操作系统的终端中，运行Vim自带的 $VIMRUNTIME/tools/demoserver.py 演示程序，服务开始监听指定端口：&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;Server loop running in thread:  Thread-1
Listening on port 8765&lt;/pre&gt;
	&lt;p&gt;在Vim中开启通道，连接到演示服务器:&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:let channel = ch_open(&#39;localhost:8765&#39;)&lt;/code&gt;&lt;/p&gt;	
	&lt;p&gt;此时操作系统终端中，将显示通讯开放：&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;=== socket opened ===&lt;/pre&gt;
	&lt;p&gt;在Vim中使用以下命令，向通道彼端发送消息：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:call ch_sendexpr(channel, &#39;hello!&#39;)&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;因为没有指定回调函数，所以Vim不会显示任何回显；运行在外部终端的监听服务，将显示以下信息：&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;received: [1,&quot;hello!&quot;]
sending [1, &quot;got it&quot;]&lt;/pre&gt;
	&lt;p&gt;在Vim中使用以下命令，向通道彼端发送消息并指定上文中定义的回调函数：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:call ch_sendexpr(channel, &#39;hello!&#39;, {&#39;callback&#39;: &quot;MyHandler&quot;})&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;Vim将执行指定的回调函数，并显示以下信息：&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;from the handler: got it&lt;/pre&gt;
	&lt;p&gt;同时运行在外部终端的监听服务，将显示以下信息：&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;received: [2,&quot;hello!&quot;]
sending [2, &quot;got it&quot;]&lt;/pre&gt;
	&lt;p&gt;在操作系统终端中的服务程序内，输入以下命令向另一端的Vim发送消息：&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;[&quot;ex&quot;,&quot;echo &#39;hi there&#39;&quot;]&lt;/pre&gt;
	&lt;p&gt;在Vim屏幕底部，将显示以下消息：&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;hi there&lt;/pre&gt;
	&lt;p&gt;&lt;a href=&quot;https://yyq123.github.io/learn-vim/images/channel_demo.png&quot; title=&quot;channel_demo&quot;&gt;&lt;img src=&quot;https://yyq123.github.io/learn-vim/images/channel_demo.png&quot; alt=&quot;channel_demo&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

	&lt;p&gt;&lt;span style=&quot;font-weight:bold; color:#4169E1; margin-left:0.2em&quot;&gt;&amp;#65311;&lt;/span&gt;使用以下命令，可以查看关于通道的帮助信息：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:help channel&lt;/code&gt;&lt;/p&gt;

	&lt;table summary=&quot;Commands&quot; border=&quot;2&quot; frame=&quot;hsides&quot; rules=&quot;all&quot; cellspacing=&quot;0&quot; cellpadding=&quot;3&quot;&gt;
		&lt;caption&gt;命令小结&lt;/caption&gt;
		&lt;tbody&gt;
		&lt;tr&gt;&lt;td&gt;&lt;code class=&quot;inset&quot;&gt;ch_open()&lt;/code&gt;&lt;/td&gt;&lt;td&gt;打开通道&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;&lt;code class=&quot;inset&quot;&gt;ch_sendexpr()&lt;/code&gt;&lt;/td&gt;&lt;td rowspan=&quot;4&quot;&gt;发送消息&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;&lt;code class=&quot;inset&quot;&gt;ch_evalexpr()&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;&lt;code class=&quot;inset&quot;&gt;ch_sendraw()&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;&lt;code class=&quot;inset&quot;&gt;ch_evalraw()&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;&lt;code class=&quot;inset&quot;&gt;ch_status()&lt;/code&gt;&lt;/td&gt;&lt;td&gt;通道状态&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;&lt;code class=&quot;inset&quot;&gt;ch_info()&lt;/code&gt;&lt;/td&gt;&lt;td&gt;通道信息&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;&lt;code class=&quot;inset&quot;&gt;ch_close()&lt;/code&gt;&lt;/td&gt;&lt;td&gt;关闭通道&lt;/td&gt;&lt;/tr&gt;
		&lt;/tbody&gt;
	&lt;/table&gt;

	&lt;p style=&quot;border-top:1px solid lightgray&quot;&gt;&lt;span style=&quot;float:right&quot;&gt;Ver: 2.0&amp;nbsp;|&amp;nbsp;&lt;a href=&quot;mailto:yyq123@gmail.com&quot;&gt;YYQ&lt;/a&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;a title=&quot;作业(job)&quot; href=&quot;http://yyq123.github.io/learn-vim/learn-vim-job.html&quot;&gt;上一篇&lt;/a&gt;&amp;nbsp;|&lt;a title=&quot;笔记列表&quot; href=&quot;http://yyq123.github.com/learn-vim/learn-vi-00-00-TOC.html&quot;&gt;&amp;nbsp;目录&amp;nbsp;&lt;/a&gt;|&amp;nbsp;&lt;a title=&quot;定时器(timer)&quot; href=&quot;http://yyq123.github.io/learn-vim/learn-vim-timer.html&quot;&gt;下一篇&lt;/a&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://yyq123.blogspot.com/feeds/4810103507656203741/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='http://yyq123.blogspot.com/2021/01/vim-channel.html#comment-form' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7045570/posts/default/4810103507656203741'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7045570/posts/default/4810103507656203741'/><link rel='alternate' type='text/html' href='http://yyq123.blogspot.com/2021/01/vim-channel.html' title='VIM学习笔记 通道（channel）'/><author><name>YYQ</name><uri>http://www.blogger.com/profile/00702527262114879030</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7045570.post-8457412160364092308</id><published>2021-01-04T14:36:00.003+08:00</published><updated>2021-01-04T14:36:37.370+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="[知]"/><category scheme="http://www.blogger.com/atom/ns#" term="OpenSource"/><category scheme="http://www.blogger.com/atom/ns#" term="Software"/><category scheme="http://www.blogger.com/atom/ns#" term="Vim"/><title type='text'>VIM学习笔记 使用rot13加密</title><content type='html'>	&lt;h2 class=&quot;article&quot;&gt;&lt;a id=&quot;rot13_algorithm&quot;&gt;ROT13算法&lt;/a&gt;&lt;/h2&gt;
	&lt;p&gt;ROT13（回转13位，英语：rotate by 13 places，有时也记为ROT-13）是一种简易的替换式密码。ROT13是一种在英文网络论坛用作隐藏八卦（spoiler）、妙句、谜题解答以及某些脏话的工具，目的是逃过版主或管理员的匆匆一瞥。ROT13被描述成“杂志字谜上下颠倒解答的Usenet点对点体”。ROT13 也是过去在古罗马开发的凯撒加密的一种变体。ROT13是它自己本身的逆反；也就是说，要还原ROT13，套用加密同样的算法即可得，故同样的操作可用再加密与解密。该算法并没有提供真正的密码学上的保全，故它不应该被套用在需要保全的用途上。它常常被当作弱加密示例的典型。&lt;/p&gt;
	&lt;p style=&quot;color:gray; font-size:0.6em&quot;&gt;&lt;a href=&quot;https://zh.wikipedia.org/zh-cn/ROT13&quot; title=&quot;ROT13&quot;&gt;&lt;img src=&quot;http://yyq123.github.io/learn-vim/images/ROT13_table_with_example.png&quot; alt=&quot;ROT13_table_with_example&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Source: zh.wikipedia.org/zh-cn/ROT13&lt;/p&gt;

	&lt;h2 class=&quot;article&quot;&gt;&lt;a id=&quot;rot13_cmd&quot;&gt;g?命令&lt;/a&gt;&lt;/h2&gt;
	&lt;p&gt;使用 g?{motion} 命令，可以使用Rot13对{motion}跨越的文本进行编码。例如以下命令，将对当前行进行ROT13转换：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;g??&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;使用以下命令，将对从当前行到文件末尾的文本进行ROT13转换：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:normal VGg?&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;使用以下命令，将对从指定行到文件末尾的文本进行ROT13转换：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:normal 10GVGg?&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;假设需要针对以下id属性值进行ROT13转换：&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;&amp;lt;li id=&quot;&lt;strong style=&quot;color:#FFAF00;&quot;&gt;lorem&lt;/strong&gt;&quot;&amp;gt;foo&amp;lt;/li&amp;gt;&lt;/pre&gt;
	&lt;p&gt;那么可以在g?命令中指定&lt;a href=&quot;https://yyq123.github.io/learn-vim/learn-vi-10-TextObjects.html&quot; title=&quot;文本对象(Text Objects)&quot;&gt;文本对象&lt;/a&gt;：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;g?i&quot;&lt;/code&gt;&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;&amp;lt;li id=&quot;&lt;strong style=&quot;color:#FFAF00;&quot;&gt;yberz&lt;/strong&gt;&quot;&amp;gt;foo&amp;lt;/li&amp;gt;&lt;/pre&gt;

	&lt;p&gt;以下英文笑话，精华句为ROT13所隐匿：&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;How can you tell an extrovert from an
introvert at NSA? Va gur ryringbef,
gur rkgebireg ybbxf ng gur BGURE thl&#39;f fubrf.&lt;/pre&gt;
	&lt;p&gt;使用以下命令，透过ROT13表格转换整片文字，该笑话的解答揭露如下：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;ggVGg?&lt;/code&gt;&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;Ubj pna lbh gryy na rkgebireg sebz na
vagebireg ng AFN? In the elevators,
the extrovert looks at the OTHER guy&#39;s shoes.&lt;/pre&gt;
	&lt;p&gt;再次执行该命令，将重新对文本进行解密。以此类推，可以反复加密和解密整个文件。&lt;/p&gt;
	&lt;p&gt;定义以下快捷键，也可以对整个文件进行ROT13转换：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:map &amp;lt;F3&amp;gt; ggg?G&lt;/code&gt;&lt;/p&gt;

	&lt;p&gt;&lt;span style=&quot;font-weight:bold; color:#4169E1; margin-left:0.2em&quot;&gt;&amp;#65311;&lt;/span&gt;使用以下命令，可以查看相关帮助信息：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:help g?&lt;/code&gt;&lt;/p&gt;

	&lt;p style=&quot;border-top:1px solid lightgray&quot;&gt;&lt;span style=&quot;float:right&quot;&gt;Ver: 2.0&amp;nbsp;|&amp;nbsp;&lt;a href=&quot;mailto:yyq123@gmail.com&quot;&gt;YYQ&lt;/a&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;a title=&quot;加密(crypt)&quot; href=&quot;http://yyq123.github.io/learn-vim/learn-vi-27-crypt.html&quot;&gt;上一篇&lt;/a&gt;&amp;nbsp;|&lt;a title=&quot;笔记列表&quot; href=&quot;http://yyq123.github.com/learn-vim/learn-vi-00-00-TOC.html&quot;&gt;&amp;nbsp;目录&amp;nbsp;&lt;/a&gt;|&amp;nbsp;&lt;a title=&quot;过滤器(Filter)&quot; href=&quot;http://yyq123.github.io/learn-vim/learn-vim-Shell-Filter.html&quot;&gt;下一篇&lt;/a&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
</content><link rel='replies' type='application/atom+xml' href='http://yyq123.blogspot.com/feeds/8457412160364092308/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='http://yyq123.blogspot.com/2021/01/vim-rot13.html#comment-form' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7045570/posts/default/8457412160364092308'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7045570/posts/default/8457412160364092308'/><link rel='alternate' type='text/html' href='http://yyq123.blogspot.com/2021/01/vim-rot13.html' title='VIM学习笔记 使用rot13加密'/><author><name>YYQ</name><uri>http://www.blogger.com/profile/00702527262114879030</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7045570.post-1208003100149219269</id><published>2020-12-18T11:33:00.004+08:00</published><updated>2020-12-18T11:33:28.141+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="[见]"/><title type='text'>The Clothed/Naked Maja</title><content type='html'>&lt;p&gt;&amp;nbsp;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5HWi1-wwN_OmQKeWgZyMx-MIYBFFy8eZcz0gM0krVmSe-3l8WBsDtEhQ3a-smIyxwbDt_LgkaUcloq2qWg-gg5LOwnvFXQ_kkega_jwMva_ZutHK9VmveAD4BaiEOE5i8yMHAeQ/s2048/8E19BCA0-BF9E-4125-A94A-BE80D48FFFE3.jpeg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;2048&quot; data-original-width=&quot;2048&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5HWi1-wwN_OmQKeWgZyMx-MIYBFFy8eZcz0gM0krVmSe-3l8WBsDtEhQ3a-smIyxwbDt_LgkaUcloq2qWg-gg5LOwnvFXQ_kkega_jwMva_ZutHK9VmveAD4BaiEOE5i8yMHAeQ/w400-h400/8E19BCA0-BF9E-4125-A94A-BE80D48FFFE3.jpeg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;background-color: white; color: rgba(0, 0, 0, 0.87); font-family: arial, sans-serif-light, sans-serif; font-size: 19px; text-align: left;&quot;&gt;The Clothed/Naked Maja&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://yyq123.blogspot.com/feeds/1208003100149219269/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='http://yyq123.blogspot.com/2020/12/the-clothednaked-maja.html#comment-form' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7045570/posts/default/1208003100149219269'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7045570/posts/default/1208003100149219269'/><link rel='alternate' type='text/html' href='http://yyq123.blogspot.com/2020/12/the-clothednaked-maja.html' title='The Clothed/Naked Maja'/><author><name>YYQ</name><uri>http://www.blogger.com/profile/00702527262114879030</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5HWi1-wwN_OmQKeWgZyMx-MIYBFFy8eZcz0gM0krVmSe-3l8WBsDtEhQ3a-smIyxwbDt_LgkaUcloq2qWg-gg5LOwnvFXQ_kkega_jwMva_ZutHK9VmveAD4BaiEOE5i8yMHAeQ/s72-w400-h400-c/8E19BCA0-BF9E-4125-A94A-BE80D48FFFE3.jpeg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7045570.post-3285373449818657092</id><published>2020-12-17T22:25:00.002+08:00</published><updated>2020-12-18T11:28:23.353+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="[见]"/><title type='text'>安全奶 VB 52</title><content type='html'>&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFoH1HJes_EQmdvYQvuI80DdUq26cpligWu91tmPmxvmqsj_ok0UzhWMpiV7vr0g6G1vgvnXQCpXllvhgrXkzMFAe5TKurJTZsJbn1uWbS8YFE7lFfMFP4llX1aDrq4Znn8rswwA/s2048/CAE78D09-9A48-48FB-9911-44DF528F7DBD.jpeg&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;2048&quot; data-original-width=&quot;2048&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFoH1HJes_EQmdvYQvuI80DdUq26cpligWu91tmPmxvmqsj_ok0UzhWMpiV7vr0g6G1vgvnXQCpXllvhgrXkzMFAe5TKurJTZsJbn1uWbS8YFE7lFfMFP4llX1aDrq4Znn8rswwA/w400-h400/CAE78D09-9A48-48FB-9911-44DF528F7DBD.jpeg&quot; title=&quot;上：王庆松 - 安全奶 下：Vanessa Beecroft - VB 52&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://yyq123.blogspot.com/feeds/3285373449818657092/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='http://yyq123.blogspot.com/2020/12/vb-52.html#comment-form' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7045570/posts/default/3285373449818657092'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7045570/posts/default/3285373449818657092'/><link rel='alternate' type='text/html' href='http://yyq123.blogspot.com/2020/12/vb-52.html' title='安全奶 VB 52'/><author><name>YYQ</name><uri>http://www.blogger.com/profile/00702527262114879030</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFoH1HJes_EQmdvYQvuI80DdUq26cpligWu91tmPmxvmqsj_ok0UzhWMpiV7vr0g6G1vgvnXQCpXllvhgrXkzMFAe5TKurJTZsJbn1uWbS8YFE7lFfMFP4llX1aDrq4Znn8rswwA/s72-w400-h400-c/CAE78D09-9A48-48FB-9911-44DF528F7DBD.jpeg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7045570.post-9067188835992773212</id><published>2020-11-30T19:51:00.001+08:00</published><updated>2020-11-30T19:51:46.592+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="[知]"/><category scheme="http://www.blogger.com/atom/ns#" term="OpenSource"/><category scheme="http://www.blogger.com/atom/ns#" term="Software"/><category scheme="http://www.blogger.com/atom/ns#" term="Vim"/><title type='text'>VIM学习笔记 定时器(timer)</title><content type='html'>	&lt;p&gt;自8.0版本起，包含+timers特性的Vim提供了定时器功能。利用定时器，可以在指定延时之后触发指定操作，也可以按照固定的时间间隔来重复执行任务。&lt;/p&gt;
	
	&lt;h2 class=&quot;article&quot;&gt;&lt;a id=&quot;timer-start&quot;&gt;启动定时器&lt;/a&gt;&lt;/h2&gt;
	&lt;p&gt;使用timer_start()函数，可以启动定时器并返回定时器ID：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;timer_start({time}, {callback} [, {options}])&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;其中：&lt;/p&gt;
	&lt;ul&gt;
		&lt;li&gt;&lt;var&gt;time&lt;/var&gt;，指定时间间隔，单位为毫秒（milliseconds）；&lt;/li&gt;
		&lt;li&gt;&lt;var&gt;callback&lt;/var&gt;，指定需要触发的回调函数；&lt;/li&gt;
		&lt;li&gt;&lt;var&gt;options&lt;/var&gt;，是包含多个键值的字典选项，用于配置和控制定时器的行为&lt;/li&gt;
	&lt;/ul&gt;

	&lt;h2 class=&quot;article&quot;&gt;&lt;a id=&quot;timer-options&quot;&gt;定时器选项&lt;/a&gt;&lt;/h2&gt;
	&lt;p&gt;使用&quot;repeat&quot;选项，可以控制执行回调函数的次数。缺省为执行&quot;1&quot;次。如果希望无限循环执行，那么可以将此值设置为&quot;-1&quot;。&lt;/p&gt;
	&lt;p&gt;使用以下命令，设置在&lt;a href=&quot;http://yyq123.blogspot.com/2009/10/vim-statusline.html&quot; title=&quot;&quot;&gt;状态行&lt;/a&gt;中显示时间：&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;&lt;code&gt;set laststatus=2
if has(&quot;win32&quot;)
    set statusline=%{strftime(\&quot;%I:%M:%S\ \%p,\ %a\ %b\ %d,\ %Y\&quot;)}
else
    set statusline=%{strftime(\&quot;%l:%M:%S\ \%p,\ %a\ %b\ %d,\ %Y\&quot;)}
endif&lt;/code&gt;&lt;/pre&gt;
	&lt;p&gt;自定义以下函数，用于更新状态行：&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;&lt;code&gt;function! UpdateStatusBar(timer)
    execute &#39;let &amp;amp;ro = &amp;amp;ro&#39;
endfunction&lt;/code&gt;&lt;/pre&gt;
	&lt;p&gt;使用以下命令启动定时器，回调函数将持续更新状态行的时间显示：&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;&lt;code&gt;:let timer = timer_start(3000, &#39;UpdateStatusBar&#39;,{&#39;repeat&#39;:-1})&lt;/code&gt;&lt;/pre&gt;

	&lt;h2 class=&quot;article&quot;&gt;&lt;a id=&quot;timer-info&quot;&gt;定时器信息&lt;/a&gt;&lt;/h2&gt;
	&lt;p&gt;使用不带参数的timer_info()函数，可以获取所有定时器的信息：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:echo timer_info()&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;&lt;a href=&quot;https://yyq123.github.io/learn-vim/images/timer_info_all.png&quot; title=&quot;timer_info_all&quot;&gt;&lt;img src=&quot;https://yyq123.github.io/learn-vim/images/timer_info_all.png&quot; alt=&quot;timer_info_all&quot; width=&quot;550&quot; height=&quot;51&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
	&lt;p&gt;使用带有ID参数的timer_info()函数，可以获取指定定时器的信息：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:echo timer_info(timer)&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;函数返回包含详细信息的字典：&lt;/p&gt;
	&lt;table summary=&quot;job_info&quot; border=&quot;1&quot; frame=&quot;border&quot; rules=&quot;all&quot; cellspacing=&quot;0&quot; cellpadding=&quot;6&quot;&gt;
		&lt;thead&gt;
		&lt;tr&gt;&lt;th style=&quot;white-space: nowrap&quot;&gt;项目&lt;/th&gt;&lt;th&gt;描述&lt;/th&gt;&lt;/tr&gt;
		&lt;/thead&gt;
		&lt;tbody&gt;
		&lt;tr&gt;&lt;td&gt;id&lt;/td&gt;&lt;td&gt;该定时器的 ID&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;repeat&lt;/td&gt;&lt;td&gt;定时器还需要重复执行的次数，无限执行则返回 -1&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;remaining&lt;/td&gt;&lt;td&gt;距定时器启动还剩余的毫秒数&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;time&lt;/td&gt;&lt;td&gt;计时器时间间隔（毫秒数）&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;paused&lt;/td&gt;&lt;td&gt;暂停状态时返回 1，否则返回 0&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;callback&lt;/td&gt;&lt;td&gt;回调函数&lt;/td&gt;&lt;/tr&gt;
		&lt;/tbody&gt;
	&lt;/table&gt;&lt;br /&gt;

	&lt;h2 class=&quot;article&quot;&gt;&lt;a id=&quot;timer-pause&quot;&gt;暂停定时器&lt;/a&gt;&lt;/h2&gt;
	&lt;p&gt;使用timer_pause()函数，并指定第二个参数为非0数值或非空字符串，可以暂停定时器：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:call timer_pause(timer,1)&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;使用timer_pause()函数，并指定第二个参数为数值0或空字符串，可以对定时器取消暂停：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:call timer_pause(timer,0)&lt;/code&gt;&lt;/p&gt;

	&lt;h2 class=&quot;article&quot;&gt;&lt;a id=timer-stop&quot;&gt;取消定时器&lt;/a&gt;&lt;/h2&gt;
	&lt;p&gt;假设启动以下定时器，将在指定延时之后强制退出Vim：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:let timer_id = timer_start(10000, {id -&amp;gt; execute(&#39;quit!&#39;)})&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;使用timer_stop()函数，可以取消指定定时器：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:call timer_stop(timer_id)&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;使用timer_stopall()函数，可以取消所有定时器：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:call timer_stopall()&lt;/code&gt;&lt;/p&gt;

	&lt;h2 class=&quot;article&quot;&gt;&lt;a id=timer-example&quot;&gt;定时器实例&lt;/a&gt;&lt;/h2&gt;
	&lt;p&gt;假设当前脚本文件中包含以下代码：&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;&lt;code&gt;let s:timeouts = [5000, 10000, 30000, 1000, 1000, 3200, 500, 700]

function! s:noop(timer_id)
    let s:timeouts = insert(s:timeouts, remove(s:timeouts, len(s:timeouts) - 1))
    normal dd
   call timer_start(s:timeouts[0], function(&#39;&amp;lt;SID&amp;gt;noop&#39;))
endfunction

call s:noop(0)
&lt;/code&gt;&lt;/pre&gt;
	&lt;p&gt;使用以下命令执行当前脚本，将从当前行开始，按照设定的时间间隔逐行删除文本：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:so %&lt;/code&gt;&lt;/p&gt;

	&lt;p&gt;&lt;span style=&quot;font-weight:bold; color:#4169E1; margin-left:0.2em&quot;&gt;&amp;#65311;&lt;/span&gt;使用以下命令，可以查看关于定时器的帮助信息：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:help timer&lt;/code&gt;&lt;/p&gt;

	&lt;table summary=&quot;Commands&quot; border=&quot;2&quot; frame=&quot;hsides&quot; rules=&quot;all&quot; cellspacing=&quot;0&quot; cellpadding=&quot;3&quot;&gt;
		&lt;caption&gt;函数小结&lt;/caption&gt;
		&lt;tbody&gt;
		&lt;tr&gt;&lt;td&gt;&lt;code class=&quot;inset&quot;&gt;timer_start()&lt;/code&gt;&lt;/td&gt;&lt;td&gt;新建定时器&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;&lt;code class=&quot;inset&quot;&gt;timer_info()&lt;/code&gt;&lt;/td&gt;&lt;td&gt;定时器信息&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;&lt;code class=&quot;inset&quot;&gt;timer_pause()&lt;/code&gt;&lt;/td&gt;&lt;td&gt;暂停或继续定时器&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;&lt;code class=&quot;inset&quot;&gt;timer_stop()&lt;/code&gt;&lt;/td&gt;&lt;td&gt;停止定时器&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;&lt;code class=&quot;inset&quot;&gt;timer_stopall()&lt;/code&gt;&lt;/td&gt;&lt;td&gt;停止所有定时器&lt;/td&gt;&lt;/tr&gt;
		&lt;/tbody&gt;
	&lt;/table&gt;

	&lt;p style=&quot;border-top:1px solid lightgray&quot;&gt;&lt;span style=&quot;float:right&quot;&gt;Ver: 2.0&amp;nbsp;|&amp;nbsp;&lt;a href=&quot;mailto:yyq123@gmail.com&quot;&gt;YYQ&lt;/a&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;a title=&quot;作业(job)&quot; href=&quot;http://yyq123.github.io/learn-vim/learn-vim-job.html&quot;&gt;上一篇&lt;/a&gt;&amp;nbsp;|&lt;a title=&quot;笔记列表&quot; href=&quot;http://yyq123.github.com/learn-vim/learn-vi-00-00-TOC.html&quot;&gt;&amp;nbsp;目录&amp;nbsp;&lt;/a&gt;|&amp;nbsp;&lt;a title=&quot;通道(channel)&quot; href=&quot;http://yyq123.github.io/learn-vim/learn-vim-channel.html&quot;&gt;下一篇&lt;/a&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://yyq123.blogspot.com/feeds/9067188835992773212/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='http://yyq123.blogspot.com/2020/11/vim-timer.html#comment-form' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7045570/posts/default/9067188835992773212'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7045570/posts/default/9067188835992773212'/><link rel='alternate' type='text/html' href='http://yyq123.blogspot.com/2020/11/vim-timer.html' title='VIM学习笔记 定时器(timer)'/><author><name>YYQ</name><uri>http://www.blogger.com/profile/00702527262114879030</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7045570.post-1339180006324699537</id><published>2020-11-23T19:08:00.004+08:00</published><updated>2020-11-23T19:08:45.984+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="[知]"/><category scheme="http://www.blogger.com/atom/ns#" term="OpenSource"/><category scheme="http://www.blogger.com/atom/ns#" term="Software"/><category scheme="http://www.blogger.com/atom/ns#" term="Vim"/><title type='text'>VIM学习笔记 作业(job)</title><content type='html'>	&lt;p&gt;在传统的单线程模式下，运行外部命令时，将中断用户当前的编辑操作，并等待命令完成才可以返回vim。&lt;/p&gt;
	&lt;p&gt;自8.0版本起，包含+channel和+job特性的Vim将可以支持异步操作。Vim使用作业（job）来启动进程，并利用通道（channel）和其他进程通信。&lt;/p&gt;
	&lt;p&gt;利用异步支持，可以在后台进行复杂耗时的操作（比如使用外部&lt;a href=&quot;http://yyq123.github.io/learn-vim/learn-vim-Regex.html&quot; title=&quot;&quot;&gt;grep&lt;/a&gt;工具查找文本），不必等待外部命令结束即可返回Vim，而不中断前台的正常编辑。在外部命令结束运行时，可以通过回调函数来处理输出结果。&lt;/p&gt;
	&lt;p&gt;&lt;a href=&quot;https://yyq123.github.io/learn-vim/images/job_start_version.png&quot; title=&quot;job_start_version&quot;&gt;&lt;img src=&quot;https://yyq123.github.io/learn-vim/images/job_start_version.png&quot; alt=&quot;job_start_version&quot; width=&quot;550&quot; height=&quot;272&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

	&lt;p&gt;例如使用&lt;code&gt;:!ls&lt;/code&gt;外部命令，将在屏幕底部列示目录内容，并等待用户按回车键以返回常规模式，此时用户无法进行其它操作：&lt;/p&gt;
	&lt;p&gt;&lt;a href=&quot;https://yyq123.github.io/learn-vim/images/shell_cmd_ls.png&quot; title=&quot;shell_cmd_ls&quot;&gt;&lt;img src=&quot;https://yyq123.github.io/learn-vim/images/shell_cmd_ls.png&quot; alt=&quot;shell_cmd_ls&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

	&lt;h2 class=&quot;article&quot;&gt;&lt;a id=&quot;job-start&quot;&gt;启动作业&lt;/a&gt;&lt;/h2&gt;
	&lt;p&gt;使用job_start()函数，可以异步执行命令，其格式为：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;job_start({command} [, {options}])&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;其中：&lt;var&gt;command&lt;/var&gt;，用于指定需要运行的外部系统命令；&lt;var&gt;options&lt;/var&gt;，是包含多个键值的字典选项，用于配置和控制作业的行为。&lt;/p&gt;
	&lt;p&gt;使用以下命令，可以启动作业以执行外部命令，并立刻返回常规模式，不影响用户的后续操作：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:call job_start(&#39;ls&#39;)&lt;/code&gt;&lt;/p&gt;

	&lt;h2 class=&quot;article&quot;&gt;&lt;a id=&quot;job-options&quot;&gt;作业选项&lt;/a&gt;&lt;/h2&gt;
	&lt;p&gt;作业采用管道（pipe）将外部命令与vim联接起来，并与标准输入（stdin）、标准输出（stdout）和标准错误（stderr）输出进行交互。&lt;/p&gt;
	&lt;p&gt;在使用job_start()函数启动作业时，可以注册一个或多个回调函数来处理特定的信息。如果希望静默执行命令，而不关心输出信息，那么也可以不注册任何回调函数。&lt;/p&gt;
	&lt;p&gt;使用&quot;callback&quot;选项，可以同时捕获标准输出与标准错误输出；也可以分别使用&quot;out_cb&quot;或&quot;err_cb&quot;选项，来单独捕获标准输出或标准错误输出。&lt;/p&gt;
	&lt;p&gt;首先定义用于捕获输出的回调函数：&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;&lt;code&gt;func! MyHandler (channel, msg)
    echomsg a:msg
endfunc&lt;/code&gt;&lt;/pre&gt;
	&lt;p&gt;通过&quot;callback&quot;选项，指定回调函数来处理stdout和stderr的内容：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code&gt;let job = job_start (&#39;ls&#39;, {&quot;callback&quot;: &quot;MyHandler&quot;})&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;通过&quot;out_cb&quot;选项，指定回调函数来处理stdout的内容：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code&gt;let job = job_start (&#39;ls&#39;, {&quot;out_cb&quot;: &quot;MyHandler&quot;})&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;通过&quot;err_cb&quot;选项，指定回调函数来处理stderr的内容：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code&gt;let job = job_start (&#39;ls&#39;, {&quot;err_cb&quot;: &quot;ErrHandler&quot;})&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;在以上回调函数中使用了&lt;code&gt;:echomsg&lt;/code&gt;命令，因此随后可以使用&lt;code&gt;:message&lt;/code&gt;命令来查看&lt;a href=&quot;http://yyq123.github.io/learn-vim/learn-vim-message.html&quot; title=&quot;信息(message)&quot;&gt;信息历史&lt;/a&gt;，以确认命令执行结果：&lt;/p&gt;
	&lt;p&gt;&lt;a href=&quot;https://yyq123.github.io/learn-vim/images/job_start_ls_messages.png&quot; title=&quot;job_start_ls_messages&quot;&gt;&lt;img src=&quot;https://yyq123.github.io/learn-vim/images/job_start_ls_messages.png&quot; alt=&quot;job_start_ls_messages&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

	&lt;p&gt;使用&quot;in_io&quot;、&quot;out_io&quot;或&quot;err_io&quot;选项，可以将作业管道重定向到文件或缓冲区。&lt;/p&gt;
	&lt;p&gt;使用以下命令，可以将标准输出重定向至指定缓冲区：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:let job = job_start(&#39;ls&#39;, {&#39;out_io&#39;: &#39;buffer&#39;, &#39;out_name&#39;: &#39;mybuffer&#39;})&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;使用以下命令，则可以打开缓冲区查看输出信息：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:sbuf mybuffer&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;请注意，首行包含了&amp;ldquo;Reading from channel output...&amp;rdquo;的说明文字：&lt;/p&gt;
	&lt;p&gt;&lt;a href=&quot;https://yyq123.github.io/learn-vim/images/job_start_ls_out_io.png&quot; title=&quot;job_start_ls_out_io&quot;&gt;&lt;img src=&quot;https://yyq123.github.io/learn-vim/images/job_start_ls_out_io.png&quot; alt=&quot;job_start_ls_out_io&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
	&lt;p&gt;使用以下任一命令，均可以将标准输出重定向至指定文件：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:let job = job_start(&#39;ls -al&#39;, {&#39;out_io&#39;: &#39;file&#39;, &#39;out_name&#39;: &#39;/tmp/file.txt&#39;})&lt;/code&gt;&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:call job_start([&quot;/bin/sh&quot;, &quot;-c&quot;, &quot;ls -al &amp;gt; /tmp/file.txt&quot;])&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;&lt;span style=&quot;font-weight:bold; color:#4169E1; margin-left:0.2em&quot;&gt;&amp;#65311;&lt;/span&gt;使用以下命令，可以查看作业选项的帮助信息：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:help job-options&lt;/code&gt;&lt;/p&gt;

	&lt;h2 class=&quot;article&quot;&gt;&lt;a id=job-status&quot;&gt;作业状态&lt;/a&gt;&lt;/h2&gt;
	&lt;p&gt;使用job_status()函数，可以返回指定作业的状态：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:echo job_status(job)&lt;/code&gt;&lt;/p&gt;
	&lt;table summary=&quot;job_status&quot; border=&quot;1&quot; frame=&quot;border&quot; rules=&quot;all&quot; cellspacing=&quot;0&quot; cellpadding=&quot;6&quot;&gt;
		&lt;thead&gt;
		&lt;tr&gt;&lt;th style=&quot;white-space: nowrap&quot;&gt;状态&lt;/th&gt;&lt;th&gt;描述&lt;/th&gt;&lt;/tr&gt;
		&lt;/thead&gt;
		&lt;tbody&gt;
		&lt;tr&gt;&lt;td&gt;run&lt;/td&gt;&lt;td&gt;作业运行中&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;fail&lt;/td&gt;&lt;td&gt;作业无法启动&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;dead&lt;/td&gt;&lt;td&gt;作业启动后结束或被终止&lt;/td&gt;&lt;/tr&gt;
		&lt;/tbody&gt;
	&lt;/table&gt;
	&lt;p&gt;使用job_info()函数，则可返回指定作业的详细信息：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:echo job_info(job)&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;&lt;a href=&quot;https://yyq123.github.io/learn-vim/images/job_info.png&quot; title=&quot;job_info&quot;&gt;&lt;img src=&quot;https://yyq123.github.io/learn-vim/images/job_info.png&quot; alt=&quot;job_info&quot; width=&quot;550&quot; height=&quot;35&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
	&lt;p&gt;函数将返回包含详细信息的字典：&lt;/p&gt;
	&lt;table summary=&quot;job_info&quot; border=&quot;1&quot; frame=&quot;border&quot; rules=&quot;all&quot; cellspacing=&quot;0&quot; cellpadding=&quot;6&quot;&gt;
		&lt;thead&gt;
		&lt;tr&gt;&lt;th style=&quot;white-space: nowrap&quot;&gt;键&lt;/th&gt;&lt;th&gt;描述&lt;/th&gt;&lt;/tr&gt;
		&lt;/thead&gt;
		&lt;tbody&gt;
		&lt;tr&gt;&lt;td&gt;status&lt;/td&gt;&lt;td&gt;job_status()返回值&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;cmd&lt;/td&gt;&lt;td&gt;启动作业的命令行参数列表&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;stoponexit&lt;/td&gt;&lt;td&gt;Vim结束时给作业发信号（缺省是 &quot;term&quot;）&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;channel&lt;/td&gt;&lt;td&gt;job_getchannel()返回值&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;process&lt;/td&gt;&lt;td&gt;进程ID&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;tty_in&lt;/td&gt;&lt;td&gt;终端输入名，如果没有则为空&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;tty_out&lt;/td&gt;&lt;td&gt;终端输出名，如果没有则为空&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;exitval&lt;/td&gt;&lt;td&gt;&quot;status&quot; 为 &quot;dead&quot; 时才有效&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;exit_cb&lt;/td&gt;&lt;td&gt;退出时调用的函数&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;termsig&lt;/td&gt;&lt;td&gt;终止程序的信号（仅用于Unix）&lt;br /&gt;仅当&quot;status&quot;为&quot;dead&quot;时才有意义&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;tty_type&lt;/td&gt;&lt;td&gt;使用的虚拟控制台类型（仅用于MS-Windows）&lt;br /&gt;可选值是&quot;winpty&quot;或&quot;conpty&quot;&lt;/td&gt;&lt;/tr&gt;
		&lt;/tbody&gt;
	&lt;/table&gt;

	&lt;h2 class=&quot;article&quot;&gt;&lt;a id=job-stop&quot;&gt;停止作业&lt;/a&gt;&lt;/h2&gt;
	&lt;p&gt;使用job_stop()函数，可以停止指定的作业：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:call job_stop(job)&lt;/code&gt;&lt;/p&gt;

	&lt;h2 class=&quot;article&quot;&gt;&lt;a id=job-example&quot;&gt;作业实例&lt;/a&gt;&lt;/h2&gt;
	&lt;p&gt;实例1：启动&lt;a href=&quot;http://httpd.apache.org/&quot; title=&quot;Apache HTTP Server&quot;&gt;Apache HTTP Server&lt;/a&gt;服务&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:let job = job_start(&#39;apachectl start&#39;)&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;使用以下命令载入首页内容，以确认服务启动成功：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:silent r ! curl localhost&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;实例2：在位置列表中显示命令输出&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;&lt;code&gt;function! s:on_find(chan, msg)
      lgetexpr split(a:msg, &#39;&#39;)
endfunction

call job_start(&#39;find . -print0&#39;, {
      \ &#39;out_mode&#39;: &#39;raw&#39;,
      \ &#39;callback&#39;: function(&#39;&amp;lt;SID&amp;gt;on_find&#39;)
      \ })&lt;/code&gt;&lt;/pre&gt;
	&lt;p&gt;使用以下命令，执行包含以上命令的脚本：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:so %&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;使用以下命令，将在位置列表（location list）中显示外部&lt;a href=&quot;http://man.he.net/?topic=find&amp;section=all&quot; title=&quot;find&quot;&gt;find&lt;/a&gt;命令输出的文件列表：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:lopen&lt;/code&gt;
	&lt;p&gt;&lt;a href=&quot;https://yyq123.github.io/learn-vim/images/job_start_out_mode_raw.png&quot; title=&quot;job_start_out_mode_raw&quot;&gt;&lt;img src=&quot;https://yyq123.github.io/learn-vim/images/job_start_out_mode_raw.png&quot; alt=&quot;job_start_out_mode_raw&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

	&lt;p&gt;&lt;span style=&quot;font-weight:bold; color:#4169E1; margin-left:0.2em&quot;&gt;&amp;#65311;&lt;/span&gt;使用以下命令，可以查看关于作业的帮助信息：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:help job&lt;/code&gt;&lt;/p&gt;

	&lt;table summary=&quot;Commands&quot; border=&quot;2&quot; frame=&quot;hsides&quot; rules=&quot;all&quot; cellspacing=&quot;0&quot; cellpadding=&quot;3&quot;&gt;
		&lt;caption&gt;函数小结&lt;/caption&gt;
		&lt;tbody&gt;
		&lt;tr&gt;&lt;td&gt;&lt;code class=&quot;inset&quot;&gt;job_start()&lt;/code&gt;&lt;/td&gt;&lt;td&gt;启动作业&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;&lt;code class=&quot;inset&quot;&gt;job_status()&lt;/code&gt;&lt;/td&gt;&lt;td&gt;显示作业状态&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;&lt;code class=&quot;inset&quot;&gt;job_info()&lt;/code&gt;&lt;/td&gt;&lt;td&gt;显示作业的详细信息&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;&lt;code class=&quot;inset&quot;&gt;job_stop()&lt;/code&gt;&lt;/td&gt;&lt;td&gt;停止作业&lt;/td&gt;&lt;/tr&gt;
		&lt;/tbody&gt;
	&lt;/table&gt;

	&lt;p style=&quot;border-top:1px solid lightgray&quot;&gt;&lt;span style=&quot;float:right&quot;&gt;Ver: 2.0&amp;nbsp;|&amp;nbsp;&lt;a href=&quot;mailto:yyq123@gmail.com&quot;&gt;YYQ&lt;/a&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;a title=&quot;静默执行命令(silent)&quot; href=&quot;http://yyq123.github.io/learn-vim/learn-vim-silent.html&quot;&gt;上一篇&lt;/a&gt;&amp;nbsp;|&lt;a title=&quot;笔记列表&quot; href=&quot;http://yyq123.github.com/learn-vim/learn-vi-00-00-TOC.html&quot;&gt;&amp;nbsp;目录&amp;nbsp;&lt;/a&gt;|&amp;nbsp;&lt;a title=&quot;定时器(timer)&quot; href=&quot;http://yyq123.github.io/learn-vim/learn-vim-job.html&quot;&gt;下一篇&lt;/a&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://yyq123.blogspot.com/feeds/1339180006324699537/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='http://yyq123.blogspot.com/2020/11/vim-job.html#comment-form' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7045570/posts/default/1339180006324699537'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7045570/posts/default/1339180006324699537'/><link rel='alternate' type='text/html' href='http://yyq123.blogspot.com/2020/11/vim-job.html' title='VIM学习笔记 作业(job)'/><author><name>YYQ</name><uri>http://www.blogger.com/profile/00702527262114879030</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7045570.post-5184781159334605048</id><published>2020-11-13T18:57:00.004+08:00</published><updated>2020-11-13T18:57:35.903+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="[知]"/><category scheme="http://www.blogger.com/atom/ns#" term="OpenSource"/><category scheme="http://www.blogger.com/atom/ns#" term="Software"/><category scheme="http://www.blogger.com/atom/ns#" term="Vim"/><title type='text'>VIM学习笔记 静默执行命令(silent)</title><content type='html'>	&lt;p&gt;通常在使用&lt;code&gt;!&lt;/code&gt;&lt;a href=&quot;https://yyq123.github.io/learn-vim/learn-vi-71-Shell.html&quot; title=&quot;Shell&quot;&gt;运行外部Shell命令&lt;/a&gt;时，将显示提示信息&amp;ldquo;Press ENTER or type command to continue&amp;rdquo;，需要用户点击回车键才可以返回常规模式。&lt;/p&gt;
	&lt;p&gt;&lt;a href=&quot;https://yyq123.github.io/learn-vim/images/shell_cmd_msg.png&quot; title=&quot;shell_cmd_msg&quot;&gt;&lt;img src=&quot;https://yyq123.github.io/learn-vim/images/shell_cmd_msg.png&quot; alt=&quot;shell_cmd_msg&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

	&lt;h2 class=&quot;article&quot;&gt;&lt;a id=&quot;cmd_silent&quot;&gt;使用silent静默执行命令&lt;/a&gt;&lt;/h2&gt;
	&lt;p&gt;如果不希望显示提示信息，那么可以使用&lt;code&gt;:silent&lt;/code&gt;命令：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:silent !echo &#39;Hello World&#39;&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;如果需要清除命令本身及其输出信息，那么可以使用&lt;kbd&gt;Ctrl-L&lt;/kbd&gt;快捷键或&lt;code&gt;:redraw!&lt;/code&gt;命令来重画屏幕。&lt;/p&gt;
	&lt;p&gt;您可以&lt;a href=&quot;http://yyq123.github.io/learn-vim/learn-vi-94-ScriptUDC.html&quot; title=&quot;Script-User Defined Command&quot;&gt;自定义命令&lt;/a&gt;，来合并以上两步操作：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:command! -nargs=1 Silent execute &#39;:silent !&#39;.&amp;lt;q-args&amp;gt; | execute &#39;:redraw!&#39;&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;使用以下自定义命令，将首先执行外部命令，然后重画屏幕：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:Silent echo &#39;Hello World&#39;&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;通过结合&lt;code&gt;:execute&lt;/code&gt;命令，可以生成并执行较复杂的命令：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:silent exec &quot;!command&quot;&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;定义以下快捷键，在Linux下静默执行命令。比如使用&lt;a href=&quot;http://espeak.sourceforge.net/&quot; title=&quot;eSpeak text to speech&quot;&gt;eSpeak&lt;/a&gt;将文字转换为语音：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:nnoremap &amp;lt;leader&amp;gt;es :silent exec &#39;!espeak &quot;hello world&quot; &amp;amp;&#39;&amp;lt;CR&amp;gt;&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;定义以下快捷键，在Windows下使用默认程序打开当前文件。比如使用默认浏览器，打开当前编辑的HTML文档：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:nmap &amp;lt;Leader&amp;gt;x :silent ! start &quot;1&quot; &quot;%:p&quot;&amp;lt;CR&amp;gt;&lt;/code&gt;&lt;/p&gt;

	&lt;h2 class=&quot;article&quot;&gt;&lt;a id=&quot;cmd_background&quot;&gt;后台执行命令&lt;/a&gt;&lt;/h2&gt;
	&lt;p&gt;使用以下命令，可以利用Shell后台执行命令和重定向的能力：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:silent exec &quot;!(ping www.vim.org &amp;gt;ping.out &amp;gt;2&amp;amp;1) &amp;amp;&quot;&lt;/code&gt;&lt;/p&gt;
	&lt;ul&gt;
		&lt;li&gt;&lt;code&gt;&amp;gt;ping.out&lt;/code&gt;，即&lt;code&gt;1&amp;gt;ping.out&lt;/code&gt;，表示将命令的标准输出（stdout）重定向到名为&amp;ldquo;ping.out&amp;rdquo;的文件；因为默认值为1，所以可以省略；&lt;/li&gt;
		&lt;li&gt;&lt;code&gt;&amp;gt;2&amp;amp;1&lt;/code&gt;，表示将&amp;ldquo;2&amp;rdquo;代表的标准错误（stderr）也重定向至&amp;ldquo;1&amp;rdquo;代表的标准输出（stdout）；即标准输出和标准错误都输出至名为&amp;ldquo;ping.out&amp;rdquo;的文件；&lt;/li&gt;
		&lt;li&gt;&lt;code&gt; &amp;amp;&lt;/code&gt;，表示在后台执行命令。&lt;/li&gt;
	&lt;/ul&gt;
	&lt;p&gt;如果不希望外部命令输出任何信息，那么可以将标准输出指向空设备文件&amp;ldquo;/dev/null&amp;rdquo;：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:silent exec &quot;!(ping www.vim.org &amp;gt;/dev/null &amp;gt;2&amp;amp;1) &amp;amp;&quot;&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;也可以静默执行外部命令，并在新建&lt;a href=&quot;http://yyq123.github.io/learn-vim/learn-vi-15-Tabs.html&quot; title=&quot;标签页(Tab)&quot;&gt;标签页&lt;/a&gt;（Tab）内显示命令输出：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:silent exec &quot;!(echo &#39;Hello World&#39;) &amp;gt; test.txt&quot; | :tabedit test.txt&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;如果希望在&lt;a href=&quot;http://yyq123.github.io/learn-vim/learn-vi-14-MultiWindows.html&quot; title=&quot;窗口(Window)&quot;&gt;分割窗口&lt;/a&gt;内显示命令输出，那么可以使用:split命令：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:silent exec &quot;!(echo &#39;Hello World&#39;) &amp;gt; test.txt&quot; | :sp test.txt&lt;/code&gt;&lt;/p&gt;

	&lt;h2 class=&quot;article&quot;&gt;&lt;a id=&quot;gui_background&quot;&gt;后台打开应用窗口&lt;/a&gt;&lt;/h2&gt;
	&lt;p&gt;使用以下命令，将打开与当前文件同名的PDF文档。由于&lt;a href=&quot;https://pwmt.org/projects/zathura/&quot; title=&quot;zathura document viewer&quot;&gt;Zathura&lt;/a&gt;窗口在前台显示，所以无法在Vim窗口中继续进行编辑；关闭zathura窗口之后，也需要在Vim中点击回车键以返回常规模式：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:!zathura %:r.pdf&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;&lt;a href=&quot;https://yyq123.github.io/learn-vim/images/zathura_foreground.png&quot; title=&quot;zathura_foreground&quot;&gt;&lt;img src=&quot;https://yyq123.github.io/learn-vim/images/zathura_foreground.png&quot; alt=&quot;zathura_foreground&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
	&lt;p&gt;使用以下命令，将打开与当前文件同名的PDF文档。由于zathura窗口在前台显示，所以无法在Vim窗口中继续进行编辑；关闭zathura窗口之后，&lt;em&gt;不需要&lt;/em&gt;在Vim中点击回车键即可返回常规模式：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:silent !zathura %:r.pdf&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;使用以下命令，将在后台打开与当前文件同名的PDF文档。由于zathura窗口在后台显示，所以&lt;em&gt;无需&lt;/em&gt;关闭zathura窗口，也&lt;em&gt;无需&lt;/em&gt;点击回车键，即可以在Vim窗口中继续进行编辑:&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:silent exec &#39;!zathura &#39;.expand(&quot;%:r&quot;).&#39;.pdf &amp;amp;&#39;&lt;/code&gt;&lt;/p&gt;

	&lt;h2 class=&quot;article&quot;&gt;&lt;a id=&quot;example_zip&quot;&gt;实例：静默压缩文件&lt;/a&gt;&lt;/h2&gt;
	&lt;p&gt;使用以下命令，可以使用&lt;a href=&quot;http://infozip.sourceforge.net/Zip.html&quot; title=&quot;Zip&quot;&gt;Zip&lt;/a&gt;压缩当前文件：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:!zip test.zip %:p&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;屏幕将显示以下信息，并等待用户按回车键以返回常规模式：&lt;/p&gt;
	&lt;p&gt;&lt;a href=&quot;https://yyq123.github.io/learn-vim/images/shell_cmd_zip_msg.png&quot; title=&quot;shell_cmd_zip_msg&quot;&gt;&lt;img src=&quot;https://yyq123.github.io/learn-vim/images/shell_cmd_zip_msg.png&quot; alt=&quot;shell_cmd_zip_msg&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
	&lt;p&gt;使用以下命令，则屏幕不会显示任何信息，并且自动返回常规模式：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:silent !zip test.zip %:p&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;使用以下命令，可以批量压缩所有打开的文件：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:silent bufdo !zip test.zip %:p&lt;/code&gt;&lt;/p&gt;

	&lt;h2 class=&quot;article&quot;&gt;&lt;a id=&quot;example_loadview&quot;&gt;实例：静默载入视图&lt;/a&gt;&lt;/h2&gt;
	&lt;p&gt;如果希望记忆光标位置和手动&lt;a href=&quot;http://yyq123.github.io/learn-vim/learn-vi-63-Fold.html&quot; title=&quot;Fold&quot;&gt;折叠&lt;/a&gt;（Fold），以便在重新打开文件时恢复到之前的编辑状态。那么可以在&lt;a href=&quot;http://yyq123.github.io/learn-vim/learn-vi-59-vimrc.html&quot; title=&quot;vimrc&quot;&gt;vimrc&lt;/a&gt;配置文件中，增加以下&lt;a href=&quot;http://yyq123.github.io/learn-vim/learn-vi-49-01-autocmd.html&quot; title=&quot;自动命令(autocmd)&quot;&gt;自动命令&lt;/a&gt;：&lt;/p&gt;
	&lt;pre class=&quot;block&quot; style=&quot;width:30em&quot;&gt;&lt;code&gt;set viewdir=$HOME/vimfiles/views/
autocmd BufWinLeave * mkview
autocmd BufWinEnter * silent loadview&lt;/code&gt;&lt;/pre&gt;

	&lt;h2 class=&quot;article&quot;&gt;&lt;a id=&quot;fun_system&quot;&gt;使用system()函数静默执行命令&lt;/a&gt;&lt;/h2&gt;
	&lt;p&gt;通过调用system()函数，也可静默执行命令：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:call system(&#39;espeak &quot;hello world&quot; &amp;amp;&#39;)&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;函数&lt;code&gt;system()&lt;/code&gt;和&lt;code&gt;!&lt;/code&gt;命令都可以调用外部命令，但system()函数不会切到shell终端，而是仍停留在vim界面。所调用外部命令的输出将会被system()函数捕获，可以将其保存在VimL变量中以供后续使用。&lt;/p&gt;
	&lt;p&gt;使用以下命令，可以查看更多帮助信息：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:help :silent&lt;/code&gt;&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:help system()&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;关于本文中使用的第三方工具，请参阅以下网址：&lt;/p&gt;
	&lt;ul&gt;
		&lt;li&gt;&lt;a href=&quot;http://espeak.sourceforge.net/&quot; title=&quot;eSpeak text to speech&quot;&gt;eSpeak&lt;/a&gt;, text to speech&lt;/li&gt;
		&lt;li&gt;&lt;a href=&quot;https://pwmt.org/projects/zathura/&quot; title=&quot;zathura document viewer&quot;&gt;Zathura&lt;/a&gt;, document viewer&lt;/li&gt;
		&lt;li&gt;&lt;a href=&quot;http://infozip.sourceforge.net/Zip.html&quot; title=&quot;Zip&quot;&gt;Zip&lt;/a&gt;, compression and file packaging/archive utility&lt;/li&gt;
	&lt;/ul&gt;
	&lt;p style=&quot;border-top:1px solid lightgray&quot;&gt;&lt;span style=&quot;float:right&quot;&gt;Ver: 2.0&amp;nbsp;|&amp;nbsp;&lt;a href=&quot;mailto:yyq123@gmail.com&quot;&gt;YYQ&lt;/a&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;a title=&quot;运行外部命令(Shell Command)&quot; href=&quot;http://yyq123.github.io/learn-vim/learn-vi-71-Shell.html&quot;&gt;上一篇&lt;/a&gt;&amp;nbsp;|&lt;a title=&quot;笔记列表&quot; href=&quot;http://yyq123.github.com/learn-vim/learn-vi-00-00-TOC.html&quot;&gt;&amp;nbsp;目录&amp;nbsp;&lt;/a&gt;|&amp;nbsp;&lt;a title=&quot;文本排序(sort)&quot; href=&quot;http://yyq123.github.io/learn-vim/learn-vi-09-03-sort.html&quot;&gt;下一篇&lt;/a&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://yyq123.blogspot.com/feeds/5184781159334605048/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='http://yyq123.blogspot.com/2020/11/vim-silent.html#comment-form' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7045570/posts/default/5184781159334605048'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7045570/posts/default/5184781159334605048'/><link rel='alternate' type='text/html' href='http://yyq123.blogspot.com/2020/11/vim-silent.html' title='VIM学习笔记 静默执行命令(silent)'/><author><name>YYQ</name><uri>http://www.blogger.com/profile/00702527262114879030</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7045570.post-3047275963478945263</id><published>2020-11-03T21:07:00.000+08:00</published><updated>2020-11-03T21:07:28.403+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="[知]"/><category scheme="http://www.blogger.com/atom/ns#" term="OpenSource"/><category scheme="http://www.blogger.com/atom/ns#" term="Software"/><category scheme="http://www.blogger.com/atom/ns#" term="Vim"/><title type='text'>VIM学习笔记 全局命令-实例(Global Command-Examples)</title><content type='html'>	&lt;h2 class=&quot;article&quot;&gt;&lt;a id=&quot;single-commands&quot;&gt;执行单条命令&lt;/a&gt;&lt;/h2&gt;
	&lt;p&gt;将所有未标志为&amp;ldquo;DONE&amp;rdquo;的行，都在行尾标注&amp;ldquo;TODO&amp;rdquo;：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:g!/DONE/s/$/ TODO/&lt;/code&gt;&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:v/DONE/s/$/ TODO/&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;从第5行到第10行，在每一行下插入空行：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:5,10g/^/pu _&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;通过调用&lt;code&gt;:sort&lt;/code&gt;命令，可以对指定范围内的文本进行&lt;a href=&quot;http://yyq123.github.io/learn-vim/learn-vi-09-03-sort.html&quot; title=&quot;文本排序(sort)&quot;&gt;排序&lt;/a&gt;。例如以下命令，将对&amp;ldquo;{}&amp;rdquo;包围的CSS属性按字母排序：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:g/{/ .+1,/}/-1 sort&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;&lt;a href=&quot;https://yyq123.github.io/learn-vim/images/g_cmd_range_sort.png&quot; title=&quot;g_cmd_range_sort&quot;&gt;&lt;img src=&quot;https://yyq123.github.io/learn-vim/images/g_cmd_range_sort.png&quot; alt=&quot;g_cmd_range_sort&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
	&lt;p&gt;同理，使用以下命令，可以针对&amp;ldquo;{}&amp;rdquo;包围的文本增加&lt;a href=&quot;http://yyq123.github.io/learn-vim/learn-vi-66-Indent.html&quot; title=&quot;Indent&quot;&gt;缩进&lt;/a&gt;：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:g/{/ .+1,/}/-1 &amp;gt;&lt;/code&gt;&lt;/p&gt;

	&lt;h2 class=&quot;article&quot;&gt;&lt;a id=&quot;multi-commands&quot;&gt;执行多条命令&lt;/a&gt;&lt;/h2&gt;
	&lt;p&gt;使用以下命令，可以为&amp;ldquo;Chapter&amp;rdquo;开头的标题行增加分隔线：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:g/^Chapter/t.|s/./-/g&lt;/code&gt;&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;Chapter 1
---------
Chapter 2
---------&lt;/pre&gt;
	&lt;p&gt;从以上命令可以看到，通过使用&amp;ldquo;&lt;code&gt;|&lt;/code&gt;&amp;rdquo;可以组合执行多条命令。首先使用&lt;code&gt;:t&lt;/code&gt;命令，复制行内容；然后执行&lt;code&gt;:s&lt;/code&gt;命令，将文本替换为横线。&lt;/p&gt;
	&lt;p&gt;使用以下命令，可以进行多次替换。对于包含&amp;ldquo;apples&amp;rdquo;或&amp;ldquo;cherries&amp;rdquo;的行，进行两次替换：首先将&amp;ldquo;apples&amp;rdquo;替换为&amp;ldquo;bananas&amp;rdquo;，然后将&amp;ldquo;cherries&amp;rdquo;替换为&amp;ldquo;oranges&amp;rdquo;：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:g /apples\|cherries/ substitute /apples/bananas/g | substitute /cherries/oranges/g&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;&lt;a href=&quot;https://yyq123.github.io/learn-vim/images/g_cmd_sub_multi.png&quot; title=&quot;g_cmd_sub_multi&quot;&gt;&lt;img src=&quot;https://yyq123.github.io/learn-vim/images/g_cmd_sub_multi.png&quot; alt=&quot;g_cmd_sub_multi&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

	&lt;h2 class=&quot;article&quot;&gt;&lt;a id=&quot;function&quot;&gt;调用函数&lt;/a&gt;&lt;/h2&gt;
	&lt;p&gt;首先在&lt;a href=&quot;http://yyq123.github.io/learn-vim/learn-vi-59-vimrc.html&quot; title=&quot;vimrc&quot;&gt;vimrc&lt;/a&gt;配置文件中，新增以下自定义函数：&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;&lt;code&gt;&quot; Delete duplicate lines
function! DelDupLine()
  if getline(&quot;.&quot;) == getline(line(&quot;.&quot;) - 1)
    norm dd
  endif
endfunction&lt;/code&gt;&lt;/pre&gt;
	&lt;p&gt;然后使用以下命令，调用函数来删除文件中重复的行：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:g/^/ call Del()&lt;/code&gt;&lt;/p&gt;

	&lt;h2 class=&quot;article&quot;&gt;&lt;a id=&quot;file&quot;&gt;读取和写入文件&lt;/a&gt;&lt;/h2&gt;
	&lt;p&gt;将所有不是以2个Tab制表符开头的行，增加到文件&amp;ldquo;top2levels.otl&amp;rdquo;的末尾：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:g!/^\t\t/.w&amp;gt;&amp;gt;top2levels.otl&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;首先移动到文件开头，然后执行以下命令，可以搜集相对于指定字符偏移位置的行：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:g /^Chapter/ .+2w &amp;gt;&amp;gt; begin&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;包含&amp;ldquo;Chapter&amp;rdquo;字符的章节号、名称和描述，分处在连续的行中。模式&lt;var&gt;^Chapter&lt;/var&gt;将查找以&amp;ldquo;Chapter&amp;rdquo;字符开头的行；&lt;var&gt;.+2&lt;/var&gt;将定位到匹配处之后的第2行；然后使用&lt;code&gt;:w&lt;/code&gt;命令将其追加到名为&amp;ldquo;begin&amp;rdquo;的文件中。&lt;/p&gt;
	&lt;p&gt;&lt;a href=&quot;https://yyq123.github.io/learn-vim/images/g_cmd_range_lines.png&quot; title=&quot;g_cmd_range_lines&quot;&gt;&lt;img src=&quot;https://yyq123.github.io/learn-vim/images/g_cmd_range_lines.png&quot; alt=&quot;g_cmd_range_lines&quot; width=&quot;550&quot; height=&quot;301&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
	&lt;p&gt;拆分当前文件，将每一行内容，分别保存为一个文本文件（1.txt,2.txt,3,txt依次类推）：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:g/^/exe &quot;.w &quot;.line(&quot;.&quot;).&quot;.txt&quot;&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;将字符串&amp;ldquo;MARK&amp;rdquo;替换为文件&amp;ldquo;tmp.txt&amp;rdquo;的内容：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:g/^MARK$/r tmp.txt | -d&lt;/code&gt;&lt;/p&gt;

	&lt;h2 class=&quot;article&quot;&gt;&lt;a id=&quot;register&quot;&gt;读取和写入寄存器&lt;/a&gt;&lt;/h2&gt;
	&lt;p&gt;假设需要从以下代码中，提取所有以&amp;ldquo;TODO&amp;rdquo;开头的注释文字：&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;if ( m &amp;amp;&amp;amp; m[2] )
    // TODO: something1
    return [ m[1].length + m[2].length ];
else {
    // TODO: something2
    return [ 1, &quot;`&quot; ];
}&lt;/pre&gt;
	&lt;p&gt;首先，使用&lt;code&gt;qaq&lt;/code&gt;命令来清除&lt;a href=&quot;https://yyq123.github.io/learn-vim/learn-vi-12-Register.html&quot; title=&quot;寄存器(Regists)&quot;&gt;寄存器&lt;/a&gt;a的内容，做为存储提取内容的中介位置；&lt;/p&gt;
	&lt;p&gt;然后，使用以下命令将包含&amp;ldquo;TODO&amp;rdquo;的行添加到寄存器a；请注意，使用大写的寄存器编号&amp;ldquo;A&amp;rdquo;以表示向寄存器添加内容（而小写字母则表示覆盖内容）；&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:g/TODO/yank A&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;如果希望将文本同时放入指定寄存器和系统剪切板，那么可以使用以下命令：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:g/TODO/yank A | :let @+=@a&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;请注意，在Mac和Windows下，寄存器*和+都用于访问系统剪切板；在Linux下，寄存器+用于访问系统剪切板。&lt;/p&gt;
	&lt;p&gt;使用以下命令，可以看到内容已经被放入寄存器和剪切板：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:registers a+*&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;&lt;a href=&quot;https://yyq123.github.io/learn-vim/images/g_cmd_register_append.png&quot; title=&quot;g_cmd_register_append&quot;&gt;&lt;img src=&quot;https://yyq123.github.io/learn-vim/images/g_cmd_register_append.png&quot; alt=&quot;g_cmd_register_append&quot; width=&quot;550&quot; height=&quot;87&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
	&lt;p&gt;请注意，vim使用&amp;ldquo;^J&amp;rdquo;符号表示换行。&lt;/p&gt;
	&lt;p&gt;使用&lt;code&gt;&quot;ap&lt;/code&gt;命令，即可以将寄存器a中存储的TODO信息粘贴出来：&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;    // TODO: something1
    // TODO: something2&lt;/pre&gt;

	&lt;p style=&quot;border-top:1px solid lightgray&quot;&gt;&lt;span style=&quot;float:right&quot;&gt;Ver: 2.0&amp;nbsp;|&amp;nbsp;&lt;a href=&quot;mailto:yyq123@gmail.com&quot;&gt;YYQ&lt;/a&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;a title=&quot;全局命令-实例(Global Command)&quot; href=&quot;http://yyq123.github.io/learn-vim/learn-vim-GlobalCommand.html&quot;&gt;上一篇&lt;/a&gt;&amp;nbsp;|&lt;a title=&quot;笔记列表&quot; href=&quot;http://yyq123.github.com/learn-vim/learn-vi-00-00-TOC.html&quot;&gt;&amp;nbsp;目录&amp;nbsp;&lt;/a&gt;|&amp;nbsp;&lt;a title=&quot;Ex模式(Ex Mode)&quot; href=&quot;http://yyq123.github.io/learn-vim/learn-vi-48-ExMode.html&quot;&gt;下一篇&lt;/a&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://yyq123.blogspot.com/feeds/3047275963478945263/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='http://yyq123.blogspot.com/2020/11/vim-global-command-examples.html#comment-form' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7045570/posts/default/3047275963478945263'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7045570/posts/default/3047275963478945263'/><link rel='alternate' type='text/html' href='http://yyq123.blogspot.com/2020/11/vim-global-command-examples.html' title='VIM学习笔记 全局命令-实例(Global Command-Examples)'/><author><name>YYQ</name><uri>http://www.blogger.com/profile/00702527262114879030</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7045570.post-8034212557596095058</id><published>2020-11-02T17:06:00.000+08:00</published><updated>2020-11-02T17:06:45.716+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="[知]"/><category scheme="http://www.blogger.com/atom/ns#" term="OpenSource"/><category scheme="http://www.blogger.com/atom/ns#" term="Software"/><category scheme="http://www.blogger.com/atom/ns#" term="Vim"/><title type='text'>VIM学习笔记 全局命令(Global Command)</title><content type='html'>	&lt;p&gt;&lt;code class=&quot;inset&quot;&gt;:global&lt;/code&gt;全局命令，通常简写为&lt;code class=&quot;inset&quot;&gt;:g&lt;/code&gt;，可以针对匹配模式的行执行编辑命令；通过与正则表达式、寄存器和标记等功能相配合，可以高效地实现复杂的操作。&lt;/p&gt;
	&lt;p&gt;使用&lt;code class=&quot;inset&quot;&gt;:g&lt;/code&gt;命令，可以针对所有匹配模式的行执行操作。其命令格式为：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:[range]g/{pattern}/[command]&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;即针对在&lt;var&gt;[range]&lt;/var&gt;范围内，所有匹配&lt;var&gt;{pattern}&lt;/var&gt;模式的行，执行&lt;var&gt;[command]&lt;/var&gt;命令。&lt;/p&gt;
	&lt;p&gt;命令&lt;code class=&quot;inset&quot;&gt;:g!&lt;/code&gt;及其同义词&lt;code class=&quot;inset&quot;&gt;:v&lt;/code&gt;，则可以针对所有不匹配模式的行执行操作。其命令格式为：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:[range]g!/{pattern}/[command]&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;即针对在&lt;var&gt;[range]&lt;/var&gt;范围内，所有不匹配&lt;var&gt;{pattern}&lt;/var&gt;条件的行，执行&lt;var&gt;[command]&lt;/var&gt;命令。&lt;/p&gt;
	&lt;p&gt;如果没有指定&lt;var&gt;[range]&lt;/var&gt;，则针对文件中的所有行执行命令。也可以使用行地址，把全局搜索限定在指定的行或行范围内。&lt;/p&gt;
	&lt;p&gt;如果没有指定&lt;var&gt;[command]&lt;/var&gt;，则执行&lt;code&gt;:print&lt;/code&gt;命令来显示行内容。&lt;/p&gt;
	&lt;p&gt;使用以下命令，可以查看全局命令的帮助信息：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:h :g&lt;/code&gt;&lt;/p&gt;

	&lt;h2 class=&quot;article&quot;&gt;&lt;a id=&quot;global_search&quot;&gt;全局查找&lt;/a&gt;&lt;/h2&gt;
	&lt;p&gt;查找并显示文件中所有包含模式pattern的行，并移动到最后一个匹配处：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:g/pattern&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;查找并显示文件中所有包含模式pattern的行：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:g/pattern/p&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;查找并显示文件中所有精确匹配单词pattern的行：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:g/\&amp;lt;pattern\&amp;gt;/p&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;查找并显示第20到40行之间所有包含模式pattern的行：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:20,40g/pattern/p&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;查找并显示文件中所有不包行模式pattern的行，并显示这些行号：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:g!/pattern/nu&lt;/code&gt;&lt;/p&gt;

	&lt;h2 class=&quot;article&quot;&gt;&lt;a id=&quot;global_del&quot;&gt;全局删除&lt;/a&gt;&lt;/h2&gt;
	&lt;p&gt;删除包含模式patternn的行：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:g/pattern/d&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;删除不包含模式pattern的行：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:g!/pattern/d&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;删除所有空行：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:g/^$/d&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;删除所有空行以及仅包含空格和Tab制表符的行：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:g/^[&amp;nbsp;tab]*$/d&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;删除指定范围内的文本，例如以下文本中的&amp;ldquo;DESCRIPTION&amp;rdquo;部分：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:g/DESCRIPTION/,/PARAMETERS/-1d&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;&lt;a href=&quot;https://yyq123.github.io/learn-vim/images/g_cmd_range_del.png&quot; title=&quot;g_cmd_range_del&quot;&gt;&lt;img src=&quot;https://yyq123.github.io/learn-vim/images/g_cmd_range_del.png&quot; alt=&quot;g_cmd_range_del&quot; width=&quot;550&quot; height=&quot;267&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

	&lt;h2 class=&quot;article&quot;&gt;&lt;a id=&quot;global_sub&quot;&gt;全局替换&lt;/a&gt;&lt;/h2&gt;
	&lt;p&gt;利用全局命令，可以仅针对符合查询条件的行，进行替换操作。例如使用以下命令，将包含&amp;ldquo;microsoft antitrust&amp;rdquo;的行中的&amp;ldquo;judgment&amp;rdquo;替换为&amp;ldquo;ripoff&amp;rdquo;：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:g/microsoft antitrust/s/judgment/ripoff/&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;可以在命令中指定查找的范围。比如以下命令，将在包含&amp;ldquo;microsoft antitrust&amp;rdquo;的前两行及后两行中进行替换：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:g/microsoft antitrust/-2,/microsoft antitrust/+2s/judgment/ripoff/c&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;&lt;a href=&quot;https://yyq123.github.io/learn-vim/images/g_cmd_range.png&quot; title=&quot;g_cmd_range&quot;&gt;&lt;img src=&quot;https://yyq123.github.io/learn-vim/images/g_cmd_range.png&quot; alt=&quot;g_cmd_range&quot; width=&quot;550&quot; height=&quot;53&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
	&lt;p&gt;以上命令末尾的&lt;var&gt;c&lt;/var&gt;参数，用于提示用户对每一个替换操作进行确认。&lt;/p&gt;
	&lt;p&gt;假设希望在以&amp;ldquo;end&amp;rdquo;结尾的行中，将第1部分文字替换为&amp;ldquo;The greatest of times;&amp;rdquo;：&lt;/p&gt;
	&lt;p&gt;&lt;code class=&quot;msg&quot;&gt;the best of times; the worst of times: end&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;由于会尽可能多（as much text as possible）的匹配，以下命令将替换至第2个&amp;ldquo;of&amp;rdquo;处：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:g/end$/s/.*of/The greatest of/&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;&lt;code class=&quot;msg&quot;&gt;The greatest of times: end&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;为了只替换第1部分，则需要更精确的匹配条件：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:g/end$/s/.*of times;/The greatest of times;/&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;&lt;code class=&quot;msg&quot;&gt;The greatest of times; the worst of times: end&lt;/code&gt;&lt;/p&gt;

	&lt;h2 class=&quot;article&quot;&gt;&lt;a id=&quot;global_move&quot;&gt;全局移动&lt;/a&gt;&lt;/h2&gt;
	&lt;p&gt;将所有的行按相反的顺序排列。其中，查找模式&lt;var&gt;.*&lt;/var&gt;将匹配所有行，&lt;var&gt;m0&lt;/var&gt;命令将每一行移动到0行之后：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:g/.*/m0&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;将指定&lt;a href=&quot;http://yyq123.github.io/learn-vim/learn-vi-53-Mark.html&quot; title=&quot;&quot;&gt;标记&lt;/a&gt;（Mark）之间的行按相反的顺序排列：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:&#39;a,&#39;bg/^/m&#39;b&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;&lt;a href=&quot;https://yyq123.github.io/learn-vim/images/g_cmd_mark_move.png&quot; title=&quot;g_cmd_mark_move&quot;&gt;&lt;img src=&quot;https://yyq123.github.io/learn-vim/images/g_cmd_mark_move.png&quot; alt=&quot;g_cmd_mark_move&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
	&lt;p&gt;将以下文本中的&amp;ldquo;DESCRIPTION&amp;rdquo;部分，上移到&amp;ldquo;SYNTAX&amp;rdquo;之前：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:g /SYNTAX/.,/DESCRIPTION/-1 move /PARAMETERS/-1&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;首先匹配从包含&amp;ldquo;SYNTAX&amp;rdquo;的行到包含&amp;ldquo;DESCRIPTION&amp;rdquo;的上一行；然后将这些行移动到包含&amp;ldquo;PARAMETERS&amp;rdquo;的上一行。&lt;/p&gt;
	&lt;p&gt;&lt;a href=&quot;https://yyq123.github.io/learn-vim/images/g_cmd_range_move.png&quot; title=&quot;g_cmd_range_move&quot;&gt;&lt;img src=&quot;https://yyq123.github.io/learn-vim/images/g_cmd_range_move.png&quot; alt=&quot;g_cmd_range_move&quot; width=&quot;550&quot; height=&quot;256&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
	&lt;p&gt;以下两条命令均可以将所有不是以数字开头的行，移动到文件末尾：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:g!/^[[:digit:]]/m$&lt;/code&gt;&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:g/^[^[:digit:]]/m$&lt;/code&gt;&lt;/p&gt;

	&lt;h2 class=&quot;article&quot;&gt;&lt;a id=&quot;global_copy&quot;&gt;全局复制&lt;/a&gt;&lt;/h2&gt;
	&lt;p&gt;使用以下命令，可以重复每一行。其中&lt;code&gt;:t&lt;/code&gt;或&lt;code&gt;:copy&lt;/code&gt;为复制命令：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:g/^/t.&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;将包含模式pattern的行，复制到文件末尾：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:g/pattern/t$&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;重复每一行，并以&amp;ldquo;print &#39;&#39;&amp;rdquo;包围：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:g/./yank|put|-1s/&#39;/&quot;/g|s/.*/Print &#39;&amp;amp;&#39;/&lt;/code&gt;&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;Chapter 1
Print &#39;Chapter 1&#39;&lt;/pre&gt;

	&lt;p style=&quot;border-top:1px solid lightgray&quot;&gt;&lt;span style=&quot;float:right&quot;&gt;Ver: 2.0&amp;nbsp;|&amp;nbsp;&lt;a href=&quot;mailto:yyq123@gmail.com&quot;&gt;YYQ&lt;/a&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;a title=&quot;Ex模式(Ex Mode)&quot; href=&quot;http://yyq123.github.io/learn-vim/learn-vi-48-ExMode.html&quot;&gt;上一篇&lt;/a&gt;&amp;nbsp;|&lt;a title=&quot;笔记列表&quot; href=&quot;http://yyq123.github.com/learn-vim/learn-vi-00-00-TOC.html&quot;&gt;&amp;nbsp;目录&amp;nbsp;&lt;/a&gt;|&amp;nbsp;&lt;a title=&quot;全局命令-实例(Global Command-Examples)&quot; href=&quot;http://yyq123.github.io/learn-vim/learn-vim-GlobalCommand-Examples.html&quot;&gt;下一篇&lt;/a&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://yyq123.blogspot.com/feeds/8034212557596095058/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='http://yyq123.blogspot.com/2020/11/vim-global-command.html#comment-form' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7045570/posts/default/8034212557596095058'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7045570/posts/default/8034212557596095058'/><link rel='alternate' type='text/html' href='http://yyq123.blogspot.com/2020/11/vim-global-command.html' title='VIM学习笔记 全局命令(Global Command)'/><author><name>YYQ</name><uri>http://www.blogger.com/profile/00702527262114879030</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7045570.post-7343323666030066432</id><published>2020-10-22T19:13:00.002+08:00</published><updated>2020-10-22T19:15:49.205+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="[知]"/><category scheme="http://www.blogger.com/atom/ns#" term="OpenSource"/><category scheme="http://www.blogger.com/atom/ns#" term="Software"/><category scheme="http://www.blogger.com/atom/ns#" term="Vim"/><title type='text'>VIM学习笔记 插件列表 (Plugins)</title><content type='html'>&lt;p&gt;Best with &lt;a href=&quot;https://github.com/vim/vim&quot; title=&quot;vim&quot;&gt;Vim8&lt;/a&gt; and &lt;a href=&quot;https://www.python.org/&quot; title=&quot;python&quot;&gt;python3&lt;/a&gt; enabled.&lt;/p&gt;

&lt;h2&gt;&lt;a aria-hidden=&quot;true&quot; class=&quot;anchor&quot; href=&quot;file:///E:/Anthony_GitHub/learn-vim/learn-vim-plugin.html#notes&quot; id=&quot;notes&quot;&gt;&lt;/a&gt;说明：&lt;/h2&gt;
&lt;ul&gt;
	&lt;li&gt;本列表完全基于作者的主观体验，既不客观也不完整；&lt;/li&gt;
	&lt;li&gt;建议使用&lt;a href=&quot;http://yyq123.github.io/learn-vim/learn-vi-102-plugin-plug.html&quot; title=&quot;插件管理器(vim-plug)&quot;&gt;vim-plug&lt;/a&gt;或&lt;a href=&quot;http://yyq123.github.io/learn-vim/learn-vi-101-plugin-vundle.html&quot; title=&quot;插件管理器(Vundle)&quot;&gt;Vundle&lt;/a&gt;等插件管理器，来安装和管理插件；&lt;/li&gt;
	&lt;li&gt;在“插件”列中的&lt;span class=&quot;pl-k&quot;&gt;&amp;nbsp;★&lt;/span&gt;，表示推荐的插件；&lt;/li&gt;
	&lt;li&gt;在“描述”列中的【&lt;a href=&quot;http://yyq123.github.io/learn-vim/learn-vi-00-00-TOC.html&quot; title=&quot;详细介绍&quot;&gt;详细介绍&lt;/a&gt;】，链接到插件配置与使用的详细介绍。&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;&lt;a aria-hidden=&quot;true&quot; class=&quot;anchor&quot; href=&quot;http://yyq123.github.io/learn-vim/learn-vim-plugin.html#type&quot; id=&quot;plugins-included&quot;&gt;&lt;/a&gt;类别&lt;/h2&gt;
&lt;details open=&quot;&quot;&gt;
  &lt;summary&gt;&lt;strong&gt;List&lt;/strong&gt; &lt;i&gt;(🔎 请点击展开/合并)&lt;/i&gt;&lt;/summary&gt;
  &lt;ul style=&quot;column-count: 5; width: 50em;&quot;&gt;
	  &lt;li&gt;&lt;a href=&quot;http://yyq123.github.io/learn-vim/learn-vim-plugin.html#tool&quot; title=&quot;Tools&quot;&gt;工具&lt;/a&gt;&lt;/li&gt;
	  &lt;li&gt;&lt;a href=&quot;http://yyq123.github.io/learn-vim/learn-vim-plugin.html#color&quot; title=&quot;Color&quot;&gt;色彩&lt;/a&gt;&lt;/li&gt;
	  &lt;li&gt;&lt;a href=&quot;http://yyq123.github.io/learn-vim/learn-vim-plugin.html#gui&quot; title=&quot;GUI&quot;&gt;界面&lt;/a&gt;&lt;/li&gt;
	  &lt;li&gt;&lt;a href=&quot;http://yyq123.github.io/learn-vim/learn-vim-plugin.html#data&quot; title=&quot;Data&quot;&gt;数据&lt;/a&gt;&lt;/li&gt;
	  &lt;li&gt;&lt;a href=&quot;http://yyq123.github.io/learn-vim/learn-vim-plugin.html#sytanx&quot; title=&quot;Sytanx&quot;&gt;语法&lt;/a&gt;&lt;/li&gt;
	  &lt;li&gt;&lt;a href=&quot;http://yyq123.github.io/learn-vim/learn-vim-plugin.html#git&quot; title=&quot;Git&quot;&gt;Git&lt;/a&gt;&lt;/li&gt;
	  &lt;li&gt;&lt;a href=&quot;http://yyq123.github.io/learn-vim/learn-vim-plugin.html#writing&quot; title=&quot;Writing&quot;&gt;写作&lt;/a&gt;&lt;/li&gt;
	  &lt;li&gt;&lt;a href=&quot;http://yyq123.github.io/learn-vim/learn-vim-plugin.html#motion&quot; title=&quot;Motion&quot;&gt;快速移动&lt;/a&gt;&lt;/li&gt;
	  &lt;li&gt;&lt;a href=&quot;http://yyq123.github.io/learn-vim/learn-vim-plugin.html#completion&quot; title=&quot;&quot;&gt;自动完成&lt;/a&gt;&lt;/li&gt;
	  &lt;li&gt;&lt;a href=&quot;http://yyq123.github.io/learn-vim/learn-vim-plugin.html#html&quot; title=&quot;HTML&quot;&gt;HTML&lt;/a&gt;&lt;/li&gt;
	  &lt;li&gt;&lt;a href=&quot;http://yyq123.github.io/learn-vim/learn-vim-plugin.html#text-objects&quot; title=&quot;Text Objects&quot;&gt;文本对象&lt;/a&gt;&lt;/li&gt;
	  &lt;li&gt;&lt;a href=&quot;http://yyq123.github.io/learn-vim/learn-vim-plugin.html#coding&quot; title=&quot;Coding&quot;&gt;编程辅助&lt;/a&gt;&lt;/li&gt;
	  &lt;li&gt;&lt;a href=&quot;http://yyq123.github.io/learn-vim/learn-vim-plugin.html#others&quot; title=&quot;Others&quot;&gt;其它&lt;/a&gt;&lt;/li&gt;
  &lt;/ul&gt;
&lt;/details&gt;

&lt;h3&gt;&lt;a aria-hidden=&quot;true&quot; class=&quot;anchor&quot; href=&quot;file:///E:/Anthony_GitHub/learn-vim/learn-vim-plugin.html#tool&quot; id=&quot;tool&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;octicon octicon-link&quot;&gt;&lt;/span&gt;&lt;/a&gt;工具&lt;/h3&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/junegunn/vim-plug&quot; title=&quot;junegunn/vim-plug&quot;&gt;junegunn/vim-plug&lt;/a&gt;&amp;nbsp;&lt;span class=&quot;pl-v&quot;&gt;★&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;插件管理器【&lt;a href=&quot;http://yyq123.github.io/learn-vim/learn-vi-102-plugin-plug.html&quot; title=&quot;vim-plug&quot;&gt;详细介绍&lt;/a&gt;】&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/VundleVim/Vundle.vim&quot; title=&quot;VundleVim/Vundle.vim&quot;&gt;VundleVim/Vundle.vim&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;插件管理器【&lt;a href=&quot;http://yyq123.github.io/learn-vim/learn-vi-101-plugin-vundle.html&quot; title=&quot;vundle&quot;&gt;详细介绍&lt;/a&gt;】&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/machakann/vim-highlightedyank&quot; title=&quot;&quot;&gt;machakann/vim-highlightedyank&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;高亮显示yanked内容&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/svermeulen/vim-yoink&quot; title=&quot;svermeulen/vim-yoink&quot;&gt;svermeulen/vim-yoink&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;yank历史纪录&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://www.vim.org/scripts/script.php?script_id=1234&quot; title=&quot;DavidFishburn/YankRing.vim&quot;&gt;DavidFishburn/YankRing.vim&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;yank历史纪录【&lt;a href=&quot;http://yyq123.github.io/learn-vim/learn-vi-107-plugin-YankRing.html&quot; title=&quot;YankRing.vim&quot;&gt;详细介绍&lt;/a&gt;】&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/Shougo/context_filetype.vim&quot; title=&quot;&quot;&gt;Shougo/context_filetype.vim&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;文件类型侦测&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/vim-scripts/fencview.vim&quot; title=&quot;vim-scripts/fencview.vim&quot;&gt;vim-scripts/fencview.vim&lt;/a&gt;&amp;nbsp;&lt;span class=&quot;pl-v&quot;&gt;★&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;多编码（Multi-Encodings）格式识别【&lt;a href=&quot;http://yyq123.github.io/learn-vim/learn-vi-104-plugin-fencview.html&quot; title=&quot;fencview.vim&quot;&gt;详细介绍&lt;/a&gt;】&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/mhinz/vim-startify&quot; title=&quot;mhinz/vim-startify&quot;&gt;mhinz/vim-startify&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;自定义启动页（包含最近使用的文件、书签和保持的会话）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/dstein64/vim-startuptime&quot; title=&quot;dstein64/vim-startuptime&quot;&gt;dstein64/vim-startuptime&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;启动时间分析&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/MTDL9/vim-verbosity&quot; title=&quot;MTDL9/vim-verbosity&quot;&gt;MTDL9/vim-verbosity&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;将verbose信息输出至日志文件&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/Shougo/vinarise.vim&quot; title=&quot;Shougo/vinarise.vim&quot;&gt;Shougo/vinarise.vim&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;十六进制（Hex）编辑器&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;h3&gt;&lt;a aria-hidden=&quot;true&quot; class=&quot;anchor&quot; href=&quot;http://yyq123.github.io/learn-vim/learn-vim-plugin.html#color&quot; id=&quot;color&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;octicon octicon-link&quot;&gt;&lt;/span&gt;&lt;/a&gt;色彩&lt;/h3&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/rafi/awesome-vim-colorschemes&quot; title=&quot;awesome-vim-colorschemes&quot;&gt;rafi/awesome-colorschemes&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Awesome配色方案合辑&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/romainl/vim-cool&quot; title=&quot;vim-cool&quot;&gt;romainl/vim-cool&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;完成搜索后自动禁用高亮显示，再次查询时重新高亮显示&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/guns/xterm-color-table.vim&quot; title=&quot;xterm-color-table&quot;&gt;guns/xterm-color-table.vim&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;xterm 256色及RGB值列表&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/lilydjwg/colorizer&quot; title=&quot;lilydjwg/colorizer&quot;&gt;lilydjwg/colorizer&lt;/a&gt;&lt;span class=&quot;pl-k&quot;&gt;&amp;nbsp;★&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;颜色代码的背景色显示相应的色彩【&lt;a href=&quot;http://yyq123.github.io/learn-vim/learn-vi-604-WebDesign-ColorSelect.html#HTML-colorizer-plugin&quot; title=&quot;colorizer&quot;&gt;详细介绍&lt;/a&gt;】&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;h3&gt;&lt;a aria-hidden=&quot;true&quot; class=&quot;anchor&quot; href=&quot;http://yyq123.github.io/learn-vim/learn-vim-plugin.html#gui&quot; id=&quot;gui&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;octicon octicon-link&quot;&gt;&lt;/span&gt;&lt;/a&gt;界面&lt;/h3&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/vim-airline/vim-airline&quot; title=&quot;vim-airline/vim-airline&quot;&gt;vim-airline/vim-airline&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;自定义状态栏&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/powerline/powerline&quot; title=&quot;powerline/powerline&quot;&gt;powerline/powerline&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;自定义状态栏&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/liuchengxu/vim-which-key&quot; title=&quot;&quot;&gt;liuchengxu/vim-which-key&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;在pop-up窗口中显示快捷键定义&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/mbbill/undotree&quot; title=&quot;&quot;&gt;mbbill/undotree&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;视觉化的undo历史&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/sjl/gundo.vim&quot; rel=&quot;sjl/gundo.vim&quot;&gt;sjl/gundo.vim&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;视觉化的undo历史&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/kshenoy/vim-signature&quot; title=&quot;&quot;&gt;kshenoy/vim-signature&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;在屏幕最左侧显示标记【&lt;a href=&quot;http://yyq123.github.io/learn-vim/learn-vi-53-Mark.html#plugin-vim-signature&quot; title=&quot;vim-signature&quot;&gt;详细介绍&lt;/a&gt;】&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/nathanaelkane/vim-indent-guides&quot; title=&quot;&quot;&gt;nathanaelkane/vim-indent-guides&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;可视化显示缩进级别&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/ryanoasis/vim-devicons&quot; title=&quot;ryanoasis/vim-devicons&quot;&gt;ryanoasis/vim-devicons&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;根据文件类型显示图标&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/bagrat/vim-buffet&quot; title=&quot;bagrat/vim-buffet&quot;&gt;bagrat/vim-buffet&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;自定义Tabline显示缓冲区列表&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/t9md/vim-choosewin&quot; title=&quot;&quot;&gt;t9md/vim-choosewin&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;类似TMUX的display-pane快速选择窗口&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;h3&gt;&lt;a aria-hidden=&quot;true&quot; class=&quot;anchor&quot; href=&quot;http://yyq123.github.io/learn-vim/learn-vim-plugin.html#data&quot; id=&quot;data&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;octicon octicon-link&quot;&gt;&lt;/span&gt;&lt;/a&gt;数据&lt;/h3&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/chrisbra/csv.vim&quot; title=&quot;&quot;&gt;chrisbra/csv.vim&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;处理按列存储的数据文件&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/mechatroner/rainbow_csv&quot; title=&quot;mechatroner/rainbow_csv&quot;&gt;mechatroner/rainbow_csv&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;以多种色彩显示CSV文件，并支持类似SQL的查询语言&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/vim-scripts/VisIncr&quot; title=&quot;vim-scripts/VisIncr&quot;&gt;vim-scripts/VisIncr&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;增加数值和日期等&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;h3&gt;&lt;a aria-hidden=&quot;true&quot; class=&quot;anchor&quot; href=&quot;http://yyq123.github.io/learn-vim/learn-vim-plugin.html#sytanx&quot; id=&quot;sytanx&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;octicon octicon-link&quot;&gt;&lt;/span&gt;&lt;/a&gt;语法&lt;/h3&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/hail2u/vim-css3-syntax&quot; title=&quot;&quot;&gt;hail2u/vim-css3-syntax&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;CSS3 syntax support to vim&#39;s built-in syntax/css.vim&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/cakebaker/scss-syntax.vim&quot; title=&quot;&quot;&gt;cakebaker/scss-syntax.vim&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Syntax file for scss (Sassy CSS)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/othree/html5.vim&quot; title=&quot;&quot;&gt;othree/html5.vim&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;HTML5 omnicomplete and syntax&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/plasticboy/vim-markdown&quot; title=&quot;&quot;&gt;plasticboy/vim-markdown&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Markdown syntax highlighting&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/rhysd/vim-gfm-syntax&quot; title=&quot;&quot;&gt;rhysd/vim-gfm-syntax&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;GitHub Flavored Markdown syntax highlight extension&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/pangloss/vim-javascript&quot; title=&quot;&quot;&gt;pangloss/vim-javascript&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Enhanced Javascript syntax&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/heavenshell/vim-jsdoc&quot; title=&quot;&quot;&gt;heavenshell/vim-jsdoc&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Generate JSDoc to your JavaScript code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/elzr/vim-json&quot; title=&quot;&quot;&gt;elzr/vim-json&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Better JSON support&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/vim-python/python-syntax&quot; title=&quot;&quot;&gt;vim-python/python-syntax&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Enhanced version of the original Python syntax&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/Vimjas/vim-python-pep8-indent&quot; title=&quot;&quot;&gt;Vimjas/vim-python-pep8-indent&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;A nicer Python indentation style&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/vim-jp/syntax-vim-ex&quot; title=&quot;&quot;&gt;vim-jp/syntax-vim-ex&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Improved Vim syntax highlighting&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/ekalinin/Dockerfile.vim&quot; title=&quot;&quot;&gt;ekalinin/Dockerfile.vim&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Syntax and snippets for Dockerfile&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/tmux-plugins/vim-tmux&quot; title=&quot;&quot;&gt;tmux-plugins/vim-tmux&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Plugin for tmux.conf&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/MTDL9/vim-log-highlighting&quot; title=&quot;&quot;&gt;MTDL9/vim-log-highlighting&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Syntax highlighting for generic log files&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/mboughaba/i3config.vim&quot; title=&quot;&quot;&gt;mboughaba/i3config.vim&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;i3 window manager config syntax&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/jstrater/mpvim&quot; title=&quot;&quot;&gt;jstrater/mpvim&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Macports portfile configuration files&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/chr4/nginx.vim&quot; title=&quot;&quot;&gt;chr4/nginx.vim&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Improved nginx syntax and indent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/vim-syntastic/syntastic&quot; title=&quot;vim-syntastic/syntastic&quot;&gt;vim-syntastic/syntastic&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;语法检查&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/dense-analysis/ale&quot; title=&quot;dense-analysis/ale&quot;&gt;dense-analysis/ale&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;支持LSP的异步语法检查&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;h3&gt;&lt;a aria-hidden=&quot;true&quot; class=&quot;anchor&quot; href=&quot;http://yyq123.github.io/learn-vim/learn-vim-plugin.html#git&quot; id=&quot;git&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;octicon octicon-link&quot;&gt;&lt;/span&gt;&lt;/a&gt;Git&lt;/h3&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/jreybert/vimagit&quot; title=&quot;jreybert/vimagit&quot;&gt;jreybert/vimagit&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;简化Git工作流程&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/lambdalisue/gina.vim&quot; title=&quot;lambdalisue/gina.vim&quot;&gt;lambdalisue/gina.vim&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;异部控制Git&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/airblade/vim-gitgutter&quot; title=&quot;airblade/vim-gitgutter&quot;&gt;airblade/vim-gitgutter&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;显示和控制Git变更&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/tpope/vim-fugitive&quot; title=&quot;tpope/vim-fugitive&quot;&gt;tpope/vim-fugitive&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Git plugin for Vim&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/mattn/vim-gist&quot; title=&quot;mattn/vim-gist&quot;&gt;mattn/vim-gist&lt;/a&gt;&amp;nbsp;&lt;span class=&quot;pl-v&quot;&gt;★&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;管理存储在&lt;a href=&quot;https://gist.github.com/&quot; title=&quot;Gist&quot;&gt;Gist&lt;/a&gt;的代码片段【&lt;a href=&quot;http://yyq123.github.io/learn-vim/learn-vi-103-plugin-Gist.html&quot; title=&quot;vim-plug&quot;&gt;详细介绍&lt;/a&gt;】&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;h3&gt;&lt;a aria-hidden=&quot;true&quot; class=&quot;anchor&quot; href=&quot;http://yyq123.github.io/learn-vim/learn-vim-plugin.html#writing&quot; id=&quot;writing&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;octicon octicon-link&quot;&gt;&lt;/span&gt;&lt;/a&gt;写作&lt;/h3&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/junegunn/goyo.vim&quot; title=&quot;junegunn/goyo&quot;&gt;junegunn/goyo&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;无干扰（Distraction-free）写作&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/junegunn/limelight.vim&quot; title=&quot;junegunn/limelight&quot;&gt;junegunn/limelight&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;无干扰（Hyperfocus）写作&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/reedes/vim-wordy&quot; title=&quot;reedes/vim-wordy&quot;&gt;reedes/vim-wordy&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;识别经常被误用的英文单词和短语&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/mzlogin/vim-markdown-toc&quot; title=&quot;mzlogin/vim-markdown-toc&quot;&gt;mzlogin/vim-markdown-toc&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;自动生成Markdown目录（TOC）标签&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/iamcco/markdown-preview.nvim&quot; title=&quot;iamcco/markdown-preview.nvim&quot;&gt;iamcco/markdown-preview.nvim&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;使用浏览器预览Markdown文件&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/chrisbra/unicode.vim&quot; title=&quot;chrisbra/unicode.vim&quot;&gt;chrisbra/unicode.vim&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;输入和查询unicode字符和Digraphs&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;h3&gt;&lt;a aria-hidden=&quot;true&quot; class=&quot;anchor&quot; href=&quot;http://yyq123.github.io/learn-vim/learn-vim-plugin.html#motion&quot; id=&quot;motion&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;octicon octicon-link&quot;&gt;&lt;/span&gt;&lt;/a&gt;快速移动&lt;/h3&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/haya14busa/vim-asterisk&quot; title=&quot;&quot;&gt;haya14busa/vim-asterisk&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;增强的&lt;code&gt;*&lt;/code&gt;命令&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/haya14busa/vim-edgemotion&quot; title=&quot;&quot;&gt;haya14busa/vim-edgemotion&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;跳转到代码块的边界&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/easymotion/vim-easymotion&quot; title=&quot;easymotion/vim-easymotion&quot;&gt;easymotion/vim-easymotion&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;快速移动&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/terryma/vim-multiple-cursors&quot; title=&quot;terryma/vim-multiple-cursors&quot;&gt;terryma/vim-multiple-cursors&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;多重光标选择&lt;/td&gt;
&lt;/tr&gt;

&lt;/tbody&gt;
&lt;/table&gt;

&lt;h3&gt;&lt;a aria-hidden=&quot;true&quot; class=&quot;anchor&quot; href=&quot;http://yyq123.github.io/learn-vim/learn-vim-plugin.html#completion&quot; id=&quot;completion&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;octicon octicon-link&quot;&gt;&lt;/span&gt;&lt;/a&gt;自动完成&lt;/h3&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/othree/csscomplete.vim&quot; title=&quot;othree/csscomplete.vim&quot;&gt;othree/csscomplete.vim&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;增强的CSS自动完成&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/prabirshrestha/asyncomplete.vim&quot; title=&quot;prabirshrestha/asyncomplete.vim&quot;&gt;prabirshrestha/asyncomplete.vim&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;异步自动完成&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/prabirshrestha/vim-lsp&quot; title=&quot;prabirshrestha/vim-lsp&quot;&gt;prabirshrestha/vim-lsp&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;异步语言服务器协议插件&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/mattn/vim-lsp-settings&quot; title=&quot;mattn/vim-lsp-settings&quot;&gt;mattn/vim-lsp-settings&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;vim-lsp自动配置&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/ycm-core/YouCompleteMe&quot; title=&quot;ycm-core/YouCompleteMe&quot;&gt;ycm-core/YouCompleteMe&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;代码自动完成&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;h3&gt;&lt;a aria-hidden=&quot;true&quot; class=&quot;anchor&quot; href=&quot;http://yyq123.github.io/learn-vim/learn-vim-plugin.html#html&quot; id=&quot;html&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;octicon octicon-link&quot;&gt;&lt;/span&gt;&lt;/a&gt;HTML&lt;/h3&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/yyq123/HTML-Editor&quot; title=&quot;yyq123/HTML-Editor&quot;&gt;yyq123/HTML-Editor&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;HTML代码输入和网页预览【&lt;a href=&quot;http://yyq123.github.io/learn-vim/learn-vi-601-WebDesign-HTMLTag-Input.html&quot; title=&quot;&quot;&gt;详细介绍&lt;/a&gt;】&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/alvan/vim-closetag&quot; title=&quot;alvan/vim-closetag&quot;&gt;alvan/vim-closetag&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;自动关闭(X)HTML标签&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/mattn/emmet-vim&quot; title=&quot;mattn/emmet-vim&quot;&gt;mattn/emmet-vim&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;类似&lt;a href=&quot;https://emmet.io/&quot; title=&quot;emmet&quot;&gt;&lt;/a&gt;emmet的HTML代码快速输入&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;h3&gt;&lt;a aria-hidden=&quot;true&quot; class=&quot;anchor&quot; href=&quot;http://yyq123.github.io/learn-vim/learn-vim-plugin.html#text-objects&quot; id=&quot;text-objects&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;octicon octicon-link&quot;&gt;&lt;/span&gt;&lt;/a&gt;文本对象&lt;/h3&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/wellle/targets.vim&quot; title=&quot;wellle/targets.vim&quot;&gt;wellle/targets.vim&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;扩展文本对象&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/kana/vim-operator-user&quot; title=&quot;kana/vim-operator-user&quot;&gt;kana/vim-operator-user&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;自定义操作符（operators）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/kana/vim-operator-replace&quot; title=&quot;kana/vim-operator-replace&quot;&gt;kana/vim-operator-replace&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;使用寄存器内容进行替换操作&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/jiangmiao/auto-pairs&quot; title=&quot;jiangmiao/auto-pairs&quot;&gt;jiangmiao/auto-pairs&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;自动输入和删除成对出现的括号和引号等&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/tpope/vim-surround&quot; title=&quot;tpope/vim-surround&quot;&gt;tpope/vim-surround&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;环绕字符编辑【&lt;a href=&quot;http://yyq123.github.io/learn-vim/learn-vim-plugin-surround.html&quot; title=&quot;vim-surround&quot;&gt;详细介绍&lt;/a&gt;】&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/machakann/vim-sandwich&quot; title=&quot;&quot;&gt;machakann/vim-sandwich&lt;/a&gt;&lt;span class=&quot;pl-k&quot;&gt;&amp;nbsp;★&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;环绕字符编辑【&lt;a href=&quot;http://yyq123.github.io/learn-vim/learn-vim-plugin-sandwich.html&quot; title=&quot;vim-sandwich&quot;&gt;详细介绍&lt;/a&gt;】&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/kana/vim-textobj-user&quot; title=&quot;&quot;&gt;kana/vim-textobj-user&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;自定义文本对象&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/terryma/vim-expand-region&quot; title=&quot;&quot;&gt;terryma/vim-expand-region&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;渐进可视化区域选择文本&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/chrisbra/matchit&quot; title=&quot;chrisbra/matchit&quot;&gt;chrisbra/matchit&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;%&lt;/code&gt;命令功能扩展【&lt;a href=&quot;http://yyq123.github.io/learn-vim/learn-vim-matchpairs.html#matchit-install&quot; title=&quot;&quot;&gt;详细介绍&lt;/a&gt;】&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/andymass/vim-matchup&quot; title=&quot;andymass/vim-matchup&quot;&gt;andymass/vim-matchup&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;%&lt;/code&gt;命令功能扩展&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/AndrewRadev/sideways.vim&quot; title=&quot;nofollow&quot;&gt;AndrewRadev/sideways.vim&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;匹配函数参数&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/osyo-manga/vim-textobj-multiblock&quot; title=&quot;osyo-manga/vim-textobj-multiblock&quot;&gt;osyo-manga/vim-textobj-multiblock&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;处理成对括号&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/kana/vim-textobj-function&quot; title=&quot;kana/vim-textobj-function&quot;&gt;kana/vim-textobj-function&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;函数相关文本对象&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;h3&gt;&lt;a aria-hidden=&quot;true&quot; class=&quot;anchor&quot; href=&quot;http://yyq123.github.io/learn-vim/learn-vim-plugin.html#coding&quot; id=&quot;coding&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;octicon octicon-link&quot;&gt;&lt;/span&gt;&lt;/a&gt;编程辅助&lt;/h3&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/AndrewRadev/splitjoin.vim&quot; title=&quot;nofollow&quot;&gt;AndrewRadev/splitjoin.vim&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;拆分/合并行&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/AndrewRadev/linediff.vim&quot; title=&quot;AndrewRadev/linediff.vim&quot;&gt;AndrewRadev/linediff.vim&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;代码块比较&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/SirVer/ultisnips&quot; title=&quot;SirVer/ultisnips&quot;&gt;SirVer/ultisnips&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;代码片段管理&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/garbas/vim-snipmate&quot; title=&quot;garbas/vim-snipmate&quot;&gt;garbas/vim-snipmate&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;代码片段管理&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/honza/vim-snippets&quot; title=&quot;honza/vim-snippets&quot;&gt;honza/vim-snippets&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;代码片段管理&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/tyru/caw.vim&quot; title=&quot;tyru/caw.vim&quot;&gt;tyru/caw.vim&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;注释工具&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/ludovicchabant/vim-gutentags&quot; title=&quot;&quot;&gt;ludovicchabant/vim-gutentags&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;管理tag文件&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/luochen1990/rainbow&quot; title=&quot;luochen1990/rainbow&quot;&gt;luochen1990/rainbow&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;多重色彩括号【&lt;a href=&quot;http://yyq123.github.io/learn-vim/learn-vim-plugin-RainbowParentheses.html#RP-Install&quot; title=&quot;Rainbow Parentheses&quot;&gt;详细介绍&lt;/a&gt;】&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/vim-scripts/Rainbow-Parenthsis-Bundle&quot; title=&quot;vim-scripts/Rainbow-Parenthsis-Bundle&quot;&gt;Rainbow-Parenthsis-Bundle&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;多重色彩括号【&lt;a href=&quot;http://yyq123.github.io/learn-vim/learn-vim-plugin-RainbowParentheses.html#RPI-Install&quot; title=&quot;Rainbow Parentheses Improved&quot;&gt;详细介绍&lt;/a&gt;】&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/rhysd/devdocs.vim&quot; title=&quot;rhysd/devdocs.vim&quot;&gt;rhysd/devdocs.vim&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;查询&lt;a href=&quot;https://devdocs.io/&quot; title=&quot;devdocs.io&quot;&gt;devdocs.io&lt;/a&gt;离线文档&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/rizzatti/dash.vim&quot; title=&quot;rizzatti/dash.vim&quot;&gt;rizzatti/dash.vim&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;查询&lt;a href=&quot;https://kapeli.com/dash&quot; title=&quot;Dash.app&quot;&gt;Dash.app&lt;/a&gt;离线文档&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/KabbAmine/zeavim.vim&quot; title=&quot;KabbAmine/zeavim.vim&quot;&gt;KabbAmine/zeavim.vim&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;查询&lt;a href=&quot;https://zealdocs.org/&quot; title=&quot;Zeal&quot;&gt;Zeal&lt;/a&gt;离线文档【&lt;a href=&quot;http://yyq123.github.io/learn-vim/learn-vim-plugin-Zeavim.html&quot; title=&quot;&quot;&gt;详细介绍&lt;/a&gt;】&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;h3&gt;&lt;a aria-hidden=&quot;true&quot; class=&quot;anchor&quot; href=&quot;http://yyq123.github.io/learn-vim/learn-vim-plugin.html#others&quot; id=&quot;others&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;octicon octicon-link&quot;&gt;&lt;/span&gt;&lt;/a&gt;其它&lt;/h3&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/junegunn/fzf.vim&quot; title=&quot;junegunn/fzf.vim&quot;&gt;junegunn/fzf.vim&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;集成Fzf模糊查询工具&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/skywind3000/asyncrun.vim&quot; title=&quot;skywind3000/asyncrun.vim&quot;&gt;skywind3000/asyncrun.vim&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;后台异步执行外部命令&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

	&lt;p style=&quot;border-top: 1px solid lightgray;&quot;&gt;&lt;span style=&quot;float: right;&quot;&gt;Ver: 2.0&amp;nbsp;|&amp;nbsp;&lt;a href=&quot;mailto:yyq123@gmail.com&quot;&gt;YYQ&lt;/a&gt;&lt;/span&gt;&amp;lt;&lt;a href=&quot;http://yyq123.github.io/learn-vim/learn-vi-203-Install-Vim-Win.html&quot; title=&quot;在Windows下安装Vim&quot;&gt;上一篇&lt;/a&gt;&amp;nbsp;|&lt;a href=&quot;http://yyq123.github.com/learn-vim/learn-vi-00-00-TOC.html&quot; title=&quot;笔记列表&quot;&gt;&amp;nbsp;目录&amp;nbsp;&lt;/a&gt;|&amp;nbsp;&lt;a href=&quot;http://yyq123.github.io/learn-vim/learn-vi-202-Install-Vim-Mac.html&quot; title=&quot;在Mac下安装Vim&quot;&gt;下一篇&lt;/a&gt;&amp;gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://yyq123.blogspot.com/feeds/7343323666030066432/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='http://yyq123.blogspot.com/2020/10/learn-vim-plugin.html#comment-form' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7045570/posts/default/7343323666030066432'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7045570/posts/default/7343323666030066432'/><link rel='alternate' type='text/html' href='http://yyq123.blogspot.com/2020/10/learn-vim-plugin.html' title='VIM学习笔记 插件列表 (Plugins)'/><author><name>YYQ</name><uri>http://www.blogger.com/profile/00702527262114879030</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7045570.post-5674325907678291179</id><published>2020-09-25T21:07:00.003+08:00</published><updated>2020-09-25T21:29:09.287+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="[知]"/><category scheme="http://www.blogger.com/atom/ns#" term="OpenSource"/><category scheme="http://www.blogger.com/atom/ns#" term="Software"/><category scheme="http://www.blogger.com/atom/ns#" term="Vim"/><title type='text'>VIM学习笔记 环绕字符编辑(sandwich)</title><content type='html'>	&lt;p&gt;&lt;a style=&quot;font-weight:bold&quot; href=&quot;https://github.com/machakann/vim-sandwich&quot; title=&quot;sandwich&quot;&gt;sandwich&lt;/a&gt;&amp;nbsp;插件可以快速编辑围绕在内容两端的字符（pairs of things surrounding things），比如成对出现的括号、引号，甚至HTML/XML标签等。&lt;/p&gt;
	&lt;p&gt;sandwich支持vim的&lt;a href=&quot;https://yyq123.github.io/learn-vim/learn-vi-10-TextObjects.html&quot; title=&quot;文本对象(Text Objects)&quot;&gt;文本对象&lt;/a&gt;（Text Objects)，比如单词、句子和段落等等。同时也支持&lt;code&gt;.&lt;/code&gt;重复命令（Dot Command）。&lt;/p&gt;

	&lt;h2 class=&quot;article&quot;&gt;&lt;a id=&quot;Install&quot;&gt;安装配置&lt;/a&gt;&lt;/h2&gt;
	&lt;p&gt;推荐您使用&lt;a href=&quot;http://yyq123.github.io/learn-vim/learn-vi-102-plugin-plug.html&quot; title=&quot;插件管理器(vim-plug)&quot;&gt;vim-plug&lt;/a&gt;或&lt;a href=&quot;http://yyq123.github.io/learn-vim/learn-vi-101-plugin-vundle.html&quot; title=&quot;插件管理器(Vundle)&quot;&gt;Vundle&lt;/a&gt;等插件管理器，来安装GitHub上的&lt;a href=&quot;https://github.com/machakann/vim-sandwich&quot; title=&quot;surround&quot;&gt;sandwich&lt;/a&gt;插件。&lt;/p&gt;

	&lt;p&gt;以下将利用实例来介绍sandwich插件的主要功能，请注意：&lt;/p&gt;
	&lt;ul&gt;
		&lt;li&gt;在&amp;ldquo;原始文本&amp;rdquo;列中，&lt;mark&gt;高亮文字&lt;/mark&gt;表示光标所在位置；&lt;/li&gt;
		&lt;li&gt;在&amp;ldquo;命令&amp;rdquo;列中，为顺序执行的命令序列；&lt;/li&gt;
		&lt;li&gt;在&amp;ldquo;更改效果&amp;rdquo;列中，为命令执行之后的结果。您可以参考&lt;a href=&quot;https://github.com/yyq123/learn-vim/blob/master/samples/surroundings.txt&quot; title=&quot;surroundings&quot;&gt;实例文件&lt;/a&gt;并自行测试。&lt;/li&gt;
	&lt;/ul&gt;

	&lt;h2 class=&quot;article&quot;&gt;&lt;a id=&quot;add&quot;&gt;新增环绕字符&lt;/a&gt;&lt;/h2&gt;
	&lt;p&gt;在常规模式和可视化模式下，可以使用&lt;code&gt;sa&lt;/code&gt;命令来新增环绕字符：&lt;/p&gt;
	&lt;table summary=&quot;Commands&quot; border=&quot;1&quot; frame=&quot;border&quot; rules=&quot;all&quot; cellspacing=&quot;0&quot; cellpadding=&quot;5&quot;&gt;
		&lt;tr&gt;&lt;th&gt;模式&lt;/th&gt;&lt;th&gt;目标&lt;br /&gt;范围&lt;/th&gt;&lt;th&gt;新增&lt;br /&gt;内容&lt;/th&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 style=&quot;font-weight:bold; text-align:center&quot; rowspan=&quot;9&quot;&gt;常规模式&lt;/td&gt;&lt;td&gt;单词&lt;/td&gt;&lt;td&gt;字符&lt;/td&gt;&lt;td&gt;Hello &lt;mark&gt;W&lt;/mark&gt;orld&lt;/td&gt;&lt;td&gt;&lt;code&gt;saiw*&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Hello *World*&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;单词不含标点&lt;/td&gt;&lt;td&gt;引号&lt;/td&gt;&lt;td&gt;Hello &lt;mark&gt;W&lt;/mark&gt;orld!&lt;/td&gt;&lt;td&gt;&lt;code&gt;saiw&#39;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Hello &#39;World&#39;!&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;单词包含标点&lt;/td&gt;&lt;td&gt;引号&lt;/td&gt;&lt;td&gt;Hello &lt;mark&gt;W&lt;/mark&gt;orld!&lt;/td&gt;&lt;td&gt;&lt;code&gt;saiW&#39;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Hello &#39;World!&#39;&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;单词&lt;/td&gt;&lt;td&gt;标签&lt;/td&gt;&lt;td&gt;Hello &lt;mark&gt;W&lt;/mark&gt;orld&lt;/td&gt;&lt;td&gt;&lt;code&gt;saiwtstrong&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Hello &amp;lt;strong&amp;gt;World&amp;lt;/strong&amp;gt;&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;单词&lt;/td&gt;&lt;td&gt;括号&lt;/td&gt;&lt;td&gt;print &lt;mark&gt;v&lt;/mark&gt;ar1, var2&lt;/td&gt;&lt;td&gt;&lt;code&gt;sa3w)&lt;/code&gt;&lt;/td&gt;&lt;td&gt;print (var1, var2)&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;行尾&lt;/td&gt;&lt;td&gt;括号&lt;/td&gt;&lt;td&gt;print &lt;mark&gt;v&lt;/mark&gt;ar1, var2&lt;/td&gt;&lt;td&gt;&lt;code&gt;sa$)&lt;/code&gt;&lt;/td&gt;&lt;td&gt;print (var1, var2)&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;查找&lt;/td&gt;&lt;td&gt;标签&lt;/td&gt;&lt;td&gt;William Shakespeare said, &lt;br /&gt;&lt;mark&gt;&quot;&lt;/mark&gt;Brevity is the soul of wit.&quot;&lt;/td&gt;&lt;td&gt;&lt;code&gt;saf&quot;tem&lt;/code&gt;&lt;/td&gt;&lt;td&gt;William Shakespeare said, &lt;br /&gt;&amp;lt;em&amp;gt;&amp;quot;Brevity is the soul of wit.&amp;quot;&amp;lt;/em&amp;gt;&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;整行&lt;/td&gt;&lt;td&gt;字符&lt;/td&gt;&lt;td&gt;Hello &lt;mark&gt;W&lt;/mark&gt;orld&lt;/td&gt;&lt;td&gt;&lt;code&gt;0sa$&quot;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&quot;Hello World&quot;&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;整行&lt;/td&gt;&lt;td&gt;标签&lt;/td&gt;&lt;td&gt;Hello &lt;mark&gt;W&lt;/mark&gt;orld&lt;/td&gt;&lt;td&gt;&lt;code&gt;0sa$tp&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&amp;lt;p&amp;gt;Hello World&amp;lt;/p&amp;gt;&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td style=&quot;font-weight:bold; text-align:center&quot; rowspan=&quot;2&quot;&gt;字符可视化模式&lt;/td&gt;&lt;td&gt;选中的文本&lt;/td&gt;&lt;td&gt;括号&lt;/td&gt;&lt;td&gt;print &lt;mark&gt;v&lt;/mark&gt;ar1, var2&lt;/td&gt;&lt;td&gt;&lt;code&gt;veesa)&lt;/code&gt;&lt;/td&gt;&lt;td&gt;print (var1, var2)&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;选中的文本&lt;/td&gt;&lt;td&gt;标签&lt;/td&gt;&lt;td&gt;&lt;mark&gt;T&lt;/mark&gt;he passion to save humanity is a&lt;br /&gt;cover for the desire to rule it.&lt;/td&gt;&lt;td&gt;&lt;code&gt;v$jsatp&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&amp;lt;p&amp;gt;The passion to save humanity is a&lt;br /&gt;cover for the desire to rule it.&amp;lt;/p&amp;gt;&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td style=&quot;font-weight:bold; text-align:center&quot; rowspan=&quot;2&quot;&gt;行可视化模式&lt;/td&gt;&lt;td&gt;整行&lt;/td&gt;&lt;td&gt;新行&lt;/td&gt;&lt;td&gt;Hello &lt;mark&gt;W&lt;/mark&gt;orld&lt;/td&gt;&lt;td&gt;&lt;code&gt;Vsa)&lt;/code&gt;&lt;/td&gt;&lt;td&gt;(&lt;br /&gt;Hello World&lt;br /&gt;)&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;选中的文本&lt;/td&gt;&lt;td&gt;标签&lt;br /&gt;新行&lt;/td&gt;&lt;td&gt;&lt;mark&gt;T&lt;/mark&gt;he passion to save humanity is a&lt;br /&gt;cover for the desire to rule it.&lt;/td&gt;&lt;td&gt;&lt;code&gt;Vjsatp&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&amp;lt;p&amp;gt;&lt;br /&gt;The passion to save humanity is a&lt;br /&gt;cover for the desire to rule it.&lt;br /&gt;&amp;lt;/p&amp;gt;&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td style=&quot;font-weight:bold; text-align:center&quot;&gt;块可视化模式&lt;/td&gt;&lt;td&gt;选中的文本&lt;/td&gt;&lt;td&gt;标签&lt;/td&gt;&lt;td&gt;&lt;mark&gt;I&lt;/mark&gt;tem 1&lt;br/&gt;Item 2&lt;br/&gt;Item 3&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;lt;Ctrl-Q&amp;gt;$jjsatli&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&amp;lt;li&amp;gt;Item 1&amp;lt;/li&amp;gt;&lt;br/&gt;&amp;lt;li&amp;gt;Item 2&amp;lt;/li&amp;gt;&lt;br/&gt;&amp;lt;li&amp;gt;Item 3&amp;lt;/li&amp;gt;&lt;/td&gt;&lt;/tr&gt;
	&lt;/table&gt;
	&lt;p&gt;&lt;a href=&quot;https://yyq123.github.io/learn-vim/images/plugin_sandwich_saiwt.gif&quot; title=&quot;plugin_sandwich_saiwt&quot;&gt;&lt;img src=&quot;https://yyq123.github.io/learn-vim/images/plugin_sandwich_saiwt.gif&quot; alt=&quot;plugin_sandwich_saiwt&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
	&lt;p&gt;从以上屏幕录像中可以看到：&lt;/p&gt;
	&lt;ul&gt;
		&lt;li&gt;插件提供了友好的视觉反馈。将根据指定的文本对象，自动高亮显示命令将影响的操作范围。例如输入saiw命令时，将高亮显示当前单词；当在可视化模式下操作多行字符时，视觉提示将使用户更加胸有成竹。&lt;/li&gt;
		&lt;li&gt;命令中的&lt;code&gt;t&lt;/code&gt;表示标签，将在屏幕底部显示提示行，在其中输入的标签名称然后按回车键即可（并不需要输入&amp;lt;&amp;gt;）；&lt;/li&gt;
	&lt;/ul&gt;
	&lt;p&gt;请注意：&lt;/p&gt;
	&lt;ol&gt;
		&lt;li&gt;插入模式下，并没有专门用于输入环绕字符的快捷键。&lt;/li&gt;
			&lt;/ul&gt;
		&lt;/li&gt;
		&lt;li&gt;可视化模式下的操作：
			&lt;ul&gt;
				&lt;li&gt;首先使用快捷键进入不同类型的可视化模式。&lt;br /&gt;比如在Windows下，使用&lt;kbd&gt;CTRL-Q&lt;/kbd&gt;键进入块视化模式；&lt;/li&gt;
				&lt;li&gt;然后使用&lt;kbd&gt;j&lt;/kbd&gt;等移动命令来选中文本；&lt;/li&gt;
				&lt;li&gt;最后点击&lt;kbd&gt;sa&lt;/kbd&gt;键，并输入环绕字符或标签。&lt;/li&gt;
			&lt;/ul&gt;
		&lt;/li&gt;
	&lt;/ol&gt;

	&lt;h2 class=&quot;article&quot;&gt;&lt;a id=&quot;change&quot;&gt;修改环绕字符&lt;/a&gt;&lt;/h2&gt;
	&lt;p&gt;使用&lt;code class=&quot;inset&quot;&gt;sr&lt;/code&gt;命令可以修改环绕字符：&lt;/p&gt;
	&lt;table summary=&quot;Commands&quot; border=&quot;1&quot; frame=&quot;border&quot; rules=&quot;all&quot; cellspacing=&quot;0&quot; cellpadding=&quot;5&quot;&gt;
		&lt;tr&gt;&lt;th&gt;替换内容&lt;/th&gt;&lt;th&gt;原始文本&lt;/th&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;引号&lt;/td&gt;&lt;td&gt;&quot;Hello &lt;mark&gt;W&lt;/mark&gt;orld&quot;&lt;/td&gt;&lt;td&gt;&lt;code&gt;srb&#39;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&#39;Hello World&#39;&lt;/td&gt;&lt;td&gt;使用标识符b来指代环绕字符&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;标签&lt;/td&gt;&lt;td&gt;&#39;Hello &lt;mark&gt;W&lt;/mark&gt;orld&#39;&lt;/td&gt;&lt;td&gt;&lt;code&gt;srbTp&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&amp;lt;p&amp;gt;Hello World&amp;lt;/p&amp;gt;&lt;/td&gt;&lt;td&gt;使用标识符T来输入包含尖括号的完整标签&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;标签&lt;/td&gt;&lt;td&gt;&amp;lt;p&amp;gt;Hello &lt;mark&gt;W&lt;/mark&gt;orld&amp;lt;/p&amp;gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;srtth1&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&amp;lt;h1&amp;gt;Hello World&amp;lt;/h1&amp;gt;&lt;/td&gt;&lt;td&gt;使用标识符t来指代尖括号之内的标签名称&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;标签&lt;/td&gt;&lt;td&gt;&amp;lt;h1&amp;gt;Hello &lt;mark&gt;W&lt;/mark&gt;orld&amp;lt;/h1&amp;gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;srT)&lt;/code&gt;&lt;/td&gt;&lt;td&gt;(Hello World)&lt;/td&gt;&lt;td&gt;使用标识符T来指代包含尖括号的完整标签&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;括号&lt;/td&gt;&lt;td&gt;(1,&lt;mark&gt;2&lt;/mark&gt;,3)&lt;/td&gt;&lt;td&gt;&lt;code&gt;srb]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;[1,2,3]&lt;/td&gt;&lt;td&gt;使用闭括号替换环绕字符&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;括号及空格&lt;/td&gt;&lt;td&gt;(1,&lt;mark&gt;2&lt;/mark&gt;,3)&lt;/td&gt;&lt;td&gt;&lt;code&gt;srb[&lt;/code&gt;&lt;/td&gt;&lt;td&gt;[&amp;nbsp;1,2,3&amp;nbsp;]&lt;/td&gt;&lt;td&gt;使用&lt;a href=&quot;#recipes&quot; title=&quot;recipes&quot;&gt;自定义&lt;/a&gt;开括号替换环绕字符并增加间隔空格&lt;/td&gt;&lt;/tr&gt;
	&lt;/table&gt;
	&lt;p&gt;从以上sr命令可以看到，并不需要明确指明环绕字符，而可以通过标识符&lt;code&gt;b&lt;/code&gt;来指代，既聪明又方便。&lt;/p&gt;
	&lt;p&gt;随着命令输入，会以高亮显示将被替换的环绕字符，以便在操作之前确认范围是否正确。&lt;/p&gt;
	&lt;p&gt;&lt;a href=&quot;https://yyq123.github.io/learn-vim/images/plugin_sandwich_srbT.gif&quot; title=&quot;plugin_sandwich_srbT&quot;&gt;&lt;img src=&quot;https://yyq123.github.io/learn-vim/images/plugin_sandwich_srbT.gif&quot; alt=&quot;plugin_sandwich_srbT&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

	&lt;h2 class=&quot;article&quot;&gt;&lt;a id=&quot;delete&quot;&gt;删除环绕字符&lt;/a&gt;&lt;/h2&gt;
	&lt;p&gt;使用&lt;code class=&quot;inset&quot;&gt;sd&lt;/code&gt;命令可以删除环绕字符：&lt;/p&gt;
	&lt;table summary=&quot;Commands&quot; border=&quot;1&quot; frame=&quot;border&quot; rules=&quot;all&quot; cellspacing=&quot;0&quot; cellpadding=&quot;5&quot;&gt;
		&lt;tr&gt;&lt;th&gt;新增内容&lt;/th&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;引号&lt;/td&gt;&lt;td&gt;&#39;Hello &lt;mark&gt;W&lt;/mark&gt;orld&#39;&lt;/td&gt;&lt;td&gt;&lt;code&gt;sdb&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Hello World&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;括号&lt;/td&gt;&lt;td&gt;(1&lt;mark&gt;2&lt;/mark&gt;3+4*56)/2&lt;/td&gt;&lt;td&gt;&lt;code&gt;sdb&lt;/code&gt;&lt;/td&gt;&lt;td&gt;123+4*56/2&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;标签&lt;/td&gt;&lt;td&gt;&amp;lt;div&amp;gt;&lt;mark&gt;H&lt;/mark&gt;ello&amp;lt;/div&amp;gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;sdt&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Hello&lt;/td&gt;&lt;/tr&gt;
	&lt;/table&gt;
	&lt;p&gt;同样在sd删除命令中，也不需要明确指明环绕字符，而可以通过标识符&lt;code&gt;b&lt;/code&gt;来指代，大大减少了命令的复杂度。&lt;/p&gt;

	&lt;h2 class=&quot;article&quot;&gt;&lt;a id=&quot;HTMLTag&quot;&gt;HTML标签&lt;/a&gt;&lt;/h2&gt;
	&lt;p&gt;假设需要针对以下文本，添加包含多个属性的HTML标签：&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;Hello World&lt;/pre&gt;
	&lt;p&gt;可以使用以下命令，简化标签的录入：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;sa$tp.class1#id1&lt;/code&gt;&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;&amp;lt;p class=&amp;quot;class1&amp;quot; id=&amp;quot;id1&amp;quot;&amp;gt;Hello World&amp;lt;/p&amp;gt;&lt;/pre&gt;
	&lt;p&gt;假设需要针对以下文本段落，添加&amp;lt;blockquote&amp;gt;标签：&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;The passion to save humanity is a
cover for the desire to rule it.&lt;/pre&gt;
	&lt;p&gt;可以使用以下命令，针对整个段落进行操作：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;sa}tblockquote&lt;/code&gt;&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;&amp;lt;blockquote&amp;gt;The passion to save humanity is a
cover for the desire to rule it.&amp;lt;/blockquote&amp;gt;&lt;/pre&gt;

	&lt;h2 class=&quot;article&quot;&gt;&lt;a id=&quot;Keymap&quot;&gt;自定义快捷键&lt;/a&gt;&lt;/h2&gt;
	&lt;p&gt;根据&lt;a href=&quot;https://github.com/machakann/vim-sandwich/blob/master/doc/sandwich.txt&quot; title=&quot;sandwich.txt&quot;&gt;帮助文件&lt;/a&gt;，建议在vimrc配置文件中取消当前&lt;kbd&gt;s&lt;/kbd&gt;键配置：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;nmap s &amp;lt;Nop&amp;gt;&lt;/code&gt;&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;xmap s &amp;lt;Nop&amp;gt;&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;请注意，在日常操作中可以使用&lt;kbd&gt;cl&lt;/kbd&gt;命令来代替&lt;kbd&gt;s&lt;/kbd&gt;功能。&lt;/p&gt;
	&lt;p&gt;如果频繁使用&lt;kbd&gt;srtt&lt;/kbd&gt;快捷键来修改标签，那么建议映射为较短的&lt;kbd&gt;srt&lt;/kbd&gt;快捷键：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;nmap srt &amp;lt;Plug&amp;gt;(operator-sandwich-replace)&amp;lt;Plug&amp;gt;(textobj-sandwich-query-a)tt&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;如果希望使用&lt;a href=&quot;https://github.com/tpope/vim-surround&quot;&gt;surround&lt;/a&gt;风格的快捷键，那么可以参照&lt;a href=&quot;https://github.com/machakann/vim-sandwich/wiki/Introduce-vim-surround-keymappings&quot; title=&quot;surround keymappings&quot;&gt;surround keymappings&lt;/a&gt;进行配置。

	&lt;h2 class=&quot;article&quot;&gt;&lt;a id=&quot;recipes&quot;&gt;自定义环绕字符&lt;/a&gt;&lt;/h2&gt;
	&lt;p&gt;通过自定义receipe，可以设置用户特有的环绕字符。例如在vimrc文件中增加以下命令，以使用&lt;a href=&quot;https://github.com/machakann/vim-sandwich/wiki/Bracket-with-spaces&quot; title=&quot;Bracket with spaces&quot;&gt; ( [ { &lt;/a&gt;来指定在括号之后附带一个间隔空格：&lt;/p&gt;
	&lt;pre class=&quot;block&quot;&gt;&lt;code&gt;&quot; if you have not copied default recipes
let g:sandwich#recipes = deepcopy(g:sandwich#default_recipes)

&quot; add spaces inside bracket
let g:sandwich#recipes += [
      \   {&#39;buns&#39;: [&#39;{ &#39;, &#39; }&#39;], &#39;nesting&#39;: 1, &#39;match_syntax&#39;: 1, &#39;kind&#39;: [&#39;add&#39;, &#39;replace&#39;], &#39;action&#39;: [&#39;add&#39;], &#39;input&#39;: [&#39;{&#39;]},
      \   {&#39;buns&#39;: [&#39;[ &#39;, &#39; ]&#39;], &#39;nesting&#39;: 1, &#39;match_syntax&#39;: 1, &#39;kind&#39;: [&#39;add&#39;, &#39;replace&#39;], &#39;action&#39;: [&#39;add&#39;], &#39;input&#39;: [&#39;[&#39;]},
      \   {&#39;buns&#39;: [&#39;( &#39;, &#39; )&#39;], &#39;nesting&#39;: 1, &#39;match_syntax&#39;: 1, &#39;kind&#39;: [&#39;add&#39;, &#39;replace&#39;], &#39;action&#39;: [&#39;add&#39;], &#39;input&#39;: [&#39;(&#39;]},
      \   {&#39;buns&#39;: [&#39;{\s*&#39;, &#39;\s*}&#39;],   &#39;nesting&#39;: 1, &#39;regex&#39;: 1, &#39;match_syntax&#39;: 1, &#39;kind&#39;: [&#39;delete&#39;, &#39;replace&#39;, &#39;textobj&#39;], &#39;action&#39;: [&#39;delete&#39;], &#39;input&#39;: [&#39;{&#39;]},
      \   {&#39;buns&#39;: [&#39;\[\s*&#39;, &#39;\s*\]&#39;], &#39;nesting&#39;: 1, &#39;regex&#39;: 1, &#39;match_syntax&#39;: 1, &#39;kind&#39;: [&#39;delete&#39;, &#39;replace&#39;, &#39;textobj&#39;], &#39;action&#39;: [&#39;delete&#39;], &#39;input&#39;: [&#39;[&#39;]},
      \   {&#39;buns&#39;: [&#39;(\s*&#39;, &#39;\s*)&#39;],   &#39;nesting&#39;: 1, &#39;regex&#39;: 1, &#39;match_syntax&#39;: 1, &#39;kind&#39;: [&#39;delete&#39;, &#39;replace&#39;, &#39;textobj&#39;], &#39;action&#39;: [&#39;delete&#39;], &#39;input&#39;: [&#39;(&#39;]},
      \ ]
	&lt;/code&gt;&lt;/pre&gt;
	&lt;p&gt;使用&lt;code&gt;:help textobj-sandwich&lt;/code&gt;命令，可以查看sandwich文本对象的帮助信息，使用&lt;code&gt;:help operator-sandwich&lt;/code&gt;命令，可以查看sandwich操作符的帮助信息。&lt;/p&gt;
	&lt;p&gt;使用以下命令，可以查看插件的帮助文件：&lt;/p&gt;
	&lt;p style=&quot;text-indent:2em&quot;&gt;&lt;code class=&quot;inset&quot;&gt;:help sandwich&lt;/code&gt;&lt;/p&gt;

	&lt;h2 class=&quot;article&quot;&gt;&lt;a id=&quot;FinalThoughts&quot;&gt;使用感受&lt;/a&gt;&lt;/h2&gt;
	&lt;p&gt;一，相较&lt;a href=&quot;http://yyq123.github.io/learn-vim/learn-vim-plugin-surround.html&quot; title=&quot;环绕字符编辑(surround)&quot;&gt;surround&lt;/a&gt;重新发明一系列新概念，&lt;a href=&quot;https://github.com/machakann/vim-sandwich&quot; title=&quot;surround&quot;&gt;sandwich&lt;/a&gt;更多地重用了已经存在的元素，比如Vim的&lt;a href=&quot;https://yyq123.github.io/learn-vim/learn-vi-10-TextObjects.html&quot; title=&quot;文本对象(Text Objects)&quot;&gt;文本对象(Text Objects)&lt;/a&gt;和&lt;a href=&quot;https://yyq123.github.io/learn-vim/learn-vi-20-DotCommand.html&quot; title=&quot;重复命令(Dot Command)&quot;&gt;重复命令(Dot Command)&lt;/a&gt;，以此保证操作的一致性，并大大降低学习成本。&lt;/p&gt;
	&lt;p&gt;二，sandwich提供了非常友好的视觉辅助。对于相隔较远或者多层嵌套的环绕字符，随着命令的输入将会高亮显示被影响的字符，这使用户在执行操作之前，能有机会确认命令执行范围是否准确。&lt;/p&gt;
	&lt;p&gt;我个人更喜欢sandwich的举重若轻，而不是surround的举轻若重。此诚为一家之言，还请自行斟酌。&lt;/p&gt;

	&lt;table summary=&quot;Commands&quot; border=&quot;2&quot; frame=&quot;hsides&quot; rules=&quot;all&quot; cellspacing=&quot;0&quot; cellpadding=&quot;3&quot;&gt;
		&lt;caption&gt;命令小结&lt;/caption&gt;
		&lt;tr&gt;&lt;td&gt;&lt;code class=&quot;inset&quot;&gt;sa&lt;/code&gt;&lt;/td&gt;&lt;td&gt;添加环绕字符&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;&lt;code class=&quot;inset&quot;&gt;sr&lt;/code&gt;&lt;/td&gt;&lt;td&gt;修改环绕字符&lt;/td&gt;&lt;/tr&gt;
		&lt;tr&gt;&lt;td&gt;&lt;code class=&quot;inset&quot;&gt;sd&lt;/code&gt;&lt;/td&gt;&lt;td&gt;删除环绕字符&lt;/td&gt;&lt;/tr&gt;
	&lt;/table&gt;

	&lt;p style=&quot;border-top:1px solid lightgray&quot;&gt;&lt;span style=&quot;float:right&quot;&gt;Ver: 2.0&amp;nbsp;|&amp;nbsp;&lt;a href=&quot;mailto:yyq123@gmail.com&quot;&gt;YYQ&lt;/a&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;a href=&quot;http://yyq123.github.io/learn-vim/learn-vi-101-plugin-vundle.html&quot; title=&quot;插件管理器(Vundle)&quot;&gt;上一篇&lt;/a&gt;&amp;nbsp;|&lt;a title=&quot;笔记列表&quot; href=&quot;http://yyq123.github.com/learn-vim/learn-vi-00-00-TOC.html&quot;&gt;&amp;nbsp;目录&amp;nbsp;&lt;/a&gt;|&amp;nbsp;&lt;a href=&quot;http://yyq123.github.io/learn-vim/learn-vi-102-plugin-plug.html&quot; title=&quot;插件管理器(vim-plug)&quot;&gt;下一篇&lt;/a&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://yyq123.blogspot.com/feeds/5674325907678291179/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='http://yyq123.blogspot.com/2020/09/vim-plugin-sandwich.html#comment-form' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7045570/posts/default/5674325907678291179'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7045570/posts/default/5674325907678291179'/><link rel='alternate' type='text/html' href='http://yyq123.blogspot.com/2020/09/vim-plugin-sandwich.html' title='VIM学习笔记 环绕字符编辑(sandwich)'/><author><name>YYQ</name><uri>http://www.blogger.com/profile/00702527262114879030</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>