行内单字符查找
fx向前查找本行中的字符x其中f代表Findtx移动的目标字符的前一个字符t代表To- 该命令的反向版本
Tx
- 该命令的反向版本
移动到指定的行
- gg 行首
- G 行尾
- nG 指定行
- H(High)
- M(Middle)
- L(Low)
滚屏
- CTRL-U 向下滚动半屏
- CTRL-D 把视窗向下移动半屏,也就是把文字向上移动半屏
- CTRL-E 向上滚一行
- CTRL-Y 向下滚一行
- CTRL-F (forwar) 向前滚动一屏
- CTRL-B (backward) 向后滚动一屏
- zt 把光标所在行移动到屏幕的顶部
- zb 移动到屏幕的底部
简单查找
- 字符
.*[]^%/\?~$有特殊含义。如果你要查找它们,需要在前面加上一个 “\” ?进行反向查找- 严格匹配一个单词
/the\>\>是一个特殊的记号,表示只匹配单词末尾。类似地,\<只匹配单词的开头
- 字符
列块选择
- CTRL + V 启动可视模式
打开互联网上的文件
gf- 放到对应链接上
CRTL-W f
vim 变量 使用
help internal-variables查看更多b:name缓冲区的局部变量w:name窗口的局部变量g:name全局变量(也用于函数中)v:namevim预定义的变量
vim的几种模式
| 模式 | 功能 | 如何进入 |
|---|---|---|
| Normal Mode(普通模式) | 该模式下可以移动光标等 | 进入vim默认为该模式,再其它模式下按 ESC 后进入此模式 |
| Visual Mode (可视模式) | 该模式下进行选择操作 | 在普通模式下,按 v 进入 |
| Insert Mode (插入模式) | 该模式下可以编辑输入 | 普通模式下按 i a o 等进入 |
| Command-Line 命令行模式 | 可以输入各种命令 | 普通模式下按冒号 : 进入 |
| Ex Mode Ex 模式 | 多行的 Command-Line模式 | 普通模式下按 Q 进入 Ex 模式 |
| Select Mode 选择模式 | 普通模式下按 gh 进入 |
map映射
| map前缀 | 含义 | |
|---|---|---|
| nore | 表示非递归 | |
| n | 表示在普通模式下下生效 | |
| v | 表示在可视模式下生效 | |
| i | 表示在插入模式下生效 | |
| c | 表示在命令行模式下生效 | |
| un | 后面跟按键组合,表示删除这个映射 | |
| clear | 表示清楚相关模式下的所有映射 |
- 映射命令及其生效模式
操作符等待模式是当你键入一个操作符(不如 “d” 或 “y”)之后,vim 期待你键入一个动作命令或者文本对象时的状态,比如,当你键入命令 “dw” 那个 “w” 就是在操作符等待模式下键入的
| 映射命令 | 生效模式 |
|---|---|
| :map | 普通,可视模式及操作符等待模式 |
| :vmap | 可视模式 |
| :nmap | 普通模式 |
| :omap | 操作符等待模式 |
| :map! | 插入和命令行模式 |
| :imap | 插入模式 |
| :cmap | 命令行模式 |
vim 插入特殊字符 & 二合字母 #
在插入模式下按
CTRL + v然后在按下特殊的字符即可,如 CTRL + v插入二合字母
CTRL+K cS对应下列二合字母; 使用:digraphs来查找有哪些二合字母可以利用

