本文由Scarb发表于金甲虫的博客,转载请注明出处

Vim笔记

Vim模式

Normal普通模式

移动、操作

  • u undo

Insert插入模式

进入

  • i insert
  • a append
  • o open a line below
  • I insert before line
  • A append after line
  • O append a line above
  • gi 快速跳转到最后一次编辑的地方并进入插入模式

退出

  • esc 退出到Normal模式
  • ctrl+c 回退到Normal模式
  • ctrl+[ 回退到Normal模式

插入模式快捷键

  • ctrl+h 删除上一字符
  • ctrl+w 删除上一单词
  • ctrl+u 删除当前行

Command命令模式

Normal下输入:后执行命令

  • :vs (vertical split)
  • :sp (split)
  • :% s/foo/bar/g 全局替换
  • :set number/ser nu 显示行号
  • :set nonu 隐藏行号
  • :syntax on 语法高亮
  • :set hls 搜索高亮 highlight search
  • :set incsearch 增量搜索 边搜索边高亮
  • :help {cmd} 查看帮助
  • :e 重新加载该文件

Read

  • :r! echo % 插入文件名
  • :r! echo %:p 插入文件名全路径

  • :help read

  • :help filename-modifiers

Visual可视模式

  • v Normal模式下进入
  • V 选择行
  • ctrl+v 块状选择

可视模式下快捷键

  • d delete 删除
  • y yank 复制
  • p paste 粘贴

快速移动

在Normal模式下

  • word 以非空白符分割的单词
  • WORD 以空白符分割的单词

移动

  • hjkl ←↓↑→
  • w/W 下一个word/WORD开头
  • e/E 下一个word/WORD尾
  • b/B backword 回到上一个word/WORD开头

行间搜索移动

  • f{char} find 移动到char字符
  • F{char} rfind 从行尾开始搜索移动到char
  • t till 移动到char的前一个字符
  • T rtill 从行尾移动到char前一个字符
  • ;/,继续搜索该行下一个/上一个

水平移动

  • 0 移动到行首
  • ^移动到第一个非空白字符
  • $ 移动到行尾
  • g_移动到行尾非空白字符

垂直移动

  • () 在句子间移动
  • {} 在段落间移动

页面移动

  • gg/G 移动到文件开头/结尾
  • ctrl+o 快速返回
  • H/M/L 跳转到屏幕开头Head 中间Middle 结尾Lower
  • ctrl+u upword 向上翻页
  • ctrl+f 向下翻页
  • zz 把屏幕置为中间

快速增删改查

快速删除

快速删除字符/单词

  • x 删除一个字符
  • d{} delete 配合文本对象删除一个单词
  • dw delete (around) word
  • daw = dw delete around word (include space)
  • diw delete word (exclude space)

删除行

  • dd delete line
  • dt{} delete till {}
  • d$ delete to end of the sline
  • d0 delete to start of the line

重复

  • {num}{cmd} repeat cmd num times
  • {num}x 删除num个字符
  • {num}dd 删除num

快速修改

  • r{} replace 替换一个字符为{}
  • s substitute 删除当前字符并进入插入模式
  • c{obj} change 删除文本对象并进入插入模式
  • ct{} change to {} 删除到并进入插入模式

  • R 连续替换字符

  • S 删除整行并进入插入模式
  • C 删除整行并进入插入操作

  • {num}r{char} 替换num个字符为char

  • {num}s 删除num个字符并入插入模式

快速查询

  • / 前向搜索
  • ? 反向搜索
  • n/N 跳转到上一个/下一个匹配
  • */# 搜索光标所在的当前单词,前向/后向匹配

正则搜索替换

  • :[range]s[ubstitute]/{pattern}/{string}/[flags] 查找并且替换文本,支持正则表达式
  • range 表示范围,10,20表示10-20行,%表示全部
  • pattern 要替换的模式(正则表达式)
  • string 替换后文本
  • flags 替换标志
    • g global 全局范围执行
    • c confirm 替换前需要确认
    • n number 报告匹配的次数而不替换,可用来查询匹配次数

多文件操作

  • vim {filename1} {filename2} -O 在多个窗口打开多个文件

三种多文件操作概念

  • Buffer: 打开的一个文件的内存缓冲区
  • Window: Buffer可视化的分割区域
  • Tab:可以组织为窗口的一个工作区

Buffer缓冲区

  • :ls 列举当前缓冲区
  • :b n 跳转到第n个缓冲区
  • :bpre :bnext :bfirst :blast
  • :b buffer_name 加上tab补全来跳转

  • :e {文件名} 修改文件

Window窗口

是可视化的分割区域

  • 一个缓冲区可以分割成多个窗口,每个窗口也可以打开不同缓冲区
  • ctrl + w, s :sp 水平分割
  • ctrl + w, v :vs 垂直分割
  • 每个窗口可以继续被无限分割

窗口切换

  • ctrl + w, w 窗口间循环切换
  • ctrl + w, h 切换到左边的窗口
  • ctrl + w, j 切换到下边的窗口
  • ctrl + w, k 切换到上边的窗口
  • ctrl + w, l 切换到右边的窗口

移动窗口

  • ctrl + w, H 左移窗口
  • ctrl + w, J 下移窗口
  • ctrl + w, K 上移窗口
  • ctrl + w, L 右移窗口

重排窗口

  • :h window-resize 查看文档
  • ctrl + w, = 使所有窗口等宽、等高
  • ctrl + w, _ 最大化活动窗口的高度
  • ctrl + w, | 最大化活动窗口的宽度
  • [N], ctrl + w, _ 把活动窗口的高度设为[N]
  • [N], ctrl + w, | 把活动窗口的宽度设为[N]

Tab标签页 将窗口分组

Tab是可以容纳一系列窗口的容器

  • :h tabpage 查看文档
  • Vim的Tab和其他编辑器不太一样,可以想象成Linux的虚拟桌面
  • 如一个Tab管理所有Python文件,一个Tab管理所有HTML文件

Tab操作

  • :tabnew {filename} 新建标签页,打开{filename}
  • :tabe[dit] {filename} 在新标签页中打开{filename}
  • ctrl + w, T 把当前窗口移到一个新标签页
  • :tabc[lose] 关闭当前标签页及其中的所有窗口
  • :tabo[nly] 只保留活动标签页,关闭所有其他标签页

Tab切换

Command模式命令 普通模式命令 用途
:tabn[ext] {N} {N}gt 切换到编号为{N}的标签页
:tabn[ext] gt 切换到下一标签页
:tabp[revious] gT 切换到上一标签页

Vim的Text Object

文本对象操作方式

  • [number]<command>[text object]
  • number 次数
  • command 命令 d(elete), c(hange), y(ank), v(isual)
  • text object 操作的文本对象 w单词,s句子,p段落
  • iw inner word,表示这个单词,不包含单词外的字符
  • aw around word,这个单词及环绕这个单词的字符(包含空格)

操作成对括号中的内容

  • i( i) 1 * ([2 + 3])
  • a( a) 1 * [(2 + 3)]
  • i< i> The <[tag]>
  • ……
  • {}
  • []
  • ""
  • ci" 删除双引号里面的内容并进入插入模式

Vim复制粘贴与寄存器

Normal模式赋值粘贴

  • y(ank) 复制
  • p(ut) 粘贴
  • d(elete) 剪切
  • v(isual) 选中要复制的地方
  • yiw 复制一个单词
  • yy 复制一行

Insert模式复制粘贴

  • 和其他编辑器差不多
  • 在vimrc设置autoindent,粘贴代码会缩进错乱
  • 需要用:set paste :set nopaste解决

Vim寄存器

  • Vim复制粘贴操作的是寄存器而不是系统剪贴板
  • 默认复制和剪切的内容放到了“无名寄存器”
  • Vim使用多组寄存器进行剪切、复制与粘贴
  • "{register} 指定寄存器 {register}为有名寄存器a-z
  • "" 无名寄存器
  • "ayiw 复制一个单词到寄存器a
  • "bdd剪切当前行到寄存器b中
  • :reg {register}查看寄存器内容

常见寄存器

  • "0 复制专用寄存器,使用y复制文本同时会被拷贝到复制寄存器0
  • "+ 系统剪贴板,在复制前加上"+可以将内容复制到系统剪贴板
  • "% 当前文件名
  • ". 上次插入文本
  • :set clipboard=unnamed set clipboard+=unnamed 直接复制粘贴系统剪贴板内容

Vim宏(Macro)

  • 一系列命令的集合
  • 可以使用宏录制一系列操作,然后用于回放
  • 可以方便的应用在多行文本上

录制和回放宏

  • q{register} 在普通模式下录制到register寄存器
  • q 结束录制
  • @{register} 回放某寄存器中的宏

将宏应用到多行,在Command模式下执行Normal模式命令

  • visual模式下选择多行
  • :'<,'> 输冒号进入Command模式
  • :'<,'>normal @a 为多行执行normal命令

Vim补全

命令 补全类型 常用
ctrl + n 普通关键字
ctrl + w, ctrl + n 当前缓冲区关键字
ctrl + x, ctrl + i 包含文件关键字
ctrl + x, ctrl + ] 标签文件关键字
ctrl + x, ctrl + k 字典查找
ctrl + x, ctrl + l 整行补全
ctrl + x, ctrl + f 文件名补全
ctrl + x, ctrl + o 全能(Omni)补全

更换配色

  • :colorscheme 显示当前主题颜色,默认default
  • :colorscheme <ctrl + d> 显示所有配色
  • :colorscheme {配色名} 修改配色