一个 Vim 用户的精神之旅

 2012-05-27    大连 /software/2012/05/27/gvim.html software, vim, encryption, decryption, cryptology works

本文最近更新于 2019 年 10 月 16 日

本文短网址:jsntn.com/go/vim.html

一开始是 notepad,word,edit 垄断你的大脑,这些东西根深蒂固,挥之不去。Vim 的使用对你而言是一场噩梦,它降低而不是提高了你的工作效率。对三种工作模式的不解甚至使你认为它是一个充满 bug 或者至少是一个古怪的与当今友好用户界面设计严重脱节的软件,事实上,这些起初看起来古怪的特性是 Vim(或者是 vi)的作者和它的用户们在自己漫长的文字编辑和程序设计生涯中总结出来的最快速最实在的操作,在几乎等于计算机本身历史的成长期中,历经无数严厉苛刻的计算机用户的批评与检验,无用的特性或糟糕的设计在 Vim 用户群面前根本就没有生存的余地,Vim 细心而谨慎的作者们也不允许自己精心设计的软件里有这样的东西。

第二个阶段你开始熟悉一些基本的操作,这些操作足以应付你日常的工作,你使用这些操作时根本就不假思索,但这些阶段你仍然很少去碰 Vim 那晦涩的在线帮助文档,它在你心里只是 notepad,edit 一个勉强合格的替代品。

第三个阶段,精益求精的你不满足于无休无止的简单操作,冗长而乏味,有没有更好的办法可以驭繁于简?于是,从 Unix 参考手册上,从同事口中,你渐渐叩开 :help xxx 的大门,开始探索里面充满魔力的咒语,从杂耍般的带有表演性质的技巧开始,这些技巧令人眩目但少有实用性,不过这却是你拥有魔力的第一步。接下来,你开始认识到这些咒语背后的真经,开始偷偷修改一些奇怪的符号,于是,奇迹产生了,魔力不但仍然有效,而且真实地作用于你现实中的文字编辑生活,你在第二阶段由于熟练操作而尘封已久的大脑突然开始运作,但这个过程并非是达到某个临界状态后的一路坦途,不断的挫折,新的挑战,看似 Mission Impossible 的任务,永远伴随着任何一个人的任何一个学习过程,这是你使用 Vim 的最后一个阶段,也是最漫长最有挑战性同时也充满无数奇趣的阶段。这个阶段里你开始定制一些希奇古怪的颜色,开始以敲入 i18n 来输入 internationalization,开始让 Vim 替你纠正经常把 the 误敲成 teh 的毛病,开始让 Vim 与系统里各种精悍而强大的兄弟工具进行合作,开始写越来越长的 script,每一次的文本编辑体验都妙趣横生高潮跌起。你的头脑因为要用 Vim 完成高效的编辑而高度紧张,你开始在 Vim 邮件列表里提一些确实是问题的问题,也开始发现你在 Vim 里做了以前在 Shell 里做的几乎一切事,事实上你已经成了一个无可救药的 Vim 骨灰级玩家。

30 分钟入门

首次安装 Vim 后,可通过 :help tutor 进入一个 30 分钟的 Vim 入门教程。

Windows 平台上的 Vim 程序结构

在 Windows 平台上,安装好 Vim 程序后,会发现其程序的文件夹结构是一个 Vim 文件夹:

├─Vim  
├───vim74 #文件夹  
├───vimfiles #文件夹  
├───_vimrc #文件  
├───vimrc #文件

其中,_vimrcvimrc 两个文件为 Vim 的配置文件,vim74 为 Vim 主程序目录,vimfiles 为用户 Vim 文件夹,里面的子目录结构和原 Vim 主程序的目录结构几乎一样,例如:

