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自定义设置-配置文件