速度与激情里面有个名场面,「Don老大带着大家在后院吃火鸡。开饭前一起缅怀先人【祷告】,然后就是开怀一笑,和家人吃鸡喝酒」。「家人」这个概念和开源「社区」多少有点类似,不管你来自哪里,犯过什么事,只要你能成为「家人」,一切就都不重要了;开源「社区」也是如此,不论你有什么背景,好像用同一个软件,一起给它做贡献,就是「家人」。今天写下这些文字,预计后续会一直更新,一则是记录自己的学习过程,二来也是介绍给大家,毕竟用vim,我们就是「家人」了。
- vim是荷兰籍程序员Bram Moolenaar开发的一款软件,1991年正式发布。
- Bram Moolenaar的个人网站
Bram Moolenaar's website - home
前置
vim是作为vi的替代产品开发出来的文本编辑器,作为代码编辑器最初(21世纪涌现了很多IDE/编辑器)广泛在程序员中使用。vim和emacs并列(peace & love)为类unix系统用户最喜欢的编辑器。
虽然vim有很多中模式,但vim和其他图形化的编辑器有很大的不同,它所有的模式下都可以使用键盘进行IO操作,对于文字录入者或者程序员来说,就可以大大提高工作效率。人们通常对他的称赞就是「思考到哪里,输入就到哪里」。
然鹅,程序员tarruda给7.0版本的vim提交patch,希望vim增加异步执行命令的功能,但是被Bram拒绝了,tarruda因此fork了一个分支出来开发并维护,这个fork出来的项目就是neovim。neovim兼容大多数vim的操作,但是基于vim做了很多重构和升级,虽然vim 8.0也开始支持异步了,但现在很多人都用neovim了。
noevim的特性
- 支持异步命令(vim 8开始支持)
- 支持RPC,让neovim作为一个后台,你的插件、GUI可以通过RPC和neovim通信
- floating windows(vim 8.2开始支持)炫富窗
- tree-sitter...
- LSP(Language Server Protocol)
- ...
实际开发中,你愿意使用vim和neovim都可以。我一般使用neovim(neovim + lsp基本媲美IDE了)。后面的行文中我只使用vim来表达这个(vim或neovim)编辑器。
我的主要开发环境是mac + neovim。
安装
brew install neovim
使用
mac环境下vim使用~/.vimrc,neovim使用~/.config/nvim/init.vim作为入口,若使用lua作为noevim的配置语言的话,配置入口对应为~/.config/nvim/init.lua。
# 安装的neovim原生命令是nvim,这里配置一下shell
alias vim="nvim"
# 打开一个文件
vim ~/hello.md
# 打开一个目录
vim ~/some-directory/
# 不使用配置打开 -u NONE表示不使用vimrc文件启动,-N表示启动nocompatible选线防止进入vi兼容模式
vim -u NONE -N
# 当然你可以加载特定的vimrc
vim -u ~/your/path/to/vimrc/init.vim
# vim +command表示打开后执行一个命令等同于打开后:command<Enter>
vim +checkhealth # 用于检查运行情况/插件依赖等
vim +Tutor # 教学
基本操作
vim的模式
- 普通模式Normal
- 插入模式Inster
- 可视模式Visual
- 选择模式Select
- 命令模式Command
- Ex模式
另外还有一些派生的模式,日常使用中我们主要用到普通模式、插入模式、可视模式、命令模式这四个模式。
普通模式
普通模式主要用来移动光标,以及不需要打字输入的场景,比如y复制、p粘贴、翻页等。
进入vim界面后,默认为普通模式。普通模式可以使用许多命令来移动光标、处理文本。这里先举几个例子来感受一下。
# 移动
h 光标左移动一格
j 光标下移动一格
k 光标上移动一格
l 光标l移动一格
w 光标移动到下一个单词
b 光标移动到上一个单词开头
0 光标移动行首
$ 光标移动到行末尾
zz 当前光标定位到屏幕中央
_ 光标移动到行首第一个非空格
gg 光标移动到文件头部
G 光标移动到文件尾部
dd 删除当前行
C-d 向下翻页
C-u 向上翻页
插入模式
插入模式主要用于我们需要录入文字的场景。
有几种方式可以从普通模式进入插入模式。
i 字面意思 insert。光标位置前一个位置插入
I 行首插入
a 下一个位置插入
A 行末插入
o 增加一行,并进入插入模式
O 向上增加一行,并进入插入模式
<ESC> 退出插入模式
<C-c> 退出插入模式
可视模式
可视模式就像是你有了光标,可以通过键盘来选择区域。可视模式中可以使用普通模式的光标移动键位来定义圈选范围。
几种方式进入可视模式。
v 进入可视模式
V 进入可视模式,选中当前行
<C-v> 多行光标
命令模式
执行命令,可以执行vim的命令、插件命令、环境命令(终端命令等)。这个命令很重要,当你想要学习某条命令的时候可以帮助你快速记忆。
在普通模式下输入:进入命令
: 后直接跟命令,回车执行,比如进入帮助a的页面:h a 设置高亮:syntax on
:! 后直接跟环境命令,如:!echo 1
:<C-c> 命令模式下按<C-c>退出命令模式
利用好内置的文档
:h a a命令帮助 插入
:h c c命令帮助 修改
:map 查看所有映射
:nmap 查看普通模式下映射
:vmap 查看可视模式下映射
:h 进入帮助页面
退出vim
退出vim有两种方式,一种是关闭终端,另一种是重启电脑。
退出vim有两种方式,一种是保存退出,另一种是强制保存退出。
:w 保存文件 字面意思 write
:w! 强制保存文件
:wa 保存所有文件,针对你打开buffer过多的情况
:q 退出
:q! 强行退出
:wq 保存并退出
:qa 退出所有buffer
更多...
学会上面的操作,你基本上可以开始使用vim,并编辑文章或者程序了。但这些并不是vim给你带来的优势,你在其他编辑器上也可以做。接下来要讲的就有点意思了。
motion
在vim里面,一个光标的移动操作,被视为一个motion,比如
b 光标移动到上一个单词头
w 光标移动到下一个单词首
而motion是可以被组合的,比如自然语言里面,「我想跳跑一步」,叠加次数后就会变成,「我想跑一万步」。motion的组合类似这个意思。
9b 光标向前移动9个单词
8<C-d> 翻页操作8次
operator
顾名思义,操作,就像是我们自然语言里面的动词一样。「我吃饭」,「吃」就是我们的操作,vim里面是一样的。这些是一些简单的操作
c change 修改
d delete 删除
y yank 复制到寄存器(后面讲)
~ 切换光标字符的大小写
gu 切换为小写
gU 切换为大写
gq 文本格式化
gw 文本格式化,不移动光标
< 块移动,左移动
> 块移动,右移动
针对motion和operator的技巧很多,现在你仅需要记住,他们都是可以组合的就行了。举几个例子,可以反应这种组合。
# 可用的介词 around in to
diw delete in word 删除一个单词
di" delete in " 删除"word"中的word
daw delete around word 删除一个单词和包裹
cb change back 向前删除到单词头部,并进入插入模式,即修改
cis change in sentence 修改句子
ci< change in < 修改<word>中的word
ca< change around < 修改<word>
# 甚至你可以组合命令进来
d:call EndParagraph() 删除到EndParagraph()执行结果的位置
dfa delete find a 删除到找到第一个a
大写命令
上面已经涉及到大部分的使用场景,现在学习一个简单的记忆规则。一个命令,小写和大写,往往是相反或者加强的。
o/O 下起一行/上起一行
a/A 光标后插入/光标行末插入
t/T 向后->直到../向前<-直到.. dta/dTa => delete to a/delete back to a
x/X 光标位置字符删除/光标前一个字符删除
p/P 向后粘贴/向上粘贴
总结
第一天,我们了解了这些内容
- vim/neovim历史,安装环境
- 基本的光标操作
- 退出方式
- motion/operator组合操作
下一次,我们要学习一些高级操作/组合