Vim笔记
大约 8 分钟
原文地址:http://hscarb.github.io/other/20191229-vim-note.html
Vim笔记
Vim模式
Normal普通模式
移动、操作
u
undo
Insert插入模式
进入
i
inserta
appendo
open a line belowI
insert before lineA
append after lineO
append a line abovegi
快速跳转到最后一次编辑的地方并进入插入模式
退出
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/set 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 从行尾开始搜索移动到chart
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) worddaw
=dw
delete around word (include space)diw
delete word (exclude space)
删除行
dd
delete linedt{}
delete till{}
d$
delete to end of the slined0
delete to start of the line
重复
{num}{cmd}
repeatcmd
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 {配色名}
修改配色
插件
安装插件管理器
- 推荐插件:https://github.com/junegunn/vim-plug
- 安装:
iwr -useb https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim |` ni "$(@($env:XDG_DATA_HOME, $env:LOCALAPPDATA)[$null -eq $env:XDG_DATA_HOME])/nvim-data/site/autoload/plug.vim" -Force
- 使用:
:edit $MYVIMRC
call plug#begin() " List your plugins here Plug 'tpope/vim-sensible' call plug#end()
- Reload the file
:source %
or restart Vim, then you can,:PlugInstall
to install the plugins:PlugUpdate
to install or update the plugins:PlugDiff
to review the changes from the last update:PlugClean
to remove plugins no longer in the list
插件网站
快速跳转插件
if exists('g:vscode')
Plug 'asvetliakov/vim-easymotion', { 'as': 'vsc-easymotion' }
else
Plug 'vim-easymotion/vim-easymotion'
endif
" ...
" easy motion 添加递归映射(后面那个也是一个映射,所以要递归映射)
" 含义为:按下 ss,就开始搜索 2 个字符的 EasyMotion 跳转
nmap ss <Plug>(easymotion-s2)ggjjjjjjjjjjk
" easy motion
let g:EasyMotion_smartcase = 1 " 启用智能大小写匹配
nmap <Leader>j <Plug>(easymotion-jumptoanywhere) " 按下;j跳转到任意位置
nmap <Leader>f <Plug>(easymotion-s2) " 按下;f触发双字符搜索
欢迎关注公众号【消息中间件】(middleware-mq),更新消息中间件的源码解析和最新动态!
