Vim的哲学
编程时,你大部分时间都花在阅读/编辑上,而不是写作。因此,Vim是一个模态编辑器:它有不同的模式来插入文本和操纵文本。VIM是可编程的(使用Vimscript和Python等其他语言),Vim的接口本身就是一种编程语言:击键(带有助记符名称)是命令,这些命令是可组合的。Vim避免使用鼠标,因为它太慢;Vim甚至避免使用箭头键,因为它需要太多的移动。最终的结果是一个可以与你思考的速度相匹配的编辑器。
模态编辑
Vim的设计基于这样一种想法,即程序员将大量时间花在阅读、导航和进行小的编辑上,而不是编写长的文本流。因此,Vim有多种工作模式。
-
普通:用于在文件周围移动并进行编辑
-
插入:用于插入文本
-
替换:用于替换文本
-
视觉(纯文本、行或块)模式:用于选择文本块
-
命令行:用于运行命令
按键在不同的操作模式下有不同的含义。例如,在插入模式下的字母x
将只插入一个文本字符“x”,但在正常模式下,它将删除光标下的字符,在视觉模式下,它将删除所选内容。
在默认配置中,Vim在左下角显示当前模式。初始/默认模式为正常模式。一般情况下,您的大部分时间都在普通模式和插入模式之间。
您可以通过按退出键(ESC
)从任何模式切换回正常模式来更改模式。在“正常”模式下,输入“i
”进入“插入模式”,输入“R
”进入“替换模式”,输入“v
”进入“视觉模式”,输入“V
”进入“视觉行模式”,输入“<C-v>
”(Ctrl-v,有时还写入^v
)进入“视觉块模式”,输入:进入“**命令行模式**”
。
在使用Vim时经常使用<ESC>
键:考虑重新映射Caps Lock以转义(macOS指令)。
基础
插入文本
在正常模式下,按i
键进入插入模式。现在,Vim的行为类似于任何其他文本编辑器,直到您按<ESC>
返回正常模式。这和上面解释的基础知识一起,是开始使用Vim编辑文件所需要的全部。
缓冲区、选项卡和窗口
Vim维护一组打开的文件,称为“缓冲区”。Vim会话有许多选项卡,每个选项卡都有许多窗口(拆分窗格)。每个窗口显示一个缓冲区。与您熟悉的其他程序(如web浏览器)不同,缓冲区和窗口之间没有1对1的对应关系;窗口只是视图。给定的缓冲区可以在多个窗口中打开,即使在同一个选项卡中也是如此。这非常方便,例如,可以同时查看文件的两个不同部分。
默认情况下,Vim打开时只有一个选项卡,其中包含一个窗口。
命令行
命令模式可以输入:
在正常模式下。按下时,光标将跳转到屏幕底部的命令行:
。此模式具有许多功能,包括打开、保存和关闭文件以及退出Vim。
:q
退出(关闭窗口)
:w
保存(“写入”)
:wq
保存并退出
:e{name of file}
打开要编辑的文件
:ls
显示打开的缓冲区
:help{topic}
打开帮助
:help:w
打开:w
命令的帮助
:help w
打开w
移动的帮助
Vim的接口是一种编程语言
Vim中最重要的思想是Vim的接口本身是一种编程语言。击键(带有助记名字)是命令,这些命令组成。这样可以有效地移动和编辑,特别是当命令变成肌肉记忆时。
移动
您应该在正常模式下花费大部分时间,使用移动命令来导航缓冲区。Vim中的动作也被称为“名词”,因为它们指的是文本块。
基本动作:hjkl
(左、下、上、右)
单词:w
(下一个单词)、b
(单词开头)、e
(单词结尾)
行:0
(行首),^
(第一个非空字符),$
(行尾)
屏幕:H
(屏幕顶部)、M
(屏幕中部)、L
(屏幕底部)
滚动:Ctrl-u
(向上)、Ctrl-d
(向下)
文件:gg
(文件开头),G
(文件结尾)
行号:{number}<CR>
或{number}G
(行{number})
杂项:%
(对应项)
查找:f{character}
、t{character}
、f{character}
、t{character}
-
在当前行上查找/向前/向后{字符}
-
,
/
;
用于导航匹配项
搜索:/{regex}
,不适用于导航匹配项
选择
视觉模式:
- 视觉纯文本
- 视觉行
- 视觉块
可以使用移动键进行选择。
编辑
你以前用鼠标做的每一件事,现在都是用键盘编辑命令,用移动命令组成。这里是Vim的接口开始看起来像编程语言的地方。Vim的编辑命令也称为“动词”,因为动词作用于名词。
i
进入插入模式
- 但是对于操作/删除文本,希望使用的不仅仅是backspace
o
/O
在下方/上方插入行
d{motion}
删除{motion}
dw
为删除字,d$
为删除行尾,d0
为删除行首
c{motion}
改变{motion}
cw
是改变单词- 就像
d{motion}
后面跟着i
x
删除字符(等于 dl
)
s
替代字符(等于xi
)
视觉模式+操作
- 选择文本,
d
删除或c
更改
u
撤消,<C-r>
重做
y
复制/“yank”(其他一些命令,如d也复制)
p
粘贴
还有很多需要学习的地方:例如,~
翻转一个角色的情况
计数
你可以把名词和动词与一个数结合起来,这个数将执行一个给定的动作若干次。
3w
向前移动3个字
5j
向下移动5行
7dw
删除7个字
修饰语
你可以用修饰语来改变名词的意思。有些修饰语是i
,意思是“inner”或“innerside”,a
,意思是“around”。
ci(
更改当前一对括号内的内容
ci[
更改当前方括号对内的内容
da'
删除单引号字符串,包括周围的单引号
演示
下面是一个有错的fizz buzz实现:
def fizz_buzz(limit):
for i in range(limit):
if i % 3 == 0:
print('fizz')
if i % 5 == 0:
print('fizz')
if i % 3 and i % 5:
print(i)
def main():
fizz_buzz(10)
我们将解决以下问题:
- main从未被调用
- 从0开始而不是从1开始
- 将“fizz”和“buzz”分别打印在15的几行上
- 以5的倍数打印“fizz”
- 使用硬编码参数10,而不是使用命令行参数