vim
Vim 的模式
基本上 vi/vim 共分为三种模式分别是
- 命令模式(Command mode)
- 插入模式(Insert mode)
- 底线命令模式(Last line mode)
简单操作
i→ Insert 模式,按ESC回到 Normal 模式.x→ 删当前光标所在的一个字符。:wq→ 存盘 + 退出 (:w存盘,:q退出) (注::w 后可以跟文件名)dd→ 删除当前行,并把删除的行存到剪贴板里p→ 粘贴剪贴板推荐
hjkl(强例推荐使用其移动光标,但不必需) → 你也可以使用光标键 (←↓↑→). 注:j就像下箭头。:help <command>→ 显示相关命令的帮助。你也可以就输入:help而不跟命令。(注:退出帮助需要输入:q)
常用操作
各种插入模式
a→ 在光标后插入o→ 在当前行后插入一个新行O→ 在当前行前插入一个新行cw→ 替换从光标所在位置后到一个单词结尾的字符
简单的移动光标
0→ 数字零,到行头^→ 到本行第一个不是 blank 字符的位置(所谓 blank 字符就是空格,tab,换行,回车等)$→ 到本行行尾g_→ 到本行最后一个不是 blank 字符的位置。/pattern→ 搜索pattern的字符串(注:如果搜索出多个匹配,可按 n 键到下一个)
拷贝/粘贴
(注:p/P 都可以,p 是表示在当前位置之后,P 表示在当前位置之前)
P→ 粘贴yy→ 拷贝当前行当行于ddP
Undo/Redo
u→ undo<C-r>→ redo
打开/保存/退出/改变文件
(Buffer)
:e <path/to/file>→ 打开一个文件:w→ 存盘:saveas <path/to/file>→ 另存为<path/to/file>:x,ZZ或:wq→ 保存并退出 (:x表示仅在需要时保存,ZZ 不需要输入冒号并回车):q!→ 退出不保存:qa!强行退出所有的正在编辑的文件,就算别的文件有更改。:bn和:bp→ 你可以同时打开很多文件,使用这两个命令来切换下一个或上一个文件。(注:我喜欢使用:n 到下一个文件)
多行编辑
- 将光标移动到第一行开头
- 按
v进入可视模式 - 按
j3 次或3j选取三行 - 按 I(大写 i)
- 键入 prefix_ 。注意:它只会更新第一行的屏幕 - 直到 Esc 按下,此时所有行都将更新。
- 按 Esc
导入
:r <文件名> - 将 <文件名> 中的内容导入到当前文件 :r !date - 导入命令的执行结果
替换技巧
:ab 小 小怪兽 - 在 vim 编辑器中输入小,系统会自动给你替换成小怪兽,
折叠代码
zc
- zo
操作
操作符
| 命令 | 用途 |
|---|---|
| c | 修改 |
| d | 删除 |
| y | 复制到寄存器 |
| g~ | 反转大小写 |
| gu | 转换为小写 |
| gU | 转换为大写 |
| > | 增加缩进 |
| < | 减小缩进 |
| = | 自动缩进 |
| ! | 使用外部程序过滤 {motion} 所跨越的行 |
操作符待决模式
像 x,i,a 这些命令执行完后,会立即改变 vim 操作的内容或状态。而当我们输入操作符以后,并不会立即出现这样的变化(在没有选中内容的前提下)。这是因为当输入操作符以后,vim 会进入一种特殊的模式状态,即「操作符待决模式」。在该模式下,vim 会继续等待用户输入动作命令,直到接收到完整的动作命令以后,才会执行具体的动作。
到指定字符操作
| 命令 | 用途 |
|---|---|
| f{char} | 正向移动到下一个 {char} 所在之处 |
| F{char} | 反向移动到上一个 {char} 所在之处 |
| t{char} | 正向移动到下一个 {char} 所在之处的前一个字符上 |
| T{char} | 反向移动到上一个 {char} 所在之处的后一个字符上 |
边界操作
| 文本对象 | 选择区域 | 文本对象 | 选中区域 |
|---|---|---|---|
| a) 或 ab | 一对圆括号 (parentheses) | i) 或 ib | 圆括号内部 (parentheses) |
| a} 或 aB | 一对花括号 {braces} | i} 或 iB | 花括号内部 {braces} |
| a] | 一对方括号 [brackets] | i] | 方括号内部 [brackets] |
| a> | 一对尖括号 |
i> | 尖括号内部 |
| a' | 一对单引号 ‘single quotes’ | i' | 单引号内部 ‘single quotes‘ |
| a" | 一对双引号 “double quotes” | i" | 双引号内部 “double quotes“ |
| a` | 一对反引号 backticks |
i` | 反引号内部 backticks |
| at | 一对 XML 标签 |
it | 一对 XML 标签内部 |
重复操作
Vim 中,进入插入模式后,所有的修改操作都会被记录下来,直至返回到普通模式。这期间产生的操作即为「可重复执行的操作」。而重复执行这些操作可以通过. 命令实现。
进阶操作
光标移动
h光标左移,同<Left>键j光标下移,同<Down>键k光标上移,同<Up>键l光标右移,同<Right>键CTRL-F下一页CTRL-B上一页CTRL-U上移半屏CTRL-D下移半屏0跳到行首(是数字零,不是字母 O),效用等同于<Home>键^跳到从行首开始第一个非空白字符$跳到行尾,效用等同于<End>键gg跳到第一行,效用等同于CTRL+<Home>G跳到最后一行,效用等同于CTRL+<End>nG跳到第 n 行,比如 10G 是移动到第十行:n跳到第 n 行,比如 :10<回车> 是移动到第十行10%移动到文件 10% 处15|移动到当前行的 15 列w跳到下一个单词开头 (word: 标点或空格分隔的单词)W跳到下一个单词开头 (WORD: 空格分隔的单词)e跳到下一个单词尾部 (word: 标点或空格分隔的单词)E跳到下一个单词尾部 (WORD: 空格分隔的单词)b上一个单词头 (word: 标点或空格分隔的单词)B上一个单词头 (WORD: 空格分隔的单词)ge上一个单词尾)向前移动一个句子(句号分隔)(向后移动一个句子(句号分隔)}向前移动一个段落(空行分隔){向后移动一个段落(空行分隔)<enter>移动到下一行首个非空字符+移动到下一行首个非空字符(同回车键)-移动到上一行首个非空字符H移动到屏幕上部M移动到屏幕中部L移动到屏幕下部fx跳转到下一个为 x 的字符,2f/ 可以找到第二个斜杆Fx跳转到上一个为 x 的字符tx跳转到下一个为 x 的字符前Tx跳转到上一个为 x 的字符前;跳到下一个 f/t 搜索的结果,跳到上一个 f/t 搜索的结果<S-Left>按住 SHIFT 按左键,向左移动一个单词<S-Right>按住 SHIFT 按右键,向右移动一个单词<S-Up>按住 SHIFT 按上键,向上翻页<S-Down>按住 SHIFT 按下键,向下翻页gm移动到行中gj光标下移一行(忽略自动换行)gk光标上移一行(忽略自动换行)%: 匹配括号移动,包括 (, {, [. (注:你需要把光标先移到括号上)*和 #: 匹配光标当前所在的单词,移动光标到下一个(或上一个)匹配单词(*是下一个,#是上一个)
插入模式:进入退出
i在光标处进入插入模式I在行首进入插入模式a在光标后进入插入模式A在行尾进入插入模式o在下一行插入新行并进入插入模式O在上一行插入新行并进入插入模式gi进入到上一次插入模式的位置<ESC>退出插入模式CTRL-[退出插入模式(同 ESC 等价,但更顺手)
INSERT MODE - 由 i, I, a, A, o, O 等命令进入插入模式后
<Up>光标向上移动<Down>光标向下移动<Left>光标向左移动<Right>光标向右移动<S-Left>按住 SHIFT 按左键,向左移动一个单词<S-Right>按住 SHIFT 按右键,向右移动一个单词<S-Up>按住 SHIFT 按上键,向上翻页<S-Down>按住 SHIFT 按下键,向下翻页<PageUp>上翻页<PageDown>下翻页<Delete>删除光标处字符<BS>Backspace 向后删除字符<Home>光标跳转行首<End>光标跳转行尾CTRL-W向前删除单词CTRL-O临时退出插入模式,执行单条命令又返回插入模式CTRL-\CTRL-O临时退出插入模式(光标保持),执行单条命令又返回插入模式CTRL-R0插入寄存器(内部 0 号剪贴板)内容,CTRL-R 后可跟寄存器名CTRL-R"插入匿名寄存器内容,相当于插入模式下 p 粘贴CTRL-R=插入表达式计算结果,等号后面跟表达式CTRL-R:插入上一次命令行命令CTRL-R/插入上一次搜索的关键字CTRL-F自动缩进CTRL-U删除当前行所有字符CTRL-V{char}插入非数字的字面量CTRL-V{number}插入三个数字代表的 ascii/unicode 字符CTRL-V065插入 10 进制 ascii 字符(两数字)065 即 A 字符CTRL-Vx41插入 16 进制 ascii 字符(三数字)x41 即 A 字符CTRL-Vo101插入 8 进制 ascii 字符(三数字)o101 即 A 字符CTRL-Vu1234插入 16 进制 unicode 字符(四数字)CTRL-VU12345678插入 16 进制 unicode 字符(八数字)CTRL-K{ch1}{ch2}插入 digraph(见:hdigraph),快速输入日文或符号等CTRL-D文字向前缩进CTRL-T文字向后缩进
文本编辑
r替换当前字符R进入替换模式,直至 ESC 离开s替换字符(删除光标处字符,并进入插入模式,前可接数量)S替换行(删除当前行,并进入插入模式,前可接数量)cc改写当前行(删除当前行并进入插入模式),同 Scw改写光标开始处的当前单词ciw改写光标所处的单词caw改写光标所处的单词,并且包括前后空格(如果有的话)c0改写到行首c^改写到行首(第一个非零字符)c$改写到行末C改写到行尾(同 c$)ci"改写双引号中的内容ci'改写单引号中的内容cib改写小括号中的内容cab改写小括号中的内容(包含小括号本身)ci)改写小括号中的内容ci]改写中括号中内容ciB改写大括号中内容caB改写大括号中的内容(包含大括号本身)ci}改写大括号中内容cit改写 xml tag 中的内容cis改写当前句子c2w改写下两个单词ct(改写到小括号前c/apple改写到光标后的第一个 apple 前x删除当前字符,前面可以接数字,3x 代表删除三个字符X向前删除字符dd删除当前d0删除到行首d^删除到行首(第一个非零字符)d$删除到行末D删除到行末(同 d$)dw删除当前单词diw删除光标所处的单词daw删除光标所处的单词,并包含前后空格(如果有的话)di"删除双引号中的内容di'删除单引号中的内容dib删除小括号中的内容di)删除小括号中的内容dab删除小括号内的内容(包含小括号本身)di]删除中括号中内容diB删除大括号中内容di}删除大括号中内容daB删除大括号内的内容(包含大括号本身)dit删除 xml tag 中的内容dis删除当前句子dip删除当前段落(前后有空白行的称为一个段落)dap删除当前段落(包括前后空白行)d2w删除下两个单词dt(删除到小括号前d/apple删除到光标后的第一个 apple 前dgg删除到文件头部dG删除到文件尾部d}删除下一段d{删除上一段u撤销U撤销整行操作CTRL-R撤销上一次 u 命令J链接多行为一行.重复上一次操作~替换大小写g~iw替换当前单词的大小写gUiw将单词转成大写guiw将当前单词转成小写guu全行转为小写gUU全行转为大写<<减少缩进>>增加缩进==自动缩进CTRL-A增加数字CTRL-X减少数字
复制粘贴
p粘贴到光标后P粘贴到光标前v开始标记y复制标记内容V开始按行标记CTRL-V开始列标记y$复制当前位置到本行结束的内容yy复制当前行Y复制当前行,同 yyyiw复制当前单词3yy复制光标下三行内容v0选中当前位置到行首v$选中当前位置到行末viw选中当前单词vib选中小括号内的东西vi)选中小括号内的东西vi]选中中括号内的东西viB选中大括号内的东西vi}选中大括号内的东西vis选中句子中的东西vip选中当前段落(前后有空白行的称为一个段落)vap选中当前段落(包括前后空白行)vab选中小括号内的东西(包含小括号本身)va)选中小括号内的东西(包含小括号本身)va]选中中括号内的东西(包含中括号本身)vaB选中大括号内的东西(包含大括号本身)va}选中大括号内的东西(包含大括号本身)gv重新选择上一次选中的文字:set paste允许粘贴模式(避免粘贴时自动缩进影响格式):set nopaste禁止粘贴模式"?yy复制当前行到寄存器 ? ,问号代表 0-9 的寄存器名称"?d3j删除光标下三行内容,并放到寄存器 ? ,问号代表 0-9 的寄存器名称"?p将寄存器 ? 的内容粘贴到光标后"?P将寄存器 ? 的内容粘贴到光标前:registers显示所有寄存器内容:[range]y复制范围,比如 :20,30y 是复制 20 到 30 行,:10y 是复制第十行:[range]d删除范围,比如 :20,30d 是删除 20 到 30 行,:10d 是删除第十行ddp交换两行内容:先删除当前行复制到寄存器,并粘贴"_[command]使用[command]删除内容,并且不进行复制(不会污染寄存器)"*[command]使用[command]复制内容到系统剪贴板(需要 vim 版本有 clipboard 支持)
文本对象 - c,d,v,y 等命令后接文本对象,一般为:<范围 i/a><类型>
$到行末0到行首^到行首非空字符tx光标位置到字符 x 之前fx光标位置到字符 x 之处iw整个单词(不包括分隔符)aw整个单词(包括分隔符)iW整个 WORD(不包括分隔符)aW整个 WORD(包括分隔符)is整个句子(不包括分隔符)as整个句子(包括分隔符)ip整个段落(不包括前后空白行)ap整个段落(包括前后空白行)ib小括号内ab小括号内(包含小括号本身)iB大括号内aB大括号内(包含大括号本身)i)小括号内a)小括号内(包含小括号本身)i]中括号内a]中括号内(包含中括号本身)i}大括号内a}大括号内(包含大括号本身)i'单引号内a'单引号内(包含单引号本身)i"双引号内a"双引号内(包含双引号本身)2i)往外两层小括号内2a)往外两层小括号内(包含小括号本身)2f)到第二个小括号处2t)到第二个小括号前
查找替换
/pattern从光标处向文件尾搜索 pattern?pattern从光标处向文件头搜索 patternn向同一方向执行上一次搜索N向相反方向执行上一次搜索*向前搜索光标下的单词#向后搜索光标下的单词:s/p1/p2/g将当前行中全替换 p1 为 p2:%s/p1/p2/g将当前文件中全替换 p1 为 p2:%s/p1/p2/gc将当前文件中全替换 p1 为 p2,并且每处询问你是否替换:10,20s/p1/p2/g将第 10 到 20 行中所有 p1 替换为 p2:., ns/p1/p2/g将当前行到 n 行中所有 p1 替换为 p2:., +10s/p1/p2/g将当前行到相对当前行加 10 行的区间中所有 p1 替换为 p2:., $s/p1/p2/g将当前行到最后一行中所有 p1 替换为 p2:0,.s/p1/p2/g将第一行到当前行中所有 p1 替换为 p2:%s/1\\2\/3/123/g将“1\2/3” 替换为 “123”(特殊字符使用反斜杠标注):%s/\r//g删除 DOS 换行符 ^M
VISUAL MODE - 由 v, V, CTRL-V 进入的可视模式
>增加缩进<减少缩进d删除高亮选中的文字x删除高亮选中的文字c改写文字,即删除高亮选中的文字并进入插入模式s改写文字,即删除高亮选中的文字并进入插入模式y拷贝文字~转换大小写o跳转到标记区的另外一端O跳转到标记块的另外一端u标记区转换为小写U标记区转换为大写g CTRL-G显示所选择区域的统计信息<Esc>退出可视模式
位置跳转
CTRL-O跳转到上一个位置CTRL-I跳转到下一个位置CTRL-^跳转到 alternate file (当前窗口的上一个文件)CTRL-]跳转到当前光标文字下的超链接CTRL-T返回到跳转之前的位置%跳转到 {} () [] 的匹配gd跳转到局部定义(光标下的单词的定义)gD跳转到全局定义(光标下的单词的定义)gf打开名称为光标下文件名的文件[[跳转到上一个顶层函数(比如 C 语言以大括号分隔)]]跳转到下一个顶层函数(比如 C 语言以大括号分隔)[m跳转到上一个成员函数]m跳转到下一个成员函数[{跳转到上一处未匹配的 {]}跳转到下一处未匹配的 }[(跳转到上一处未匹配的 (])跳转到下一处未匹配的 )[c上一个不同处(diff 时)]c下一个不同处(diff 时)[/跳转到 C 注释开头]/跳转到 C 注释结尾- ```回到上次跳转的位置
''回到上次跳转的位置\.` 回到上次编辑的位置'.回到上次编辑的位置
文件操作
:w保存文件:w <filename>按名称保存文件:e <filename>打开文件并编辑:saveas <filename>另存为文件:r <filename>读取文件并将内容插入到光标后:r !dir将 dir 命令的输出捕获并插入到光标后:close关闭文件:q退出:q!强制退出:wa保存所有文件:cd <path>切换 Vim 当前路径:pwd显示 Vim 当前路径:new打开一个新的窗口编辑新文件:enew在当前窗口创建新文件:vnew在左右切分的新窗口中编辑新文件:tabnew在新的标签页中编辑新文件
已打开文件操作
:ls查案缓存列表:bn切换到下一个缓存:bp切换到上一个缓存:bd删除缓存:b 1切换到 1 号缓存:b abc切换到文件名为 abc 开头的缓存:badd <filename>将文件添加到缓存列表:set hidden设置隐藏模式(未保存的缓存可以被切换走,或者关闭):set nohidden关闭隐藏模式(未保存的缓存不能被切换走,或者关闭)n CTRL-^切换缓存,先输入数字的缓存编号,再按 CTRL + 6