如果你要玩转 Linux 系统,那 Vim 是必备的技能,即使是零基础,本文也能带你读懂 Vim,掌握 Vim 的配置及学习要点。我们为你讲述:Vim 的现状、安装和配置 Vim、使用 Vim 阅读 Linux 内核源代码、Vim 学习之路等内容。
前言 想要玩转 Linux 系统必须要有一个编辑器,一个好用的文本编辑器在 Linux 系统中实在是太重要了,在 Linux 系统中很多文章编辑的例子都是靠 Vim 展示出来的。没有文本编辑器,怎么去读代码、改配置、写脚本呢?如果不能读代码、改配置、写脚本,那内容怎么进行得下去呢?所以,必须向大家讲述 Vim 的配置及其学习要点。 先介绍一下 Vim,Vim 是 Linux 系统上的最著名的文本/代码编辑器,也是早年的 Vi 编辑器的加强版,被誉为文本/代码编辑器之中最为优秀经典的上古神器。 1、Vim 之所以会获得如此美誉,我想主要有以下原因: 1].它古老而神秘,学习曲线陡峭,难以驾驭,但是一旦学会则受益匪浅。如今被看作是高手、Geek 们专用的编辑器。所以尽管 Vim 已经是古董级的软件,但还是有无数新人迎着困难去学习使用。 2].轻便,无需多言,当仅仅只需要对某一文本文件(脚本代码、配置文件)进行简单的编辑的时候,所使用的工具当然是越轻便越好。Vim 同时也是阅读文本文件的利器。 3].经典巧妙的编辑方式及强大的功能。它全程使用键盘操作,用户必须记住一堆快捷键、按键组合以及各种命令才能开始使用,一旦使用熟练则编辑效率远超其余编辑器,而且具有各种插件、语法高亮、代码补全、配色方案等极其丰富的资源以及灵活的配置。 2、我主要在以下情况下使用 Vim: 1].用来修改服务器系统的配置文件。很多时候, Linux 作为服务器是不会开启图形界面的,当需要远程操作时,只能利用 SSH “命令字符式”的 Shell 界面对其进行操作,这种情况下,Vim 自然是首选。 2].用来阅读内核源代码和系统的脚本。理由同上。 3].用来写简单的程序,一般都是单文件的程序,或多文件但是只有少数几个文件的项目,例如学习一门编程语言的时候做练习题,喜欢看到文件夹内干干净净,不喜欢一大堆类似 .project 的文件。 4].个性化,花花绿绿的纯文本字符界面,很酷。 3、不适合 Vim 使用的场景: 1].大的编程项目,大的项目还是最好使用 IDE,如果要远程连接没有图形界面的服务器写大项目,最好还是在服务器上建立代码仓库。理由:Vim 没有好的项目管理功能,Vim 的自动补全只建立在文本匹配上,没有程序语言的语义分析功能。 2].对内容的输入要求不高,但是经常需要设置显示格式,且每个动作之间本身就有很多的停顿的工作,用其他 GUI 编辑器( LibreOffice Writer、WPS)效率反而比 Vim 高。 有人说,Vim 是“成也插件、败也插件”。Vim 灵活的配置和丰富的插件极大地增强了它的功能,但是也极大地增加了我们管理 Vim 的难度。首先,在使用 Vim 之前,必须经过适当的配置,而 Vim 的配置又极其繁琐。 Vim 的插件丰富,在网上不乏使用各种插件将Vim 配置成强大 IDE 的文章,但是 Vim 的插件管理非常困难,因为每安装一个插件,都需要将该插件的文件分别放到 Vim 安装路径下的 plugin、autoload、syntax、doc 等目录下。好在是目前有不少能管理插件的插件,它们不仅解决了 Vim 插件在文件系统中分散的问题,同时能够自动搜索和下载插件。
一、Vim 的现状 从前面的介绍可知,Vim 神秘高效水又深,所以吸引了一大批信徒。在网络上关于 Vim 的自定义配置汗牛充栋。既有高手 Tim Pope 的极简配置 tpope/vim-sensible(这个配置一个插件都没有),也有 spf13/spf13-vim 和 SpaceVim 这样大而全的配置。而对我来说,我喜欢简洁而优雅,一大堆 Plugin 堆砌起来的东西我固然不喜欢,但是一个插件都没有的极简配置那用起来也不太顺手。所以我必须得自己配。 自己配 Vim,必然涉及到 Plugin 的选型的问题。说到选型,那就有很多话要说了。首先是 Vim 自身版本的进步和功能的进步,目前 Vim 已经进入到 Vim 8 的时代,增加了不少新功能,像异步啊、内置 Terminal 之类的。而且还有 NeoVim 和它抢饭碗。其次就是 Vim 插件的作者的理念发生了变化,他们逐渐瞧不上纯粹 VimScript 写的插件,毕竟纯 VimScript 写的插件功能比较有限,速度也不够快。目前的 Vim 插件有几个发展趋势:一是要充分利用异步的支持,二是往往使用某些后端提供更强大的功能支持,三是喜欢搞大而全的框架。下面我来逐一举例说明。 例如管理插件的插件,我以前一直都是用 Vundle,我觉得挺好用的。但是这几年又雨后春笋般的冒出了几种新的管理插件的插件,像 junegunn/vim-plug 和 Shougo/dein.vim,看一下它们的说明,无一例外都是说使用了并发技术,加快了插件的下载速度。 再例如 Vim 中的自动补全。其实 Vim 自身就支持补全功能,不过使用起来一点都不自动,需要使用 Ctrl+P 或者 Ctrl+X Ctrl+O 这样的快捷键才会调出补全功能。Vim 自身的补全功能支持 buffers 中的单词,也支持 dictionary 和 tags 中的条目。但是不管怎么说,都只是基于字面意义上的补全,不支持深层次的对编程语言的语义分析。但是可以用后端解决这个问题啊。像 Valloric/YouCompleteMe,在网络上的名声就是典型的难安装难配置,因为它需要使用 Clang 作为后端提供对 C/C++ 语义的支持,使用 Jedi 提供对 Python 的支持,使用 OmniSharp 提供对 C# 的支持,等等。正是如此,使得我们若是想使用某些插件,还不得不在系统上安装 Clang、Python、Lua 这样的一些程序,比较复杂。 自动补全中还有大名鼎鼎的 Shougo/neocomplete.vim。但是我到 github 上一看,好家伙,居然说在 Vim 8 上建议就不要用了,要用就用 Shougo/deoplete.nvim。这也算是 Vim 版本的升级推动插件的升级吧,虽然怎么看怎么像这些插件倾向于 NeoVim 更多一点。而 deoplete 也只是一个自动补全的框架,它还是需要很多后端对编程语言的语义分析提供支持。看下面这个截图,这些都是 deoplete 所需要的后端:
再来一个例子,关于 Vim 的目录树插件,老牌的 NERDTree 不用说了吧,我用着挺舒服的。但现在流行的趋势是 vimfiler。然后我到 github 上一看,马上发现两个难题。一是 vimfiler 需要 unite.vim 支持,二是这个插件也不更新了,在 Vim 8 或者 NeoVim 的时代,请使用 Shougo/defx.nvim ,而且在 Defx 的文档中,写明了,需要 Python 3.6.1+ 的支持。对了,必须提一下,Defx 我试用了,根本没配成功。 通过前面的介绍,发现这个 Shougo 还真是有点高产。前面提到的 unite.vim 也是他写的,而且又升级了。在 Vim 8 或 NeoVim 中建议使用 Shougo/denite.nvim。这里的 unite 和 denite 就是我前面说的大而全的框架,框架之下,需要别的更多的插件作为 source 来提供更多的功能,而这个框架,负责把控 Vim 的界面。 还有一个网红插件 Yggdroot/LeaderF,主要是为了取代经典的 ctrlp,而且其功能比 ctrlp 强大不少。这个倒是没有要求 Vim 8,不过还是要求 Python。值得一用。 鉴于以上提到的错综复杂的关系,以及我自身的强迫症,我决定还是回归经典。Vim 7 就能用多好,纯 VimScript 多好,不想整那后端这后端的。所以我还是使用 Vundle 管理插件,并选择了 7 个最常用的插件,其中一个还是 colorscheme。唯一的升级,可能算是把 Taglist 升级为 Tagbar 了吧。另外,我还是选择了 CtrlP,没有选择 LeaderF。我觉得功能够用了。至于 tpope/vim-surround 、nerdcommenter 之类的,那就不要了吧,不要它们也多敲不了几下键盘,还可以省下学习成本。如果为了美观,这个 vim-airline/vim-airline 插件倒是不错,这个 Lokaltog/vim-powerline 也不错,但是以上两个插件需要特殊字体的支持,到这里 powerline/fonts 可以下载字体,我一般选择 DejaVu Sans Mono for Powerline。如果需要语法检查,vim-syntastic/syntastic 可以试一下。 必须得说明一下:怎么为 Vim 配插件还得看自己的需求。我主要是看文档和看代码,偶尔改改配置文件,有时还要在非 GUI 环境下改配置文件。就算写代码也只用 Vim 写非常简单的。所以我这个经典配置完全够用了,而且开箱即用,超级方便。至于需求比较复杂的,建议玩玩我前面提到的 SpaceVim。
二、安装和配置 Vim 我的配置非常简单,加上空行,也不超过 75 行,我只选择了 7 个插件,所有的插件都是纯 VimScript 的,所有插件都是开箱即用,不需要额外配置。依赖方面,除了 ctags,不需要任何后端的支持。ctags 软件用来分析程序源代码,生成 tags 文件,可不仅仅只支持 C/C++哟,它还支持一大票编程语言。使用man ctags可以查看 ctags 的用法,使用ctags --list-languages可以查看 ctags 支持哪些编程语言。Vim 自身就有很多地方需要用到 tags 文件。首先是 Vim 的跳转功能,快捷键是 Ctrl+],需要 tags 文件支持。其次,Vim 的自动补全功能,不仅支持 buffers 中的单词,也支持 dictionary 和 tags 中的条目。而在我选择的几个插件中,Tagbar 插件可以调用 ctags 对当前编辑的文件进行分析,生成符号表。 目录树插件,我还是选择老牌的 NERDTree。文件搜索插件,我还是选择 CtrlP。自动补全插件,我选择的是 OmniCppComplete 和 AutoComplPop,免除了我按 Ctrl+P、Ctrl+X Ctrl+O 这样的操作,当我输入单词时,补全就自动跳出来了。使用 syntastic 进行语法检查。没有使用 airline,也没有使用 powerline,一是它们需要专用字体的支持,二是我个人对酷炫屌炸天的界面并不是很感兴趣,而且这些酷炫的效果一到 Linux 的纯字符界面就抓瞎,三是如果使用这些插件,配置文件中就必须增加针对这些插件的配置,影响配置文件的简洁。我还是使用 Vundle 管理以上这些插件。只需三步,即可完成 Vim 的安装和配置。安装方面可以参考在Linux系统中下载安装Vim 8 一文。 第一步、安装 Vim、GVim、exuberant-ctags、curl 和git sudo aptitude install vim vim-gtk3 exuberant-ctags curl git 第二步、把以下代码拷贝到配置文件 ~/.vimrc 中 代码非常简洁,如下: set nocompatible filetype off set rtp+=~/.vim/bundle/Vundle.vim call vundle#begin() Plugin 'VundleVim/Vundle.vim' Plugin 'majutsushi/tagbar' Plugin 'kien/ctrlp.vim' Plugin 'scrooloose/nerdtree' Plugin 'vim-scripts/AutoComplPop' Plugin 'vim-scripts/OmniCppComplete' Plugin 'vim-syntastic/syntastic' Plugin 'altercation/vim-colors-solarized' call vundle#end() filetype plugin indent on set history=1000 set ruler set number set showcmd set showmode set laststatus=2 set cmdheight=2 set scrolloff=3 set fillchars=stl:\ ,stlnc:\ ,vert:\ set noerrorbells set novisualbell set t_vb= set background=dark syntax on colorscheme desert set cursorline hi CursorLine term=NONE cterm=NONE ctermbg=0 guibg=Gray40 set backspace=2 set whichwrap+=<,>,h,l set expandtab set smarttab set shiftwidth=4 set tabstop=4 set autoindent set cindent set nobackup set noswapfile set autoread set autowrite set autochdir set fileencodings=utf-8,cp936 set fileformats=unix,dos,mac set showmatch set matchtime=2 set hlsearch set incsearch set ignorecase set smartcase set magic set lazyredraw set nowrapscan set iskeyword+=_,$,@,%,#,-,. if has("gui_running") colorscheme solarized set guifont=DejaVu\ Sans\ Mono\ 12 set guioptions=aegicmT endif map <F2> :NERDTreeToggle<CR> map <F3> :TagbarToggle<CR> map <F4> :CtrlPMixed<CR> Vim 是可以访问全局剪切板的,所以只需要复制上面的代码,然后使用vim ~/.vimrc命令编辑~/.vimrc文件,在 Vim 的 Normal 模式下键入"*p就可以把以上内容粘贴到 Vim 中。然后键入:wq保存退出即可。如下图:
第三步、下载 Vundle,再用 Vundle 安装其它的插件 先建立Vundle需要用到的目录,然后使用 git 从 github 上下载 Vundle,命令如下: mkdir ~/.vim mkdir ~/.vim/bundle cd ~/.vim/bundle git clone https://github.com/VundleVim/Vundle.vim.git 然后,再打开 Vim,在 Normal 模式下键入:PluginInstall,静静地等待它安装完成就可以了。如下图:
在使用过程中,按 F2 键调出 NERDTree,按 F3 键调出 Tagbar,按 F4 键调出 CtrlP。如果只写个简单的程序,单窗口就够了。写个简单的 C 代码看看效果,return 0后面故意不写分号看一下 syntastic 的语法纠错功能,printf故意写个开头看看自动补全功能(这里需要按 Ctrl+P 调出补全),如下图:
三、使用 Vim 阅读 Linux 内核源代码 实战一下,看看用 Vim 阅读 Linux 内核源代码是什么效果。首先,我们需要安装 linux-source 软件包,然后解压缩,再然后生成 tags 文件。命令如下: sudo apt install linux-source cd /usr/src/ sudo tar jxvf linux-source-4.15.0.tar.bz2 cd linux-source-4.15.0 sudo ctags -R --c++-kinds=+p --fields=+ias --extra=+q 最后,在/usr/src/linux-source-4.15.0/目录中运行vim命令就可以了。按 F4 调出 CtrlP,输入我们想看的源代码文件名进行查找,例如红黑树的实现 rbtree.c,你只要输入rbtree,CtrlP就会自动找到lib/rbtree.c。如果想要在代码间跳转,或者自动补全,就需要在 Vim 中加入 tags 文件,使用:set tags+=/usr/src/linux-source-4.15.0/tags命令即可。我在使用 Vim 写 C/C++ 程序时,常常喜欢在/usr/include目录下生成 tags 文件,然后把它添加到 Vim 中,这样,C/C++ 标准库和 Linux 系统库的自动补全就全有了。在控制台下运行的效果,如下图:
我特意退出全屏模式进行展示,因为全屏半透明控制台很有威力。在 GVim 中运行的效果,如下图:
四、Vim 学习之路 Vim 虽好,但是学习曲线还是有点陡的,这里也给出学习的建议,学习的要点。有没有人记得第一次使用 Vim 时什么都做不了的那种无力感呢?有的人第一次使用 Vim 时,怎么都输入不了文字;有的人第一次使用 Vim 时,怎么都退出不了 Vim。这些人往往都是误入 Vim 的,而我不一样,我学 Linux 的时候是按教科书来的,Vim 也是教科书推荐给我的,所以基本操作还是知道一点点的,不至于完全用不了。其实让 Vim 开始工作,只需要了解最简单的一点点知识就可以了。 首先,要知道 Vim 分为两种不同的模式:Normal 模式和 Insert 模式。刚启动时,Vim 处于 Normal 模式,是不能向文档中输入文字的,必须按i键,进入插入模式,才能向文档中插入文字。这时,Vim 就和普通的文本编辑器没啥区别了,要移动光标,用方向键,要删除文字,用 Backspace 键。等编辑完文档,怎么保存和退出呢?这时,必须退出 Insert 模式,回到 Normal 模式,按 ESC 键可以回到 Normal 模式。然后再输入:wq保存退出,只输入:w是保存,只输入:q是退出,但是修改过的文档不保存是退出不了的,如果想放弃修改直接退出,输入:q!命令即可。这几个命令比较好记,i就是 Insert 的首字母,:w就是 Write 的首字母,:q就是 Quit 的首字母,而:q!后面的感叹号,可以理解为强制的意思,强制退出。所以,Vim 的最小工作子集非常简单,找到正确的资料的话一分钟就学会了。如下表:
如果这时还没有被 Vim 吓退,就可以更进一步地学习,可以从 Vim 的官方帮助文档入手。在 Vim 中输入:help就可以查看 Vim 的文档。Vim 启动时有一个空白窗口,输入:help后,Vim 被分割为两个窗口,上面一半显示帮助文档,这看着肯定不舒服啊,怎么办呢?只需要输入:only,就可以只保留文档窗口了。Vim 的文档非常详细,在该帮助文档的一开始,就告诉大家可以使用 Ctrl+] 进行跳转,使用 Ctrl+T 或者 Ctrl + O 跳回。所以,就算是新手,使用该帮助文档也是没有什么困难的。我建议顺着 usr_toc.txt 一章一章的往下读。 一般用户对 Vim 的兴趣就是在这个阶段培养起来的。因为读着读着就会发现,我可以不用鼠标耶,手指不离开键盘,速度快了不少耶;我可以不用方向键耶,手指不用离开主键盘区,速度又快了不少耶;光标的定位好像更方便耶,编辑文档好像更快耶,查找替换更流畅耶,等等。同时也发现,Vim 这种充分利用键盘上的字母当命令的方式好像确实很神奇耶,而且命令很多,几乎键盘上的每个按键都有它的意义。有哪些命令呢?先放个图片出来:
关于这张图更清楚及中文意思,请继续看下去。Vim 流行了这么多年,中文文档肯定是有的啦。Github 上有一个 Vim 中文文档计划 vimcdoc,大家可以直接去这里下载最新的中文文档。而且有 pdf 格式的,放到手机上慢慢看吧。 读了文档后会发现,Vim 不止我前面说的两种模式,除了 Normal 模式和 Insert 模式之外,还有可视模式、替换模式和命令模式。在 Normal 模式下按v或者V可以进入可视模式,可以用可视化的方式选择一块文本。在 Normal 模式下按R就会进入替换模式,输入文字时会覆盖存在的字符。在 Normal 模式下按:就会进入命令模式,除了:,在 Normal 模式下按!、/ 和 ? 也可以进入命令模式,它们分别执行的是过滤、搜索和反向搜索。 好吧,关于 Vim 的学习我就写这么多,资料我是给足了的,至于能够达到什么高度就要看自己的修行了。反正我到现在也只是一个入门水平,不过够用了。下面是我以表格的形式整理的我的学习笔记,都是常用命令。 usr_01.txt 关于 Vim 帮助手册的简单介绍:
usr_02.txt Vim 初步,讲一些简单的命令:
usr_03.txt 主要是讲怎么在文件中快速移动的
这里主要讲的是怎么移动光标,也就是 {motion} ,有两点说明:一是移动光标的命令前面可以加数字,表示重复移动的次数;二是查找单词时,使用\<匹配单词开头,使用\>匹配单词结尾,使用^匹配一行的开头,使用$匹配一行的结尾,使用.匹配任意字符,而对于单词中的特殊字符需要转义。 usr_04.txt 这一章主要讲操作和移动的结合使用。前面学过的d就是操作,这里记作 {operator},表示删除,w就是移动,这里记作 {motion},表示移动一个单词。所以dw就是删除一个单词。操作命令和移动命令前面都能加数字,表示重复的次数,这里记作 [n]。所以操作和移动相结合遵循如下模式:[n] {operator} [n] {motion}。
操作后面还可以接文本对象。文本对象有哪些呢?见下表:
usr_05.txt 这一章主要是讲配置文件的。这一章大家看一看就可以了,不用记。我觉得有必要设置的选项我已经放到配置文件中了。关于安装插件的内容,了解即可。 usr_06.txt 关于设置语法高亮的。了解即可。 usr_07.txt 这一章是讲编辑多个文件的。
usr_08.txt 这一章讲窗口和标签页的,其中关于调整窗口宽度的快捷键是我在 index.txt 中找出来的。
usr_09.txt 使用 GUI 版本。了解即可。关于 GUI 的设置就不啰嗦了,我主要是取消了滚动条。另外,这里讲到了当前选区和真剪切板的概念,主要是熟悉两个寄存器"*和"+。 usr_10.txt 其它一些修改文件的手段,包括录制命令和回放命令
usr_11.txt 从崩溃中恢复,了解即可。 usr_12.txt 关于使用 Vim 的一些小窍门,了解即可。 usr_20.txt 关于命令行编辑、命令行缩写、命令行补全、命令行历史的,了解即可。需要记住一个打开命令行窗口的命令。
usr_21.txt 离开和返回
其它关于会话和视图的内容,了解即可。关于 modeline 的内容了解一下。 usr_22.txt 讲 netrw 文件浏览器的,了解一下即可。还有多缓冲区编辑的命令。
usr_23.txt 编辑特殊文件,Vim 功能挺强大的,可以编辑网络文件、加密文件、二进制文件、压缩文件等,了解一下即可。 usr_24.txt 快速插入,以下快捷键都是在插入模式下执行的。
关于缩写功能,因为用得少,我这里就没有总结出来。而且从这里可以看到,Vim 自带的补全功能还是很强大的,但是我们用自动补全的插件代替了,所以这些快捷键用得少。 usr_25.txt 编辑带格式的文本,了解一下即可。记住其中增加缩进和减少缩进的命令,这个用得比较多。
usr_26.txt 重复,了解一下即可。 usr_27.txt 查找命令即模式,了解一下即可。 usr_28.txt 折叠
折叠有很多方法,可以按缩进进行折叠,也可以按标志进行折叠,也可以按语法进行折叠。了解一下即可。 usr_29.txt 在代码间移动。主要是使用 tags,我前面已经讲过 ctags 程序和 tagbar 插件。但是这里讲到了预览窗口,值得学习一下。
usr_30.txt 编辑程序,主要是和 quickfix 有关的命令和缩进有关的命令。
usr_31.txt 利用 GUI,了解一下。 usr_32.txt 撤销树,了解一下。 usr_40.txt 创建新的命令,usr_41 编写 Vim 脚本,usr_42.txt 添加新的菜单,对于有志于编写插件的朋友可以学一下,相当于又多学了一门编程语言。对于我这样的新人,从这里开始到后面的内容我都跳过了。 读完 Vim 帮助中的 usr_toc 系列,并做好笔记,大概需要两天时间吧。唯一的问题是如果不经常用的话,很快就会忘记了。必要时可以隔一段时间再读一遍。如果需要更详细地了解 Vim 的所有内容,可以参考 quickref.txt 和 index.txt 中的内容,也可以读其它的专题内容。
结语 掌握以上这些内容,你的 Vim 技能会提升不少,最后再向大家推荐一个比我总结得更好的 Vim 学习资料:vim-galore-zh_cn。如果想要了解和 Vim 类似的编辑器请看文件编辑_Linux常用命令大全。
相关主题 |