Vim使用指南
可以使用已有的配置文件 。
安装
源码安装
拉取源代码:
|
|
安装依赖:
|
|
编译&安装:
|
|
如果需要安装Python依赖:
|
|
配置编译启用-python3
选项:
|
|
基本概念
Buffers
buffer就是内存中的一块空间,你可以在这里写入或编辑文本。当你在Vim中打开一个文件时,文件的数据就与一个buffer绑定。当你在Vim中打开3个文件,你就有3个buffers。
|
|
但是实际上默认看到的是一个缓冲区,可以通过:buffers
查看缓冲区:
Windows
一个window就是在buffer上的一个窗口,在Vim中,你同样可以拥有多个窗口。
Tabs
Tabs就是windows的集合。它就像窗口的布局。在大部分的现代文本编辑器(还有现代互联网浏览器)中,一个tab意味着打开一个文件/页面,当你关闭标签,相应的文件/页面就消失了。但在Vim中,tab并不表示打开了一个文件。当你在Vim中关闭一个tab,你并不是关闭一个文件。你仅仅关闭了窗口布局。
Register 寄存器
在vim中,寄存器是一个用于存储文本的内存区域,它可以存储文本、命令、宏等内容。
可视模式
高亮显示文本块并对其进行更改,是很多文本编辑器中的常见功能。 Vim也可以使用可视模式实现这一功能。Vim有三种可视模式:
v
逐字符可视模式V
逐行可视模式Ctrl-v
逐块可视模式
如果我们有文本:
|
|
我们需要在每一行的末尾都增加上;
,我们可以如下操作:
ctrl-v
进入逐块模式,使用jj
选到行尾A
然后输入;
<esc>
退出可视模式
所有行的末尾便都加上了;
。
Vim有Ctrl-X
和Ctrl-A
命令来减少和增加数字。与可视模式一起使用时,可以跨多行递增数字。假定我们有如下的HTML元素:
|
|
有多个相同名称的id不是一个很好的方式,因此我们通过下面的方式是他们id递增:
- 光标移动到第2行的
1
ctrl-v 3j
启动逐块模式,并显示剩余的高亮1
g ctrl-A
逐行递增
标签 Tag
快速转到任意定义处,是文本编辑中一个非常有用的特性Vim中则使用标签来做到这一点。
而现代 Vim 不自带标签生成器,你需要配合标签生成器来配合使用。我们这里使用Universal ctags来说明:
|
|
在安装好之后,可以通过以下命令生成一个基本标签:
|
|
假设我们有两个ruby文件one.rb
和two.rb
,文件内容如下:
|
|
|
|
我们可以使用如下命令生成标签
|
|
随后,我们便可以在vim中使用这些标签了。
在普通模式下,您可以使用Ctrl-]
跳转到定义。在two.rb
中,转到one.donut
所在行,将光标移到donut
处,按下Ctrl-]
。
颜色模式
如果我们使用sainnhe/edge
主题,我们会定义如下的配置:
|
|
这个地方本质上是配置是否使用24位True color。
Vim语法
你只需要知道一个Vim语言的语法规则:
|
|
而对于Vim中我们可以把操作符 (Operator)作为动词,动作 (Motion)视为名词。
-
复制当前位置到行尾的所有内容
1
y$ # 因为y代表yank(复制),$代表跳转到当前行尾
-
删除当前位置到下一个单词的开头
1
dw # 因为d代表delete(删除),w代表跳转到下一个词的开头
-
修改当前位置到这个段落的结尾
1
c} # 因为c代表change,}代表跳转到这个段落结尾
动作motions也接受数字作为参数。
- 向左拷贝两个字符
y2h
- 删除后两个单词
d2w
- 修改后面两行
c2j
文本通常是结构化的,特别是代码中,文本经常被放置在小括号、中括号、大括号、引号等当中。Vim提供了一种处理这种结构的文本对象的方法。
- 删除括号内部内容但保留括号
di
- 删除括号以及内部的内容
da{
Vim的结合性最强大之处体现在它和外部程序结合时,Vim有一个过滤操作符!
可以用外部程序过滤我们的文本。
操作符 operator
可以使用:h operator
查看 vim 中所有的操作符,以下是可用的操作符:
operator | command | remark |
---|---|---|
c | c |
change |
d | d |
delete |
y | y |
复制 |
g~ | g~ |
反转字符的大小写 |
gu | gu |
使得小写 |
gU | gU |
使得大写 |
! | ! |
filter through an external program 执行外部的命令 |
动作 motion
在Vim中,motion(即movement)是你在编辑器中移动的方式。它们是在键入时以高速和精度移动光标的命令。有许多不同的motion命令,每个命令最适合用于不同类型和长度的移动。以下是一些常用的 motion:
motion | remark | example |
---|---|---|
h | left | h 光标左移一个字符 |
l | right | l 光标右移动一个字符 |
j | down | j 光标下移一行 |
k | up | k 光标上移一行 |
w | 移动到下一个单词的开头 | w |
} | 移动到下一个段落 | } |
$ | 移动到行末尾 | $ |
i + object | Inner Text Object | yi" 复制当前"abc" 里面的abc |
a + object | Outer Text Object | ya" 复制当前"abc" 里面的"abc" |
命令
点命令
在编辑文本时,我们应该尽可能地避免重复的动作。
而在vim中可以使用点命令来重放上一个修改操作。当你使用普通模式下的命令来更新(添加,修改或者删除)当前缓冲区中的内容时,你就是在执行一个修改操作了。其中的例外是使用命令行命令进行的修改(以:
开头的命令),这些命令不算作修改操作。
假设我们有以下的文本:
|
|
我们现在想将let
都替换为const
,则我们使用如下的操作:
/let
找到第一个位置,回车cwconst
+<esc>
完成替换n
找到下一个位置.
重复修改操作
在这4步做完之后,结果如下:
|
|
宏命令
宏命令可以自动完成一些普通的任务。其基本语法如下:
qa
开始记录动作到寄存器aq
停止记录@a
执行寄存器a中的宏
假设有以下文本,我们想把每一行都变成大写
|
|
把光标移动到hello
行首,然后执行如下的命令:
|
|
可以分解该命令如下:
qa
录制宏到寄存器a0
移动到行首gU$
将从光标到行尾的字母变成大写j
移动到下一行q
停止记录
然后我们可以使用@a
调用a宏,则记录可以成为:
|
|
常用操作
导航
移动
基本的方向键移动:
h
左j
下k
上l
右
按照单词移动:
w
移动到下一个单词的开头e
移动到下一个单词的末尾b
移动到上一个单词的开始ge
移动到上一个单词的结尾
当前行导航:
0
移动到本行的第一个字符^
移动到本行的第一个非空字符g_
移动到本行的最后一个非空字符$
移动到本行最后一个字符
句子和段落导航:
(
跳到前一个句子)
跳到后一个句子{
跳到上一个段落}
跳到下一个段落
滚动
Ctrl-e
向下滚动一行Ctrl-d
向下滚动半屏Ctrl-f
向下滚动一屏Ctrl-y
向下滚动一行Ctrl-u
向下滚动半屏Ctrl-b
向下滚动一屏
匹配导航
程序员经常编辑含有代码的文件,这种文件内容会包含大量的小括号,中括号和大括号,并且可能会把你搞迷糊你当前到底在哪对括号里。 许多编程语言都用到了小括号,中括号和大括号,你可能会迷失于其中。 如果你在它们中的某一对括号中,你可以通过%
跳到其中一个括号或另一个上(如果存在)。
此外,还可以使用[{
来跳转到{
的开头处,或者使用]}
跳到}
处。
跳转(行号导航)
gg
跳转到第一行G
跳转到最后一行ng
跳转到第n
行n%
跳转到文件的n%。
使用:123
可以跳转到第123行。
搜索
在命令模式下,输入/
加上需要搜索的内容即可,回车可以到高亮处。可以使用//
重复上一个搜索。按*
可以高亮出所有的匹配内容。
使用n
键为下一个关键词
使用N
键为上一个关键词
编辑
输入
可以在命令模式中传递一个计数参数,便可以重复输入:
|
|
则输入的内容会被重复10遍。
撤销/恢复撤销
- 撤销:命令模式
u
- 恢复撤销:命令默认
ctrl + r
剪切/复制/粘贴
- 单行复制:
yy
- 单行剪切:
dd
- 多行复制:
nyy
其中n
表示数字,表示从光标开始的多少行 - 多行剪切:
ndd
其中n
表示数字,表示从光标开始的多少行 - 粘贴:
p
替换
简单的可以参考:【vim】批量替换文件内容
替换语法如下:
|
|
其中,pattern
表示要被替换掉的字符串,可以使用正则表达式,string
表示替代的字符串,range
表示检索范围,缺省表示当前行,%
表示整个文件,其中s
表示替换操作。操作类型option
有以下几种选项:
g
全局替换c
进行确认i
不区分大小写
将原来的源替换成中科大的镜像源:
|
|
源文本:
|
|
替换的语句:
|
|
替换之后的内容:
|
|
删除
删除行:可以使用:[range]d
来删除行。
|
|
|
|
plugins 插件
在Vim中,一般会使用vim-plug
来对vim的插件进行管理。在unix下可以使用如下脚本安装:
|
|
其基本用法如下:
在~/.vimrc
中加入一个vim-plug的节:
- 以
call plug#begin()
开始 - 使用
Plug
命令列出要管理的插件 - 以
call plug#end()
结束
搜索
fzf.vim
fzf.vim是一个基于fzf模糊搜索引擎的Vim插件,它可以帮助用户更快速、更高效地查找和打开文件、缓冲区、标签、历史记录等内容。
使用vim-plug来安装fzf:
|
|
fzf的基础语法如下:
^
表示前缀精确匹配。要搜索一个以"welcome"开头的短语:^welcom
。$
表示后缀精确匹配。要搜索一个以"my friends"结尾的短语:friends$
。'
表示精确匹配。要搜索短语"welcom my friends":'welcom my friends
。|
表示或者匹配。要搜索"friends"或"foes":friends | foes
。!
表示反向匹配。要搜索一个包含"welcome"但不包含"friends"的短语:welcome !friends
。
搜索文件:
|
|
搜索文件内容:
|
|
Git
fugitive.vim
fugitive.vim是一个基于Git的Vim插件,它提供了许多Git操作的快捷方式和命令,可以帮助用户更方便地在Vim中使用Git。
使用vim-plug进行安装:
|
|
以下是插件的常用用法:
:Git
可以调用任何的git命令
Code
ALE
ALE(Asynchronous Lint Engine)是一个插件,在 NeoVim 0.2.0+ 和 Vim 8 中提供linting(语法检查和语义错误),并且在编辑文本文件时,并充当Vim语言服务器协议客户端。
使用vim-plug进行安装:
|
|
ALE充当language client,支持各种语言服务器协议功能,包括:
- Diagnostics 诊断(通过语言服务器协议 linter)
:ALEGoToDefinition
跳转到定义- 自动补全
:ALEFindReferences
寻找引用:ALEHover
悬浮信息:ALESymbolSearch
符号查询
在使用之前,我们需要对ALE进行配置:
|
|
使用vim打开Go文件,然后可以看到文件中有>>
标示表示错误:
Tagbar
❗️ 使用之前需要安装
ctags
或者兼容ctags
的一些制品,安装方法可以参考文档 。
使用vim-plug进行安装
|
|
s
可以改变排序的方式:Name
或者File Order
vim-gutentags
使用前需要按照文档 安装ctags。
Link:如何管理库文件tags
该插件可以管理tags
文件,以及自动生成对应的tags文件。该插件甚至能够管理cscope
文件的生成,可以设置:
|
|
vim-cscope
使用vim-plug进行安装(安装了一个镜像的):
|
|
通常安装之后,还会配置如下的内容:
|
|
常规的用法如下:
主要用来查询,查询的语法如下:
|
|
其中querytype
可以使用的值如下表所示:
number | querytype | remark |
---|---|---|
0 | s | 找到这个symbol |
1 | g | 找到定义 definition |
2 | d | 找到被这个函数调用的函数 |
3 | c | 找到调用(call)这个函数的函数 |
4 | t | 找到这个文本 |
6 | e | 找到这个正则表达模式 |
7 | f | 找到这个文件 |
8 | i | Find files #including this file |
9 | a | 找到赋值 Find places where this symbol is assigned a value |
也可以使用Ctrl+\
加上querytype
快速查询光标所在位置。
使用cscope寻找__init
的定义。