学习链接:eleon-vim基础教程
Vim - 基础翻屏操作
光标移动:hjkl 20j 向下移动20行,w 向后移动一个字符,b 向前移动一个字符。
Ctrl + u
向上翻半页 UP
Ctrl + d
向下翻半页 Down
Ctrl + f
向下翻整页 Forward
Ctrl + b
向上翻整页 Backward
大写M
跳转到屏幕中间 Middle
大写L
跳转到屏幕最后一行 Last Line
大写H
跳转到屏幕第一行 Home
Count + 大写H
光标移动到顶部下面的count行。
Count + 大写L
光标移动到底部上面的count行。
Ctrl + e
向下翻一行,光标不动
Ctrl + y
向上翻一行,光标不动
Vim - 编辑操作
复制:yy=Y
复制光标所在行,3yy 复制光标所在行以在内的三行, y$ 复制光标所在字符至行尾的内容。
粘贴:p P
一个是粘贴到光标或行之前,一个是之后。
删除:dd
删除本行,3dd
删除光标所在行以在内的三行,D = d$
删除光标所在字符至行尾的内容。
剪切:x
剪切当前字符,3x
剪切当前字符在内的三个字符
交换字符顺序:xp
,其实就是先剪切后粘贴
合并行:大写J
无论光标在哪里,都能把下一行的内容补到当前行尾,间隔一个空格。(在代码整理的时候用吗???)
替换光标处字符(单词打错了后很常用):rb
就可以把光标所在位置字符替换成b,Rccc
就可以把光标所在位置和其后面的俩字符都替换成b。
s
会删除掉单个字符然后进入插入模式。 S
会删除掉光标所在行让后进入插入模式。
变更: cc
与S
的作用一样。
撤销:u
或者 U
都行,撤销上一步。
重做: Ctrl + r
是u
作用的反向
大小写转换:gu + Motion
, gU + Motion
其中Motion可以是w表示转换单词,如果是2w就是转换当前单词在内的俩单词。
重复上次修改:点“.
” 可以重复上次的命令操作。
Vim - 文本对象(常用)
Operation + type + Object 的组合
Operation: 可能是d,y, c, v
Type:只有两种 a
和 i
,分别表示all和in
Object:可以是一堆括号{ [ ( " '
等,也可也是w
(word)s
(句子)t
(tab,html用到)
Vim - 缩进
1 手动缩进:
>>
:增加缩进
<<
:减小缩进
3>>
:当前行以下3行增加缩进,减小缩进类似。
> %
:当光标放在大括号上时有效,对当前块进行增加缩进操作,减小缩进类似。
> i {
:为{}内的内容(不含{})增加缩进
> a {
:为包含{}在内的块儿内内容增加缩进
2 自动缩进:
==
:对当前行自动缩进
4==
:对当前行及下面三行执行自动缩进
=i{
:对{中的内容自动缩进
=a{
:对{中的内容包括{自动缩进(常用)
=%
:当贯标在括号上时自动缩进整个块
3 缩进格式设置:
set shiftwidth=8
设置缩进操作长度为8个空格的长度(如果tab为4个空格,则缩进就是两个制表符,如果tab为8个空格,则缩进就是1个制表符)
set tabstop=4
设置tab的长度为4,当在命令模式下进行缩进时起作用。
set expandtab
在插入模式和命令模式都起作用,使用手动缩进插入的是空格。此时如果在插入模式下敲入tab,则插入的是空格
set noexpandtab
expandtab 的反面,使用手动缩进插入的是制表符。此时如果在插入模式下敲入tab,则插入的是制表符
上面的命令与手动自动缩进命令的配合来编写符合原代码规范的代码。
set softtabstop=8
只在插入模式起作用。 注意与tabstop的不同。如果你想手动写tab则要修改这个命令。
在检查更改时如果要检查自己的设置是否正确使用俩命令:
set list
显示特殊符号,如$表示行尾,Ctrl+I表示tab制表符
set nolist
隐藏特殊符号
4 插入模式下编辑下一行时如何自动缩进:
set <自动缩进类型>
: 类型有四种,autoindent
,smartindent
, cindent
, indentexpr
;
我现在先使用cindent, 是用于c语言时的缩进格式。 我找了很长时间,网上的教程都是东拼西凑,原来学习还得需要系统,这块东西如果光靠一个博客就搞明白的确很费精力。
Vim - 折叠-Floding
如果有不需要的代码可以折叠起来。也可以参考手册命令模式输入:help folding
当前我,几乎不咋用,只有使用vim -d 进行文件对比的时候使用。仅列在这,详情参考vim 基础教程
z + f + Motion
: 创建当前行至Motion为一个折叠。
count + z + F
: 创建当前行之后count行的折叠。
z + f + %
:查找光标所在的块进行块儿折叠。
z + o
打开折叠,z + O
递归打开折叠。
z + c
折叠起来,z + C
递归折叠起来。
z + d
删除光标所在行折叠,z + D
递归删除光标所在块折叠。
z + E
删除所有折叠。
Vim - Buffers 多文件(很重要)
命令模式下有如下命令,我曾苦苦找寻,如今发现vim本身就特么强大的一批了,我还装个毛线的nvim. lvim,骑驴觅驴而已。
e + 文件名
打开并激活指定文件(e为edit)
ls, buffers, files
列出缓冲区文件,这仨命令一样的作用
b add b.txt
向缓冲区列表添加新文件但不激活。
b d 3
删除缓冲区编号为3的文件,d也可写作delete, 如果删除当前文件不需要加数字即可。
b+空格+Tab
先在命令模式输入ls进入buffer列表,然后输入该命令tab就可实现文件跳转,哈哈好方便啊,我之前都打开一堆vim窗口,简直是浪费声明卧槽了。
bn, bp
可以切换到buffer中下一个nexp文件,上一个privious文件
b3
,buffer3
都可以切换到buffer中符号为3的文件。
b#
访问刚刚访问的文件,这个应该最常用了。
bf, bl
可以跳转到buffer中第一个文件,最后一个文件
b1.txt, buffer1.txt
都可以切换到指定文件名的文件,支持tab补全。
set hidden
当写入内容后不保存也能切换不同文件 set nohidden
作用相反。
Vim - Windows 多窗口
可以将一个窗口分隔成多个窗口,不常用,如果对比文件直接vim -d 不更方便?但是还是记录下基本用法,以免以后用到查找。
sp + 文件名
,split的缩写,横向分隔窗口打开指定文件
vs + 文件名
,vertical split缩写,纵向分隔窗口打开指定文件
Ctrl + W + Motion
Motion 可以是hjkl实现窗口切换
Ctrl + W + w
轮换窗口
Ctrl + W + +
增加窗口高度。Ctrl + W + -
减小窗口高度。
Ctrl + W + >
增加窗口宽度。Ctrl + W + <
减小窗口宽度。
Ctrl + W + Count + action
其中action可以是上面的窗口操作,比如窗口宽度增大4个格:ctrl + W + 4 + >
Ctrl + W + _
最大化窗口高度; Ctrl + W + |
最大化窗口宽度;
Ctrl + W + =
调整窗口为一致性大小。
Ctrl + W + H/J/K/L
注意motion为大写,用于调整光标所在窗口在屏幕的位置。
Ctrl + W + q
退出当前窗口
Ctrl + W + =
除当前窗口之外全部退出,等价于on。
Vim - tabs 多标签
vim -p 文件1 文件2
以TAB形式打开指定文件
vim -p *
以TAB形式打开当前目录所有文件
:tabe + 文件名
以TAB形式打开新文件,常用(tab edit)
gt
或:tabn
跳到下一个tab.
gT
或:tabp
跳到上一个tab.
数字 + gt
或 :tabn + 数字
跳到指定序号的的tab
:tabl
跳到最后一个tab
:tabm + 数字
(tab move)将当前tab插入到指定数字的位置
:tabc
(tab close)
:tabo
只保留当前窗口 (tab only)
《思考 buffers Windows tabs 的关系》
之前都是先搜索怎么配置,网上找到博客一通复制粘贴,跟着人家的命令就开始用,也不知到为啥,但是最终还是被这些概念搞烦了,最后使用最简单的vim 打开一个文件的最原始状态。现在机缘成熟,我学到这里了,也该搞明白他们的关系了,看这个大佬博客:如何理解并正确使用 Vim 中的 Buffer、Window 和 Tab
总结:
buffers
: 为文件在内存中的缓存数据,每个文件对应内存中唯一的buffer。
Windows
: 在一个电脑屏幕大小的空间,划分不同的小窗口,每个小窗口可以显示一个打开的文件。可以说Windows可以规定一个窗口的布局。
tabs
:每个tab可以理解为一个电脑屏幕,每个tab里面都可以有一种窗口布局。不同tab之间的窗口没关系。
我应该如何使用 tabs 和 buffer ?
Windows使用的很少,当我使用vim filename.c 打开一个文件,找到一个目标函数,转到定义时此时跳到另外一个文件,此时通过:ls
可以到这个文件的buffer也被激活了,这就已经打开了多buffer.
当我要 porting 两个不同工程的代码时,我可以为每个工程打开一个tag。这样可以方便的实现复制。
之前我都是使用多tag, 每个tag显示一个文件,但是当你使用ctags工具跳转时,tag显示的名称已经不是原来的文件了,会把自己搞晕。(如果能时刻显示当前打开buffer对应的文件就好了)
Vim 寄存器
无名寄存器(Unnamed):“
(没错就是个双引号)
用于保存d, c, x, s, y
操作的内容。可以通过命令行输入:reg "
来查看无名寄存器的内容。
数字寄存器(Number): 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. 一共10个数字寄存器。
0号寄存器 保存y
操作的内容。
1-9 号寄存器 保存d, c
操作的内容,且保存的内容会随着操作的进行逐渐向后搬移,1号寄存器始终保存着最新删除的内容。
搜索寄存器:/
,当执行搜索字符后,这个寄存器保存刚刚的搜索记录。
系统剪切板寄存器:+ 和 * 。在ubuntu中看到两个寄存器的内容一致,都来自鼠标或键盘复制得到的内容。
只读寄存器:有三个,分别为:
- 文件名寄存器:
%
- 命令寄存器:
:
- 插入文本寄存器:
.
Named - 寄存器:a-z 共26个寄存器
。比较常用,如果想要将指定内容复制到指定寄存器,需要" + 寄存器 + 操作
,其中寄存器小写表示替换大写表示追加,vim普通命令模式下例子:
"ayaw
:将单词 复制 到 a 寄存器。
"byiw
:将单词 复制 到 b 寄存器。
"Cyaw
:将单词 追加 到 c 寄存器。
"ap
:将 a 寄存器中的内容粘贴到光标位置。
思考:这一堆寄存器什么时候用?
当我们要跨文件进行大量复制粘贴时,如果只是使用0号寄存器,我们就得来回切换文件,此时若使用vim提供的Named寄存器单次保存不同内容就可以提升编辑效率。还有就是用于存储录制的宏。
寄存器内容查看:reg + 寄存器名
寄存器内容操作:Count + " + 寄存器名 + 操作
举例:3"+p
或 "+3p
都是将+寄存器中的内容粘贴到光标处重复3次。
Vim - Macro 宏(需要用寄存器存储)
宏就是一个录制好的一串命令,如果这个命令需要多次重复操作,你就可以录制一个宏到指定的Named 寄存器,这样下次就不用一个一个敲了(但是觉的还是很少用到)。
记录宏的步骤:
开始记录宏:q + 寄存器名
输入宏命令
按下q
结束宏录制
使用宏的步骤:
使用录制的宏命令:@ + 寄存器名
使用最近一次录制的宏命令:@@
追加宏内容:q + 大写寄存器名
多次重复宏命令:count + @ + 寄存器名
举例子:
比如我想要实现按下@c
来快速将本行行首添加//
注释掉本行(想法牛逼,很实用)。
比如我想要实现按下@d
来快速将本行行尾添加;
。
Vim - Marks书签(需要用寄存器存储)
用到小写和大写两种寄存器,每个文件内有一套小写Named寄存器提供文件内书签跳转(局部跳转),而文件之间有大写Named寄存器可以实现文件之间书签跳转(全局跳转)。
添加书签:m + Named寄存器
清理书签:delmarks a
可清理a书签
查看书签:marks + 要查看的寄存器
(此时区分小写还是大写)
跳转到书签所在行: ' + Named寄存器
(单引号)
跳转到书签所在行与列: ` + Named寄存器(反引号)
范式:Operation + ' + Named寄存器
(单引号)
比如:
d'a
:删除当前光标所在行至a寄存器书签所在行之间的内容。
y'a
:复制光标所在行至a寄存器书签所在行之间的内容。
c'a
:删除当前光标所在行至a寄存器书签所在行之间的内容并进入插入模式。
思考:书签什么时候用?
通过marks查看寄存器存储的标签,可见他会随着你删除代码动态更新,这比较有用。
1,多文件穿梭,可能你说用buffers的命令bn就够了,但是书签可以更快的跳转到目标位置,还能跟随删除粘贴等命令移动。
2,调试过程中,可以标记报错位置,快速往返于代码和日志。
Vim - 插入模式下的快捷键
- 进入插入模式常用的有:i, l, a, A, o, O, ea
- Ctrl + y : 插入光标之前行的内容,一直操作就可以一直复制。
- Ctrl + e : 插入光标之后行的内容,一直操作就可以一直复制。
- Ctrl + r + =:将表达式求值并插入。(会议一下:在命令模式使用“ap插入寄存器内容)
Ctrl + r + 寄存器
,将寄存器内容插入Ctrl + t
:当前行增加缩进Ctrl + d
:当前行减小缩进Ctrl + w
:删除光标前面的单词- Ctrl + h:删除光标前面的字符
- Ctrl + o:切换到普通模式,完成一个命令后,重新进入插入模式。
插入模式下比较常用的操作
缩进应该比较少用,我只需要知道如何在命令模式自动管理缩进就够了。删除操作吧,都是退回到命令模式切换光标位置或者按上下左右切换位置,感觉都不咋用。
Vim - 视图模式
之前我只知道Ctrl+V, 用来对那几行前面插入注释,但不知道为何他只能选择一个方块儿,后面的内容就无法选中。。。
小写v
: 基于字符模式选择,从光标所在字符开始选中。
大写V
:基于行选择,从光标所在行开始选中整行。
Ctrl + v
:基于块,可以选中方块儿形状的内容。(可配合小写o,大写O
来快速跳转光标位置)
gv
:选中之前选择的内容。
小写u大写U
来切换文本大小写,~
也可切换大小写。
>
增加缩进,<
减小缩进。