vim 笔记
vim cheatsheet https://vim.rtorr.com/
Mode
vim 有四种模式
- normal,普通模式,按下
esc
,ctrl + [
可以进入 normal mode - insert,插入模式
i, a, o
, insert, append, open a line below - command-line,使用
:
可以进入 command-line mode,可以进行很多操作 - visual,块状选择,v 以字符为单位选择,V 选中行,
ctrl + v
选择每一行相同位置的连续字符
插入模式下的
Move Arount
j, k, h, l
gj, gk(折行文本)
单词操作
w/W
移动到下个单词开头/单词含标点e/E
移动到下个单词结尾/单词含标点b/B
移动到上个单词开头/单词含标点ge/gE
移动到上个单词结尾/单词含标点dw/W
删除一个单词/单词含标 点,可搭配数字使用dt{char}
delete untild$/0
删除到行尾/首r, c, s
, replace, change(c(a)w 删除一个单词并进入插入模式,ct" 删除 "" 内容并进入插入模式), substitute(替换一个字符并进入插入模式)
行内操作
0/^
移动到行首/行首非空白符$/g_
移动到行尾/行尾非空白字符f{char}
行间搜索,快速跳转,;
跳转到下一个,,
向前查找F{char}
反向搜索t{char}
跳转到目标字符的前一个字符,快速跳转,;/n
跳转到下一个,`
垂直移动
()
在句子中移动{}
在段落之间移动
页面操作
gg/G
移动到文件开头和结尾,ctrl + o
快速返回H/M/L
移动到当前页面 顶部/中间/底部 (Head/Middle/Lower)zt/zz/zb
屏幕光标在当前位置 居顶/居中/居底 (top, bottom)Ctrl + e/y
屏幕向 下/上 移动一行(保持光标不动)Ctrl + b/f
屏幕向 上/下 滚动一屏 back/forwardCtrl + u/d
屏幕向 上/下 滚动半屏 up/down
其他
gd
跳转到局部定义gD
跳转到全局定义
Search/Replace
/
或者?
可以进行查找,后面输入需要查找的内容n/N
跳转到下一个/上一个匹配的位置
除了可以查找,还可以进行替换
:[range]s[ubstitute]/{pattern}/{string}/[flags]
# range 表示范围,如 :10,20表示 10-20 行,% 表示全部
# pattern 表示要替换的模式
# string 是替换后的文本
# flags 表示替换的方式
# - g(global) 表示全局范围内执行
# - c(confirm) 表示确认,可以确认或拒绝修改
# - n(number) 报告匹配到的次数二不替换,可以用来查询匹配次数
:%s/self/this/g # 表示将所有的 self 替换为 this
:%s/self/this/gc # 表示逐个将 self 替换为 this
:1,6s/self/this/g # 表示将 1 到 6 行所有的 self 替换为 this
:1,6s/self//n # 统计 1 到 6 行的 self 出现次数
:%s/\<quack\>/jiao/g
Multiple File
buffer 指打开的一个文件的内存缓冲区,vim 打开一个文件后会加载文件内容到缓冲区,之后的修改都是针对内存中的缓冲区,并不会直接保存到文件
- :w 保存
- :ls 列举当前缓冲区
- :b n 跳转到第 n 个缓冲区
- :bpre :bnext :bfirst :blast
- :b buffer_name 加上 tab 补全跳转
窗口是 buffer 可视化的分割区域
一个窗口可以分割成多个窗口,每个窗口也可以打开不同缓冲区
- <ctrl +w> s 水平分割, 或 :sp
- <ctrl +w> v 垂直分割,或 :vs
- <ctrl +w> h/j/k/l
- <ctrl +w> w 窗口间循环切换
- <ctrl +w> h/j/k/L 将当前窗口移动到 左/... 边,交换
- <c-w>= 使所有窗口等宽、登高
- <c-w>_ 最大化活动窗口的高度
- <c-w>| 最大化活动窗口的宽度
tab 可以组织窗口为一个工作区,可以理解为虚拟桌面,比如可以一个 tab 用来编辑 go,一个用来编辑 html
Text Object
\[number\]\<command\>\[text object\]
- number 表示次数
- command 表示命令,如 d(elete), c(hange), y(yank)
- text object 是要操作的文本对象,比如 w(单词), s(句子), p(段落)
例子
- viw 选中单词(v visual 模式,i inner); vip 选中段落
- viw 选中单词包括后面的空格(v visual 模式,a around)
- 3yiw 复制三个个单词,yy 复制一行
Register
在 vim 中,将复制、删除的内容暂时放在了寄存器中,如果不指定,内容默认放在了 “无名寄存器”,通过 "{register} 前缀可以指定寄存器,不指定默认使用无名寄存器
- normal 模设计下 y(yank), p(put), d, p
- yiw 复制一个单词,yy 复制一行
- insert 模式
"ayiw 复制一个单词到寄存器 a 中
"bdd 删除当前行到寄存器 b 中
:reg {register} 查看寄存器中的内容
"ap 粘贴 a 寄存器中的内容
"+ 复制到系统剪切板
"% 当前文件名
". 上次插入的文本
插入模式下
ctrl r +
Macro
macro 可以看成是一系列命令的集合,我们可以使用宏“录制”一系列操作,然后用于“回放”,即将一系列命令用在多行文本上
normal 模式下
- q 录制,q 结束录制
- q{register} 选择要保存的寄存器,把录制的命令保持在其中
- @{register} 回放寄存器中保持的一系列命令
eg. 给多行 url 连接加上双引号
qa # 开始录制
I
"
esc
A
"
esc
q # 结束录制
j
vG
:normal @a # 回放
VG
:normal I"
:normal A"
Config
set number
syntax on
colorscheme hybrid
" F2 进入粘帖模式
set pastetoggle=<F2>
" 高亮搜索
set hlsearch
" 设置折叠方式
set foldmethod=indent
可以在 command-line mode 下 :h option-list
查看可配置的选项
自定义映射
map
基本映射,指 normal 模式下的映射。unmap
取消映射nmap/vmap/imap
,如:vmap \ U
在 visual 下将选中文本转换为大写。存在递归映射nnoremap/vnoremap/inoremap
非递归映射
let mapleader=';' # 定义 ; 为 Leader 键
inoremap <leader>w <Esc>:w<cr> # leader + w(;w) 映射为 <ESC> + : + w 即进入 normal mode 并保存
inoremap jj <Esc> # jj 进入 normal node
noremap <C-h> <C-w>h # 将 ctrl-h 映射为 ctrl-w + h
noremap <C-j> <C-w>j # 将 ctrl-j 映射为 ctrl-w +
还可以自定义 vimscript 函数、配置插件,现在还不会...
Vim 操作太多了,等用到了再记录...