多行折叠为一行 #
- 有下面一份文件内如如下,把文件内容保存为一行有如下方法
name,
age,
sex,
email
- :%j 或 :%j!(不会再行尾添加空格)
- :1,$j
- :ggVGJ
- :%s/\n//g
- qqJ@qq@q
增加缓冲区 #
在启动vi时,可以指定多个文件做为参数,例如vi file1 file2 file3,参数中的所有文件都会被载入缓冲区,但vi只会在窗口中显示第一个文件。
可以使用 :ball命令为每一个缓冲区打开一个窗口。
使用 :badd filename 命令将新增一个缓冲区。指定的文件会被加载到缓冲区列表中,但是对这个文件的编辑过程只有切换到那个缓冲区才会开始。
在命令中还可以指明为这个缓冲区打开窗口时,光标所处的位置:
:badd +linenum filename
列出缓冲区 #
buffers, files, ls 命令将会累出当前编辑中的缓冲区信息。在列表中,第一个数字是缓冲区的标号,第二个标记是缓冲区当前的状态,第三个是与缓冲区所关联的文件名。缓冲区状态包含下面几种情况
| 标记 | 说明 |
|---|---|
| - | Readonly buffer, 禁用了modifiable选项,只读缓冲区 |
| = | Readonly buffer, 只读缓冲区 |
| a | Active buffer, 活动缓冲区,当前显示在屏幕上 |
| h | Hidden buffer, 隐藏缓冲区,已载入但没有显示在屏幕上 |
| + | Modiffied buffer, 禁用了modifiable选项,只读缓冲区 |
| x | Error buffer, 读入时报错的缓冲区 |
| % | Current buffer, 当前缓冲区 |
| # | Alternate buffer, 交换缓冲区 |
| u | Unlisted buffer, 只有在列式命令中使用 ! 修饰符才能显示的缓冲区 |
选择缓冲区 #
- 使用
number参数,选择的hiing标号的缓冲区
:buffer number
- 使用文件名选择缓冲区
:buffer filename
- 使用
subffer命令
:subffer filename
:subffer number

切换缓冲区 #
:bnext下一个缓冲区:bprevious或:bNext前一个缓冲区:blast最后一个缓冲区:bfirst第一个缓冲区
删除缓冲区 #
:bdelete filename:bdelete 3或:3 bdelete删除一个缓冲区:1,3 bdelete删除指定范围的缓冲区:bdelete! filename强制删除缓冲区,缓冲区中的所有改动都会被放弃
卸载缓冲区 #
:bunload会从内存中卸载一个缓冲区,所有为这个缓冲区打开的窗口也会关闭。但是这个文件名仍然会存在于缓冲区列表中:bunload!强制卸载缓冲区,但所有的改动也将会丢失
帮助信息 #
使用 :help buffers 命令查看缓冲区的帮助信息

