主题 3 编辑器(Vim)¶
编辑器 (Vim) · the missing semester of your cs education (missing-semester-cn.github.io)
代码编辑器和和其他的编辑器(比如用来写文章的编辑器)有一些不同。
因为写程序和写文章不同。当你写程序时,会花大量时间来阅读你写的东西,或者来移动光标,做一些小小的修改;而不是像写文章的时候,从上到下一气呵成。因此,对于不同的用途,我们会使用不同的编辑器。
1.该学哪个编辑器?¶
Stack Overflow 的调查显示,VS Code 是目前最流行的代码编辑器。而 Vim 则是最流行的基于命令行的编辑器。就算最终你没有打算长期使用Vim,我们仍然认为学习Vim背后的思想很有价值。
另外,许多工具也觉得 vim 哲学很棒,从而提供了 Vim 模式。例如当前最热门的 VS Code,支持 Vim 键位绑定,该插件已经被下载了数百万次。
2.Vim的哲学¶
Vim 是一个基于模式(Modal)的编辑器,这意味着 Vim 有多个模式。
Modal 这个词源于 Mode
多模式的思想源于,当你在写程序的时候会经常做不同的事情。
在编程的时候,你会把大量时间花在阅读/编辑而不是在写代码上。所以,Vim 是一个**多模态**编辑器:它对于插入文字和操纵文字有不同的模式。Vim 是可编程的(可以使用 Vimscript 或者像 Python 一样的其他程序语言),Vim 的接口本身也是一个程序语言:键入操作(以及其助记名) 是命令,这些命令也是可组合的。Vim 避免了使用鼠标,因为那样太慢了;Vim 甚至避免用上下左右键因为那样需要太多的手指移动。
这样的设计哲学使得 Vim 成为了一个能跟上你思维速度的编辑器。
3.编辑模式¶
正常模式:Normal,在文件中四处移动光标进行修改
插入模式:Insert,插入文本
替换模式:replace,替换文本
可视化模式(一般,行,块):Visual,Visual Line,Visual Block,选中文本块
命令行模式:Command Line,用于执行命令
- Normal 正常模式 & Insert 插入模式
当你开始使用 Vim 时,它会在 Normal 模式下启动。
在这个模式下,各种键位组合拥有在这个模式下的特定意义。其中就有一些按键组合来切换到其他的模式。而切换后这些键位组合和意义也相应改变。
但你的大部分时间都会在 Insert 和 Normal 模式下,在Normal模式下按下i
键就可以进入Insert模式。而在Insert模式下按下Esc
就可以回到Normal模式。
这里注意一下我们表示按键的方式,这个表示方式将会用于笔记以及Vim给你的提示中:
当仅仅是代表
i
键这样一个按键本身时,那么就会直接写i
。但是对于如Ctrl+v这种按键组合,就有可能以这么几种形式来体现:第一种是一个脱字符号后跟着控制用字符:
^v
(这里控制用字符指v,也就是组合键中的另一个键),另一种写法可能是你最熟悉的:Ctrl-v
,而有的地方我们可能会写成:<c-v>
Vim 有好几种模式,而 Normal 模式是用来移动光标、阅读东西,以及在文件间切换的。
而 Insert 模式是用来输入的,因此在 Insert 模式下,你的按键大多会直接进入 buffer(缓冲区),而在 Normal模式下则不然,它们不会进入 buffer,而是用来进行了一些浏览和编辑操作。
- replace 替换模式
不像插入模式那样会把字符往后移,替换模式会直接覆盖掉文本。
- 可视化模式(一般,行,块)
可视化模式有 Visual 模式,Visual Line 模式,以及一个 Visual Block 模式。
- 各种模式的切换
你可以按下 <ESC>
(退出键)从任何其他模式返回正常模式。在正常模式,键入 i
进入插入 模式,R
进入替换模式,v
进入可视(一般)模式,shift+V
进入可视(行)模式,<C-v>
(Ctrl-V, 有时也写作 ^V
)进入可视(块)模式,:
进入命令模式。
- 映射Esc键
从非 Normal 模式切换到 Normal 模式下都是按 Esc
键,因此使用 Vim 时要频繁按 Esc
键。但这个键在键盘的角落里,按起来很不方便,所以很多人会将键盘上某个键映射成 Esc。通常这个键是 Caps Lock
,因为它在键盘的中间一行上。
4.基本操作¶
- 如何打开Vim程序
Vim 是一个基于命令行的编辑器,我们要打开 Vim,只需要在命令行中键入 vim
。
vim 也可以接收参数,当我们想用它直接编辑特定的文件时,可以在 vim 后面加上文件的路径+文件名。
[lighthouse@VM-8-17-centos vim]$ ls
poem.md
[lighthouse@VM-8-17-centos vim]$ vim poem.md
4.1插入文本¶
Vim 以 Normal 模式启动。在 normal 模式下按下i
键,进入 Insert 模式,屏幕左下角将会提示--INSERT--
。在插入模式下按下<esc>
键,可以返回 Normal 模式。
左下角总会显示你所在的模式,但 Nomal 模式下是空白的。
4.2命令行¶
在 Normal 模式按下 :
(冒号)将会进入命令行模式。这时你的光标将会跳到屏幕左下方的命令行。这个模式有很多功能,包括打开,保存,关闭文件,退出 vim。
在命令行模式下:
命令 | 释义 |
---|---|
:q /:quit |
退出(关闭窗口) |
:w / :wirite |
保存文件 |
:wq |
保存并退出 |
:ls |
显示打开的缓存 |
:e {文件名} |
打开对应文件 |
:help <特定键/特定命令> |
打开帮助文档 |
注意,这里的特定命令和特定键不同,如 :help :w
表示获取命令 :w
的说明,而 :help w
表示在 Normal 模式下 w 键的说明。
4.3buffer, tab, window¶
Vim 会维护一系列打开的文件,称为“缓存”。一个 Vim 会话包含一系列标签页(tab),每个标签页包含一系列窗口(分隔面板)。每个窗口(window)显示一个缓存(buffer)。
跟网页浏览器等其他你熟悉的程序不一样的是, 缓存和窗口不是一一对应的关系;窗口只是视角。一个缓存可以在多个窗口打开,甚至在同一 个标签页内的多个窗口打开。这个功能其实很好用,比如在查看同一个文件的不同部分的时候。
Vim 默认打开一个标签页,这个标签也包含一个窗口。
5.Vim的接口是一种编程语言¶
Normal 模式实际上是做什么的?这是 Vim 设计中的最有趣的设计。Vim 的设计理念是 Vim 的 Normal模式例如 Vim 的接口,本身是一种编程语言。
接口即指用户与它交互的方式、中介物
**Vim 最重要的设计思想是 Vim 的界面本身是一个程序语言。**这意味着不同的按键组合具有不同的效果。这些效果又可以组合到一起。而且一旦形成肌肉记忆,你就可以快速编辑文件,思维多快就能写多快。
5.1移动¶
Normal 模式下:
- 基本移动:
hjkl
(左, 下, 上, 右) - 词:
w
(下一个词),b
(词首),e
(词尾) - 行:
0
(行首),^
(第一个非空格字符),$
(行尾) - 屏幕:
H
(屏幕首行),M
(屏幕中间),L
(屏幕底部) - 翻页:
Ctrl-u
(上翻),Ctrl-d
(下翻) - 文件:
gg
(文件头),G
(文件尾) - 行数:
:{行数}<CR>
或者{行数}G
({行数}为行数) - 杂项:
%
(找到配对,比如括号或者 /* */ 之类的注释对) - 查找:
f{字符}
,t{字符}
,F{字符}
,T{字符}
- 查找/到 向前/向后 在本行的{字符}
-
,
/;
用于导航匹配 -
搜索:
/{正则表达式}
,n
/N
用于导航匹配