fgg blog

利器4: Vim 编辑器 – 只因为在键盘之中,方向键太遥远

Table of Contents

# Vim 初体验

“多年以后,面对显示屏,“逃离了巨硬·仍旧愤怒·懵懂菜鸟"将会回想起初次尝试 Vim 编辑器 而被困在里面叫天不应叫地不灵的那个遥远的下午”。

那时候的我(2017),是个二十多岁的青年,刚刚认识终端和 Linux 大概是怎么一回事, 感觉恰似上天给我关了那扇“窗”,自己推开了 Linux 世界的大门。 世界新生伊始,许多事物还不知其名何处,对许多“拿来主义”的命令仍旧半信半疑, 简直就是一场大冒险 (没有性命之攸的那种)。

当我发现在文本编辑器里的光标可以用 h,j,k,l 来进行左下上右移动时,“不懂,但我大受震撼”。

(其实就是见识少,不是所有键盘都有独立的方向键,更不是操作系统就只一个 windows ,不过我是二十好几的人了才知道这个事情,用于连的话讲就是:“啊,这是一场侮辱”。)

虽然第一次尝试 Vim 就被抛弃到了荒岛,好在我对这样一个新奇的世界,早有心理准备。 事实证明,要适应新环境,最好的武器不过是“一点好奇心和多点耐心”。从那以后, 感觉就好像“居住在兔子皮毛深处的微生物”竭力向毛尖爬去,“以便将魔术师看个清楚”。

终端里能用的优秀工具多得让我觉得简直“就像是在海边拣贝壳的孩子”,而 Vim 编辑器无疑是我最喜爱的那一枚。 而在海边放贝壳的无疑是那些乐于分享的同道中人,我相信真正的进步来自于分享。

后来当我大概明白 vimrc 文件是怎么一回事之后,我第一件事就是给它加上了这一句:

set mouse=

其实当时是怀着对旧日那种凡事必得“鼠标点击拖拽”宣战的忐忑心态。

后来怎么样了?

后来我发现,其实不怎么需要“专门腾出一只手用鼠标操控”。 如果是在终端干活,你乐意的话,那就是:根本不需要。 如果你极端点,在哪里都不需要鼠标。 除非是你另一只手在忙点别的什么,或者是老板要“麻烦”你给“赶紧”修改一篇work文档,客户在线等那种…

# Vim 编辑器

## Vim 是干啥的

首先应该了解: Vim 适用于什么场景?

“Vim是从 vi 发展出来的一个文本编辑器。 其代码补完、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。 和Emacs并列成为类Unix系统用户最喜欢的编辑器。”

平时我在浏览中(尤其是寻找一些功能插件过程)也看到有人发博客说他/她是用 Vim 进 行“写作”的(主要是关于 $\LaTeX$, $\TeX$, markdown 的插件),但我想如果是用来进 行文学创作这一类的工作的话,重点可能不在于编辑器,很简单,还没有“电脑”的时代就 已经诞生了太多优秀作品。 (想象大佬曹雪芹面对电脑屏幕“十年删改”《红楼梦》总觉得有点荒诞, 但是就算是有电脑,这难点肯定不在于删改(编辑器无关紧要),而在于文学创造。 极有可能他根本买不起电脑。)

反过来却不一样,至少我们这年代,没有听说哪个成功的软件产品,它的代码是用手写在草稿纸上 … 怪诞的是,面试的时候倒是有不少这种要手写代码啊伪代码这种事情,我觉得这多多少少有点黑色幽默。

简而言之,vim是个编辑器,很多人用它来写代码,也有人用它来干其他。

随着了解深入,慢慢就会接触到诸如“编辑器之战”、“编程语言之争”这一类话题。

## 编辑器之战

“编辑器之战是指计算机编程领域内, 两类文本编辑器 vi(以及衍生版本)和 Emacs 用户之间的对抗冲突。 这已经成为黑客文化和自由软件社区文化的一部分。

一些 Emacs 用户说:

Vi 有两个模式,“不停地哔哔叫”和“搞砸一切”。

而据 Vi 用户称:

一些 Emacs 用户由于修改键过多而使用脚踏板。

