文艺复兴·VIM使用指南·Day 1

559 阅读7分钟

速度与激情里面有个名场面,「Don老大带着大家在后院吃火鸡。开饭前一起缅怀先人【祷告】,然后就是开怀一笑,和家人吃鸡喝酒」。「家人」这个概念和开源「社区」多少有点类似,不管你来自哪里,犯过什么事,只要你能成为「家人」,一切就都不重要了;开源「社区」也是如此,不论你有什么背景,好像用同一个软件,一起给它做贡献,就是「家人」。今天写下这些文字,预计后续会一直更新,一则是记录自己的学习过程,二来也是介绍给大家,毕竟用vim,我们就是「家人」了。

  1. vim是荷兰籍程序员Bram Moolenaar开发的一款软件,1991年正式发布。
  2. 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的特性

  1. 支持异步命令(vim 8开始支持)
  2. 支持RPC,让neovim作为一个后台,你的插件、GUI可以通过RPC和neovim通信
  3. floating windows(vim 8.2开始支持)炫富窗
  4. tree-sitter...
  5. LSP(Language Server Protocol)
  6. ...

实际开发中,你愿意使用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的模式

  1. 普通模式Normal
  2. 插入模式Inster
  3. 可视模式Visual
  4. 选择模式Select
  5. 命令模式Command
  6. Ex模式

另外还有一些派生的模式,日常使用中我们主要用到普通模式、插入模式、可视模式、命令模式这四个模式。

普通模式

普通模式主要用来移动光标,以及不需要打字输入的场景,比如y复制、p粘贴、翻页等。

进入vim界面后,默认为普通模式。普通模式可以使用许多命令来移动光标、处理文本。这里先举几个例子来感受一下。

# 移动
h    光标左移动一格
j    光标下移动一格
k    光标上移动一格
l    光标l移动一格
w    光标移动到下一个单词
b    光标移动到上一个单词开头
0    光标移动行首
$    光标移动到行末尾
zz   当前光标定位到屏幕中央
_    光标移动到行首第一个非空格
gg   光标移动到文件头部
G    光标移动到文件尾部
dd   删除当前行
C-d  向下翻页
C-u  向上翻页

vim day1 normal

插入模式

插入模式主要用于我们需要录入文字的场景。

有几种方式可以从普通模式进入插入模式。

i       字面意思 insert。光标位置前一个位置插入
I       行首插入
a       下一个位置插入
A       行末插入
o       增加一行,并进入插入模式
O       向上增加一行,并进入插入模式
<ESC>   退出插入模式
<C-c>   退出插入模式

vim day1 insert

可视模式

可视模式就像是你有了光标,可以通过键盘来选择区域。可视模式中可以使用普通模式的光标移动键位来定义圈选范围。

几种方式进入可视模式。

v       进入可视模式
V       进入可视模式,选中当前行
<C-v>   多行光标

vim day1 visual

命令模式

执行命令,可以执行vim的命令、插件命令、环境命令(终端命令等)。这个命令很重要,当你想要学习某条命令的时候可以帮助你快速记忆。

在普通模式下输入:进入命令

:      后直接跟命令,回车执行,比如进入帮助a的页面:h a 设置高亮:syntax on
:!     后直接跟环境命令,如:!echo 1
:<C-c> 命令模式下按<C-c>退出命令模式

利用好内置的文档

:h a   a命令帮助 插入
:h c   c命令帮助 修改
:map   查看所有映射
:nmap  查看普通模式下映射
:vmap  查看可视模式下映射
:h     进入帮助页面

vim day1 command

退出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次

vim day1 motions

operator

顾名思义,操作,就像是我们自然语言里面的动词一样。「我吃饭」,「吃」就是我们的操作,vim里面是一样的。这些是一些简单的操作

c       change 修改
d       delete 删除
y       yank   复制到寄存器(后面讲)
~       切换光标字符的大小写
gu      切换为小写
gU      切换为大写
gq      文本格式化
gw      文本格式化,不移动光标
<       块移动,左移动
>       块移动,右移动

vim day1 operator

针对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

vim day1 motion-navigator

大写命令

上面已经涉及到大部分的使用场景,现在学习一个简单的记忆规则。一个命令,小写和大写,往往是相反或者加强的。

o/O       下起一行/上起一行
a/A       光标后插入/光标行末插入
t/T       向后->直到../向前<-直到..   dta/dTa => delete to a/delete back to a
x/X       光标位置字符删除/光标前一个字符删除
p/P       向后粘贴/向上粘贴

总结

第一天,我们了解了这些内容

  1. vim/neovim历史,安装环境
  2. 基本的光标操作
  3. 退出方式
  4. motion/operator组合操作

下一次,我们要学习一些高级操作/组合