Linux 桌面玩家指南:02. 以最简洁的方式打造实用的 Vim 环境
特别说明:要在我的随笔后写评论的小伙伴们请注意了,我的博客开启了 MathJax 数学公式支持,MathJax 使用
$
标记数学公式的开始和结束。如果某条评论中出现了两个$
,MathJax 会将两个$
之间的内容按照数学公式进行排版,从而导致评论区格式混乱。如果大家的评论中用到了$
,但是又不是为了使用数学公式,就请使用\$
转义一下,谢谢。
想从头阅读该系列吗?下面是传送门:
前言##
本来我是想写完 Linux 桌面系统的美化和字体配置之后再写 Vim 的。但是等我写完玩转 Linux 系统的方法论一看,发现一个好用的文本编辑器在 Linux 系统中实在是太重要了,在玩转 Linux 系统的方法论中,我的很多例子都是靠 Vim 展示出来的。没有文本编辑器,怎么去读代码、改配置、写脚本呢?如果不能读代码、改配置、写脚本,该系列后面的内容怎么进行得下去呢?所以,我这一篇写一写 Vim 的配置。
先介绍一下 Vim。Vim 是 Linux 系统上的最著名的文本/代码编辑器,也是早年的 Vi 编辑器的加强版,被誉为文本/代码编辑器之中最为优秀经典的上古神器。 它之所以会获得如此美誉,我想主要有以下原因:1.它古老而神秘,学习曲线陡峭,难以驾驭,但是一旦学会则受益匪浅。如今被看作是高手、Geek 们专用的编辑器。所以尽管 Vim 已经是古董级的软件,但还是有无数新人迎着困难去学习使用。 2.轻便,无需多言,当仅仅只需要对某一文本文件(脚本代码、配置文件)进行简单的编辑的时候,所使用的工具当然是越轻便越好。Vim 同时也是阅读文本文件的利器。 3.经典巧妙的编辑方式及强大的功能。它全程使用键盘操作,用户必须记住一堆快捷键、按键组合以及各种命令才能开始使用,一旦使用熟练则编辑效率远超其余编辑器,而且具有各种插件、语法高亮、代码补全、配色方案等极其丰富的资源以及灵活的配置。
我主要在以下情况下使用 Vim: 1.用来修改服务器系统的配置文件。很多时候, Linux 作为服务器是不会开启图形界面的,当需要远程操作时,只能利用 SSH “命令字符式”的 Shell 界面对其进行操作,这种情况下,Vim 自然是首选。 2.用来阅读内核源代码和系统的脚本。理由同上。 3.用来写简单的程序,一般都是单文件的程序,或多文件但是只有少数几个文件的项目,例如学习一门编程语言的时候做练习题,喜欢看到文件夹内干干净净,不喜欢一大堆类似 .project 的文件。 4.装B,花花绿绿的纯文本字符界面,很酷。
不适合 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 的安装和配置。
第一步、安装 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 时什么都做不了的那种无力感呢?在 Stack Overflow 上有一个问题——怎么退出 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 的最小工作子集非常简单,找到正确的资料的话一分钟就学会了。如下表:
命令 | 功能 |
---|---|
i | 进入 Insert 模式 |
<Esc> | 退出 Insert 模式,回到 Normal 模式 |
<Left>、<Right>、<Up>、<Down> | 移动光标 |
<Backspace> | 删除光标前的文字 |
:w | 保存文档 |
:q | 退出 Vim |
: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 帮助手册的简单介绍
命令 | 功能 |
---|---|
CTRL-] | 跳转到当前光标下的标签 |
CTRL-O | 回跳(重复这个操作可以回跳多次) |
:set compatible? | 查看 Vim 是否关闭了对 Vi 的兼容 |
:scriptnames | 查看配置文件的位置和文件名 |
usr_02.txt Vim 初步,讲一些简单的命令
命令 | 功能 |
---|---|
i | 从普通模式进入插入模式,在当前光标前插入文本 |
:set showmode | 开启模式提示,便于用户知道自己在什么模式 |
<Esc> | 回到普通模式,敲一次不行就敲两次 |
h | 向左移动光标 |
j | 向下移动光标 |
k | 向上移动光标 |
l | 向右移动光标 |
x | 删除光标处的字符 |
dd | 删除一行 |
J | 删除一个换行符,把两行连起来 |
u | 撤销之前的操作 |
CTRL-R | 重做,就是撤销之前的撤销操作 |
a | 在光标之后添加字符 |
o | 在当前行的下方建立一个新的空行,并进入插入模式 |
O | 在当前行的上方建立一个新的空行,并进入插入模式 |
1-9 | 在命令前加一个数字,表示重复这个命令相应的次数 |
ZZ | 保存文件并退出 |
:q! | 放弃修改并退出 |
usr_03.txt 主要是讲怎么在文件中快速移动的
命令 | 功能 |
---|---|
w | 移动到下一个单词的词首 |
b | 移动到上一个词的词首 |
e | 移动到下一个词的词尾 |
ge | 移动到上一个词的词尾 |
:set iskeyword | 定义哪些字符允许出现在单词中,而不是单词分隔符 |
W | 移动到以空白符分割的下一个词的词首 |
B | 移动到以空白符分割的上一个词的词首 |
E | 移动到以空白符分割的下一个词的词尾 |
gE | 移动到以空白符分割的上一个词的词尾 |
\$ | 移动到当前行的行尾 |
^ | 移动到当前行的第一个非空白字符 |
0 | 移动到当前行的行首 |
f | 向前查找并移动到一个指定的字符 |
F | 向后查找并移动到一个指定的字符 |
t | 向前查找一个字符并移动到这个字符的前一个字符上 |
T | 向后查找一个字符并移动到这个字符的后一个字符上 |
; | 重复上面的四个命令 |
, | 反向重复上面的四个命令 |
% | 移动到匹配的 ()、[]、{}上 |
G | 移动到文件最后一行 |
gg | 移动到文件的第一行 |
数字+% | 移动到文件的百分之多少 |
数字+G | 移动到指定的行 |
H | 移动到当前窗口的第一行 |
M | 移动到当前窗口的中间一行 |
L | 移动到当前窗口的最后一行 |
CTRL-G | 确定当前位置 |
:set number | 显示行号 |
:set ruler | 在右下角显示当前光标的位置 |
CTRL-U | 向下滚动半屏 |
CTRL-D | 向上滚动半屏 |
CTRL-E | 向上滚动一行 |
CTRL-Y | 向下滚动一行 |
CTRL-F | 向前滚动一整屏 |
CTRL-B | 向后滚动一整屏 |
zt | 把光标所在的行移动到屏幕顶部 |
zz | 把光标所在的行移动到屏幕中间 |
zb | 把光标所在的行移动到屏幕底部 |
/ | 查找匹配的字符串 |
? | 反向查找匹配的字符串 |
n | 重复上面的查找 |
N | 反向重复上面的查找 |
:set ignorecase | 查找时忽略大小写 |
* | 查找当前光标所在的单词 |
# | 反向查找当前光标所在的单词 |
:set hlsearch | 查找时高亮显示所有匹配的地方 |
:set incsearch | 在输入字符串的过程中就显示匹配点 |
:set nowrapscan | 正向查找时,到文件结尾就停止查找,反向查找是,到文件开头就停止查找 |
:nohlsearch | 关闭高亮显示 |
' ' | 跳回原来的地方,反复使用可以在两个位置上跳来跳去 |
CTRL-O | 跳到一个较老的地方 |
CTRL-I | 跳到一个较新的地方 |
:jumps | 列出所有可跳往的位置 |
m | 放置位置标记,位置标记可以是 a 到 z 共 26 个 |
' | 跳转到位置标记 |
:marks | 列出所有的位置标记 |
' " | 跳到最后编辑的光标位置 |
' [ | 跳到最后修改的开始位置 |
' ] | 跳到最后修改的结束位置 |
这一章的命令主要讲的是怎么移动光标,也就是 {motion} ,有两点说明:一是移动光标的命令前面可以加数字,表示重复移动的次数;二是查找单词时,使用\<
匹配单词开头,使用\>
匹配单词结尾,使用^
匹配一行的开头,使用$
匹配一行的结尾,使用.
匹配任意字符,而对于单词中的特殊字符需要转义。
usr_04.txt 这一章主要讲操作和移动的结合使用。前面学过的d
就是操作,这里记作 {operator},表示删除,w
就是移动,这里记作 {motion},表示移动一个单词。所以dw
就是删除一个单词。操作命令和移动命令前面都能加数字,表示重复的次数,这里记作 [n]。所以操作和移动相结合遵循如下模式:[n] {operator} [n] {motion}
。
命令 | 功能 |
---|---|
d4w | 删除 4 个单词 |
d\$ | 删除到行尾 |
c | 修改文本 |
x | 表示 dl,删除当前光标下的字符 |
X | 表示 dh,删除光标左边的字符 |
D | 表示 d\$ ,删除到行尾 |
C | 表示 c\$ ,修改到行尾 |
s | 表示 cl,修改一个字符 |
S | 表示 cc,修改一整行 |
r | 替换一个字符 |
. | 重复最后一次的修改操作 |
v | 启动可视模式 |
V | 启动按行选择的可视模式 |
CTRL-V | 启动按块选择的可视模式 |
可视模式下的 o 和 O | 把光标移动到被选择文字的另一端 |
p | 粘贴到光标的后面 |
P | 粘贴到光标的前面 |
y | 拷贝 |
yy | 拷贝一整行 |
Y | 表示 y\$ ,拷贝到行尾 |
"* | 使用全局剪切板 |
R | 进入替换模式 |
~ | 修改光标下字符的大小写,并移动到下一个字符,后面不能跟移动指令 |
I | 移动到当前行的第一个非空字符并启动插入模式 |
A | 移动到行尾并启动插入模式 |
操作后面还可以接文本对象。文本对象有哪些呢?见下表:
文本对象 | 意义 |
---|---|
a" | 双引号字符串 |
a’ | 单引号字符串 |
a( | 等同于 ab |
a) | 等同于 ab |
a< | "一个 <> 块" 从 ’<’ 到匹配的 ’>’ |
a> | 等同于 a< |
aB | "一个大块" 从 "[{" 到 "]}" (带上括号) |
aW | "一个字串" (带上空白) |
a[ | "一个 [] 块" 从 ’[’ 到匹配的 ’]’ |
a] | 等同于 a[ |
a` | 反引号字符串 |
ab | "一个块" 从 "[(" 到 "])" (带上括号) |
ap | "一个段落" (带上空白) |
as | "一个句子" (带上空白) |
at | "一个标签块" (带上空白) |
aw | "一个单词" (带上空白) |
a{ | 等同于 aB |
a} | 等同于 aB |
i" | 双引号字符串,不带引号 |
i’ | 单引号字符串,不带引号 |
i( | 等同于 ib |
i) | 等同于 ib |
i< | "内含 <> 块" 从 ’<’ 到匹配的 ’>’ |
i> | 等同于 i< |
iB | "内含大块" 从 "[{" 到 "]}" |
iW | "内含字串" |
i[ | "内含 [] 块" 从 ’[’ 到匹配的 ’]’ |
i] | 等同于 i[ |
i` | 反引号字符串,不带反引号 |
ib | "内含块" 从 "[(" 到 "])" |
ip | "内含段落" |
is | "内含句子" |
it | "内含标签块" |
iw | "内含单词" |
i{ | 等同于 iB |
i} | 等同于 iB |
usr_05.txt 这一章主要是讲配置文件的。这一章大家看一看就可以了,不用记。我觉得有必要设置的选项我已经放到配置文件中了。关于安装插件的内容,了解即可。
usr_06.txt 关于设置语法高亮的。了解即可。
usr_07.txt 这一章是讲编辑多个文件的。
命令 | 功能 |
---|---|
:edit | 打开一个文件 |
:edit! | 放弃对当前文件的修改,打开另一个文件 |
:hide edit | 不放弃对当前文件的修改,隐藏当前文件,打开另一个文件 |
:next | 可以在启动 Vim 的时候打开一堆文件,使用该命令在文件之间切换 |
:write | 保存当前文件 |
:wnext | 先保存,再切换到下一个文件 |
:next! | 放弃对当前文件的修改,切换到下一个文件 |
:args | 查看整个文件列表,后面跟文件名可以编辑另外一个文件列表 |
:previous | 切换到上一个文件 |
:first | 切换到第一个文件 |
:last | 切换到最后一个文件 |
:set autowrite | 设置自动保存 |
CTRL-^ | 在两个文件间快速跳转 |
' " | 跳转到上次离开这个文件时的位置 |
' . | 跳转到最后一次修改文件的位置 |
m | 后面跟大写字母可以设置在所有文件中共享的位置标记 |
:marks | 查看位置标记 |
" | 使用寄存器进行复制粘贴,后面可跟小写字母 a 到 z |
:saveas | 另存为 |
:file | 把当前文件用另外的名字建一个新文件进行编辑,不立即保存 |
usr_08.txt 这一章讲窗口和标签页的,其中关于调整窗口宽度的快捷键是我在 index.txt 中找出来的。
命令 | 功能 |
---|---|
:split | 垂直分割窗口 |
CTRL-W w | 在窗口之间跳转 |
:close | 关闭窗口 |
:only | 关闭其它窗口 |
CTRL-W + | 增加窗口高度 |
CTRL-W - | 减少窗口高度 |
{height}CTRL-W _ | 指定窗口高度 |
:vsplit | 水平分割窗口 |
CTRL-W h/j/k/l | 跳转到上下左右的窗口 |
CTRL-W t/b | 跳转到最顶上或最底部的窗口 |
CTRL-W H/J/K/L | 把当前窗口移动到最左边最下边最上边最右边 |
CTRL-W > | 增加当前窗口的宽度 |
CTRL-W < | 减少当前窗口的宽度 |
:tabedit | 新建标签页 |
:tab split | 新建标签页 |
usr_09.txt 使用 GUI 版本。了解即可。关于 GUI 的设置就不啰嗦了,我主要是取消了滚动条。另外,这一章讲到了当前选区和真剪切板的概念,主要是熟悉两个寄存器"*
和"+
。
usr_10.txt 其它一些修改文件的手段,包括录制命令和回放命令
命令 | 功能 |
---|---|
q{register} | 记录命令,{register}可以使用小写字母 a 到 z |
@{register} | 回放记录的命令 |
@@ | 回放刚执行的命令 |
:[range]substitute/from/to/[flags] | 替换字符串,涉及的信息量比较多,请自行阅读文档 |
:[range]global/{pattern}/{command} | 找到一个匹配点,并在那里执行一个命令 |
> | 把选中的文本右移一个“平移单位 ” |
< | 把选中的文本左移一个“平移单位” |
:read | 读取文件到当前文件 |
gq | 自动排版命令 |
gu/gU | 改变大小写 |
! | 过滤操作 |
:! | 执行外部命令 |
:read !{command} | 读取外部命令的输出到当前文档 |
usr_11.txt 从崩溃中恢复,了解即可。
usr_12.txt 关于使用 Vim 的一些小窍门,了解即可。
usr_20.txt 关于命令行编辑、命令行缩写、命令行补全、命令行历史的,了解即可。需要记住一个打开命令行窗口的命令。
命令 | 功能 |
---|---|
q: | 打开命令行窗口 |
usr_21.txt 离开和返回
命令 | 功能 |
---|---|
CTRL-Z | 挂起 Vim,回到 Shell |
fg | 从 Shell 回到 Vim |
其它关于会话和视图的内容,了解即可。关于 modeline 的内容了解一下。
usr_22.txt 讲 netrw 文件浏览器的,了解一下即可。还有多缓冲区编辑的命令。
命令 | 功能 |
---|---|
:buffers | 查看缓冲区列表 |
:ls | 同上 |
:buffer {number} | 编辑缓冲区,也可以使用文件名 |
:bnext | 编辑下一个缓冲区 |
:bprevious | 编辑上一个缓冲区 |
:bfirst | 编辑第一个缓冲区 |
:blast | 编辑最后一个缓冲区 |
:bdelete | 删除缓冲区 |
usr_23.txt 编辑特殊文件,Vim 功能挺强大的,可以编辑网络文件、加密文件、二进制文件、压缩文件等,了解一下即可。
usr_24.txt 快速插入,以下快捷键都是在插入模式下执行的。
命令 | 功能 |
---|---|
CTRL-W | 快速删除一个单词 |
CTRL-U | 快速删除到行首 |
CTRL-P | 自动补全,搜索匹配的单词 |
CTRL-N | 自动补全,反向搜索匹配的单词 |
CTRL-X CTRL-F | 自动补全文件名 |
CTRL-X CTRL-L | 自动补全整行 |
CTRL-X CTRL-D | 自动补全宏定义 |
CTRL-X CTRL-I | 自动补全当前文件及所包含的文件 |
CTRL-X CTRL-K | 自动补全字典文件内的单词 |
CTRL-X CTRL-T | 自动补全同义词词典文件内的单词 |
CTRL-X CTRL-] | 自动补全标签 |
CTRL-X CTRL-V | 自动补全 Vim 命令行 |
CTRL-X CTRL-O | 自动补全程序代码 |
CTRL-A | 把上次在插入模式下输入的文本再输入一次 |
CTRL-@ | 同上,但插入后退出插入模式 |
CTRL-Y | 从光标上面一行拷贝 |
CTRL-E | 从光标下面一行拷贝 |
CTRL-R | 插入寄存器里面的内容 |
CTRL-O | 在插入模式下执行普通模式的命令 |
关于缩写功能,因为用得少,我这里就没有总结出来。而且从这里可以看到,Vim 自带的补全功能还是很强大的,但是我们用自动补全的插件代替了,所以这些快捷键用得少。
usr_25.txt 编辑带格式的文本,了解一下即可。记住其中增加缩进和减少缩进的命令,这个用得比较多。
命令 | 功能 |
---|---|
>> | 增加当前行的缩进,前面带数字可以缩进多行 |
<< | 减少当前行的缩进,前面带数字可以缩进多行 |
usr_26.txt 重复,了解一下即可。
usr_27.txt 查找命令即模式,了解一下即可。
usr_28.txt 折叠
命令 | 功能 |
---|---|
zf | 产生一个折叠 |
zo | 展开折叠的内容 |
zc | 折叠展开的内容 |
zr | 减少折叠 |
zm | 增加折叠 |
zR | 展开所有嵌套的折叠 |
zM | 关闭所有的折叠 |
折叠有很多方法,可以按缩进进行折叠,也可以按标志进行折叠,也可以按语法进行折叠。了解一下即可。
usr_29.txt 在代码间移动。主要是使用 tags,我前面已经讲过 ctags 程序和 tagbar 插件。但是这里讲到了预览窗口,值得学习一下。
命令 | 功能 |
---|---|
:ptag | 打开预览窗口显示函数信息 |
CTRL-W } | 打开预览窗口显示函数信息 |
:pclose | 关闭预览窗口 |
:pedit | 在预览窗口中编辑一个文件 |
:psearch | 在预览窗口中搜索 |
] 开头和 [ 开头的命令 | 在程序中跳转 |
usr_30.txt 编辑程序,主要是和 quickfix 有关的命令和缩进有关的命令。
命令 | 功能 |
---|---|
:cnext | 将光标移动到下一个错误所在的行 |
:cc | 查看详细的出错信息 |
:clist | 列出所有的出错信息 |
:set cindent siftwidth=4 | 设置 C 风格的缩进 |
= | 自动对选定的范围进行缩进 |
> | 增加缩进 |
< | 减少缩进 |
:set expandtab | 将<Tab>展开为空格 |
CTRL-T | 在插入模式下,增加一个缩进 |
CTRL-D | 在插入模式下,减少一个缩进 |
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-galore-zh_cn。
版权申明##
该随笔由京山游侠在2018年09月11日发布于博客园,引用请注明出处,转载或出版请联系博主。QQ邮箱:1841079@qq.com
Linux 桌面玩家指南:02. 以最简洁的方式打造实用的 Vim 环境的更多相关文章
- Linux 桌面玩家指南:18. 使用 Docker 隔离自己的开发环境和部署环境
特别说明:要在我的随笔后写评论的小伙伴们请注意了,我的博客开启了 MathJax 数学公式支持,MathJax 使用$标记数学公式的开始和结束.如果某条评论中出现了两个$,MathJax 会将两个$之 ...
- Linux 桌面玩家指南:17. 在 Ubuntu 中使用 deepin-wine,解决一些依赖 Windows 的痛点问题
特别说明:要在我的随笔后写评论的小伙伴们请注意了,我的博客开启了 MathJax 数学公式支持,MathJax 使用$标记数学公式的开始和结束.如果某条评论中出现了两个$,MathJax 会将两个$之 ...
- Linux 桌面玩家指南:16. 使用 CUDA 发挥显卡的计算性能
特别说明:要在我的随笔后写评论的小伙伴们请注意了,我的博客开启了 MathJax 数学公式支持,MathJax 使用$标记数学公式的开始和结束.如果某条评论中出现了两个$,MathJax 会将两个$之 ...
- Linux 桌面玩家指南:15. 深度学习可以这样玩
特别说明:要在我的随笔后写评论的小伙伴们请注意了,我的博客开启了 MathJax 数学公式支持,MathJax 使用$标记数学公式的开始和结束.如果某条评论中出现了两个$,MathJax 会将两个$之 ...
- Linux 桌面玩家指南:14. 数值计算和符号计算
特别说明:要在我的随笔后写评论的小伙伴们请注意了,我的博客开启了 MathJax 数学公式支持,MathJax 使用$标记数学公式的开始和结束.如果某条评论中出现了两个$,MathJax 会将两个$之 ...
- Linux 桌面玩家指南:13. 使用 Git 及其和 Eclipse 的集成
特别说明:要在我的随笔后写评论的小伙伴们请注意了,我的博客开启了 MathJax 数学公式支持,MathJax 使用$标记数学公式的开始和结束.如果某条评论中出现了两个$,MathJax 会将两个$之 ...
- Linux 桌面玩家指南:12. 优秀的文本化编辑思想大碰撞(Markdown、LaTeX、MathJax)
特别说明:要在我的随笔后写评论的小伙伴们请注意了,我的博客开启了 MathJax 数学公式支持,MathJax 使用$标记数学公式的开始和结束.如果某条评论中出现了两个$,MathJax 会将两个$之 ...
- Linux 桌面玩家指南:11. 在同一个硬盘上安装多个 Linux 发行版以及为 Linux 安装 Nvidia 显卡驱动
特别说明:要在我的随笔后写评论的小伙伴们请注意了,我的博客开启了 MathJax 数学公式支持,MathJax 使用$标记数学公式的开始和结束.如果某条评论中出现了两个$,MathJax 会将两个$之 ...
- Linux 桌面玩家指南:10. 没有 GUI 的时候应该怎么玩
特别说明:要在我的随笔后写评论的小伙伴们请注意了,我的博客开启了 MathJax 数学公式支持,MathJax 使用$标记数学公式的开始和结束.如果某条评论中出现了两个$,MathJax 会将两个$之 ...
随机推荐
- driver匹配元素定位用法大全
# -*- coding:utf-8 -*- from selenium import webdriver from selenium.webdriver.common.by import By fr ...
- Docker 新手入门
简介 如果您是 Docker 新手请您花大约三十分钟的时间来了解 Docker 相关的知识和内容. Docker 与 Linux 息息相关,因此在阅读本文档之前请您确保以下条件: 对 Linux 的命 ...
- HEOI2018——welcome to NOI2018
我不得不和烈士和小丑走在同一道路上, 万人都要将火熄灭, 我一人独将此火高高举起, 我借此火得度一生的茫茫黑夜. ——海子 弹指一瞬间,翘首以盼的HEOI2018就来了. 我,一个滑稽的小丑,带 ...
- bzoj 1064 假面舞会 图论??+dfs
有两种情况需要考虑 1.链:可以发现对最终的k没有影响 2.环:如果是真环(即1->2->3->4->1),可以看出所有可行解一定是该环的因数 假环呢??(1->2-&g ...
- BZOJ_1070_[SCOI2007]修车_费用流
BZOJ_1070_[SCOI2007]修车_费用流 Description 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同 的车进行维修所用的时间 ...
- BZOJ4554: [Tjoi2016&Heoi2016]游戏 luoguP2825 loj2057
题面描述:尽可能多的放置符合要求的炸弹. 分析: 在i,j处放置炸弹,则在第i行,上一个硬石头之后,下一个硬石头之前,第j列,上一个硬石头之后,下一个硬石头之前,不能再次放置炸弹. 首先,这个题,一看 ...
- java集合框架之Collections
参考http://how2j.cn/k/collection/collection-collections/369.html Collections是一个类,容器的工具类,就如同Arrays是数组的工 ...
- 深入理解Java 栈数据结构
栈(stack)又名堆栈,它是一种运算受限的线性表.其限制是仅允许在表的一端进行插入和删除运算.这一端被称为栈顶,相对地,把另一端称为栈底.向一个栈插入新元素又称作进栈.入栈或压栈,它是把新元素放到栈 ...
- Scala 开发遇到的坑
1. x.purchaseIntax.getOrElse(BigDecimal(0.00)) 可以直接写成 x.purchaseIntax.getOrElse(0)自动转换的 2. srcDataL ...
- 基于滴答清单 Web 开发的 PC 客户端
基于滴答清单 Web 开发的 PC 客户端 关于「滴答清单」 滴答清单是一款不可多得的 GTD 效率工具,它有着清晰明了的界面设计.恰到好处的功能设置.稳定的同步服务,如果你还缺少一款简洁而有效的 G ...