一些博客博文、影视作品也都会出现这些内容场景,而且大都是轻松欢乐的场景。比如, 《硅谷》里理查德和他“简直就是踩了狗屎运”才勾搭上的漂亮女友就为了 Vim 和 Emacs 、使用 Tab 还是 Space 进行代码缩进以及缩进风格而吵了起来,继而直接闹掰, 最后以理查德秀逗了的在用身体力行进行“缩进演示”中滚下楼梯而告终。 …

战火在两群用户之间多次点燃,他们互相蔑视,坚信自己的选择才是最完美的。 相比其他的IT领域战争(浏览器大战、操作系统之争、编程语言之争、代码缩进风格之战 等等),编辑器的选择其实通常只是个人问题。 ”

如果不小心也卷入了这些战争,请记住:编辑器的选择其实通常只是个人问题。

当然,实在吵得不可开交的时候,别忘了搬出编程语言之争里那句一锤定音的话题终结语: “PHP 才是真好的编程语言,不接受任何反驳。”

如果想了解更多,可以去 Vim 维基词条 了解更多精彩内容。如果你甚至无法访问维基百科,那不是你的错,不过你得想办法。

# vim 及其配置

如果你是想入门而还在门口徘徊的,可以先在终端 (Terminal) 里输入 vimtutor, 然后看看你感觉如何。如果你认真追随,你会发现一切自有道理。貌似还挺好玩。 嗯,咦,怎么退出这编辑器呢?

## 现代码仔如何在终端界面退出vim编辑器

如果你和我当初一样一头雾水… 淡定淡定,输入 :q ,按下 Enter 即可退出。

嗯,如果你正在输入,需要先按下 Esc,然后输入 :q 来退出。

这个操作也不好使?八成你是在别的模式里,比如 Ex mode, 八成它也会提示你输入 visual 来返回到 normal mode

如果不是这种情况,极有可能是你不小心按了 q 进入命令录制, 通常要是你多按几次 q 来观察,会发现有 recording @ 的提示, 这就是多命令录制无疑,重复操作:输入 :q ,按下 Enter 即可退出。

如果都不是,并且“他X的按什么也没用”,先检查一下你的机器是否还在正常工作, 是,则重复以下操作:输入 :q,按下 Enter

如果你所有好奇心还没有被消耗殆尽,我来告诉你一个好消息: vim 共有 12种模式

这确实是个新世界。

# vimrc

应当注意:从第一次在终端输入 vim 到开始了解和使用自己配置的 .vimrc, 从前者到后者,每个人所经历的时间不太一样,毕竟每个人的生活和目的千差万别。 (倒不是说,刚开始使用 vim 就不能直接上手个人配置,而是想说明, “步子迈大了,容易扯着蛋”;一旦放弃了探索和思考,容易一碰挫折就十分沮丧。) 但在很多文章里,这两者之间多半就是一个空行的距离。 (因此我决定在这个空行之前添加一点说明,以下的内容新手初看时不太明白实属正常)

Vim 如此受欢迎,它的丰富的插件生态应该是一个重要的原因。为什么有这么多插件呢? 因为有这么多的需求。因为有那么多的插件,所以有了要管理插件(更新、删除等)的 插件。使用比较广泛的有:

它们的安装和使用条件都在各自的主页有详细说明,这里不再搬运。那到底用哪个呢? 你在阅读他们的说明的时候自己就会有答案,如果还是难以决定,我的建议就是像八戒 所说的那样:“待俺老猪一家家吃将去!”。(我自己嘛,吃过了三家)

从 vim8.0 开始,vim 自带插件管理的功能特性(实际上,前述的 minpac 就利用了 这些特性),我仅在这个功能出来的时候尝过新(满足好奇心而已,浅尝辄止), 因为已经习惯了所用的管理插件的插件:)(更新:后来我改变了主意)

如果说管理插件的插件可以由 vim 自带的功能所提供,那么,有多少插件是必须的呢?

有人作了很好的总结: How to Do 90% of What Plugins Do (With Just Vim)

如果你崇尚极简主义,值得一试。(不是说就一定要如此,而是知道有的选择)