├─after #这里面的文件也会在 Vim 每次启动的时候加载,不过是等待 ./plugin/ 加载完成之后才加载 after 里的内容,所以叫做 after
├─autoload #放置的是当你真正需要的时候才被自动加载运行的文件,而不是在 Vim 启动时就加载
├─colors #用来存放 Vim 配色方案的
├─compiler #和 indent 很像,放的是相应文件类型应该如何编译的选项
├─doc #为插件放置文档的地方,例如 :help 的时候可以用到
├─ftplugin #当 Vim 给缓冲区的 filetype 设置一个值时,Vim 将会在该目录下来查找和 filetype 相同名字的文件。例如你运行 set filetype=derp 这条命令后,Vim 将查找 ./ftplugin/derp.vim 此文件,如果存在就运行它。不仅如此,它还会运行 ftplugin 下相同名字的子目录中的所有文件,如 ./ftplugin/derp/ 这个文件夹下的文件都会被运行。每次启用时,应该为不同的文件类型设置局部缓冲选项,如果设置为全局缓冲选项的话,将会覆盖所有打开的缓冲区。
├─indent #这里面的文件和 ftplugin 中的很像,它们也是根据它们的名字来加载的。它放置了相关文件类型的缩进。例如 Python 应该怎么缩进,java 应该怎么缩进等等。其实放在 ftplugin 中也可以,但单独列出来只是为了方便文件管理和理解。
├─keymap
├─lang
├─macros
├─plugin #存放的是每次启动 Vim 都会被运行一次的插件,也就是说只要你想在 Vim 启动时就运行的插件就放在这个目录下
├─spell #拼写检查脚本
├─syntax #语法描述脚本
├─tools
├─tutor
...

附:我的 Vim 文件夹结构

一些链接……

官方网站:www.vim.org

Vim 官方文档中文版安装包 Vim Documentation Chinese Version,安装后使用 :help 命令,看到的就是中文手册了。(注[20150609update#Bangkok]:Windows 平台上下载安装包,例如 vimcdoc-1.9.0-setup-unicode.exe,在安装过程中选择 Vim 的所在目录时,需要选择 Vim 程序所在目录,例如 C:\Program Files (x86)\Vim\vim74,不可以是 C:\Program Files (x86)\Vim

大家来学 Vim|李果正:链接[已失效] 备份链接

台湾网友李果正编写的手册,PDF 格式、80+ 页、800 KB。

Vim 实用技术|IBM 吴咏炜

共分 3 篇:实用技巧常用插件定制 Vim

神奇的 Vim|IBM 闫石:链接

举了很多例子,尽显 Vim 之神奇。xbeta 推荐阅读。

史上最强的 vimrc 文件|amix

网上称为史上最强的 vimrc 文件(源链接[已失效] 备份链接① 备份链接②),约 800 行,还是作者精简后的结果。
评价:未必全用,但通读有益!
另:国内网友改进版,更符合中文习惯。

Learn Vimscript the Hard Way|Steve Losh

一本面向那些想学会如何自定义 Vim 编辑器的用户教程。
英文原版:learnvimscriptthehardway.stevelosh.com
中文译版:kaka.io/vim

Vim Tips wiki

Wikia 社区的 Vim 频道:vim.wikia.com/wiki/Vim_Tips_Wiki

Pathogen——管理插件的插件

类似 Pathogen 的插件还有 Vundle,写好相应的 Vim 配置配置后,可以通过一条命令下载安装所需插件,但在 Windows 平台使用 Vundle 需要另配置 curl,所以这里只推荐非 Windows 平台用户使用 Vundle,关于 Vundle 更多介绍,请继续阅读下文。

Vim 自身希望通过在其目录中预定义子目录管理所有插件(例如,子目录 doc/ 存放插件帮助文档、plugin/ 存放通用插件脚本),而 Vim 的各插件打包文档中通常也包含上述两个(甚至更多)子目录,用户将插件打包文档中的子目录拷贝至 Vim 相应的目录即可完成插件的安装。


Vim 7.4 的预定义子目录


vimwiki 插件的目录结构

一般情况下这种方式没问题,但对于重度插件用户,Vim 目录将变得混乱不堪,一旦卸载插件也很麻烦,需要知道 doc/plugin/ 子目录下哪些文件是属于该插件的,再逐一删除,很容易多删或者漏删。

我们希望每个插件都可以有各自独立的子目录,这样需要升级、卸载插件时,直接找到对应插件目录变更即可。Pathogen 为此而生,它突破了 Vim 只能识别 vim/doc/vim/plugin/ 等等路径的限制,可以按插件名创建独立目录,然后将插件压缩包提取至各自插件目录中。通常来说,我们需要先创建 bundle/ 目录,bundle/ 就是以后存放各插件目录的父目录。

Pathogen 下载地址

Pathogen 的安装方法(Windows 平台)

1) 在 用户 Vim 文件夹(vimfiles/)下建立 autoload 目录,下载 Pathogen 的 pathogen.vim 并放置到该目录下。

2) 在 用户 Vim 文件夹(vimfiles/)下建立 bundle 目录,这将成为 Vim 其他插件的父目录。

