vim
vim
功能:
命令行模式下的文本编辑器
根据文件扩展名自动判别编程语言。支持代码缩进、代码高亮等功能
使用方式:vim filename
打开一个名为 vim filename 的文件。
如果没有该文件,则打开个一个新的文件,并命名为filename
模式:
normal 模式
ESC从插入模式回到普通模式
普通模式下进行各种命令操作和移动
大部分情况下,使用的是浏览
normal移动的快捷方式
hjkl 左下上右
w/W: 移动到下一个word/WORD 开头
e/E: 移动到下一个 word/WORD 结尾
b/B: 移动到上一个 word/WORD 开头 (backword)
行间搜索移动
f{char}: 当前光标往行后搜索字符, 分号(;)下一个找到的字符,逗号(,)上一个找到的字符
F{char}: 当前光标往前搜索字符
0: 移动到行首第一个字符
^: 移动到第一个非空白字符
$: 移动到行尾
G: 移动到行尾非空白字符
页面移动
gg: 文件开头
G: 文件结尾
H: 屏幕的开头(Head)
M: 屏幕的中间(Middle)
L: 屏幕的结尾(Lower)
crtl+u: 上翻页(upword)
ctrl+f: 下翻页(forword)
zz: 屏幕置为中间
:n 或 nG:n为数字,光标移动到第n行
n[HTML_REMOVED]:n为数字,光标向下移动n行
快速增删改查
vim快速增加
a/i/o A/I/O
vim快速删除
x 快速删除一个字符
d可以配合本文对象快速删除一个单词
dw删除整个单词包括空格
daw删除整个单词包括空格
diw不包括空格
dd删除一行
dt) 删除直到 ‘)’ 的内容
di) 可以删除整个括号内的内容
vim快速修改
r(replace)替换一个字符
s(substitute)替换并进入插入模式
c(change)和d的用法差不多
vim查询
/word:向光标之下寻找第一个值为word的字符串
?word:向光标之上寻找第一个值为word的字符串
n:重复前一个查找操作
N:反向重复前一个查找操作
*:当前词的向前匹配
#:当前词的向后匹配
Insert模式
a append 在当前光标后面插入
i insert 在当前光标前面插入
o open open a line below 在当前光标的下一行插入
A append after line 在当前行的后面插入
I insert before line 在当前行的第一个插入
O append a line above 在当前行的上面插入
快速纠错
ctrl+h删除上一个字符
ctrl+w删除上一个单词
ctrl+u删除当前行
shell
ctrl+a快速移动到开头
ctrl+e快速移动到结尾
ctrl+f光标后移
ctrl+b光标前移
快速模式切换
insert->normal: ctrl+c ctrl+[
gi:normal模式切换到insert模式,且到上次编辑地方
Command命令模式
normal模式下:进入命令模式
:q退出 :q! 强制退出 :w保存 :w!强制退出 :wq 保存并退出
:vs(vertical split) 垂直左右分屏
:sp(split)上下水平分屏
:set nu设置行号
:% s/java/python/g 全局替换java->python
vim替换
substitute命令允许我们查找并且替换掉文本,并且支持正则表达式
:[range]s[ubstiute]/{pattern}/{string}/[flags]
range表示范围比如:10,20表示10-20行,%表示全部
pattern要替换的模式,string是替换后的文本
flags有几个常用的标志
-
g(global)表示全局范围内执行
-
c(confirm)表示确认,可以确认或者拒绝
-
n(number)报告匹配到的次数而不替换,可以用来查询匹配次数
:n1,n2s/word1/word2/g:n1与n2为数字,在第n1行与n2行之间寻找word1这个字符串,并将该字符串替换为word2
:1,$s/word1/word2/g:将全文的word1替换为word2
:1,$s/word1/word2/gc:将全文的word1替换为word2,且在替换前要求用户确认
visual可视模式
normal模式下进入visual模式
v选择字符
V选择行
ctrl+v块状选择
多文件操作
概念:
- Buffer:内存缓冲区
- Window:Buffer的可视化分割区域
- Tab:组织Window为一个工作区
:ls 列举当前缓冲区
:b [num] 跳转到[num]缓冲区
:b [name] 跳转到[name]缓冲区
:bpre/bnext/bfirst/blast 跳转到上一个/下一个/第一个/最后一个缓冲区
:e [name] 编辑[name]文件
C-w s 水平分割窗口
C-w v 垂直分割窗口
C-w w 循环切换窗口
C-w h/j/k/l 切换到←/↓/↑/→窗口
C-w H/J/K/L 移动当前窗口向←/↓/↑/→
C-w = 所有窗口等宽高
C-w _/| 当前窗口最大化高度/宽度
[num]C-w _/| 当前窗口高度设为[num]行/列
:tabnew 新建标签页
:tabe [name] 在新标签页打开[name]文件
:tabc 关闭当前标签页和窗口
:tabo 只保留当前标签页并关闭其他的
C-w T 将当前窗口移动到新标签页
:tabn [num] 切换到[num]标签页,没有[num]表示下一个
:tabp 切换到上一个标签页
vim的text object
命令格式:
[number][HTML_REMOVED][text object]
number 次数
command 命令 d(delete), c(change), y(yank), v(visual)
text object 文本对象 w(单词word), s(句子sentence),p(段落paragraph)
eg:
iw 插入单词
viw 选择模式插入单词
vaw around word 选中当前单词和单词之后的空格
vis/vas/vip/vap
vi(/)/[HTML_REMOVED]/{/}/”/”/’/’
va(/)/[HTML_REMOVED]/{/}/”/”/’/’
ciw 删除单词并插入
ci{ 删除{内容
vim复制粘贴与寄存器的使用
vim在normal模式复制粘贴
Normal模式下复制粘贴分别使用y(yank)和p(put),剪切d和p
可以使用v(visual)命令选中所要复制的地方,然后p粘贴
配合文本对象:比如yiw复制一个单词,yy复制一行
insert模式复制粘贴
和其他文本编辑器差不多,但粘贴代码有个坑
在vimrc中设置了autoindent,粘贴代码缩进错乱
这个时候需要使用:set paste
和:setnopaste
解决
vim寄存器
vim里操作的是寄存器而不是系统剪切版,这和其他编辑器不同
默认使用d删除或者y复制的内容都放到了“无名寄存器”
用x删除一个字符放到无名寄存器,然后p粘贴,可以调换俩字符
register
通过"{register}
前缀可以指定寄存器,不指定默认无名寄存器
比如使用"ayiw
复制一个单词到寄存器a中,’bdd删除当前行到寄存器b中
:reg a查看寄存器a中的内容
“a p粘贴a寄存器中的内容
其他常见寄存器
除了有名的寄存器a-z,vim中还有一些其他常见寄存器
复制专用寄存器"0
使用y复制的文本同时会被拷贝到复制寄存器0
系统剪切版"+
可以复制到系统剪切板
其他寄存器,比如"%
当前文件名,"上次插入的文本
:set clipboard=unnamed可以让你直接复制粘贴系统剪切板内容
宏
需求:批量处理文本
vim宏(marco)
宏可以看成是一系列命令的集合
我们可以使用宏【录制】一系列操作,然后用于回放
宏可以方便的把一下列命令用在多行文本上
使用宏
vim使用q来录制,同时也也是q结束录制
使用q{register}选择要保存的寄存器,把录制的命令保存其中
使用@{register}回放寄存器中保存的一系列命令
vim补全
常见的三种补全类型
使用Ctrl+n和Ctrl+p补全单词
使用Ctrl+x,Ctrl+f补全文件名
使用Ctrl+x,Ctrl+o补全代码,需要开启文件类型检查,安装插件