这里提到的应该都理解为是“别人的”个人配置,而所谓“个人配置”,基本意思就是: 走过路过,可以随便错过。 看到钟意的,拿走不谢。看到不爽的,请去Pull Request,切勿乱喷粪。

大佬林纳斯·托瓦兹早就看透了那些到处乱喷的键盘侠,他的至理名言说明了一切:

“On the Internet, talk is cheap, show me the code.”

# vimrc (~/.vimrc)

" " ================================Part-1: Plugins============
call plug#begin('~/.vim/bundle')            " reuse the bundle dir
" "-------------------=== tmux ===-------------------------------
Plug 'christoomey/vim-tmux-navigator'       " vim <-> tmux, pane dance
Plug 'edkolev/tmuxline.vim'                 " status line
" "-------------------=== Coding enhancement ===-------------------
Plug 'airblade/vim-gitgutter'               " shows git diff sign and more
Plug 'tpope/vim-fugitive'                   " awsome git wrapper!
Plug 'tpope/vim-repeat'                     " enhance . repeat
Plug 'dense-analysis/ale'                   " linters config
Plug 'mileszs/ack.vim'                      " cherrypick your strings
Plug 'junegunn/fzf', { 'do': './install --all' } | Plug 'junegunn/fzf.vim'
" "-------------------=== Python enhancement ===-------------------
" Plug 'Valloric/YouCompleteMe'               " for completion
Plug 'davidhalter/jedi-vim'                 " python auto-completion
" "-------------------=== Wiki/markdown enhancement ===-------------------
Plug 'vimwiki/vimwiki'                      " for personal wiki
Plug 'mzlogin/vim-markdown-toc'             " for table_of_content
Plug 'plasticboy/vim-markdown'              " couple with vim-instant-markdown
Plug 'instant-markdown/vim-instant-markdown', {'for': ['markdown', 'markdown.pandoc']}
" "-------------------=== Latex support  ===-------------------
Plug 'lervag/vimtex'                        " for LaTeX files
Plug 'xuhdev/vim-latex-live-preview', { 'for': 'tex' }  " Lively Previewing
" "-------------------=== Julia lang  ===-------------------
Plug 'JuliaEditorSupport/julia-vim'
" "-------------------=== for GnuPG ===-----------------------------
Plug 'jamessan/vim-gnupg'                   " transparent editting .gpg files
" "-------------------=== Code/Project navigation ===-------------
Plug 'easymotion/vim-easymotion'            " quickly move
Plug 'preservim/nerdtree', { 'on':  'NERDTreeToggle' }
" "-------------------=== local plugins (manually install and update) ===-----
" " 中文跳转 (easymotion-like)
Plug '~/.vim/bundle/vim-PinyinSearch'
call plug#end()            " required

安装和使用 vim-plug 的步骤:

  1. 下载并保存到 ~/.vim/autoload/ 目录下 (在终端操作)
curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
    https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
  1. 配置 ~/.vimrc 文件的相应内容(必须遵循的格式):
call plug#begin('~/.vim/bundle')            " reuse the bundle dir

Plug 'tpope/vim-fugitive'                   " awsome git wrapper!

call plug#end()            " required

plug#begin()plug#end() 之间就是你想要安装和管理的插件的列表。 Plug 'tpope/vim-fugitive' 就是指明想要安装并管理 vim-fugitive 这个插件。

如果 plug#begin() 括弧里为空,则默认是奖所有的插件安装到 .vim/plugged/, 上文的我的配置中,我是指定了 .vim/bundle 作为插件的目录 (因为我在使用 vim-plug 之前就已经在这个目录下存放了许多插件,简单复用而已)。

vim-plug 会自动执行以下两个命令(许多插件需要这两个设定):

  • filetype indent on

  • syntax enable

如果你发现自己“完全”按照官方的指南进行安装,可是“插件死活不起作用”,极有可能是 因为你在某个地方设置了完全相反的设定(因为从别的地方 copy 一大段自己没有认真看 过的内容到自己的 .vimrc 文件里)。


更详细的使用方法应该直接去 vim-plug 的主页了解,那里不仅告诉大家应该怎么安装此插件,还给出各种情况的说明和例子。