1.Vim的哲学
在编程的时候,你会把大量时间花在阅读/编辑而不是在写代码上。所以,Vim 是一个多模态编辑器:它对于插入文字和操纵文字有不同的模式。Vim 是可编程的(可以使用 Vimscript 或者像 Python 一样的其他程序语言),Vim 的接口本身也是一个程序语言:键入操作(以及其助记名) 是命令,这些命令也是可组合的。Vim 避免了使用鼠标,因为那样太慢了;Vim 甚至避免用 上下左右键因为那样需要太多的手指移动。
2.Vim的编辑模式
Vim的设计以大多数时间都花在阅读、浏览和进行少量编辑改动为基础,因此它具有多种操作模式:
- 正常模式:在文件中四处移动光标进行修改
- 插入模式:插入文本
- 替换模式:替换文本
- 可视化(一般/行/块)模式:选中文本块
- 命令模式:用于执行命令
在不同的操作模式下,键盘敲击的含义也不同。比如,x 在插入模式会插入字母x,但是在正常模式会删除当前光标所在的字母,在可视模式下则会删除选中文块。
在默认设置下,Vim会在左下角显示当前的模式。 Vim启动时的默认模式是正常模式。通常你会把大部分时间花在正常模式和插入模式。
你可以按下 <ESC>
从任何其他模式返回正常模式。 在正常模式:
- 键入
i
进入插入 模式 R
进入替换模式v
进入可视(一般)模式V
进入可视(行)模式<C-v>
(Ctrl-V, 有时也写作 ^V)进入可视(块)模式:
进入命令模式。
因为你会在使用 Vim 时大量使用 <ESC>
键,所以可以考虑把大小写锁定键重定义成
3.Vim基本操作
3.1 插入文本
在正常模式,键入 i
进入插入模式。现在 Vim 跟很多其他的编辑器一样,直到你键入
- 缓存、 标签页、窗口
Vim 会维护一系列打开的文件,称为“缓存”。一个 Vim 会话包含一系列标签页,每个标签页包含一系列窗口(分隔面板)。每个窗口显示一个缓存。跟网页浏览器等其他你熟悉的程序不一样的是,缓存和窗口不是一一对应的关系;窗口只是视角。一个缓存可以在_多个_窗口打开,甚至在同一个标签页内的多个窗口打开。这个功能其实很好用,比如在查看同一个文件的不同部分的时候。
Vim 默认打开一个标签页,这个标签也包含一个窗口。
- 命令行
在正常模式下键入 : 进入命令行模式。 在键入 : 后,你的光标会立即跳到屏幕下方的命令行。 这个模式有很多功能,包括打开,保存,关闭文件,以及 退出 Vim。
<esc> 模式下操作 |
含义 |
---|---|
:q | 退出(关闭窗口) |
:w | 保存(写) |
:wq | 保存然后退出 |
:e <文件名> |
打开要编辑的文件 |
:ls | 显示打开的缓存 |
:help <命令> | 打开命令的帮助文档 |
:help :w | 打开:w 命令的帮助文档 |
:help w | 打开 w 移动的帮助文档 |
Vim 的接口其实是一种编程语言,Vim 最重要的设计思想是 Vim 的界面本身是一个程序语言。键入操作 (以及他们的助记名) 本身是命令, 这些命令可以组合使用,这使得移动和编辑更加高效。
3.2 移动
多数时候你会在正常模式normal
下,使用移动命令在缓存中导航。在 Vim 里面移动也被称为 “名词”, 因为它们指向文字块。详见下表:(注意以下命令或按键均需要在normal
模式下使用)
功能 | 操作 |
---|---|
基本移动 | h j k l (左/下/上/右) |
以一个词为单位去移动 | w :下一个词 b :词初 e :词尾 |
以一行为单位去移动 | 0 :行初 ^ :第一个非空格字符 $ :行尾 |
在屏幕中进行移动 | H :屏幕首行 M : 屏幕中间 L : 屏幕底部 |
翻页 | ctrl-u :上翻 ctrl-d :下翻 |
文件头尾快捷键 | gg :文件头 G :文件尾 |
依据行数进行移动 | :<行数> |
向前/向后查找在本行的字符(小写表示向前查找,大写表示向后查找) | f<字符> t<字符> F<字符> T<字符> |
搜索字符串/正则表达式 | :/<字符串或正则表达式> |
3.3 选择文本
- 可视化模式:可以方便的选中文本进行复制、删除、粘贴等操作,详见Vim 可视化模式入门
可视化模式名 | 按键操作 |
---|---|
可视化(一般) | v |
可视化行 | V |
可视化块 | ctrl+v |
- 编辑文本
所有你需要用鼠标做的事, 你现在都可以用键盘:采用编辑命令和移动命令的组合来完成。 这就是 Vim 的界面开始看起来像一个程序语言的时候。Vim 的编辑命令也被称为 “动词”, 因为动词可以施动于名词。
操作 | 实现功能 |
---|---|
i | 进入插入模式但是对于操纵/编辑文本,不单想用退格键完成 |
O / o | 在之上/之下插入行 |
d{移动命令} | 删除 {移动命令}.例如:dw 删除词, d$ 删除到行尾, d0 删除到行头 |
c{移动命令} | 改变 {移动命令}.例如:cw 会删除词并进入insert模式 |
x | 删除字符(等同于 dl) |
s | 删除字符并进入insert模式 |
r | 替换字符(在需要替换字符位置处按r,再输入需要替换的字符) |
ctrl+r |
重做(撤销的反面) |
u | 撤销 |
y | 复制 :yy 可以复制当前行 yw 可以复制一个单词 |
p | 粘贴 |
可视化模式 + 操作 | 选中文字并进行上述操作(例如可以通过hjkl移动光标再复制选中区域) |
~ | 改变光标位置处字符的大小写 |
计数移动
你可以用一个数字来结合“名词”和“动词”,这会执行指定操作若干次。3w
向前移动三个词5j
向下移动5行7dw
删除7个词
开启绝对行号/相对行号
- 开启绝对行号,
ESC
进入命令行模式,输入:set number
;关闭需要ESC
进入命令行模式,输入:set nonumber
- 开启相对行号,
ESC
进入命令行模式,输入:set rnu
;关闭需要ESC
进入命令行模式,输入:set nornu
- 开启绝对行号,
修饰语
你可以用修饰语改变“名词”的意义。修饰语有 :i表示“内部”或者“在内“ ,a表示”周围“。
输入操作 | 功能 |
---|---|
ci( |
改变当前括号内的内容 |
ci[ |
改变当前方括号内的内容 |
da' |
删除一个单引号字符串, 包括周围的单引号 |
注:我们可以使用%
在成对的结构中切换位置,例如在()\‘’\“”\[]等结构
3.4 分屏显示
- Vim和终端分屏显示
vim打开文件后,进入ESC
并输入:vert terminal
,实现垂直分屏显示(直接输入terminal
是水平分屏显示)。关闭terminal时,需要在terminal中输入ctrl+d
- Vim多个文件分屏显示
Vim打开是输入参数-O\-o,-O表示垂直分屏,-o表示水平分屏