Practical Vim
Ch01 #
技巧1. 使用
.命令技巧2. 不要自我重复
符合命令 等效的长命令 Cc$sclS^cI^iA$aoA<CR>Oko技巧3. 以退为进
f{char}让 vim 查找下一处指定字符出现的位置,如果找到了就直接把光标移动到那里;到下一个目标字符串.重复上次修改
技巧4. 执行, 重复,回退
| 目的 | 操作 | 重复 | 回退 |
|---|---|---|---|
| 做出一个修改 | {edit} | . | u |
| 在行内查找下一指定字符 | f{char}/t{char} | ; | , |
| 在行内查找上一指定字符 | F{char}/T{char} | ; | , |
| 在文档中查找下一处匹配项 | /pattern<CR> | n | N |
| 在文档中查找上一处匹配项 | ?pattern<CR> | n | N |
| 执行替换 | :s/targent/replacement | & | u |
| 执行一系列修改 | qx{changes}q | @x | u |
- 技巧5. 查找并手动替换
- 技巧6.
.范式- 用一次按键移动,另一次按键执行的模式我们称之为
.范式
- 用一次按键移动,另一次按键执行的模式我们称之为
Ch02 普通模式 #
- 技巧12. 双剑合璧,天下无敌
- 操作符 + 动作命令 = 操作
vim 的操作符命令
| 命令 | 用途 |
|---|---|
c | 修改 |
d | 删除 |
y | 复制到寄存器 |
g~ | 反转大小写 |
gu | 转换为小写 |
gU | 转换为大写 |
> | 增加缩进 |
< | 减少缩进 |
= | 自动缩进 |
! | 使用外部程序过滤 {motion}锁跨越的行 |
Ch03 插入模式 #
- 技巧13. 在插入模式中可即时更正错误
| 按键操作 | 用户 |
|---|---|
<C-h> | 删除前一个字符(同退格键) |
<C-w>> | 删除前一个单词 |
<C-u> | 删至行首 |
- 技巧14. 返回普通模式
| 按键操作 | 用途 |
|---|---|
<Esc> | 切换到普通模式 |
<C-[> | 切换到普通模式 |
<C-o> | 切换到插入-普通模式 |
技巧16. 随时随地做运算
- 在插入模式中 输入
<C-r>=就可以访问表达式寄存器。输入表达式后敲一下<CR>vim 就会把执行的结果插入到文档的当前位置。
- 在插入模式中 输入
技巧17. 用字符编码插入非常用字符
- 在插入模式中输入
<C-v>{code}其中{code}是要插入字符的编码- vim 所接受的字符编码共有3个数字。如要插入大些字母"A" 它的编码是 65, 因此我们需要输入
<C-v>065
- vim 所接受的字符编码共有3个数字。如要插入大些字母"A" 它的编码是 65, 因此我们需要输入
- 插入4位十六进制编码,需要输入
<C-v>u{1234}
插入非常用字符
按键操作 用途 <C-v>{123}以十进制编码插入字符 <C-v>u{1234}以十六进制字符编码插入字符 <C-v>{nondigit}按原义插入非数字字符 <C-k>{char1}{char2}插入以二合字母 {char1}{char2}表示的字符- 在插入模式中输入
Ch04 可视模式 #
- 技巧21. 选择高亮选区
激活可视模式
| 命令 | 用途 |
|---|---|
v | 激活面向字符的可视模式 |
V | 激活面向行的可视模式 |
<C-v> | 激活面向列块的可视模式 |
gv | 重选上次的高亮选区 |
在可视模式间切换
| 按键操作 | 用途 |
|---|---|
<Esc> / <C-[]> | 回到普通模式 |
v / V / <C-v> | 切换到普通模式 |
v | 切换到面向字符的可视模式 |
V | 切换到面向行的可视模式 |
<C-v> | 切换到面向列块的可视模式 |
o | 切换高亮选区的活动端 |
vit 来选择标签里的内容 (visually sellect inside the tag)
Ch05 命令行模式 #
| 符号 | 地址 |
|---|---|
1 | 文件的第一行 |
$ | 文件的最后一行 |
0 | 虚拟行,位于文件第一行上方 |
. | 光标所在行 |
'm | 包含位置标记m的行 |
'< | 高亮选区的起始行 |
'> | 高亮选区的结束行 |
% | 代表整个文件( :1,$ 的简写形式) |
- 技巧45. 以超级用户权限保存文件
:w !sudo tee % > /dev/null
Ch06 多文件 #
- 工作区切分窗口的方式
| 命令 | 用途 |
|---|---|
<C-w>s | 水平切分当前窗口,新窗口仍显示当前缓冲区 |
<C-w>v | 垂直切分当前窗口,新窗口仍显示当前缓冲区 |
:sp[lit] {file} | 水平切分当前窗口,并在新窗口中载入 {file} |
:vsp[lit] {file} | 垂直切分当前窗口,并在新窗口中载入 {file} |
Ch08 #
- 技巧48 基于单词移动
| 命令 | 光标动作 |
|---|---|
w | 正向移动到下一单词的开头 |
b | 反向移动到当前单词/上一单词的开头 |
e | 正向移动到当前单词/下一单词的结尾 |
ge | 反向移动到上一单词的结尾 |
- 技巧51. 用精确的文本对象选择选区
Vim的文本对象由两个字符组成,第一个字符永远是i 或是 a, i 开头的文本对象选择分隔符内部的文本,而以a开头的文本对象则选择包括
分隔符在内的整个文本。
| 文本对象 | 寻找区域 |
|---|---|
a) 或 ab | 一对圆括号 |
i) 或 ib | 圆括号内部 |
a} 或 aB | 一对花括号 |
i} 或 i} | 花括号内部 |
a] | 一对方括号 |
i] | 方括号内部 |
a> | 一对尖括号 |
i> | 尖括号内部 |
a' | 一对单引号 |
i' | 单引号内部 |
a" | 一对双引号 |
i" | 双引号内部 |
a" | 一对双引号 |
i" | 双引号内部 |
| a` | 一对反引号 |
| i` | 反引号内部 |
at | 一对 xml 标签 |
it | xml 标签内部 |
每当在命令语法里看到 {motion} 时,你也可以在这个地方使用文本对象,常见的例子包括
d{motion} (删除) c{motion} (修改) y{motion} (复制).
- 技巧52. 删除周边,修改内部
文本对象分为两类:一类是操作分隔符的文本对象,如 i) i" 和 it; 另一类用于操作文本块,如单词,句子和段落。
| 文本对象 | 选择范围 |
|---|---|
iw | 当前单词 |
aw | 当前单词及一个空格 |
iW | 当前字串 |
aW | 当前字串及一个空格 |
is | 当前句子 |
as | 当前句子及一个空格 |
ip | 当前段落 |
ap | 当前段落及一个空格 |
技巧55. 遍历跳转列表
<C-o> <C-i>
技巧60. 深入理解 Vim 寄存器
通过给命令加
"{register}前缀的方式指定要用的寄存器。如不指明,Vim 将缺省使用无名寄存器
无名寄存器
""复制专用寄存器
"0有名寄存器
"a - "z系统剪贴板
"+于选择专用寄存器"*表达式寄存器
"=其它寄存器
"%当前文件名"#轮换文件名".上次插入的文本":上次执行的 Ex 命令"/上次查找的模式
技巧64. 宏的读取与执行
- 把命令序列录制成宏;
q既是“录制按钮” 也是“停止按钮” - 通过执行宏来回放命令序列
- 把命令序列录制成宏;
技巧65. 规范光标位置、直达目标以及中止宏
- 在录制一个宏时,要确保每条命令都可被重复执行
- 规范光标位置
- 用可重复的动作命令直达目录 面向单词的动作命令
wbe和ge比面向字符的动作命令h和l相比,更具灵活性 - 当动作命令失败时,宏将中止执行
技巧71. 编辑宏的内容
- 将宏粘贴到文档中
- 首先按
G跳到当前文档的结尾,目的是要把寄存器a中的内容粘贴至新的一行 - 使用
:put a
- 首先按
- 将宏从文档中复制回寄存器
:d a
- 将宏粘贴到文档中
技巧72. 调整查找模式的大小写敏感性
- 全局设置大小写敏感性 如果启用了
ignorecase设置,Vim 的查找模式将不区分大小写 - 每次查找时设置大小写敏感性
- 通过使用元字符
\c\C可以覆盖Vim缺省的大小写敏感性设置 \c查找忽略大小写\C强制区分大小写- 注意:这两个元字符可以出现在模式的任意位置。假设你已输入了完整的模式,却 发现需要按区分大小写的方式进行查找。此时,你只需在模式的结尾加上 \C ,该 元字符就会作用于它前面的所有文本
- 通过使用元字符
- 启用更具智能的大小写敏感性设置
smartcase该选项被启用后,无论何时,只要我们在查找模式中输入了大 写字母,‘ignorecase’设置就不再生效了
- 全局设置大小写敏感性 如果启用了
按正则表达式查找时,使用
\v模式开关
匹配以下 CSS 片段中的每一组颜色代码
body { color: #3c3c3c; }
a { color: #0000EE; }
strong { color: #000; }
使用
magic搜索模式查找十六进制颜色代码#\([0-9a-fA-F]\{6}\|[0-9a-fA-F]\{3}\)
使用
very magic搜索模式查找十六进制颜色代码\v#([0-9a-fA-F]{6}|[0-9a-fA-F]{3})\v#(\x{6}|\x{3})使用\x字符代替[0-9a-fA-F]
技巧 74. 按原义查找文本时,使用
\V原义开关- 使用 “\V” 会使得其后的模式中只有反斜杠有特殊的意义
/\Va.k.a.仅匹配字符a.k.a.
- 使用 “\V” 会使得其后的模式中只有反斜杠有特殊的意义
技巧75. 使用圆括号捕获子匹配
- 专用匹配重复单词的正则表达式
/\v<(\w+)\_s+\1>\v激活very magic搜索模式<与>将用于匹配单词的边界- 元字符
\_s会匹配空白符或换行符
- 专用匹配重复单词的正则表达式
技巧81. 根据预览结果对查找域自动补全
<C-r><C-w>用当前预览的匹配结果对查找域进行自动补全
技巧82. 统计当前模式的匹配个数
:%s///gn