讲讲Vim
原文链接:https://missing.csail.mit.edu/2020/editors/
Vim哲学
Vim是个模态编辑器。一般来说编辑器在使用时大部分时间是用于看,少部分时间才是操作文本,故设计成对应多个模式。Vim的设计让你的手可以不需要离开键盘,甚至不需要碰方向键因为那样太慢。最终使得你的输入效率可以达到你的思维速度。
模态编辑
- 常规模式:看文件与编辑文件
- 插入模式:插入新文本
- 替换模式:顾名思义
- 可视模式:(常规,行,块)用于按单位选择文本
- 命令行模式:跑命令
同样的命令在不同的模式下有不同的意义。ESC
用于从任何模式退回到正常模式。在正常模式中,用i
进入插入模式,用R
进入替换模式,用v
进入可视模式,用V
进入行可视模式,用C-v
进入块可视模式,用:
进入命令行模式。由于会频繁使用ESC
键,可以考虑map到大小写键上方便敲击(尤其是某些按ESC很不方便的机器,没错说的就是你macbook)
基础
插入文本
进入插入模式,然后和其他编辑器一毛一样
缓冲区,分页和窗口
Vim会维护一个打开文件的集合,叫缓冲区们。一个Vim会话含有一些分页,每个分页含有一些窗口(分屏)。每个窗口展示一个缓冲区。不像其他的应用,这里的缓冲区和窗口不是一一对应的,窗口仅仅作为一个展示器。一个缓冲区可能被多个窗口打开,即使在同一个分页中。这是个十分便利的地方, 例如同时展示同一个文件中不同的部分。
Vim模式只启动一个分页,一个分页仅仅包含一个窗口。
命令行
当进入命令行模式后,光标会跳到底部的命令行。命令可以用于打开关闭保存退出种种。
:q
退出:w
保存:wq
保存退出:e {name of file}
打开文件:ls
显示缓冲区:help {topic}
打开帮助,可以是按键或者命令
Vim界面是一种编程语言
这是理解Vim的一个重要观点。
移动
大部分时间都在常规模式下使用移动命令浏览缓冲区。移动在Vim中也叫“名词”,因为他们指向文本块。
- 基础移动:
hjkl
左下上右 - 单词粒度:
w
下一词,b
到词首,e
到词尾 - 行内粒度:
0
到行首,^
到行内首个非空字符,$
到行末 - 屏幕粒度:
H
到屏顶,M
到屏居中,L
到屏底 - 滚动:
C-u
向上,C-d
向下 - 文件粒度:
gg
文件首,G
文件尾 - 行号:
:行号<按回车>
或行号G
或行号gg
- 迷:
%
- 行内查找(快速移动):
ftFT+字符
f表示向右移动到字符
上,大写表示反向。t则表示向右移动到字符
前,大写表示反向。;
表示重复上一次的命令,,
表示反向重复上一次的命令。所有命令前均可加数字。 - 搜索:
/{regex}
,用n
/N
来选择导航结果
选择
视觉模式有三种:普通 行 块。可以用移动键来做选择。
编辑
所有你用鼠标熟悉的操作都可以用键盘的命令组合来实现。这正是Vim命令为何与编程语言相似之处。Vim编辑命令也叫动词,因为它们在名词之上进行操作。
i
进入插入模式o
orO
在下或上插入新行d{motion}
删除{motion}
-
- 例如
dw
删除词d$
删除到行末d0
删除到行首
- 例如
c{motion}
可以看作是d{motion}
紧接着i
x
删除字符 等价于dl
s
替换字符 等价于xi
- 视觉模式下操作
-
- 选择文本后用
d
或c
- 选择文本后用
u
撤销C-r
重做y
拷贝(yank)p
粘贴- 很多其他命令例如
~
可以反转大小写
计数
可以用来与名词或动词连用,表示同一个动作执行数次。
3w
向前移动三行5j
向下移动5行7dw
删掉7个词
组合修改
用于改变名词的意义。i
表示“内部inner”,a
表示“周围around”
ci(
若当前在小括号内,整个括号内的内容作为c
的对象ci[
同上,改为方括号da'
删除一个单引号字符串
定制Vim
Vim是一个能够深度定制的编辑器,而且只要放到~/.vimrc
就行了
扩展VIM
Vim有一大坨插件,从8.0开始就不需要插件管理器了(网上的老教程会让你装),因为有内置的插件管理系统。
只需要创建目录~/.vim/pack/vendor/start
把插件扔进去。
- ctrlp.vim 模糊文件搜索
- ack.vim 代码搜索
- nerdtree 文件浏览器
- vim-easymotion 魔术移动
这里只是简单的列出了一些插件,vim-awesome有很多好的插件
进阶
搜索与替换
:s
替换命令
%s/foo/bar/g
全局把foo替换成bar%s/\[.*\](\(.*\))/\1/g
全局把md类型的链接改成普通链接
多窗口
:sp
/:vsp
分屏
宏
q{character}
录制并以{character}
注册宏q
停止录制@{character}
执行宏{number}@{character}
执行多次
其他的见原页面