vim学习与我的配置
vim? 那是个什么 JB 东西?
Enjoy coding 的你,是否时常痛恨鼠标点来点去、方向键远离字母,耽误码字?可曾詈骂手动批量重复处理的痛苦?Debug 时代码上下反复跳转,令你烦闷否?别人写的编辑器设置种种不便,是否想过有一个自己私人订制的编辑器?如果你有以上苦恼,那么 vim 将是你的绝佳选择。
vim 是一个文本编辑器,素有“编辑器之神”的美名,同时它也是 Linux 尤其是服务器环境下编辑文件的主要方法。
vim 的主要特点是分模式编辑:
模式 | 说明 | 功能 |
---|---|---|
Normal | 正常 | 光标移动、阅读文件 |
Insert | 插入 | 在当前光标位置插入内容,编辑文件 |
Visual | 视觉/选择 | 选中、复制粘贴 |
Replace | 替换 | 替换当前光标下字符 |
其关系如下:

我的 vim 学习路线
不幸的是 Vim 的学习曲线确实相当陡峭,最开始你会觉得非常不适应,但一旦熬过了初始阶段,你会爱上 Vim。以我而言,现在离开了 vim 的模式几乎已经快不会写材料了,前几天交作业要求 word,我保存文件居然不是Ctrl+s,而是顺手来了个:wq。
我的 vim 学习路线如下:
- 环境:虚拟机 Ubuntu22.04 LTS 环境,vim。也可以使用 windows 下的 gvim/neovim 或 gitbash 自带 vim 等。
- 首先,阅读和观看 MIT 的
Missing Semister
中关于 vim 的课程。消失的学期其他课程也非常不错。要是我刚上大学就知道有这个学期该多好! - 而后,在网上玩Vim
Adventures,多玩几遍,直到熟悉其所有键位。
“家贫,无从致游戏以玩”,谁要是有这个游戏全版,记得 v 我一份! - 同时,在命令行中学
vimtutor
,这是 vim 自带的基础官方教程,对于基础使用方法介绍非常完整。- 系统如果是中文则该教程是中文,否则为英文。
- 使用方法为在命令行中输入vimtutor并回车。学习过程中尽量不要退出,因为教程不会保存本次做过的操作,下次再进来是个新的。
- 第一次学会慢一些,一小时左右,一共 7 章若干节,一节一个技能,每一章有一个总结。
- 用了 vim,你难道不觉得键盘上的 Esc 放那么远简直是反人类吗?没错,我也这么觉得。于是想到自己做键盘映射。
想了解其他信息,可以参考 CSDiy 的vim 指南。当然,众所周知,学习工具的核心在于使用,用起来逢山开路遇水搭桥,才最具效率和效果,isn’t it? 现代的我们,大多数情况的代码都有 IDE,但 vim 的分模式编辑和高度定制化一定会帮我们在 Coding 之路上快马加鞭。在你的各种 IDE 里安装 vim 插件,练起来,享受 All in One 的乐趣吧!
vim 手动编译安装
vim 在许多 Linux 发行版都有预装,即使没有预装的也都可以下载到安装包进行安装。但是这里边有几个问题:
- 很多 vim 版本不支持 python/python2/rust/perl/lua 等语言编写的插件。
- 是否支持某功能,在命令行运行
vim --version
或在 vim 内运行:version
命令即可查看,带有+
号的表示支持,-
号表示不支持。 - 语言后边带有
dyn
的(如+python3/dyn
)表示支持动态链接,否则表示仅静态链接。
- 是否支持某功能,在命令行运行
- 不论何种 Linux 发行版,使用的 vim 版本都略微比发行时间旧一些以保证稳定性;但有时追求新功能的话需要最新版,甚至网上找不到你需要的版本的安装包。
因而,我们有时会需要自己手动编译安装 vim。即以我而言,为了在 vim 上使用 GitHub Copilot 插件,根据插件文档要求,我不得不手动编译 vim。下面是我的编译过程。当前系统为 Ubuntu22.04 LTS。编译过程中主要参考以下几篇文章,在此一并致谢:
清理干净
下载的第一步当然是卸载当前系统具有的 vim 了。除此之外,由于 Python2 过于老旧,我选择不支持 Python2 仅支持 Python3 的 vim,因此也将 Python2 卸载。
sudo apt autoremove vim rvim gvim vim-runtime
sudo apt autoremove python2*
做好准备
为了编译能够支持 python3/rust/perl/lua 等语言的 vim,我们需要安装一些包。
sudo apt install -y git \
libatk1.0-dev \
libcairo2-dev \
liblua5.1-0-dev \
libncurses5-dev \
libperl-dev \
libx11-dev \
libxpm-dev \
libxt-dev \
lua5.1 \
python3-dev \
ruby-dev \
# libgtk2.0-dev
由于我的编译在服务器上运行,主要运行环境为命令行,不需要 gtk2 等图形界面的支持,因而将安装 gtk 的那一行注释掉了。在编译带有 gtk2.0 的 vim 时似乎会遇到问题:vim
源码截至目前版本(v9.0.1854)采用的 gtk 代码中的struct _GTimeVal
已经被弃用,gcc
要求改用struct _GDateTime
,因此编译时会报错,而且陷入死循环,编译不会终止,只能Ctrl+c杀死进程。我尚不知道如何解决。这也是我放弃支持
gtk 的原因之一。
下载源码
vim 源码可以通过其GitHub 仓库下载,也可以在其官网下载。我选择了前者。
git clone https://github.com/vim/vim
# 后续处理过程都在源码目录下的src目录内进行,因而切换过去
cd vim/src
# 如果此前自己编译安装过vim,需要先卸载自己的安装并清理上次的编译文件,否则会持续报错
sudo make uninstall
sudo make distclean
开干!
configure
vim
的编译过程中,需要先运行configure
脚本,该脚本会检查当前系统的环境,并以参数形式接收你需要哪些功能。可以通过./configure --help
查看所有可选参数及其功能说明。我选择的参数如下:
sudo ./configure\
--with-features=huge \
--enable-multibyte \
--enable-rubyinterp=dynamic \
--with-ruby-command=/usr/bin/ruby \
--enable-luainterp\
--enable-python3interp=dynamic \
--with-python3-command=/usr/bin/python3.10 \
--with-python3-config-dir=/usr/lib/python3.10/config-3.10-x86_64-linux-gnu \
--enable-perlinterp=dynamic \
--enable-largefile \
--enable-cscope \
--with-compiledby="An Ordinary Communist weunite1848@gmail.com" \
--enable-fail-if-missing \
--prefix=/usr
对以上选择的参数做一简要说明:
--with-features=huge
:支持最多的功能--enable-multibyte
:支持多字节字符(比如中文!!!)--enable-rubyinterp=dynamic
:支持 ruby 插件,动态链接--with-ruby-command=/usr/bin/ruby
或--with-python3-command=/usr/bin/python3
等,指定 vim 使用的这些语言解释器的位置--with-python3-config-dir=/usr/lib/python3.10/config-3.10-x86_64-linux-gnu
,指定 python3 的 config 文件位置。- 该文件在不同系统上的位置不同,可以通过命令行运行
python3-config --configdir
查看。
- 该文件在不同系统上的位置不同,可以通过命令行运行
--enable-largefile
:支持大文件--enable-cscope
:支持 cscope--with-compiledby
:说明编译者。该信息在编译结束之后会在 vim 首页、帮助页面及版本信息中显示,也就是你的名字与此次编译的 vim 版本永远绑定了。--enable-fail-if-missing
:如果缺少某些功能,编译过程会终止,而不是继续编译。强烈推荐加上!否则遇到编译错误还继续编译,只会得到不符合需求的 vim。--prefix=/usr
:指定安装位置。默认为/usr/local
,但我选择了/usr
。
除此之外还有一些参数,如--enable-gui=gtk2
/--enable-gtk2-check
/--enable-fontset
等,可以根据自己的需求选择。
编译安装
编译安装过程简单到无以复加,就几句话的事。
# 编译
sudo make
# 安装
sudo make install
安装过程中可能会出现报错,如部分文件(ex
/view
等)已经存在,删掉该文件再重新运行命令安装便是。
安装完成后,可以在命令行中运行vim --version
查看 vim 的版本信息,确认是否支持你需要的功能。
最后,将我的编译安装脚本奉上,供参考。
我的 vim 配置
网上一般的教程都说 vim 的默认配置文件为~/.vimrc
。这当然是不错的,但是有一个巨大的问题:家目录是随着用户而不同的,这会导致我们以当前普通用户打开 vim 编辑文件与以
root 用户使用 vim 的观感完全不一致,就很烦。
通过查看vim –version的输出,可以发现,vim 的配置文件有几层,其中“系统 vimrc
文件”被放置在$VIM/vimrc
,而$VIM
为/etc/vim
。因此,我们可以将 vim
的配置文件放置在/etc/vim
下,这样不论是普通用户还是 root
用户,都会使用这份文件,保证观感一致。另外,由于该文件位置较远,我选择在~/useful
下创建软链接,方便使用。
除此之外,出于同样的目的(保证当前用户与 root 用户观感一致),建议将插件也指定一个专门的绝对路径。我放在了/home/player/useful/bundle
。
# 创建软链接
# 我习惯把有用的文件放在~/useful下
mkdir useful
cd useful
# 创建软链接
sudo ln -s /etc/vim /home/player/useful/vim
# 插件存放位置
mkdir bundle
设置
这里原本记录着我的旧版 vim 配置,但随着http 浏览服务器文件的完成,再保留旧版然后每隔三四个月更新一次,对于我这种没事就折腾的人来说说,就显得不那么必要了。因此,这里只简单说一下。
配置的整体结构如下:
/etc/vim
├── vimrc # vim配置文件,负责引入不同的配置模块
└── vimrcs # 我的配置文件夹,里边是不同的配置模块
├── autocmd.vim
├── codecmd.vim
├── keybind.vim
├── match.vim
├── myset.vim
├── plugs.vim
└── statusline.vim
我直接把我服务器上的配置文件放在这里,以供查看。
2023.7.5
2023.9.6
2024.1.3