Skip to content

Latest commit

 

History

History
483 lines (423 loc) · 21.4 KB

vim.md

File metadata and controls

483 lines (423 loc) · 21.4 KB

vim

Vim 的模式

基本上 vi/vim 共分为三种模式分别是

  • 命令模式(Command mode)
  • 插入模式(Insert mode)
  • 底线命令模式(Last line mode)

简单操作

  • iInsert 模式,按 ESC 回到 Normal 模式.
  • x → 删当前光标所在的一个字符。
  • :wq → 存盘 + 退出 (:w 存盘, :q 退出) (注::w 后可以跟文件名)
  • dd → 删除当前行,并把删除的行存到剪贴板里
  • p → 粘贴剪贴板

推荐

  • hjkl (强例推荐使用其移动光标,但不必需) → 你也可以使用光标键 (←↓↑→). 注: j 就像下箭头。
  • :help <command> → 显示相关命令的帮助。你也可以就输入 :help 而不跟命令。(注:退出帮助需要输入:q)

常用操作

  1. 各种插入模式

    • a → 在光标后插入
    • o → 在当前行后插入一个新行
    • O → 在当前行前插入一个新行
    • cw → 替换从光标所在位置后到一个单词结尾的字符
  2. 简单的移动光标

    • 0 → 数字零,到行头
    • ^ → 到本行第一个不是 blank 字符的位置(所谓 blank 字符就是空格,tab,换行,回车等)
    • $ → 到本行行尾
    • g_ → 到本行最后一个不是 blank 字符的位置。
    • /pattern → 搜索 pattern 的字符串(注:如果搜索出多个匹配,可按 n 键到下一个)
  3. 拷贝/粘贴

    (注:p/P 都可以,p 是表示在当前位置之后,P 表示在当前位置之前)

    • P → 粘贴
    • yy → 拷贝当前行当行于 ddP
  4. Undo/Redo

    • u → undo
    • <C-r> → redo
  5. 打开/保存/退出/改变文件

    (Buffer)

    • :e <path/to/file> → 打开一个文件
    • :w → 存盘
    • :saveas <path/to/file> → 另存为 <path/to/file>
    • :xZZ:wq → 保存并退出 (:x 表示仅在需要时保存,ZZ 不需要输入冒号并回车)
    • :q! → 退出不保存 :qa! 强行退出所有的正在编辑的文件,就算别的文件有更改。
    • :bn:bp → 你可以同时打开很多文件,使用这两个命令来切换下一个或上一个文件。(注:我喜欢使用:n 到下一个文件)
  6. 多行编辑

    • 将光标移动到第一行开头
    • v 进入可视模式
    • j 3 次或 3j 选取三行
    • 按 I(大写 i)
    • 键入 prefix_ 。注意:它只会更新第一行的屏幕 - 直到 Esc 按下,此时所有行都将更新。
    • 按 Esc
  7. 导入

    :r <文件名> - 将 <文件名> 中的内容导入到当前文件 :r !date - 导入命令的执行结果

  8. 替换技巧

    :ab 小 小怪兽 - 在 vim 编辑器中输入小,系统会自动给你替换成小怪兽,

  9. 折叠代码

  • zc
  • zo

操作

操作符

命令 用途
c 修改
d 删除
y 复制到寄存器
g~ 反转大小写
gu 转换为小写
gU 转换为大写
> 增加缩进
< 减小缩进
= 自动缩进
! 使用外部程序过滤 {motion} 所跨越的行

操作符待决模式

xia 这些命令执行完后,会立即改变 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 标签 tags it 一对 XML 标签内部 tag

重复操作

Vim 中,进入插入模式后,所有的修改操作都会被记录下来,直至返回到普通模式。这期间产生的操作即为「可重复执行的操作」。而重复执行这些操作可以通过. 命令实现。

