vim
- vim(vi的增强版)是我最喜欢的编辑器,也是linux下第二强大的编辑器
- 虽然emacs是公认的世界第一,但我认为emacs并没有vi编辑来得高效
- 如果是初学vi,运行一下vimtutor是个聪明的决定
如果你的系统环境不是中文,而你想使用中文的vimtutor,就运行
vimtutor zh
vim的模式
- 正常模式(normal-mode):可以使用快捷键
- 插入模式(insert-mode):可以输入文本
- 命令模式(command-mode):可以执行命令,又称末行模式
- 替换模式(replace-mode):替换光标后的文字
- 可视模式(visual-mode):按行或按列选择区块
模式切换
正常模式 -》 插入模式
打开Vim时是正常模式。在任何模式下,只要按下Esc
键就可以返回正常模式
快捷键 | 功能 |
---|---|
i | 在光标左侧输入正文 |
I | 在光标所在行的行首输入正文,此行首指第一个非空白字符处 |
a | 在光标右侧输入正文 |
A | 在光标所在行的行尾输入正文 |
s | 删除光标所在的字符,并进入输入模式 |
S | 删除光标所在的行,并进入输入模式 |
o | 在光标所在行的下一行增添新行,光标位于新行的行首 |
O | 在光标所在行的上一行增添新行,光标位于新行的行首 |
r | 修改光标所在字符,r后面跟要修改为的字符 |
R | 替换光标所在处开始的字符,直到按【ESC】回到普通模式 |
正常模式 -》 命令模式
按冒号(:)即可进入命令模式,又称末行模式
正常模式 -》 替换模式
按大写的R即可进入替换模式,替换光标所在处开始的字符,直到按【ESC】回到普通模式
正常模式 -》 可视模式
快捷键 | 功能 |
---|---|
v | 进入可视模式,移动光标可以选择文本 |
V | 进入可视行模式,总是整行整行的选中 |
ctrl + v | 进入可视块模式,左右移动选择区块 |
启动vim
vim可以启动多个文件
vim [选项] [文件...]
命令 | 功能 |
---|---|
vim -b FILENAME | 用二进制模式打开 |
vim -c CMD FILENAME | 在打开文件前,先执行指定的命令 |
vim -r FILENAME | 恢复上次异常退出的文件 |
vim -R FILENAME | 以只读的方式打开文件,但可以强制保存 |
vim -M FILENAME | 以只读的方式打开文件,不可以强制保存 |
vim -y N FILENAME | 将编辑窗口的大小设为N行 |
vim + FILENAME | 从文件的末尾开始 |
vim +N FILENAME | 从第N行开始 |
vim +/STRING FILENAME | 打开file,并将光标停留在第一个找到的string上 |
vim --remote FILENAME | 用已有的vim进程打开指定的文件 |
退出vim
退出vim将是初学者面临的第一大难题,趣闻可以参考这里
快捷键 | 功能 |
---|---|
:wq或:x | 保存文件,退出vi编辑器 |
:w | 保存文件,但不退出vi编辑器 |
:q | 退出vi编辑器 |
:q! | 不保存文件,退出vi编辑器 |
ZZ | 保存文件,退出vi编辑器 |
在字符命令后加上字符
a
表示操作全部文件,如qa
退出所有文件
vim的使用
- 注意后续带冒号(:)开头的字符命令都是在命令模式下,否则在正常模式下
- ctrl-w是指control 和 w字符的组合,不包括减号,是非常常用的组合
- 快捷键中的加号表达组合的意思,不需要输入
光标移动
下面的操作都可以配合数字n使用,比如3h, 则光标向左移动3个字符。
快捷键 | 功能 |
---|---|
h | Backspace | 左移一个字符 |
l | Space | 右移一个字符 |
j | 下移一行 |
k | 上移一行 |
gj | 移动到一段内的下一行 |
gk | 移动到一段内的上一行 |
Enter | + | 把光标移至下一行第一个非空白字符 |
- | 把光标移至上一行第一个非空白字符 |
w | 移动下一个单词开头 |
W | 移动下一个单词开头,忽略一些标点符号 |
e | 移动下一个单词末尾 |
E | 移动下一个单词末尾,忽略一些标点符号 |
b | 移动到上一个单词开头 |
B | 移动到上一个单词开头,忽略一些标点符号 |
ge | 移动到上一个单词末尾 |
gE | 移动到上一个单词末尾,忽略一些标点符号 |
( | 前移1句 |
) | 后移1句 |
{ | 前移1段 |
} | 后移1段 |
fc | 把光标移到同一行的下一个c字符处,c可换为其他字符 |
Fc | 把光标移到同一行的上一个c字符处,c可换为其他字符 |
tc | 把光标移到同一行的下一个c字符前,c可换为其他字符 |
Tc | 把光标移到同一行的上一个c字符后,c可换为其他字符 |
; | 配合f & t使用,重复一次 |
, | 配合f & t使用,反向重复一次 |
一行文本在屏幕上可以显示多行,屏幕行是屏幕上的一行,而非文本行
快捷键 | 功能 |
---|---|
0 | 移动到行首 |
g0 | 移到光标所在屏幕行行首 |
^ | 移动到文本行第一个非空白字符 |
g^ | 移动到屏幕行第一个非空白字符处 |
$ | 移动到行尾 |
g$ | 移动屏幕行行尾 |
n | 向前移动n列 |
n| | 移动到第n列 |
nG | 移动到文件第n行 |
:n | 移动到文件第n行 |
gg | 移动到文件头部 |
G | 移动到文件尾部 |
:$ | 移动到文件尾部 |
H | 移动到屏幕最顶端 |
M | 移动到屏幕中间 |
L | 移动到屏幕最底端 |
翻屏移动
ctrl是control键,加号(+)表示组合的意思,不需要输入
快捷键 | 功能 |
---|---|
ctrl + f | 下翻一屏 |
ctrl + b | 上翻一屏 |
ctrl + d | 下翻半屏 |
ctrl + u | 上翻半屏 |
ctrl + e | 向下滚动一行 |
ctrl + y | 向上滚动一行 |
zz | 将当前行移动到屏幕中央 |
zt | 将当前行移动到屏幕顶端 |
zb | 将当前行移动到屏幕底端 |
f -> forward | b -> backward | d -> down | u-> up
文档标记
使用标记可以快速移动。到达标记后,可以用ctrl + o后退,ctrl + i继续前进
快捷键 | 功能 |
---|---|
m[a-z] | 标记光标所在位置,局部标记,只用于当前文件 |
m[A-Z] | 标记光标所在位置,全局标记,重新启动时标记仍然有效 |
[a-z] | 移动到标记位置 |
'[a-z] | 移动到标记位置的行首 |
`[0-9] | 移动到倒数第[2-10]次关闭vim时离开的位置 |
`` | 移动到上次编辑的位置,精确到列 |
" | 移动到上次编辑的位置,精确到行 |
`" | 移动到上次离开的地方 |
`. | 移动到最后改动的地方 |
ctrl + o | 移动到更老的位置 |
ctrl + i | 移动到更新的位置 |
:marks | 显示所有标记 |
:delmarks a b | 删除标记a和b |
:delmarks a-c | 删除标记a、b和c |
:delmarks a c-f | 删除标记a和c、d、e、f |
:delmarks! | 删除当前缓冲区的所有标记 |
:help mark-motions | 查看更多关于mark的知识 |
文档操作
快捷键 | 功能 |
---|---|
:e | 重新加载当前文档 |
:e! | 重新加载当前文档,并丢弃已做的改动 |
:e FILENAME | 关闭当前文件并打开新的文件,如果修改未保存则会有警告 |
:e! FILENAME | 关闭当前文件并打开新的文件,并丢弃已做的改动 |
:e+ FILENAME | 开始新的文件,并从文件尾开始编辑 |
:e+n FILENAME | 开始新的文件,并从第n行开始编辑 |
:enew | 编辑一个未命名的新文档(ctrl-w + n) |
:e# | 切回到刚才编辑的文件(ctrl + ^) |
:f | 显示文档和光标等相关信息(ctrl + g ) |
:f FILENAME | 改变编辑的文件名,这时再保存相当于另存为 |
gf | 打开以光标所在字符串为文件名的文件 |
:w | 保存修改 |
:n1,n2w FILENAME | 保存第n1行到n2行的内容到指定文件中 |
:wq | 保存并退出 |
:x | 保存并退出 |
ZZ | 保存并退出 |
:q[uit] | 退出当前窗口(ctrl-w + q或ctrl-w + ctrl-q) |
:saveas NEW_FILENAME | 文件另存为 |
:browse e | 打开一个文件浏览器来选择要编辑的文件 |
:set browsedir=last | 用上次访问过的目录(默认) |
:set browsedir=buffer | 用当前文件所在目录 |
:set browsedir=current | 用当前工作目录 |
:Ex(plore) | 浏览当前目录下的所有文件 |
:Sex | 水平分割一个窗口,浏览文件系统 |
:Vex | 垂直分割一个窗口,浏览文件系统 |
:browse e
vim --version | grep browse
用来检查支不支持browse命令- 加号(+)开头表示支持,减号(-)开头表示不支持
- 如果是终端,则会打开netrw文件浏览窗口
- 如果是gvim,则会打开一个图形界面的浏览窗口
- :browse后可以跟任何编辑文档的命令,如sp等
- 打开的起始目录可以由browsedir来设置
基本插入
快捷键 | 功能 |
---|---|
i | 在光标左侧输入正文 |
I | 在光标所在行的行首第一个非空白字符处输入正文 |
a | 在光标右侧输入正文 |
A | 在光标所在行的行尾输入正文 |
s | 删除光标所在的字符,并进入输入模式 |
S | 删除光标所在的行,并进入输入模式 |
o | 在光标所在行的下一行增添新行,光标位于新行的行首 |
O | 在光标所在行的上一行增添新行,光标位于新行的行首 |
:r FILENAME | 在当前行下面插入另一个文件的内容 |
:[n]r FILENAME | 在第n行下面插入另一个文件的内容 |
:r !date | 在当前行下面插入当前日期与时间 |
:r !command | 在当前行下面插入指定command命令的输出 |
一个小技巧:
- 按7
- 再按 i 进入插入模式
- 输入=
- 按 esc 回到命令模式
- 就会出现7个=
这在插入分割线时非常有用,如 36i + esc 就插入了36个+组成的分割线
改写插入
类似[n]cw的类型也可以写为c[n]w
快捷键 | 功能 |
---|---|
[n]cw | 改写光标(包括光标)后n个词 |
[n]ch | 改写光标(包括光标)前n个字符 |
[n]cl | 改写光标(包括光标)后n个字符 |
[n]cc | 改写当前n行 |
[n]s | 以输入的文本代替光标(包括光标)之后的n个字符 |
[n]S | 以输入的文本代替当前n行 |
b, w, e大写时,表示忽略一些标点符号
删除和剪切
类似[n]dw的类型也可以写为d[n]w
快捷键 | 功能 |
---|---|
d | 删除(剪切)在可视模式下选中的文本 |
[n]dd | 删除(剪切)n行 |
[n]db | 删除(剪切)光标左边n个单词 |
[n]dw | 删除(剪切)光标右边n个单词 |
[n]dh | 删除(剪切)光标左边n个字符 |
[n]dl | 删除(剪切)光标右边n个字符 |
[n]x | 剪切光标右边n个字符,相当于d[n]l |
[n]X | 剪切光标左边n个字符,相当于d[n]h |
d0 | 删除(剪切)当前位置到行首的内容 |
d$ | D | 删除(剪切)当前位置到行尾的内容 |
dgg | d1G | 删除(剪切)光标及光标以上的所有行 |
dG | 删除(剪切)光标及光标以下的所有行 |
:m,nd | 删除(剪切)m行到n行的内容 |
daw | 删除(剪切)一个词,即使光标不在词首和词尾 |
das | 删除(剪切)一个句子,即使光标不在句首和句尾 |
d/c | 删除(剪切)当前位置到下一个字符c之间(不包括字符c)的内容,c可换为其他字符 |
b, w, e大写时,表示忽略一些标点符号
复制
类似[n]yw的类型也可以写为y[n]w
快捷键 | 功能 |
---|---|
y | 复制在可视模式下选中的文本 |
[n]yy | [n]Y | 复制n行 |
[n]yw | 复制n个词 |
[n]yh | 复制光标左边n个字符 |
[n]yl | 复制光标右边n个字符 |
y0 | 从光标当前位置复制到行首 |
y$ | 从光标当前位置复制到行尾 |
ygg | y1G | 复制光标及光标以上的所有行 |
yG | 复制光标及光标以下的所有行 |
:m,ny | 复制m行到n行的内容 |
yaw | 复制一个词,即使光标不在词首和词尾 |
yas | 复制一个句子,即使光标不在词首和词尾 |
b, w, e大写时,表示忽略一些标点符号
粘贴
快捷键 | 功能 |
---|---|
p | 粘贴到光标所在行之后 |
P | 粘贴到光标所在行之前 |
文本对象
c(change), y(yank), d(delete), p(paste)都可以跟文本对象,进行更复杂的操作
- aw:一个词
- as:一句
- ap:一段
- ab:一块(包含在圆括号中的)
寄存器
Vim中的复制、删除的内容都会被存放到默认(未命名)寄存器中,可以在相关命令前添加字母表示将数据放入指定寄存器中
字符 | 说明 |
---|---|
a-z | 拷贝内容到寄存器,如ayy把当前行的内容放入a寄存器 |
A-Z | 追加内容到寄存器,如Ayy把当前行的内容追加到a寄存器中 |
:reg | 显示所有寄存器的内容 |
"" | 不加寄存器索引时,默认使用的寄存器 |
"* | 拷贝内容到默认缓冲区 |
"+ | 拷贝内容到系统剪贴板 |
vim --version | grep clipboard
用来检查支不支持系统剪切板 加号(+)开头表示支持,减号(-)开头表示不支持
文件加解密
`vim -x file` 开始编辑一个加密的文件
快捷键 | 功能 |
---|---|
:X | 为当前文件设置密码 |
:set key= | 去除文件的密码 |
文件的编码
快捷键 | 功能 |
---|---|
:e ++enc=utf8 filename | 使用utf-8的编码打开指定文件 |
:w ++enc=gbk | 转存为gbk编码 |
:set fenc | fileencoding | 查看当前文件的编码 |
- 在vimrc中添加
set fileencoding=ucs-bom,utf-8,cp936
- vim会为要打开的文件选择合适的编码,注意编码之间不要留空格
- cp936对应于gbk编码,ucs-bom对应于windows下的文件格式
文件换行格式
有三种文件换行格式:dos, unix, mac
系统 | 换行 |
---|---|
dos | \r\n(CRLF)(ASCII 13,10) |
unix | \n(LF)(ASCII 10) |
mac | \r(CR)(ASCII 13) |
快捷键 | 功能 |
---|---|
:e ++ff=dos FILENAME | 用dos格式来打开指定文件 |
:w ++ff=mac FILENAME | 以mac格式存储到指定文件 |
:set ff | 显示当前文件的格式 |
在vimrc中添加
set fileformats=unix,dos,mac
,vim会自动识别文件格式
vim退格键
vim 退格键(backspace)不能用是由于vi一致性模式造成的
- 去掉讨厌的有关vi一致性模式,避免以前版本的一些bug和局限
set nocompatible
- backspace有几种工作方式,默认是vi兼容的
|可选值 | 说明 | |---|--- | |indent | 如果用了:set indent等自动缩进,必须设置这个选项 | |eol | 想通过退格键合并两行,需要设置eol | |start | 要想删除此次插入前的输入,需设置这个 |set backspace=indent,eol,start
参考
Vim使用笔记
Stack Overflow:帮助一百万开发者退出 Vim
vim命令模式与输入模式切换
vim 退格键(backspace)不能用
vim自定义设置-配置文件