Vim

  • 行内单字符查找

    • fx 向前查找本行中的字符 x 其中 f代表 Find
    • tx 移动的目标字符的前一个字符 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:name vim预定义的变量

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表示清楚相关模式下的所有映射

001-Buffers缓冲区

003-一些使用技巧

  • 映射命令及其生效模式

操作符等待模式是当你键入一个操作符(不如 “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, 只读缓冲区
aActive buffer, 活动缓冲区,当前显示在屏幕上
hHidden buffer, 隐藏缓冲区,已载入但没有显示在屏幕上
+Modiffied buffer, 禁用了modifiable选项,只读缓冲区
xError buffer, 读入时报错的缓冲区
%Current buffer, 当前缓冲区
#Alternate buffer, 交换缓冲区
uUnlisted 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$
    scl
    S^c
    I^i
    A$a
    oA<CR>
    Oko
  • 技巧3. 以退为进

    • f{char} 让 vim 查找下一处指定字符出现的位置,如果找到了就直接把光标移动到那里
    • ; 到下一个目标字符串
    • . 重复上次修改
  • 技巧4. 执行, 重复,回退

目的操作重复回退
做出一个修改{edit}.u
在行内查找下一指定字符f{char}/t{char};,
在行内查找上一指定字符F{char}/T{char};,
在文档中查找下一处匹配项/pattern<CR>nN
在文档中查找上一处匹配项?pattern<CR>nN
执行替换:s/targent/replacement&u
执行一系列修改qx{changes}q@xu
  • 技巧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
    • 插入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 或是 ai 开头的文本对象选择分隔符内部的文本,而以a开头的文本对象则选择包括 分隔符在内的整个文本。

文本对象寻找区域
a)ab一对圆括号
i)ib圆括号内部
a}aB一对花括号
i}i}花括号内部
a]一对方括号
i]方括号内部
a>一对尖括号
i>尖括号内部
a'一对单引号
i'单引号内部
a"一对双引号
i"双引号内部
a"一对双引号
i"双引号内部
a`一对反引号
i`反引号内部
at一对 xml 标签
itxml 标签内部

每当在命令语法里看到 {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. 规范光标位置、直达目标以及中止宏

    • 在录制一个宏时,要确保每条命令都可被重复执行
    • 规范光标位置
    • 用可重复的动作命令直达目录 面向单词的动作命令 w b ege 比面向字符的动作命令 hl 相比,更具灵活性
    • 当动作命令失败时,宏将中止执行
  • 技巧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.
  • 技巧75. 使用圆括号捕获子匹配

    • 专用匹配重复单词的正则表达式 /\v<(\w+)\_s+\1>
      • \v 激活 very magic 搜索模式
      • <> 将用于匹配单词的边界
      • 元字符 \_s 会匹配空白符或换行符
  • 技巧81. 根据预览结果对查找域自动补全

    • <C-r><C-w> 用当前预览的匹配结果对查找域进行自动补全
  • 技巧82. 统计当前模式的匹配个数

    • :%s///gn