vim操作指南

0.简介

什么是最优秀的文本编辑器,当然是vim.
vim操作方便,在熟悉中会发现直接通过键盘进行操作比用鼠标更加的快速,可以享受到双手放在键盘上打字的畅快淋漓。
在打字过程中,不需要中断操作,然后再拿鼠标,减少了鼠标控制的打扰。
而且vim经历了大量大神的调教之后,增加了无数的扩展,更加贴近人的使用习惯。
完全可以用vim作为日常的程序文本编辑器,

当你直接下载之后,vim是非常干净的,里面没有扩展,功能也很单一,在实际使用的情况下,我们需要对vim进行配置,来添加一些有用的插件。
我的vim配置?https://github.com/Emir-Liu/vimrc
配置是fork其他大神的,里面的功能也在探索的过程中,使用它搭配makefile等可以进行项目的实践,贴图:

上面是我之前使用vim和一些工具做的STM32程序模板。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
ack.vim: 
Vim plugin for the_silver_searcher (ag) or ack -- a wicked fast grep
bufexplorer.zip: Quickly and easily switch between buffers. This plugin can be opened with <leader+o>
ctrlp.vim:
Fuzzy file, buffer, mru and tag finder. It's mapped to <Ctrl+F>
goyo.vim and vim-zenroom2:
lightline.vim:
A light and configurable statusline/tabline for Vim
NERD Tree:
A tree explorer plugin for vim
mru.vim:
Plugin to manage Most Recently Used (MRU) files. This plugin can be opened with <leader+f>
open_file_under_cursor.vim:
Open file under cursor when pressing gf
pathogen.vim:
Manage your vim runtimepath
snipmate.vim:
snipmate.vim aims to be a concise vim script that implements some of TextMate's snippets features in Vim
ale:
Syntax and lint checking for vim (ALE requires NeoVim >= 0.2.0 or Vim 8 with +timers +job +channel)
vim-commentary:
Comment stuff out. Use gcc to comment out a line (takes a count), gc to comment out the target of a motion. gcu uncomments a set of adjacent commented lines.
vim-expand-region:
Allows you to visually select increasingly larger regions of text using the same key combination
vim-fugitive:
A Git wrapper so awesome, it should be illegal
vim-indent-object:
Defines a new text object representing lines of code at the same indent level. Useful for python/vim scripts
vim-multiple-cursors:
Sublime Text style multiple selections for Vim, CTRL+N is remapped to CTRL+S (due to YankRing)
vim-yankstack:
Maintains a history of previous yanks, changes and deletes
vim-zenroom2
Remove all clutter and focus only on the essential. Similar to iA Writer or Write Room
gist-vim Easily create gists from Vim using the :Gist command

内容结构:
1.vim配置方式
2.vim操作指南
3.vim中一些有用的插件
3.1 NERDTree
3.2 ctags
4.FAQ

1.vim配置方式

首先,为了让vim实现更多的功能,我们需要对其进行配置使得使用过程更加流畅方便,当然,如果没有配置同样可以使用,那就直接跳转到下一章。
配置之后,每次使用vim就可以直接为配置的样式。

1.1 配置文件的位置

1
vim --version

输入上面的命令之后,可以看到

1
2
3
4
5
6
system vimrc file: "$VIM/vimrc"
user vimrc file: "$HOME/.vimrc"
2nd user vimrc file: "~/.vim/vimrc"
user exrc file: "$HOME/.exrc"
defaults file: "$VIMRUNTIME/defaults.vim"
fall-back for $VIM: "/usr/share/vim"

我一般是修改user vimrc file,也就是用户vim配置文件,通过编辑这个文件可以修改vim的外观,快捷键,插件等。

可以直接用我的配置,可以看上面的我的配置。
之后有一篇我的博客是对我的配置进行一些讲解。

1.2 配置样例

我们以自动设置行号为目标对文件做简单的配置。

首先进入用户vim配置文件中

在配置文件.vimrc后面加上:

1
2
set number    "显示行号
set tabstop=2 "tab长度为2

2.vim操作指南

2.1 vim的模式

vim有三种常用模式,分别为:底线命令模式(Last line mode)、输入模式(Insert mode)、命令模式(Command mode)
但是,实际上还有:视图模式(Visual mode)

2.1.1命令模式:

用户刚刚启动vim,便进入了命令模式。
此状态下敲击键盘动作会被Vim识别为命令,而非输入字符。比如我们此时按下i,并不会输入一个字符,i被当作了一个命令。
这种模式主要是输入简单常见的几种命令组合。
当前模式下,切换模式的命令:

1
2
i 切换到输入模式,以输入字符。
: 切换到底线命令模式,以在最底一行输入命令。

该模式下的常用命令:

1
2
3
yy  复制当前行内容
dd 删除当前行内容
pp 粘贴内容到下一行

2.1.2输入模式:

在命令模式下按下i就进入了输入模式,输入文件内容。
当前模式下,切换模式的命令:

1
ESC,退出输入模式,切换到命令模式

2.1.3底线命令模式:

在命令模式下按下:(英文冒号)就进入了底线命令模式。
底线命令模式可以输入单个或多个字符的命令,可用的命令非常多。
当前模式下,切换模式的命令:

1
ESC,退出输入模式,切换到命令模式

该模式下的常用命令:

1
2
q 退出程序
w 保存文件

2.1.4视图模式:

1
2
help v_ 
查看帮助

在命令模式下按下v/V/Ctrl+V就进入了视图模式。
视图模式是为了方便选取文本,然后进行复制粘贴等内容。

1
ESC,退出视图模式,切换到命令模式

该模式中有三种小的模式:

