计算机教育中缺失的一课——Vim

本文最后更新于:2023年9月6日 上午

Vim简介——编辑器之神

Vim是一个文本编辑器,被称为编辑器之神,但与之强大功能所对应的,是陡峭的学习曲线

很多人学习Vim都是从入门到放弃,之后便将其束之高阁。但是掌握之后,你将感受到Vim哲学与效率的巨大提升

在学习之前需要明确的几点:

  • 学习Vim在开始是痛苦的

  • 只有多用才会熟练

  • 克服的一切困难都是值得的

下面是Vim的一个快速使用示范:

  • 在命令行中键入Vim 1.cpp,会直接进入Vim的普通模式(Normal Pattern),此时是无法输入文字的

  • 按下i,便进入了编辑模式(Insert Pattern),在编辑模式下,方可键入文字

  • 输入文字

  • 按下ESC,输入:wq,我们便回到了命令行,并且成功完成了文件的编辑

Vim模式

在上面我们可以发现,Vim具有普通模式和编辑模式(这是最常用的模式),不同的模式具有不同的特点,这是Vim的特性,也是我们初学会感受到别扭的地方

在普通模式下不可以插入文字,只能输入命令。要想进行编辑,需要切换到插入模式

模式切换

Vim打开之后即进入普通模式,在Vim的普通模式下,所有的键都是功能键。对于以下不同情景的目的,有不同的按键帮助我们提升效率

对于以下特殊情景,不同的快捷键可以快速移动光标。比如输入2 G,即可移动到第二行

常用命令

移动到特定位置:

按键 功能
0 光标移动到行首
$ 光标移动到行尾部
gg 光标移动到文件的第一个字符
G 光标移动到文件的最后一个字符
n G 光标移动到第n行
w 光标移动到下个单词的开始
e 光标移动到本单词最后一个字母
b 光标移动到本单词的第一个字母

上下左右:

除了上下左右箭头可以移动之外,Vim支持使用hjkl进行光标的移动,分别对应

按键 功能
h 或 左箭头键 光标向左移动一个字符
j 或 向下箭头 光标向下移动一个字符
k 或 向上箭头 光标向上移动一个字符
l 或 向右箭头 光标向右移动一个字符

字符串匹配

输入/之后,可以输入text,之后光标会移动到text首次出现的地方,在这之后:

按键 功能
n 光标移动到下一个text出现的地方
N 光标移动到前一个text出现的地方

替换

普通模式,可以替换单个字母,方式很简单,先按下r,然后输入要替换的字母即可

删除

按键 功能
dw 删除光标到下个单词的开始处所有文本
de 删除光标到本单词的结束处所有文本
d2w 删除光标到后面第二个单词的开始处所有文本

撤销

按键 功能
u 撤销
ctrl+r 撤销你的撤销

拷贝/粘贴

按键 功能
yy 拷贝当前行
p 在当前位置后面粘贴
P 在当前位置的下一行粘贴

普通模式切换到插入模式

按键 功能
a 在光标后插入
o 在当前行后面插入一个新行
O 在当前行前面插入一个新行

保存/退出

保存/退出都要在命令模式下完成

按键 功能
:w 仅保存
:q 退出
:wq 保存且退出

快速入门

  • vimtutor命令打开官方教程,并建立一份教程文件的拷贝,该教程有各种语言的版本,如果想要打开中文版本,输入vimtutor zh即可

  • 按 CTRL-O 回跳,C-I后跳

  • ZZ保存并退出

  • “J” 命令删除两行间的换行符

  • x删除单个字符

  • dd删除整行

  • u撤销

  • U撤销整行所有修改

  • C-R撤销你的撤销

  • 9k向上移动 9 行

  • w向后移动一个单词

  • b向前移动一个单词

  • f向右移动到一个指定的字符,fy向右移动到第一个y出现的位置

  • F向左移动到一个指定的字符

  • %进行括号匹配

  • “H” 表示 “Home” (头),”M” 表示 “Middle” (中) 而 “L” 表示 “Last” (尾)

  • C-G输出你现在在的位置

  • C-D向下滚屏

  • C-U向上

  • zz让光标保持在屏幕中间

  • /pattern进行字符串匹配,n向后查找,N向前查找

  • ^匹配行首,$匹配行尾,d$删除光标到尾端所有的文本

  • cw修改一个词,c2w修改两个词,c$修改到行尾,cc修改一整行。确切地说,它删除一个词,并切换到插入模式

  • 灵活的组合上面命令,/pattern查找字符串,cw修改单词,n找到下一个单词,.重复修改操作,n继续下一个单词

  • dd+p可以用来移动文本

  • p接受计数前缀,比如3p就是插入相同的文本三次

  • xp可以交换两个字符,比如你把the打成了teh,那么把光标放到e下面,按下xp即可

  • y是yank(抽出)的意思,可以将文本拷贝到寄存器中,然后使用p粘贴到别的地方。yw就是拷贝一个单词的意思。yy拷贝一整行

  • yaw表示yank a word,可以在一个单词的任意位置复制该单词

  • 一些经常用到的文本删除:

1
2
3
4
5
6
7
8
9
10
11

x 删除光标下的字符 ("dl" 的缩写)
X 删除光标前的字符 ("dh" 的缩写)
D 从当前位置删除到行尾 ("d$" 的缩写)
dw 从当前位置删除到下一个单词开头
db 从当前位置删除到前一个单词的开头
diw 删除光标上的单词 (不包括空白字符)
daw 删除光标上的单词 (包括空白字符)
dG 删除到文件末
dgg 删除到文件首

  • ~ 将字符的大小写转换

  • I移动到当前行第一个非空字符处并切换到插入模式

  • A移动到行尾并切换到插入模式

vimtutor

lunavim

首先要安装最新版neovim,如果是Ubuntu直接apt install可能会安装较低版本的nvim,不符合lunavim的版本要求,可以参考https://github.com/neovim/neovim/releases/tag/stable进行安装

1
2
3
wget https://github.com/neovim/neovim/releases/download/stable/nvim-linux64.deb

sudo apt install ./nvim-linux64.deb

如果版本过低需要先卸载neovim再重新安装

1
2
sudo apt remove neovim-runtime    
sudo apt remove neovim

安装lunavim

1
2
3
4
5
sudo apt-get install cargo

sudo apt-get install neovim #需要cargo

LV_BRANCH='release-1.2/neovim-0.8' bash <(curl -s https://raw.githubusercontent.com/lunarvim/lunarvim/fc6873809934917b470bff1b072171879899a36b/utils/installer/install.sh)

[ERROR]: Unable to verify plugins, make sure to manually run ‘:PackerSync’ when starting lvim for the first time.

添加环境变量即可:

export PATH="$PATH:/home/$USER/.local/bin"

source ~/.bashrc

还遇到了一些由于网络因素被墙无法访问外网下载插件的问题,给服务器挂代理即可解决。由于Linux挂代理比较麻烦,因此建议直接走主机代理

一些好用的vim资源

Vim插件

在其他软件上使用vim

  • jetbrain系软件的Vim插件
  • Chrome浏览器的Surfingkeys插件
  • Vscode的Vim插件

推荐阅读

如何使用原生 vim 覆盖90%的插件功能 - 知乎
vi - What is your most productive shortcut with Vim? - Stack Overflow

TODO


计算机教育中缺失的一课——Vim
http://gls.show/p/4f2baa62/
作者
郭佳明
发布于
2023年7月26日
许可协议