3) 编辑 vimrc,添加如下内容:

execute pathogen#infect()
syntax on
filetype plugin indent on

默认使用上面的内容进行配置即可,更自定义化的配置可以参考官方安装说明

4) 添加插件到 bundle 目录下,例如直接解压 vimwiki 的压缩包到 bundle 下:

5) 重启 Vim 生效。

更简单易用的插件管理器——Vundle

Vundle 是 Vim 和 Bundle 的缩写,可以为每一个安装的 Vim 插件创建一个独立的目录树,并在相应的插件目录中存储附加的配置文件。因此,相互之间没有混淆的文件。简言之,Vundle 允许安装新的插件、配置已有的插件、更新插件配置、搜索安装的插件和清理不使用的插件。更重要的是——相应操作可以通过一条命令完成!

而且,Vundle 还会帮助我们自动完成:

  1. 管理已安装插件的 runtime path
  2. 安装和更新后,重新生成帮助标签

Vundle 的安装配置与使用详见作者的 GitHub 链接(内含中文版说明):

Vundle 支持三种来源插件的管理:

  1. GitHub 上 vim-scripts 仓库的插件
  2. GitHub 上非 vim-scripts 仓库的插件
  3. 不在 GitHub 上的插件

对于不同的插件,Vundle 自动管理和下载插件的时候,有不同的地址填写方法:

  1. 在 GitHub 上 vim-scripts 用户下的仓库,只需要写出 <repo name>
  2. 在 GitHub 其他用户下的 repos,需要写出 <username>/<repo name>
  3. 不在 GitHub 上的插件,需要写出 git 全路径

扩展阅读:

插件推荐

以下内容可以复制粘贴到 Vim 配置文件中通过 Vundle 快速安装。

Plugin 'VundleVim/Vundle.vim'               # Vundle是 Vim 的一个插件管理工具
Plugin 'rust-lang/rust.vim'                 # 提供 Rust 文件检查和语法高亮功能
Plugin 'racer-rust/vim-racer'               # Rust 补全提示功能
Plugin 'Valloric/YouCompleteMe'             # YouCompleteMe 是 Vim 下的智能补全插件,支持 C-family, Python, Rust 等的语法补全,整合了多种插件,功能强大。
Plugin 'jeffkreeftmeijer/vim-numbertoggle'  # 提供显示绝对行号和相对行号
Plugin 'scrooloose/nerdtree'                # 显示左侧树形菜单
Plugin 'jiangmiao/auto-pairs'               # 给括号自动配对
Plugin 'cespare/vim-toml'                   # toml 文件高亮插件
Bundle 'ZoomWin'                            # Zoom in/out of windows (toggle between one window and multi-window)
Bundle 'majutsushi/tagbar'                  # Vim plugin that displays tags in a window, ordered by scope.

gVim 在 Windows 平台的右边框和下边框会分别显示出一条灰色区域,使用 bargreybars.vim 可以将它们移除掉。如下示图。

移除前:

移除后:

Vim 和 Markdown

这里不推荐任何关于 Markdown 的 Vim 插件。我们可能寻找的 Markdown 插件包括两种类型:

  1. 渲染 Markdown 语法
  2. 实时预览 Markdown 文件

这些功能在非 Vim 插件范围内有很多优秀的选择,例如 MarkdownPadPandoc 等。

Pandoc 在 Windows 平台也可直接从官网下载绿色版,之后可以编辑 vimrc 实现快捷调用 Pandoc 将 Markdown 转换为 HTML:

"convert Markdown to HTML by Pandoc {{{
:nnoremap <leader>m2h :!<the path to pandoc.exe> --standalone --self-contained --css <the path to customized CSS file> -o %:r.html %
"}}}

加密解密

原生加密功能

