简单谈谈VIM设计的优点

2019-03-12 观点和感想 #Vim #Neovim #Productivity
更新日志
2019-07-20 更新所属分类

我接触VIM的时间较短,从正式学习到现在也就一年半不到的时间,期间我将所有使用到的编辑器、IDE的键位都修改为了VIM模式,这对我快速掌握VIM很有帮助(相当于强行适应+学习)。

在VIM的使用过程中,VIM设计的优点随处可见:

模式切换

VIM模式编辑的设计真的是非常惊艳,通过模式编辑可以使手几乎不离开键盘。当然,如果仅仅是实现了大多数的键盘流操作,那VIM被称为“编辑器之神”肯定是不够格的。

VIM的模式编辑之所以惊艳,主要有有以下亮点:

  1. 一个键可以在不同模式下拥有不同的行为。
  2. 可以通过组合的形式实现更复杂的操作。

VIM中的模式有:

其中,前三个模式(Insert、Normal、可视化)是我们通常编辑过程中最常用的模式。使用VIM打开一个文件后是进入Normal模式,该模式可以使用h、j、k、l来表示光标移动的:左、下、上、右。

Normal模式是VIM的基本操作,要掌握不少按键在该模式下的行为(快捷键),这也是大多数人接触VIM后的第一感觉:要背快捷键、太难。

下图是经常用来调侃第一次使用VIM的遭遇:不会退出VIM。我想第一次接触VIM的人,都会至少搜索一次:如何退出VIM,StackOverflow也统计过:问题“how-to-exit-the-vim-editor”帮助了至少一百万开发者退出VIM。

exit-vim-for-the-first-time how-to-exit-vim

其实Normal模式下的快捷键没有想象中的那么复杂,因为大多都是有规律的,例如:

当然,以上举的例子虽然比较简单,但可以体现出Normal模式下各个按键的行为是设计得非常优秀,大多情况下只需要记住基础按键的行为,其余都是根据需要自行组合

按键映射

VIM作为一个成熟的编辑器,自定义按键行为肯定是少不了的,在VIM中可以对一个按键在多个模式映射不同的行为:

如想实现在Normal模式下按-删除当前行,那么可以定义nmap - dd来实现。每个*map都有一个对应的非递归按键映射*noremapnoremap, nnoremap, vnoremap, 和 inoremap)。使用*noremap来定义快捷键,将不会将按键事件继续传递下去,可以理解为只执行当前noremap定义的映射。

VIM按键系统中还设计了一个非常优秀的按键:Leader Key(前缀键)。顾名思义,前缀键就是在你按其他键之前先按的一个键,可以通过Leader Key + 其他按键实现自定义的按键组合。刚接触VIM时可能不好理解Leader Key是什么,我们可以将Leader Key比作在VIM中的功能键,例如系统中CtrlAlt等功能键。

在使用Leader Key之前,首先需要定义Leader Key,一般我们会选择一个非常方便的位置,例如我使用<Space>来作为Leader Key的。

" 定义快捷键的前缀,即<leader>
let mapleader="\<Space>"

定义好Leader Key之后,我们可以定义nnoremap <silent> <leader>fj ddp来实现在Normal模式下按“空格fj”将当前行与下一行交换位置。

可以通过verbose map来查看具体定义好的快捷键:

" 查看<Leader>fj映射的行为
verbose map <Leader>fj

" 输出如下:
n  <Space>fj   * ddp>fj
        Last set from ~/.dotfiles/vim/keymappings.vim

插件

在VIM中除了通过组合实现操作外,还可以通过VimScript来编写VIM的插件。VIM之所以能够脱离编辑器,迈向IDE很大程度是靠VimScript来实现的。例如可以在VIM中实现目录树侧边栏、文档结构显示、Git history、文件搜索等一系列复杂的操作。

以下是我Neovim在Iterm2中的展示效果,有左侧的目录树、右边还展示了语法提示的窗口。

vim复杂界面

VIM8之前的插件管理比较简陋,在8.0版本之后,官方提供了package概念来管理插件,并且开源社区也有非常多的插件管理:VundleVAMvim-plug

通过官方或者开源社区提供的优秀插件管理,可以非常方便安装、更新插件。并且像vim-plug这样的插件还提供了按需加载,不但提供了高级的特性还优化了速度。

正是因为VIM的优秀设计,使软件几乎可以控制VIM中的所有内容,也就是说,VIM中的插件几乎可以实现任何事情。

只要愿意花时间,将VIM配置为一个IDE也是完全没有问题的。




文章作者:eightpigs
创作时间:2019-03-12
更新时间: 2019-03-13
许可协议:CC by-nc-nd 4.0