1
2
3
v   进入字符可视化模式,文本选择是以字符为单位
V 进入行可视化模式,文本选择是以行为单位
Ctrl+V 进入块可视化模式,可以选择一个矩形内的文本

该模式下的常用命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
光标选择
G 从当前光标位置选择到结尾

va{ 选中{}中间的内容,包括{}
vi< 选中<>中间的内容,<abs>
上面的两个可以扩展:
a表示包含中间的内容,包括边界
i表示只包含中间的内容,不包括边界
后面可以为
{ [ ( " ':分别表示对应的符号之间
t s b w p:选中标签的内容 一个句子 一个块 一个单词 一个段落

操作
x 剪切
y 复制
r 替换为新的字符
u/U/~ 将所有字母变小写/变大写/反转大小写
>/< 将选中的字符右移/左移
p/P 粘贴剪贴板的内容,p是粘在光标所在字符后面,P是粘在前面
d/D c/C y/Y 小写是针对选中字符,大写针对所在行字符

2.2 常用快捷键

1
vim filename    打开或者新建文档

输入模式(在命令模式下按下i)

1
2
3
4
5
6
7
ENTER   回车,换行
BACK SPACE 退格,删除光标前一个字符
DEL 删除光标后一个字符
方向键 移动光标
HOME/END 移动光标到行首/行尾
Page Up/Page Down 上/下翻页
Insert 切换光标为输入/替换模式,光标变为竖线/下划线

底线命令模式(在命令模式中按下:)

1
2
3
4
5
6
:q   退出模式
:w 保存文件
:set nu 显示行号
:set nonumber
:set nonu 隐藏行号
:n 跳转到第n行

命令模式(在其他模式下按下ESC)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
移动光标
kjhl 上/下/左/右移动光标(可以加上组合按键,30j)
ctrl b/f/u/d 屏幕上移一页/下移一页/上移半页/下移半页
-/+ 光标移动到非空格符的上一行/下一行
n<space> 光标向右移动n个字符
0/Home 光标移动到这一行最前面的字符处
$/End 光标移动到这一行卓后面的字符处
H/M/L 光标移动到这个屏幕最上/中间/下面那一行的第一个字符(不确定)

n<Enter> 光标向下移动n行
nG 移动到这个文件的第n行
G 调到文件的最后一行
gg 移动到这个文件的第一行

搜索/替换
/word 向光标下寻找一个名为word的字符串
?word 向光标上寻找一个名为word的字符串
n 重复前一个搜寻的动作
N 反向前一个搜寻的动作

:n1,n2s/word1/word2/g
在第n1与第n2行之间寻找word1字符串,并将字符串取代为word2
:1,$s/word1/word2/g(c)
:%s/word1/word2/g(c)
从第一行到最后一行寻找word1字符串,并将其取代为word2,(并在取代前给用户确认)

删除/复制/粘贴
x/X 向后/前删除一个字符
nx 连续删除n个字符
dd 删除光标坐在的一整行
ndd 删除光标所在的向下n行
d1G 删除光标所在到第一行的所有数据
dG 删除光标坐在到最后一行的所有数据
d$ 删除光标所在到该行的最后一个字符
d0 删除光标所在处到该行的最前面一个字符
yy 复制光标所在的那一行
nyy 复制光标所在的向下n行
y1G 复制光标所在到第一行的所有数据
yG 复制光标所在到最后一行的所有数据
y$ 复制光标所在到该行的最后一个字符

选择
viw 当光标在哪个单词上的时候,选中该单词


3.vim中一些有用的模块

3.1 NERDTree

当建立一个工程的时候,我们通常不仅仅只有一个文件,而是一个文件夹下面的多个文件,为了能够方便我们切换编辑工程内的文件,我们使用了这个模块。

命令模式

1
:NERDTree

配置(按下F3可以显示或者隐藏NERDTree)

1
2
map <F3> :NERDTreeMirror<CR>
map <F3> :NERDTreeToggle<CR>

常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
树形界面中
h/j/k/l 左/下/上/右移光标
上下建 移动选中的目录或者文件
Enter 展开目录或者打开文件
go 打开文件,但是光标依然在树形界面中
i/s 水平或纵向分割窗口,
m 显示文件系统菜单(添加、删除、移动操作)

? 弹出NERDTree帮助
t 文件在新的标签页打开
T 文件在后台标签页打开
p 到上层目录
P 到根目录
K 到同目录第一个节点
J 到同目录最后一个节点


ctrl+w 光标在左右侧窗口切换
ctrl+w+h/l 光标在窗口切换,只有左右两个窗口所以只能h/l

3.2 ctags

当使用上面的NERDTree模块之后,我们可以很方便的管理一个工程,但是,当需要查看函数的定义的时候,我们需要使用ctags模块来快速跳转到函数的定义。

1
2
3
4
5
6
7
8
ctags -R
在工程的根目录下建立索引文件

Ctrl+]
搜索定义函数的位置

Ctrl+o
返回到之前的位置

用上面的两个常用的按键来查看代码简直爽快。

4.FAQ

4.1 当编辑之后忘记保存文件就直接强制退出了,导致文件无法打开怎么办?

Ans:当编辑后忘记退出或意外关闭时,删除隐藏文件swp,可以删除;或者找到编辑后的文件

4.2 如何将不同文档中的内容进行复制粘贴?

vim中存在系统粘贴板,可以通过使用

1
:reg

来显示系统粘贴板中的内容,然后记住所要粘贴内容的需要例如下面

1
"3

然后在文档中输入命令

1
"3p

就可以了

4.3 如何多行首行缩进或者相反

1
2
:xx,yy>
:xx,yy<