[ The Missing Semester of Your CS Education ] 学习笔记 Vim篇
“Writing English words and writing code are very different activities. When programming, you spend more time switching files, reading, navigating, and editing code compared to writing a long stream.”
—— < The Missing Semester of Your CS Education >
Vim
是一个模态编辑器(modal editor),它的设计哲学是:编辑操作应当通过键盘组合完成,而非依赖鼠标或菜单。
“Vim avoids the use of the mouse, because it’s too slow; Vim even avoids using the arrow keys because it requires too much movement.”
—— < The Missing Semester of Your CS Education >
Vim
认为使用鼠标浪费时间,会降低效率,因为手从鼠标移动到键盘需要一定时间,对程序员来说反复来回的切换是很annoying
的。因此,所有的vim
功能都可以通过键盘操作,或许一开始你并不习惯,但等你使用久了,便能发现它得到程序员青睐的原因!
课程相关视频与讲义:Editors (Vim)
核心特性
普通模式
:用于导航和操作文本(默认模式)插入模式
:像常规编辑器一样输入文本(按i
进入)可视模式
:选择文本块(按v
进入)命令行模式
:执行保存/退出等命令(按:
进入)
基础操作
使用 Vim
时会经常使用<ESC>
键,而它不在主键盘区,显然不那么方便,于是很多程序员考虑将 Caps Lock
重新映射到 Escape
或使用简单的键序列创建替代映射!
模式切换
操作 | 功能 |
---|---|
vim | 进入vim编辑器 |
vim 文件名 | 打开特定文件(不存在时会新建) |
i (insert ) | 进入插入模式 |
Esc | 返回普通模式 |
: | 进入命令行模式 |
光标移动
操作 | 功能 |
---|---|
h j k l | 左/下/上/右移动 |
0 | 移动到行首 |
$ | 移动到行尾 |
^ | 移动到行首非空字符 |
G | 移动到文件底部 |
gg | 移动到文件顶部 |
H | 移动到窗口顶部 |
L | 移动到窗口底部 |
Ctrl+u | 上翻半页 |
Ctrl+d | 下翻半页 |
Ctrl+b | 上翻整页 |
Ctrl+f | 下翻整页 |
编辑功能
文本操作
操作 | 功能 |
---|---|
o | 下方新建行并插入 |
O | 上方新建行并插入 |
u | 撤销 |
Ctrl+r | 重做 |
x | 删除字符 |
dw | 删除单词 |
dd | 删除整行 |
cc | 删除并进入插入模式 |
复制粘贴
操作 | 功能 |
---|---|
y (yank ) | 复制 |
yy | 复制当前行 |
yw | 复制单词 |
p (paste ) | 粘贴 |
可视化模式
操作 | 功能 | 说明 |
---|---|---|
v | 字符可视化 | 按字符选择 |
V | 行可视化 | 按行选择 |
Ctrl+v | 块可视化 | 矩形选择 |
高级功能
搜索与替换
操作 | 功能 |
---|---|
f+字符 | 向前查找字符 |
F+字符 | 向后查找字符 |
~ | 大小写转换 |
批量操作
数字+指令
可以进行批量化操作
4j #向下移动4行 3ee #选择3个单词 7dw #删除7个单词
文件操作
保存与退出
操作 | 功能 |
---|---|
:w (write ) | 保存文件 |
:q (quit ) | 退出 |
:qa (all ) | 退出所有窗口 |
:wq | 保存并退出 |
实战演示
学习了上面那么多的指令不妨自己创建一个python
文件,结合之前学习的shell
命令,在实践中感受Vim
的魅力吧!
import sys #导入sys来接受shell中的参数def fizz_buzz(limit):for i in range(1, limit + 1):if i % 3 != 0 and i % 5 != 0:print(i)elif i % 3 == 0 and i % 5 != 0:print('fizz')elif i % 5 == 0 and i % 3 != 0:print('buzz')else:print('fizzbuzz')def main():fizz_buzz(int(sys.argv[1]))if __name__=='__main__':main()
$ python3 fizzbuzz.py 30
1
2
fizz
4
buzz
fizz
7
8
fizz
buzz
11
fizz
13
14
fizzbuzz
16
17
fizz
19
buzz
fizz
22
23
fizz
buzz
26
fizz
28
29
fizzbuzz