Vim速查

插入模式

字母 含义
a 在当前字符插入
i 在当前字符插入
o 插入新行到后
A 在当前行后插入
I 在当前行前插入
O 插入新行到前
  • ctrl h 删除上一个字符
  • ctrl w 删除上一个单词
  • ctrl u 删除当前一行
  • ctrl [ 退出编辑模式进入normal模式(代替Esc)
  • gi 快速回到最后一次编辑位置
  • 题外话:linux命令行快捷键:
    • ctrl a 移动到当前行开头
    • ctrl e 移动到当前行结尾
    • ctrl b 向前移一位
    • ctrl f 向后移一位

normal模式

快速移动

  • h(左),j(下),k(上),l(右)
  • 单词之间移动
    • w/W移动到下一个word/WORD开头,e移动到尾部
    • b/B移动到上一个word/WORD开头
    • word是以非空白符分割的单词,WORD是以空白符分割的单词
  • 行间搜索移动
    • 使用f{char}移动到char字符上,用t移动到char的前一个字符
    • 可以用分号;/逗号,继续搜下一个/上一个
    • F倒着搜
  • vim水平移动
    • 0移动到行首第一个字符,^移动到第一个非空白字符
    • 移动到行尾,g_移动到行尾非空白字符
  • vim垂直移动
    • 使用()在句子间移动
    • 使用{}在段落间移动
  • vim页面移动
    • gg/G移动到文件的开头/结尾,Ctrl o快速返回
    • H/M/L 移动到屏幕开头/中间/结尾
    • ctrl u/ctrl f 上下翻页,zz将当前行放在屏幕中间

增删改查

  • 快速删除
    • x 快速删除一个字符
      • 删除2个字符 2x
    • daw 快速删除一个单词,包含周围空格
    • diw 快速删除一个单词,不包含周围空格
    • dd 删除当前行
      • 删除2行 2dd
    • dt[R] 从当前删除到[R]字符前
  • 快速修改
    • r[R] 将当前光标字符替换成字符[R]
    • R[S] 会将其后的字符挨个替换成字符串[S]
    • c 删除并进入插入模式
      • 同上述的dcaw ciw ct[R]
    • C 删除当前光标后整行并进入插入模式
    • s 删除当前光标字符并进入插入模式
      • 删除[\d]个字符并… [\d]s
    • S 删除整行并进入插入模式
  • 查询
    • / / ? 前向搜索、反向搜索
    • n/N 跳转到下一个、上一个匹配
    • */# 当前单词的前向、后向匹配

Visual(可视)模式

  • Normal模式下用v进入visual选择
  • 使用V选择行
  • 使用ctrl v进行方块选择

选择后可以用d剪贴,或则y复制

命令模式

substitute替换命令

  • 命令格式 :[range] s[ubstitute]/{pattern}/{string}/[flags]
    • [range] 表示范围:10,20表示10-20行,%表示全部
    • [pattern] 想要替换的字符串
    • [string] 替换后文本
    • [flags] 替换的标志
      • g 全局范围内执行
      • c 表示确认,可以确认或者拒绝修改
      • n 报告匹配次数 不替换,用来查询匹配次数

命令行执行normal命令

格式

1
:normal <command>

用途:使用V选中多行,然后:normal I"在每行前面添加"

多文件切换

  • 打开多文件 :e {FileName}
  • Buffer缓冲区切换
    • :ls 列举当前缓冲区
    • :b [num] 跳转到第[num]个缓冲区
      • :bpre :bnext :bfirst :blast
      • :b [BufferName] + Tab补全
  • 窗口
    • 水平分割窗口:<Ctrl w> s :sp {FileName} 水平分割并打开新窗口
    • 垂直分割窗口:<Ctrl w> v :vs
    • 切换窗口
      • <Ctrl w> w 循环切换窗口
      • <Ctrl w> h 切换到左边窗口
      • <Ctrl w> j 切换到下边窗口
      • <Ctrl w> k 切换到上边窗口
      • <Ctrl w> l 切换到下边窗口
    • 移动窗口
      • <Ctrl w> H 将当前窗口移动到左边 ,JKL同理
    • 重排窗口
      • <Ctrl w> = 使所有窗口等宽等高
      • <Ctrl w> _ 最大化活动窗口的高度:[num]<Ctrl w> _ 将高度设为[num]
      • <Ctrl w> | 最大化活动窗口的宽度
  • Tab(标签页)操作
    • tabe[dit] {FileName} 在新标签页打开文件
    • <Ctrl w> T 将当前窗口移动到新标签页
    • tabc[lose] 关闭当前标签页及所有窗口
    • tabo[nly] 保留当前标签页,关闭其他所有标签页
    • tabn[ext]{N} {N}gt 切换到编号为N的标签页
    • tabn[ext] gt 切换到下一个标签页
    • tabp[revious] gT 切换到上一个标签页

Vim文本对象

  • [number]<command>[text object] :格式
    • [number] 表示操作次数
    • <command> 命令:d删除,c改变,y复制
    • [text object] 表示要操作的文本对象
  • 文本对象
    • iw 当前单词
    • aw 当前单词与当前单词之后的空格
    • is 当前句子,as
    • ip 当前段落
    • i +[ ]
      • i( 小括号内内容,不包括小括号
      • a( 小括号及小括号内容
      • 类似还有 [] {} <> "" ''

Vim复制粘贴

  • normal模式下复制粘贴

    • y(yank) 复制

    • d 剪贴

    • p(put) 粘贴

    • v(visual)选中要复制的地方,再用d y p

    • 配合文本对象

  • insert模式下复制粘贴

  • 粘贴代码格式混乱解决办法

    • 当设置了autoindent(自动缩进)后,粘贴代码缩进可能会错乱
    • 解决办法:
      • 粘贴前使用命令: :set paste
      • 粘贴后撤销上一条命令: :set nopaste
  • 寄存器

    • Vim操作的是vim寄存器,而不是系统剪贴板

    • 指定寄存器

      • 使用"{register} 作为前缀 执行 复制剪贴粘贴 命令时,可以指定寄存器

      • 不指定默认使用无名寄存器 无名寄存器指定为""两个双引号

      • 示例

        1
        2
        3
        "add	# 剪贴该行至a寄存器
        "byy # 复制该行至b寄存器
        "ap # 粘贴a寄存器内容
      • 常见寄存器

        寄存器符号 含义
        a-z 有名寄存器
        "0 复制专用寄存器
        "+ 复制到系统剪贴板
        % 当前文件名
        ". 上次插入文本
      • 将系统剪贴板与无名寄存器关联

        1
        set clipboard=unnamed

Vim宏

宏的使用分为 录制 和 回放

  • 录制:
    • 使用q{reg}来录制,同时使用q来结束录制
    • 使用q{register}选择要保存的寄存器,把录制的命令保存到其中
  • 回放
    • 使用@{rigister} 回放寄存器中保存的一系列命令

Vim补全

命令 补全类型
Ctrl n 普通关键字补全(向下)
Ctrl p 普通关键字补全(向上)
Ctrl x Ctrl f 文件名补全
Ctrl x Ctrl n 当前缓冲区关键字
Ctrl x Ctrl i 包含文件关键字
Ctrl x Ctrl ] 标签文件关键字
Ctrl x Ctrl k 字典查找
Ctrl x Ctrl l 整行补全
Ctrl x Ctrl o 全能(Omni)补全(可能需要安装插件)

Vim配置

vim配置

1
2
3
4
5
6
7
8
" 主题
color desert
" 设置行号
set number
" 启用代码高亮
syntax enable
"高亮搜索
set hlsearch

Vim映射

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
" 主题
color desert
" 设置行号
set number
" 启用代码高亮
syntax enable
"高亮搜索
set hlsearch


" 修改映射

" insert模式 映射
" 修改 jj退出insert模式(替换Esc)
inoremap jj <Esc>


" normal模式 映射
" 修改窗口切换按键
noremap <C-h> <C-w>h
noremap <C-j> <C-w>j
noremap <C-k> <C-w>k
noremap <C-l> <C-w>l


" command命令行模式 映射
" com!