从「什么是Vim」开始、その二

从「什么是Vim」开始、その二

题图来源

Vim的可定制性可从.vimrc的配置中窥见,在讲什么是.vimrc文件以及怎么使用.vimrc配置文件之前,先来看看客制化Vim时会碰到的东西。首先假定我们的用户目录在

/Users/Peter/Home/

那么一个最基本的Vim配置文件会在:

/Users/Peter/Home/.vimrc

然后我们还会有一个配置文件夹:

/Users/Peter/Home/.vim/

这个文件夹的初始状态是空的,在此我放入一个NerdTree插件来展示这个配置文件夹内文件分布的基本状态:

.vim
├── autoload
│   ├── nerdtree
│   │   └── ui_glue.vim
│   └── nerdtree.vim
├── doc
│   ├── NERD_tree.txt
│   └── tags
├── lib
│   └── nerdtree
│       ├── bookmark.vim
│       ├── creator.vim
│       ├── event.vim
│       ├── flag_set.vim
│       ├── key_map.vim
│       ├── menu_controller.vim
│       ├── menu_item.vim
│       ├── nerdtree.vim
│       ├── notifier.vim
│       ├── opener.vim
│       ├── path.vim
│       ├── tree_dir_node.vim
│       ├── tree_file_node.vim
│       └── ui.vim
├── nerdtree_plugin
│   ├── exec_menuitem.vim
│   └── fs_menu.vim
├── plugin
│   └── NERD_tree.vim
└── syntax
    └── nerdtree.vim

--------------------------------------------------

首先我们来看.vimrc;简单来说.vimrc文件就是一个在打开Vim之后,会被第一个运行的脚本(一行一行命令)。在之前提到的命令模式里可以执行的命令 被写进.vimrc里以在每次打开Vim的时候执行。栗子:

set background=dark

这个命令会调整背景色,在按冒号进入命令模式之后输入并回车:

这个单次执行与将set background=dark放在.vimrc文件里效果是一样的,所以某种意义上说.vimrc就是一个自动执行一堆命令的配置文件。要知道Vim允许用户自定义的方面非常之多不仅可以重新绑定键位,将一组命令隐射到按键上,设置字体/配色,还能设置一些文本显示行为比如是否要软换行,一个Tab多宽,等等……参考The Ultimate vimrc 以感受一个中度用户的vimrc大约有多长(虽然这人给他的vimrc脚本命名为ultimate,然而其实一点都不ultimate感性感受一下就好)

vim的命令模式本质上来说其实是一套编程语言 名曰VimL(虽然和Emacs家丧心病狂的eLisp规模上还是有差距的);所以与其说.vimrc是预先执行的Vim命令,不如说Vim的命令模式是临时执行的VimL代码。而在前面的配置目录结构里的后缀为.vim的文件,就都是这样的VimL脚本。

--------------------------------------------------

在这里我们直接丢了一个唯一的插件NerdTree以做演示,在实际情况下会有几十个插件共同存在,在这种状况下直接安装插件(放在.vim/目录里)的行为是愚蠢且容易炸裂的,个人推荐使用tpope/vim-pathogen · GitHub作为Vim的插件管理器,同时也有Vundle之类的。使用方法请自行搜索

NerdTree是一个提供目录显示和文件跳转的插件

--------------------------------------------------

接下来解释一下在/Home/.vim/目录里的文件夹分别存放了什么Vim脚本以称得上是插件。

autoload里存放的是启动Vim时会执行的脚本

.vim
├── autoload
│   └── nerdtree.vim

而在autoload里的nerdtree目录则存放了nerdtree.vim会调用的更多代码。

doc存放的是插件的帮助文档,可以在vim当中调用。

lib是library的缩写,存放的是运行nerdtree需要的支援代码,可以认为是一个插件的核心实现部分。

plugin存放了提供给Vim程序调用的.vim文件,这个文件可以认为是NerdTree插件运行的启动点。

sytax内是用于处理Vim里字符现实语法规则的Vim脚本;比如在上方.tex和.bib文件是不同的高亮即是通过在.vimrc里配置NerdTree的变量实现的。这部分代码在sytax文件里。

除了上述提到的文件夹目录以外,常见的还有ftplugin,这个文件夹内放置的是filetype-plugin顾名思义就是针对特定文件类型运行的Vim脚本,常见于支持多文件支持的插件需要实现不同的效果时使用。比如一个前端开发软件同时有.css, .js, .html的高亮和静态分析,那么它很有可能有关将不同文件类型的代码分放在了这个文件夹里。

--------------------------------------------------

关于什么是Vim和Vim有什么可以算是入门了,通过对以上最最基本的Vim特性的了解,应该可以想象这个编辑器在使用过程当中逐渐进化成最顺手的文本编辑器的过程了。


由于Vim普通模式下的操作是在太多,我也许会在接下来时不时分享一些我新发现的Vim技巧,也有可能某一日会写一份有关「我所使用的Vim配置」的po,但是接下来让我们早点进入NeoVim的正题吧。

附加:

Interactive Vim tutorial 在写交互式学习Vim基本操作的网站

Vim入门教程 - 博客 一份不错的Vim基础入门

VimGolf - real Vim ninjas count every keystroke! 闲着蛋痛的Vim用户把最少次数按键完成想要的编辑目标当作消遣,从这里你能看到丧心病狂的Vim使(奇)用(技)实(淫)战(巧)

Basic Vim Configuration 一份不错的.vimrc入门

有哪些编程必备的 Vim 配置? - 代码 spf13的用户配置案例是一个用来欣赏的配置方案而不是实际拿来用的;在我看来spf13这种巨大的配置方案是为了想我们展示Vim可以有多好用/万能


使用脚本编写 Vim 编辑器,第 1 部分: 变量、值和表达式 IBM出品的Vim脚本指南,hardcore用户可以尝试学习,有助于理解插件的原理,自己debug或者自己书写插件。

Learn Vim in a week 一组视频,请翻

编辑于 2015-09-05

文章被以下专栏收录

    一个有前途项目:Barm一己之力的巨作Vim的核心代码极难维护,而又有众多Bug不予修复;这里将随着NeoVim的进展,展示日用技巧并见证Vim在21世纪重生。