从 Vim 7.3 版本开始,Vim 支持两种加密算法:pkzip 和 Blowfish。随后的 7.4.399 版本开始支持 Blowfish2(修复了一些安全问题)。

要使用 Vim 自身的加密解密功能,首先需要通过 :version 命令确认输出信息中包含 +cyptv

通过如下命令查看和设置加密算法:

:setlocal cm?              " show encryption method for the current file
:setlocal cm=zip           " weak (default for backwards-compatibility)
:setlocal cm=blowfish      " better
:setlocal cm=blowfish2     " best (requires Vim version 7.4.399 or higher) 

(可以在 vimrc 中加入 setlocal cm=<xxx>

之后在编辑好文件之后就可以通过 :XX 为大写)转为加密文件(或者在启动 Vim 时使用 -x 启动参数,创建加密文件:vim -x <filename>),然后输入 :wq 保存退出即可。之后如果使用其它编辑器查看加密后的文件,将会看到无意义的乱码,而如果使用 Vim 打开加密文件,则会要求输入密钥以正确显示内容。

通过以下命令重置密码:

:set key=<passphase>

但以上命令将会以明文显示输入的密码,显然不够安全。仍然推荐使用 :X 命令——则会以星号 * 显示输入的密码,更加安全。

如果要解除加密,可以使用以下命令将选项 key 置空:

:set key=

注意:

  1. Vim 的 pkzip 算法不适合加密太隐私的数据。
  2. 新版 Vim 采用 Blowfish2 算法后,虽然加密文件本身是安全的,但是由于交换文件(可以关闭)、内存缓存(未加密)是不安全的,也就是说过程不安全,所以,如果需要严格保密,也不宜使用 Vim 加密。
  3. 注意防止 Vim 加密过程中的误操作,例如以乱码打开、编辑并保存了文件等,且没有消息完整性验证机制(在我们输入了错误的密码时,Vim 将打开文件并呈现乱码)。
  4. Vim 官方推荐加密要求高的用户采用 PGP、GPG 加密软件。
  5. 在编辑文件时所使用的交换文件(swap file)、撤销文件(undo file)和备份文件(backup file)也会同时被加密。当然我们也可以在命令行中利用 -n 参数,即 vim -x -n <filename>,指定不使用交换文件(注意:不使用交换文件,我们也就不能够通过交换文件来恢复文件了)。
  6. 由于 viminfo 文件并不会被加密,所以我们可以使用 :set viminfo= 命令禁用 viminfo 文件。

GPG 加密

安装好 GPG 后,可以通过配置 vimrc 将 Vim 与 GPG 加密集成,例如:

"{{{ Edit gnupg-encrypted files
" https://vim.fandom.com/wiki/Edit_gnupg-encrypted_files
if has("autocmd")
  augroup GPGASCII
    au!
    " First make sure nothing is written to ~/.viminfo while editing an encrypted file
    au BufReadPre,FileReadPre *.asc set viminfo=
    " We don't want a swap file, as it writes unencrypted data to disk
    au BufReadPre,FileReadPre *.asc set noswapfile
    " [Optional] Uncomment below line if don't want a various options which write unencrypted data to disk
    " au BufReadPre,FileReadPre *.gpg set noswapfile noundofile nobackup
    au BufReadPost *.asc :%!gpg --quiet --decrypt 2> /dev/null
    " To refresh the screen
    au BufReadPost *.asc |redraw
    " Convert all text to encrypted text before writing
    au BufWritePre *.asc :%!gpg --quiet --encrypt --armor 2> /dev/null
    " Undo the encryption so we are back in the normal text, directly after the file has been written
    au BufWritePost *.asc u
    au VimLeave *.asc :!clear
  augroup END
endif
"}}}

扩展阅读

参考链接

更新日志

2019/10/16 增加“加密解密”章节

2019/10/10 更新“Vim 和 Markdown”章节

2019/09/23 移除 gVim 右边框和下边框的灰色区域

2019/03/28 #日本

2015/10/16 添加 Pathogen 内容

2015/05/09 #曼谷

2015/04/07

2012/05/27 发布

关于作者
麦子,80 后,现从事通信行业。安卓玩家一个人的书房朗读者。
 英语入门到放弃
 jsntn
 jasonwtien
 jasonwtien
更多…… /about.html

最近更新: