利器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 的步骤:
- 下载并保存到
~/.vim/autoload/
目录下 (在终端操作)
curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
- 配置
~/.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 的主页了解,那里不仅告诉大家应该怎么安装此插件,还给出各种情况的说明和例子。