进阶操作

  1. 光标移动

    • 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 光标上移一行(忽略自动换行)
    • % : 匹配括号移动,包括 (, {, [. (注:你需要把光标先移到括号上)
    • * 和 #: 匹配光标当前所在的单词,移动光标到下一个(或上一个)匹配单词(*是下一个,#是上一个)
  2. 插入模式:进入退出

    • i 在光标处进入插入模式
    • I 在行首进入插入模式
    • a 在光标后进入插入模式
    • A 在行尾进入插入模式
    • o 在下一行插入新行并进入插入模式
    • O 在上一行插入新行并进入插入模式
    • gi 进入到上一次插入模式的位置
    • <ESC> 退出插入模式
    • CTRL-[ 退出插入模式(同 ESC 等价,但更顺手)
  3. 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文字向后缩进
  4. 文本编辑

    • r 替换当前字符
    • R 进入替换模式,直至 ESC 离开
    • s 替换字符(删除光标处字符,并进入插入模式,前可接数量)
    • S 替换行(删除当前行,并进入插入模式,前可接数量)
    • cc 改写当前行(删除当前行并进入插入模式),同 S
    • cw 改写光标开始处的当前单词
    • 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 减少数字
  5. 复制粘贴

    • p 粘贴到光标后
    • P 粘贴到光标前
    • v 开始标记
    • y 复制标记内容
    • V 开始按行标记
    • CTRL-V 开始列标记
    • y$ 复制当前位置到本行结束的内容
    • yy 复制当前行
    • Y 复制当前行,同 yy
    • yiw 复制当前单词
    • 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 支持)
  6. 文本对象 - 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) 到第二个小括号前
  7. 查找替换

    • /pattern 从光标处向文件尾搜索 pattern
    • ?pattern 从光标处向文件头搜索 pattern
    • n 向同一方向执行上一次搜索
    • 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
  8. VISUAL MODE - 由 v, V, CTRL-V 进入的可视模式

    • > 增加缩进
    • < 减少缩进
    • d 删除高亮选中的文字
    • x 删除高亮选中的文字
    • c 改写文字,即删除高亮选中的文字并进入插入模式
    • s 改写文字,即删除高亮选中的文字并进入插入模式
    • y 拷贝文字
    • ~ 转换大小写
    • o 跳转到标记区的另外一端
    • O 跳转到标记块的另外一端
    • u 标记区转换为小写
    • U 标记区转换为大写
    • g CTRL-G 显示所选择区域的统计信息
    • <Esc> 退出可视模式
  9. 位置跳转

    • CTRL-O 跳转到上一个位置
    • CTRL-I 跳转到下一个位置
    • CTRL-^ 跳转到 alternate file (当前窗口的上一个文件)
    • CTRL-] 跳转到当前光标文字下的超链接
    • CTRL-T 返回到跳转之前的位置
    • % 跳转到 {} () [] 的匹配
    • gd 跳转到局部定义(光标下的单词的定义)
    • gD 跳转到全局定义(光标下的单词的定义)
    • gf 打开名称为光标下文件名的文件
    • [[ 跳转到上一个顶层函数(比如 C 语言以大括号分隔)
    • ]] 跳转到下一个顶层函数(比如 C 语言以大括号分隔)
    • [m 跳转到上一个成员函数
    • ]m 跳转到下一个成员函数
    • [{ 跳转到上一处未匹配的 {
    • ]} 跳转到下一处未匹配的 }
    • [( 跳转到上一处未匹配的 (
    • ]) 跳转到下一处未匹配的 )
    • [c 上一个不同处(diff 时)
    • ]c 下一个不同处(diff 时)
    • [/ 跳转到 C 注释开头
    • ]/ 跳转到 C 注释结尾
    • ```回到上次跳转的位置
    • '' 回到上次跳转的位置
    • \.` 回到上次编辑的位置
    • '. 回到上次编辑的位置
  10. 文件操作

    • :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 在新的标签页中编辑新文件
  11. 已打开文件操作

    • :ls 查案缓存列表
    • :bn 切换到下一个缓存
    • :bp 切换到上一个缓存
    • :bd 删除缓存
    • :b 1 切换到 1 号缓存
    • :b abc 切换到文件名为 abc 开头的缓存
    • :badd <filename> 将文件添加到缓存列表
    • :set hidden 设置隐藏模式(未保存的缓存可以被切换走,或者关闭)
    • :set nohidden 关闭隐藏模式(未保存的缓存不能被切换走,或者关闭)
    • n CTRL-^ 切换缓存,先输入数字的缓存编号,再按 CTRL + 6