[TOC]

前言介绍

Vim(Visual Interface|可视化接口),在linux中常常使用的工具,是进行Linux嵌入式编程的必备工具之一;
vim最大的贡献就是它的按键系统这也是为什么chrome、idea、atom等编辑器都会提供一个vim mode;

首先我来简单说为什么要学习Vi或Vim(Vi Imporved)主要我有以下三点:

  • vi是很多Linux系统预装的,也就是说你到服务器上面不用担心没有的问题。
  • vi轻量、快速、强大,熟悉之后你几乎不用离开键盘。
  • 太多浏览器,编辑器,IDE插件支持,你学会了它效率倍增,几乎相当于学会了很多编辑器,比如我现在在Pycharm下用Vim。

vim的优点:
1)支持多级撤销
2)可以跨平台
3)支持语法syntax高亮
4)支持图像界面
5)支持自定义编程设置(配置方案和插件)

键盘图/快速入门

WeiyiGeek.VIM键盘图

WeiyiGeek.VIM键盘图

注意事项:

  • 一般100MB以下为宜,不要使用vim打开大文件,vim会一次性读取所有内容到内存,容易造成宿主机内存溢出。

参考地址:


Vim安装

描述:在我们安装完成Centos后,系统默认自带的是vim-minimal也就是最小安装版本使用的命令是vi命令,而最小安装版本是不支持语法高亮和自动缩进等选项,所以我们需要安装vim是vi的增强版;

完整的vim编辑器需要安装四个包:

  • vim-filesystem
  • vim-common
  • vim-enhanced
  • vim-minimal

查看本机是否安装、以及安装VIM:

1
2
3
4
5
6
7
8
9
10
11
#Centos
WeiyiGeek# rpm -qa | grep "vim" #一般都是最小安装
WeiyiGeek# yum install -y vim

#debain/ubuntu
WeiyiGeek# apt install vim
WeiyiGeek# pkg --list | grep "vim"
ii vim 2:7.4.1689-3ubuntu1.2 amd64 Vi IMproved - enhanced vi editor
ii vim-common 2:7.4.1689-3ubuntu1.2 amd64 Vi IMproved - Common files
ii vim-runtime 2:7.4.1689-3ubuntu1.2 all Vi IMproved - Runtime files
ii vim-tiny 2:7.4.1689-3ubuntu1.2 amd64 Vi IMproved - enhanced vi editor - compact version


VIM界面信息
描述: 当使用vim打开文件后,我将可以获取信息比如文件名,文件状态,文件的总行数,以及光标所在的相对位置。

1
2
ctrl + g #快捷键显示当文件信息
#下面那个 5,1 表示第 5 行第一列;

WeiyiGeek.

WeiyiGeek.


Vim使用

vim总结的三种模式:

  • 普通模式:比如 W 和 B 以及 h(左) j(下) k(上) l(右) Y(拷贝) P(粘贴) 移动光标(跳入行尾)剪切/粘贴文本
  • 插入编辑模式(insert mode): 比如按下 i 或者 r表示插入编辑和替换字符,按下esc键都回到普通模式
  • 底行命令模式(last line mode): 比如执行的 :wq :r 退出并保存的命令,按下esc键都回到普通模式

补充快捷键:

1
#VIM进入底行命令模式可以采用 esc 或者 ctrl +[ (推荐)


vim语法参数:

1
2
3
4
5
6
7
vim [[+][行数|字符]|[选项]] [filename ...]

#参数
+行数 #打开文件跳入到指定行
+/字符串 #定位到字符串首次出现的行

-o,-O #打开多个文件小写o表示垂直并列,大写O表示水平并排


基础示例1:

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
#示例1:外部shell参数
vim abc.txt # 打开单个文件
vim aa bb cc # 一次性创建或打开多个文件,一开始进入第一个文件命令模式中键入 :n 就依次进入其他文件
vim + abc # 定位到尾行
vim +3 abc # 定位到第三行,其他数字依次,如果超过文件最大行数,则光标定位到尾行
vim +/字符xxx abc # 定位到xxx首次出现的行,通过按N(向上),n(向下)键来回切换定位其他有xxx的行


#示例2.打开文件显示方式
vim -o/-O abc abc.txt # 垂直与水平打开并排

:split #同时显示多个文件
:exit #退出显示多个文件
:vsplit
:vsp #底行命令模式输入水平排列

#快捷点切换文件
ctrl + w + w #切换到笑一个文件
ctrl + w + 方向键(h j k l)
垂直并排: ctrl + w + [j|k] #切换文件
水平并排: ctrl + w + [h|l]

Ctrl+6 #下一个文件
:bn #下一个文件
:bp #上一个文件
:bd #关闭打开的文件

WeiyiGeek.-o/-O

WeiyiGeek.-o/-O

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
#示例3.显示多个文件与退出当打开多个文件时候,再文件中进行切换
:ls #列出所有打开的文件
# 1 # "1.txt" 第 1 行
# 2 %a "2.txt" 第 1 行 #表示当前行

:n #文件后退
:N或者:prev #依次回到前一个文件


#示例4.打开一个文件
:o filename #打开一个新文件到当我文件列表中
:open filename


#示例4.读取一个文件到当前工作空间(及合并文件)
:r filename #读取filename文件中的内容并将其插入在当前光标位置
:read filename


#示例5.同一个编辑器的缓冲区是剪贴板是共享的,可以方便在多个文件中复制
:e /tmp/a #在同一个编辑器内打开/tmp/a文件

#示例6.退出多个编辑器与快捷键
:q #退出
:! #暂停写入退出到shell界面,任意键继续编辑文件
:qa #退出所有
:qa! #强制退出所有

:w #保存
:w filename #将当前缓冲区内容保存到filename文件中(相当于文件另存为)
:w! filename #用当前文本覆盖filename文件中的内容

:wq #保存退出或者 安装shift+两次Z(推荐)
#ZZ :退出vi,仅当文件在最后一次保存后进行了修改,才保存缓冲区内容
#ZQ : 退出vim不保存写入

:wqa! #强制保存退出所有


光标移动(页面显示)

在vim中移动光标和编辑是两件事,正因为区分开来, 所以可以很方便的进行光标定位和编辑,因此能更快一点移动光标是很有用的.

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
zt:将当前行放置于页面的最顶端一般阅读函数定义时非常非常有用 top
zz:将当前行放置于页面中间利于阅读
zb:将当前行放置于页面的最底端 bottom

#示例1.移动光标
k #光标上移
h #光标左移 l #光标右移
j #光标下移
#常常与数字结合
3h 则是将光标向前移动 3 格
3j 则是将光标向下移动 三 行
30j 则是向下移动 30 行

#示例2.移动光标
0 #移动光标到本行最开头.
^ #移动光标到本行最开头的字符处.(有用呀当为空格的时候)
$ #移动光标到本行结尾处.

b(B) #移动光标到上一个单词.
w(e/E) #移动光标到下一个单词.
5w(e/E) #移动光标到下五个单词.
3w #则是将光标跳到三个单词后的开始位置

H #移动光标到屏幕的首行
M #移动光标到屏幕的中间一行
L #移动光标到屏幕的尾行

gg #移动光标到文档首行
G #移动光标到文档尾行


ctrl+p #光标向上移动
ctrl+n #光标向下移动
ctrl+u #向上翻半页(page up)
ctrl+d #向下翻半页(page down)
ctrl+b #向上翻页(page back)
ctrl+f #向下翻页(page front)
ctrl+e #编辑窗口中的文件内容整体上移一行
ctrl+y #编辑窗口中的文件内容整体下移一行


'' #此命令相当有用, 它移动光标到上一个标记处, 比如用gd * 等查找到某个单词后, 再输入此命令则回到上次停留的位置.
'. #此命令相当好使, 它移动光标到上一次的修改行.
`. #此命令相当强大, 它移动光标到上一次的修改点.


插入编辑

描述:该在普通模式下进行插入编辑,下面是几个常用的:

1
2
3
4
5
6
7
8
9
#进入插入模式的各种方法
i #在光标的前边进入插入模式
I #在光标所在行的行首进入插入模式
a #在光标的后边进入插入模式
A #在光标所在行的行尾进入插入模式
o #在光标所在行的下方插入空行并进入插入模式
O #在光标所在行的上方插入空行并进入插入模式
s #删除光标指定的字符并进入插入模式
S #将光标所在行清除并进入插入模式

注意事项:

  • 大 S 是清除所在行而不是删除。清除的意思就是保留行,把内容清空,然后在行首进入插入模式。


删除操作

当然你可以选择在插入模式中使用退格键(Backspace)或删除键(Delete)来删除光标前面或当前的字符,但是常常我们不会这么去做我们会使用下面的方法;

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
x #s删除单一字符在普通模式下跟在插入模式按下 Delete 键一样x 命令是删除光标指定的字符。

#使用删除操作符 d 的删除命令的格式是 d motion;d 是 Delete(删除)的意思,motion 即指定要删除的对象
#motion 其实是一些表示操作范围的指令,比如:
0 将光标定位到行首的位置
^ 同上
$ 将光标定位到行尾的位置
b 将光标定位到光标所在单词的起始处
e 将光标定位到光标所在单词的结尾处
w 将光标定位到下一个单词的起始处(注意,是光标所在单词的下一个单词噢^_^)
gg 将光标定位到文件的开头
G 将光标定位到文件的末尾

#将 d 命令跟它们结合
d0 | d^ #删除光标从当前位置(不包含)到该行行首的所有字符
d$ #删除从光标当前位置(包含)到该行行尾的所有字符
db #删除从光标当前位置(不包含)到单词起始处的所有字符
de #删除从光标当前位置(包含)到单词结尾处的所有字符
dw #删除从光标当前位置(包含)到下个单词起始处的所有字符
dh #删除光标前面一个字符
dl #删除光标指定的字符
dj #删除光标所在行以及下一行的所有字符
dk #删除光标所在行以及上一行的所有字符
dd #删除光标所在行的所有字符
dgg #删除光标所在行(包含)到文件开头的所有字符
dG #删除光标所在行(包含)到文件末尾的所有字符

#与数字连用删除指定的行
d3h #表示删除光标前的 3 个字符,
d3j #表示删除光标所在行以及下面 3 行的所有字符
d3w #表示向后删除当前光标到后面第三个单词前的所有字符


#与f连用删除指定的字符串前的字符串
df" 删除到出现的第一个双引号

基础示例:

1
2
3
#示例1:删除空白行值得注意:d^   
set mouse=a #删除set前面的空白行
set mouse=a #使用后d0


撤销与恢复

描述:人总难免会做错事,尤其是在进行删除操作的时候,这时候我们应该怎么办?

1
2
3
u #小写的 u 表示撤销最后一次修改,可以按多次返回多次
U #而大写的 U 表示撤销对整行的修改。
ctrl+r # 可以修改返回的状态(可以按多次),回到修改后的状态

注意事项:

  • 上面所有的“删除”操作并不是真的删除,它们事实上是存放在 VIM 的一个缓冲区(VIM 把它称之为寄存器)中,相当于 Windows 的剪切功能;


拷贝命令

描述:其实我们用的最多的还是拷贝粘贴,VIM 用 y 命令实现拷贝。

语法跟删除的 d 命令一样:y motion其中的 motion 同样是用来表示操作范围的指令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
yy 复制光标所在的行
yw 表示拷贝从当前光标到光标所在单词结尾的内容(复制光标开始的一个单词).
y0 表示拷贝从当前光标到光标所在 行首 的内容.
y$ 表示拷贝从当前光标到光标所在 行尾 的内容.
ygg 到文件首部
yG 到文件尾部

yfa 表示拷贝从当前光标到光标后面的第一个a字符之间的内容.
y2fa 表示拷贝从当前光标到光标后面的第二个a字符之间的内容.
yfB 复制光标到第一个大写B中间的内容
y2fB 复制光标到第二个大写B中间的内容

5yy 表示拷贝光标以下5 行.
10yy 向下复制10行

:12,24y 表示拷贝第12行到第24行之间的内容.
:,24y 表示拷贝光标所在行到第24行之间的内容.
:12,y 表示拷贝第12行到光标所在行之间的内容.

WeiyiGeek.拷贝

WeiyiGeek.拷贝


剪切命令

描述:vim中采用x命令来进行文本的剪切

1
2
3
x  向剪切一个一个字符,如果是在行尾则为向前剪切
3x 剪切三个
xp 非行尾交换两个字符,如从bs变成sb


粘贴命令

描述:我们也可以将使用y命令拷贝的字符串行来粘贴到文件中,常常是整行为单位;

1
2
P(Max) #在光标所在行的上方粘贴
p(Min) #在光标所在行的下方粘贴


行与块模式

描述:v命令进入行模式+键盘上下键然后通过 h、j、k、l 或 其他 motion 来移动你的光标,来选择多行类似于剪贴;也可以通过V进行可视化行模式;

1
2
3
4
5
6
7
v #进入行模式
V #可视化行模式

1v #行模式选择十行
3v #行模式 选择三十行
v +{hjkl}+d # 相当于剪贴
ggVG #文本全选 (其实都是组合)

快捷键之块模式

1
2
ctrl + v 可视块模式(vim only)  # 批量添加文本 / 可以完成列互换
shift + v 行选择

WeiyiGeek.visual

WeiyiGeek.visual


s
实例化讲解:
1
2
3
4
5
6
7
8
#示例1.局部内容另存为,VIM 字面意思可以将文件中的局部文本另存为一个新的文件,
1. 进行可视模式,进入后左下角显示 -- VISUAL --
2. 此时光标的位置开始为选中状态,你可以通过任何移动或范围的按键来移动光标,光标所到之处皆为选中状态(h、j、k、l 移动光标,$ 去到行尾,0 去到行首……)
3. 按下冒号(:)屏幕左下方出现 :'<,'>
4. 输入 w test2 # 表示新建一个 test2 文件,并将选中的内容单独存放进去。 如果文件存在可以强占覆盖 w! test2

#执行结果
test2.txt" [新][unix] 6L, 31C 已写入

WeiyiGeek.局部另存为

WeiyiGeek.局部另存为

块模式演示:将文件中的每一行进行更改

1
2
3
4
5
6
7
8
9
10
1) 在命令模式下执行%s/$/");/g,"在行尾追加数据
2) 按ESC进入普通模式,并使用gg回到行首
3) 按ctrl+v进入可视化模式,然后按G到文件尾
4) 不要理会编辑器反应,按I进入插入模式,输入list.add("
5) 按ESC回到普通模式,可以发现以上输入已经在每一行生效了

#产生效果
wweiyigeek");
list.add("weiyigeek");
list.add("weiyigeek1");

块模式还可以完成列互换示例:

1
2
3
4
5
6
7
#示例文本
USER %CPU %PID MEM PID VSZ RSS TTY STAT START TIME COMMAND
Weiyigeek 0.0 2 0.0 2 0 0 ? S Aug02 0:00 [kthreadd]
Weiyigeek 0.0 3 0.0 3 0 0 ? S Aug02 0:05 [ksoftirqd]
#都在普通模式下进行:
#ctrl + {h,j,k,l} + d 选择后删除 = 其实等于剪贴
#p


替换命令

描述:VIM 还提供了一个简单的替换命令:r 命令。

1
2
3
4
5
6
7
8
9
#注意全程无需进入插入模式,也不会进入插入模式。
r 用于替换光标所在的字符 #做法是先将光标移动到需要替换的字符处,按一下 r 键然后输入新的字符。

#对于需要替换多个字符,更好的方案是直接进入替换模式。
R #替换模式此时输入字符可以连续替换光标及其后边的内容。,屏幕左下角出现REPLACE字样
~ 光标所在处的字符进行大小写互换

#数字 + r 可能会产生一些物理反应。
先输入【数字】再输入 r,最后输入新字符,说明从当前光标的位置开始,替换【数字】个新字符。

修改替换案例:

1
2
第一行,先将光标移动到字符 A 处,按下 r 键,再按下 C;
第二行,先将光标移动到第一个字符 B 出,按下 3r 键,再按下 C。 则替换3个字符

底行命令模式替换

1
2
3
4
5
6
7
#针对于行
:s/aa/bb/g #将光标所在行出现的所有包含aa 的字符串中的aa 替换为bb
:s/\aa/bb/g # 将光标所在行出现的所有aa 替换为bb, 仅替换aa 这个单词

#针对于全局
:%s/aa/bb/g #将文档中出现的所有包含aa 的字符串中的aa 替换为bb
:%s/aa/bb/gc #c将询问您是不是确定替换.将文档中全部包含aa的字符串进行替换为bb不过要询问

基础示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#在普通模式下在进入命令模式(输入:即可进入)
#替换第 5 行到第 13 行之间的所有 XX
:5,13s/old/new/g

:12,23s/aa/bb/g #将从12行到23行中出现的所有包含aa 的字符串中的aa 替换为bb
:12,23s/^/#/ 将从12行到23行的行首加入# 字符

:%s/<br>/<br />/g #而必须写成: :%s/<br>/<br\/>/g
:%s/\\/\\\\/g #反斜杠(及十中特殊字符)要转义

#总结命令模式用的是正则,这些正则在sed命令中也是通用
:g/^\s*$/d #删除空行以及只有空格的行(非常御用)
%s/#.*//g #删除#之后的字符
%s/$/sth/ #在行尾追加sth
%s/\^M//g #替换掉dos换行符,\^M使用ctrl+v + Enter即可输入

#VIM 在咨询您的意见 (y/n/a/q/l/^E/^Y) 参数解释
y 表示替换
n 表示不替换
a 表示替换所有
q 表示放弃替换
l 表示替换第一个并进入插入模式
^E 表示用 Ctrl+e 来滚动屏幕
^Y 表示用 Ctrl+y 来滚动屏幕

注意事项

  • 退格键(Backspace)在替换模式中被解释为如果左边内容被替换过,则恢复到原来的样子;
  • 如果没有被替换过,则简单的向左移动。
  • 修改完毕后按下 Esc 回到普通模式。


修改命令

描述:修改跟替换是不一样的,修改会进入插入模式,替换不会进入插入模式!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#格式是:c [number] motion
c #开始修改操作允许更改当前行文本可以选择要修改的行 c 1,3
C #修改从光标位置开始到当前行末尾范围内的内容

#使用示例
按键 含义
c0|c^ 删除光标从当前位置(不包含)到该行行首的所有字符,并进入插入模式
c$ 删除从光标当前位置(包含)到该行行尾的所有字符,并进入插入模式
cb 删除从光标当前位置(不包含)到单词起始处的所有字符,并进入插入模式
ce 删除从光标当前位置(包含)到单词结尾处的所有字符,并进入插入模式
cw 删除从光标当前位置(包含)到下个单词起始处的所有字符,并进入插入模式
ch 删除光标前边一个字符,并进入插入模式
cl 删除光标指定的字符,并进入插入模式
cj 删除光标所在行以及下一行的所有字符,并在光标下一行进入插入模式
ck 删除光标所在行以及上一行的所有字符,并在光标下一行进入插入模式
cc 删除光标所在行的字符,并进入插入模式

比如 cw 是修改光标指定单词的内容(VIM 的做法就是删除当前光标位置到下个单词前的所有字符,并进入插入模式)
而 c2w 便是修改当前光标指定的单词以及下一个单词共计两个单词的内容;

总结实现:

  • 修改 == 删除 + 进入插入模式


快速定位

描述:当您写近千行代码的时候,如何一下将光标指向想要跳转的行,当使用() {} <> 等包含符时候,又如何快速的定位?
答:所以我们需要知道vim中的快捷跳转按钮

1
2
3
4
5
6
#示例1.将光标跳转到指定的位置的两种方式
行号 + G #普通模式
:行号 #底行命令模式

#示例2.快速找到符号的宁外一半,注意除了%符号。因为vim保留关键;
% #快速找到另一半 % 跳转到下一个匹配,如在<div>上按%,则跳转到相应的</div>

基础示例:

1
2
3
#快速定位到第15行
15G
:15

注意事项:

  • 不建议在插入模式下进行光标移动这很低效;


缩进操作

描述: TAB 就是制表符, 单独拿出来做一节是因为这个东西确实很有用;VIM 可以使用尖括号(< 或 >)来控制缩进,我们常用的就是两个同方向的尖括号表示将光标所在的语句进行缩进和反缩进操作。

1
2
3
4
5
# >> 表示缩进,而 << 则表示反缩进。
> # 输入此命令则光标所在行向右移动一个tab.
5>> #输入此命令则光标后 的5行向右移动两个tab.
:12,24> # 此命令将12行到14行的数据都向右移动一个tab.
:12,24>> #此命令将12行到14行的数据都向右移动两个tab.

基础示例:

1
2
3
4
5
6
7
8
9
#缩进效果
>
abc
5>>
abc
deg
hij
klm
opq


合并行操作
1
J   #合并下一行可以去除本行和下一行之间的换行符,也就是将下一行续接到本行尾部(实用)


数值操作

ctrl-a:可以将光标所在处的数字加1,负数和多位数都在支持范围内哦
ctrl-x:有加1就会有减1


字符操作

描述:对vim打开的文件,文本进行大写转换

1
2
gu  #小写光标所在处的字符
gU #大写光标所在处的字符

实际案例:
1
ggguG  #整篇文章大写转化为小写


搜索命令

描述:利用搜索命令和快捷键可以快速的找到全文中想要查找的字符串;

1
2
3
4
5
6
7
8
9
#:set ignorecase 查找到以后,再输入n 查找下一个匹配处, 输入N 反方向查找(不区分大小写)
gd #查找与光标所在单词相匹配的单词, 并将 `光标停留的单词`在文档的非注释段中第一次出现这个单词的地方.

*(#) #当光标停留在某个单词上时, 输入这条命令表示查找与该单词匹配的下(上)一个单词. 同样, 再输入n 查找下一个匹配处, 输入N 反方向查找.
* #已查找到文件结尾,再从开头继续查找
# #已查找到文件开头,再从结尾继续查找
g*(g#) #此命令与上条命令相似, 只不过它不完全匹配光标所在处的单词, 而是匹配包含该单词的所有字符串.

f(F)x #本命令表示在光标所在行进行查找, 查找光标右(左)方第一个x字符.找到后: 输入; 表示继续往下找输入, 表示反方向查找.


扩展模式的两种方法当搜索到了文件的末尾(/目标)或开头(?目标)会显示 * 与 # 的效果

1
2
3
4
5
6
7
          /目标     ?目标
搜索方向 从光标位置向后 从光标位置向前
n 向后搜索下一个 向前搜索下一个
N 向前搜索下一个 向后搜索下一个
/xxx #从光标位置开始(自上而下的查找操作 ),向后搜索xxx ,按n进行下一个
?xxx #从光标位置开始(自下而上的查找操作 ),向前搜索xxx ,按N进行上一个
:nohl #取消查找

注意事项:

  • 在搜索命令中”.、*、[、]、^、%、/、?、~ 和 $“这 10 个字符有着特殊意义所以在使用这些字符的时候要在前面加上一个反斜杠(\)进行转义;
    • 比如你要搜索问号则输入 /\?

进阶操作

执行系统命令

描述:在vim中伟大的 VIM 作者(Bram Moolenaar),给我们加入了一个方法就是采用”:+系统命令”便可以正常的执行了命令;
基础示例:

1
2
3
4
5
6
# 比如你想知道根目录(/)下面有哪些目录和文件,可以在VIM中输入 
:!ls /
# [已修改但尚未保存]
# bin etc LICENSE.txt ReleaseNotes.html unins000.exe
# cmd git-bash.exe mingw64 tmp unins000.msg
# dev git-cmd.exe proc unins000.dat usr


重复上次操作

描述:在VIM普通模式下采用点.表示重复上次修改操作;

案例学习:

1
2
3
4
5
#1.先输入大写字母A在行尾进行插入模式
#2.然后输入\n\,点击ESC回到普通模式
#3.输入字母j将光标移动到下一行
#4.按下点 . ,VIM将自动实现上方1和2的操作,(即在行尾插入 \n\)
#5.接下来我只需要重复点击字母 j + 点(.) 即可

宏录制

描述:vim提供这个功能可以录制不同的多个宏,方便的进行批量操作

1
2
3
4
5
6
7
8
9
10
11
12
13
1) 按下gg到行首
2) 按下qa进行宏录制,a是宏标记名称
3) 按I进入插入模式,输入list.add("
4) 按ESC进入普通模式,然后按$跳到行尾"
5) 按j进入下一行,然后按^回到行首
6) 再次按下q结束宏录制
7) 输入@a触发宏测试一下录制效果
8) 输入[email protected]重复宏100次,也就是影响下面的100行

#执行结果
list.add("top");
CFnetwork #执行步骤 7 将变成 list.add("CFnetwork");
quickload


自动补齐(可写入配置文件)

描述:在vi中有许多的字符串补齐命令, 非常方便TAB系统就会自动将剩下的字符补齐;需要注意的是命令必须在插入模式下运行;
如果需要匹配其他的语言扩展则需要安装;

1
2
#此命令会在所有在这个vim 程序中打开的文件中进行匹配.
ctrl-p (ctrl-n) #在编辑模式中, 输入几个字符后再输入此命令则vi 开始向上(下)搜索开头与其匹配的单词并补齐,不断输入此命令则循环查找.

非常值得学习:

1
ctrl-x-l #在编辑模式中此命令快速补齐整行内容, 但是仅在本窗口中出现的文档中进行匹配.

WeiyiGeek.本窗口补齐

WeiyiGeek.本窗口补齐

1
2
ctrl-x-f #在编辑模式中这个命令表示补齐文件名. 
#如输入:/usr/local/tom 后再输入此命令则它会自动匹配出:/usr/local/tomcat/
WeiyiGeek.自补齐路径

WeiyiGeek.自补齐路径


代码缩写(可写入配置文件)

描述:abbr 即缩写这是一个宏操作(alias), 可以在编辑模式中用一个缩写代替另一个字符串. 比如编写java文件的常常输入System.out.println, 这很是麻烦 所以应该用缩写来减少敲字.

1
2
#扩展模式
:abbr sprt System.out.println #以后在输入sprt后再输入其他 非字母符号 它就会自动扩展为System.out.println

注意事项:

  • 缩写单词后需要输入非可见字符才能自动扩展,比如回车符号;


VIM配置参数(重要灵魂)

描述:设置 vim 编辑环境有两种形式:
1.通过配置文件修改;
2.在编辑的时候通过底行命令来实现(临时生效)

配置文件修改的两种方法:

  • 直接修改 /etc/vimrc 文件这种设置方法会作用于所有登录到 Linux 环境下的用户
  • 在用户登录的~目录下创建一个.vimrc 文件,在其中进行自己习惯的编程环境的设置,这样当别的用户使用时并不相互影响(推荐方法-用户之间互不干扰)

VIM 自定义编辑器
ubuntu与redhat下打开配置文件vimrc的方法,其实linux系统都差不多。

1
2
3
4
5
6
7
8
9
10
11
vim /etc/vimrc           #redhat 系列
sudo vim /etc/vim/vimrc #ubuntu

#vim关键结构
系统 vimrc 文件: "$VIM/vimrc"
用户 vimrc 文件: "$HOME/.vimrc"
用户 exrc 文件: "$HOME/.exrc"
系统 gvimrc 文件: "$VIM/gvimrc"
用户 gvimrc 文件: "$HOME/.gvimrc"
系统菜单文件: "$VIMRUNTIME/menu.vim"
$VIM 预设值: "/usr/share/vim"

常用设置:

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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
" 常用设置
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
syntax on " 语法高显

" 编码字符集
" set encoding=utf-8

" 设定默认编码
set enc=utf-8
" set fenc=utf-8
set fencs=utf-8,usc-bom,euc-jp,gb18030,gbk,gb2312,cp936

set history=50 " 历史记录为50
set number " 显示行号
set cursorline " 在当前行显示一条下划线
set cursorline " 在当前行显示一条下划线
set cursorcolumn " 在当前列突出
hi CursorLine cterm=underline guibg=#00ff00 " 设置横竖的颜色
hi CursorColumn cterm=reverse ctermbg=2 guibg=#00ff00


"设置光标样式为竖线vertical bar
" Change cursor shape between insert and normal mode in iTerm2.app
"if $TERM_PROGRAM =~ "iTerm"
let &t_SI = "\<Esc>]50;CursorShape=1\x7" " Vertical bar in insert mode
let &t_EI = "\<Esc>]50;CursorShape=0\x7" " Block in normal mode
"endif

set nocompatible " 不要使用vi的键盘模式,而是vim自己的
set confirm " 在处理未保存或只读文件的时候,弹出确认
set clipboard+=unnamed " 与windows共享剪贴板
set showcmd " 输入的命令显示出来,看的清楚些

filetype on " 侦测文件类型
filetype plugin on " 载入文件类型插件
filetype indent on " 为特定文件类型载入相关缩进文件

set viminfo+=! " 保存全局变量
set iskeyword+=_,$,@,%,#,- " 带有如下符号的单词不要被换行分割

" 高亮字符,让其不受100列限制
:highlight OverLength ctermbg=red ctermfg=white guibg=red guifg=white
:match OverLength '\%101v.*'
" 状态行颜色
highlight StatusLine guifg=SlateBlue guibg=Yellow
highlight StatusLineNC guifg=Gray guibg=White

set list lcs=tab:\¦\ " 是两条设置 \后有空格 垂直对齐

" 设置配色方案
"colorscheme murphy
colorscheme desert
" 指定配色方案是256色
set t_Co=256
"字体
if (has("gui_running"))
set guifont=Bitstream\ Vera\ Sans\ Mono\ 10
endif


" 文件设置
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
set nobackup "不要备份文件(根据自己需要取舍)
set autoread " 文件被改动时自动载入

"不要生成swap文件当buffer被丢弃的时候隐藏它
setlocal noswapfile
set bufhidden=hide

set linespace=0 " 字符间插入的像素行数目
set wildmenu " 增强模式中的命令行自动完成操作

" 在状态行上显示光标所在位置的行号和列号
set ruler
set rulerformat=%20(%2*%<%f%=\ %m%r\ %3l\ %c\ %p%%%)


" 去掉有关vi一致性模式,避免以前版本的一些bug和局限,解决backspace不能使用的问题
set nocompatible
set backspace=indent,eol,start
set backspace=2 " 使回格键(backspace)正常处理indent, eol, start等

set cmdheight=2 " 命令行(在状态行下)的高度,默认为1,这里是2
set whichwrap+=<,>,h,l " 允许backspace和光标键跨越行边界


" 可以在buffer的任何地方使用鼠标(类似office中在工作区双击鼠标定位)
set mouse=a " 鼠标可用
set selection=exclusive
set selectmode=mouse,key

set shortmess=atI " 启动的时候不显示那个援助索马里儿童的提示
set report=0 " 通过使用: commands命令,告诉我们文件的哪一行被改变过
set noerrorbells " 不让vim发出讨厌的滴滴声
set fillchars=vert:\ ,stl:\ ,stlnc:\ " 在被分割的窗口间显示空白,便于阅读


" 搜索和匹配
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
set laststatus=2 " 总是显示状态行
set scrolloff=3 " 光标移动到buffer的顶部和底部时保持3行距离
set showmatch " 高亮显示匹配的括号
set matchtime=5 " 匹配括号高亮的时间(单位是十分之一秒)
set ignorecase " 在搜索的时候忽略大小写

set nohlsearch " 不要高亮被搜索的句子(phrases)
set incsearch " 在搜索时,输入的词句的逐字符高亮(类似firefox的搜索)

set listchars=tab:\|\ ,trail:.,extends:>,precedes:<,eol:$ " 输入:set list命令是应该显示些啥?
set novisualbell " 不要闪烁

" 我的状态行显示的内容(包括文件类型和解码)
" set statusline=%F%m%r%h%w\[POS=%l,%v][%p%%]\%{strftime(\"%d/%m/%y\ -\ %H:%M\")}
set statusline=%F%m%r%h%w\ [FORMAT=%{&ff}]\ [TYPE=%Y]\ [POS=%l,%v][%p%%]\ %{strftime(\"%d/%m/%y\ -\ %H:%M\")}
"set statusline=[%F]%y%r%m%*%=[Line:%l/%L,Column:%c][%p%%]

" 参数解析
" 显示状态行当前设置 set statusline
" 设置状态行显示常用信息
" %F 完整文件路径名
" %m 当前缓冲被修改标记
" %m 当前缓冲只读标记
" %h 帮助缓冲标记
" %w 预览缓冲标记
" %Y 文件类型
" %b ASCII值
" %B 十六进制值
" %l 行数
" %v 列数
" %p 当前行数占总行数的的百分比
" %L 总行数
" %{...} 评估表达式的值,并用值代替
" %{"[fenc=".(&fenc==""?&enc:&fenc).((exists("+bomb") && &bomb)?"+":"")."]"} 显示文件编码
" %{&ff} 显示文件类型
set statusline=%F%m%r%h%w%=\ [ft=%Y]\ %{\"[fenc=\".(&fenc==\"\"?&enc:&fenc).((exists(\"+bomb\")\ &&\ &bomb)?\"+\":\"\").\"]\"}\ [ff=%{&ff}]\ [asc=%03.3b]\ [hex=%02.2B]\ [pos=%04l,%04v][%p%%]\ [len=%L]
" 设置 laststatus = 0 ,不显式状态行
" 设置 laststatus = 1 ,仅当窗口多于一个时,显示状态行
" 设置 laststatus = 2 ,总是显式状态行 set laststatus=2


" 文本格式和排版
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
set foldenable " 用空格键来开关折叠
set foldmethod=manual " 手动折叠
nnoremap <space> @=((foldclosed(line('.')) < 0) ? 'zc':'zo')<CR>
set formatoptions=tcrqn " 自动格式化
set fdm=indent " 打开折叠功能 , zo打开/zc关闭折叠
set autoindent " 继承前一行的缩进方式,特别适用于多行注释
set smartindent " 为C程序提供自动缩进
set cindent " 使用C样式的缩进
set completeopt=longest,menu


" 统一缩进为4
set softtabstop=4
set shiftwidth=4
" 设置显示制表符的空格字符个数,改进tab缩进值,默认为8,现改为4
set tabstop=4

"set expandtab 用空格代替tab
set noexpandtab " 不要用空格代替制表符
set nowrap " 不要换行
set smarttab " 在行和段开始处使用制表符


" 设置帮助文件为中文(需要安装vimcdoc文档)
set helplang=cn

" CTags的设定
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
let Tlist_Sort_Type = "name" " 按照名称排序
let Tlist_Use_Right_Window = 1 " 在右侧显示窗口
let Tlist_Compart_Format = 1 " 压缩方式
let Tlist_Exist_OnlyWindow = 1 " 如果只有一个buffer,kill窗口也kill掉buffer
let Tlist_File_Fold_Auto_Close = 0 " 不要关闭其他文件的tags
let Tlist_Enable_Fold_Column = 0 " 不要显示折叠树


编程开发环境

vim编程语句自动补齐配置
描述:在vim中不但可以使用ctrl + x + l 与 ctrl + x + f 进行文档和路径的自动补齐,还能补齐其他的一些编程语言,但是需要额外的关键词的包;

autocmd 命令十分的强大实现对不同的文件格式应用不同的配置,可以在新建文件时自动添加上版权声明等等,该命令一般定义在~/.vimrc 这样的配置文件里面。

常用的有:

  • jcommenter.vim 自动加入javadoc 风格的注释.
  • JBrowser.vim 类资源浏览. C, C++ 等可以用Tlist
  • checkstyle.vim 可以检验你的编程风格,
  • jad.vim 可以直接反编译.class 文件等等
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
:autocmd!  # 删除所有之前的自动命令.

#在打开java 文件时才应用后面提到的两个配置文件.
autocmd FileType java source ~/.vim/files/java.vim #引用加载配置
autocmd FileType java source ~/.vim/files/jcommenter.vim
autocmd FileType java source ~/.vim/files/jcommenter.sh

#在新建java 文件时自动加入java.skel 文件的内容.
autocmd BufNewFile *.java 0r ~/.vim/files/weiyigeek/java.skel
autocmd BufNewFile *.sh 0r ~/.vim/files/weiyigeek/shell.sh

#在新建java 文件时自动运行gnp 命令将新java 文件中的__date__ 替换成今天的日期
autocmd BufNewFile *.java normal gnp

#对于所有文本条件,将textwidth设置为71(也可设置为其他比如 set number 当类型为文本的时候自动打开)
autocmd FileType txt setlocal textwidth=71
autocmd FileType sh setlocal sw=4 | setlocal sta #对于shell脚本的设置

比如:为了能够自动开始对php文件的自动完成功能,我们可以将以下的配置添加到你的~/.vimrc文件里面;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#示例1.支持php自动补齐配置
autocmd FileType php set omnifunc=phpcomplete#CompletePHP

set dictionary+=/root/.vim/php_functionlist.txt

set complete-=k complete+=k

function! InsertTabWrapper()
let col=col('\.')-1
if !col || getline('.')[col-1] !~ '\k'
return "\"
else
return "\"
endif
endfunction

inoremap = InsertTabWrapper()


Vim自定义快捷键
采用map关键字进行设置快捷键功能其语法参数是:

1
map <快捷键>: call VIM函数名称<CR>

基础示例:

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
" C / c++ / java 的编译和运行 
map <F5> :call CompileRunGcc()<CR>
func! CompileRunGcc()
exec "w"
exec "!clear"
if &filetype == 'c'
exec "!gcc -Wall % -o %<.count"
exec "!./%<.count"
elseif &filetype == 'cpp'
exec "!g++ -Wall % -o %<.cppout"
exec "!./%<.cppout"
elseif &filetype == 'java'
exec "!javac %"
exec "!java %<"
endif
endfunc


" F5编译和运行C程序,F6编译和运行C++程序
" 请注意,下述代码在windows下使用会报错需要去掉./这两个字符
" C的编译和运行
map <F5> :call CompileRunGcc()<CR>
func! CompileRunGcc()
exec "w"
exec "!gcc % -o %<"
exec "! ./%<"
endfunc

" C++的编译和运行
map <F6> :call CompileRunGpp()<CR>
func! CompileRunGpp()
exec "w"
exec "!g++ % -o %<"
exec "! ./%<"
endfunc

基础示例:

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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
" 只在下列文件类型被侦测到的时候显示行号,普通文本文件不显示 
if has("autocmd")
autocmd FileType xml,html,c,cs,Java,perl,shell,bash,cpp,Python,vim,PHP,ruby set number
autocmd FileType xml,html vmap <C-o> <ESC>'<i<!--<ESC>o<ESC>'>o-->
autocmd FileType java,c,cpp,cs vmap <C-o> <ESC>'<o
autocmd FileType html,text,php,vim,c,java,xml,bash,shell,perl,python setlocal textwidth=100
autocmd Filetype html,xml,xsl source $VIMRUNTIME/plugin/closetag.vim

autocmd BufReadPost *
\ if line("'\"") > 0 && line("'\"") <= line("$") |
\ exe " normal g`\"" |
\ endif
endif "has("autocmd")


" 能够漂亮地显示.NFO文件
set encoding=utf-8
function! SetFileEncodings(encodings)
let b:myfileencodingsbak=&fileencodings
let &fileencodings=a:encodings
endfunction
function! RestoreFileEncodings()
let &fileencodings=b:myfileencodingsbak
unlet b:myfileencodingsbak
endfunction


" 高亮显示普通txt文件(需要txt.vim脚本)
au BufRead,BufNewFile * setfiletype txt
au BufReadPre *.nfo call SetFileEncodings('cp437')|set ambiwidth=single au BufReadPost *.nfo call RestoreFileEncodings()

" minibufexpl插件的一般设置
let g:miniBufExplMapWindowNavVim = 1
let g:miniBufExplMapWindowNavArrows = 1
let g:miniBufExplMapCTabSwitchBufs = 1
let g:miniBufExplModSelTarget = 1

" 新建.c,.h,.sh,.java文件,自动插入文件头,注意vim默认是识别python的而非py
autocmd BufNewFile *.cpp,*.sh,*.java,*.[ch],*.py exec ":call SetTitle()"

" 定义函数SetTitle,自动插入文件头
let $author_name = "WeiyiGeek"

" 自定义函数开头
func Note1()
call append(0, "############################################################")
call append(1, "# Filename : ".expand("%:t"))
call append(2, "# Author : ".$author_name)
call append(3, "# CreatedTime: ".strftime("%c"))
call append(4, "# Description: ")
call append(5, "############################################################")
endfunc

func Note2()
call append(0, "/* *******************************************************")
call append(1, " > Filename : ".expand("%:t"))
call append(2, " > Author : ".$author_name)
call append(3, " > CreatedTime : ".strftime("%c"))
call append(4, " > Description : ")
call append(5, "********************************************************/")
endfunc

func SetTitle()
if &filetype == 'sh'
call Note1()
call append(6, "\#!/bin/bash")
call append(7, "")
elseif &filetype == 'python' "关键点
call Note1()
call append(6, "\#!/usr/bin/env python")
call append(7, "")
elseif &filetype == 'c'
call Note2()
call append(6, "\#include \<stdio.h\>")
call append(7,"")
elseif &filetype == 'cpp'
call Note2()
call append(6, "\#include \<iostream\>")
call append(7, "using namespace std;")
call append(8, "")
elseif &filetype == 'java'
call Note2()
call append(6, "class ".expand("%:t:r")."{")
call append(7, " public static void main(String[] args){")
call append(8, " ")
call append(9, " }")
call append(10, "}")
endif

" ####新建文件后,自动定位到文件末尾####
autocmd BufNewFile * normal G
endfunc


" ###键盘命令快捷键####
" nmap <leader>w :w!<cr>
" nmap <leader>f :find<cr>

" ####映射全选+复制 ctrl+a####
map <C-A> ggVGY
map! <C-A> <Esc>ggVGY
map <F12> gg=G

" ####选中状态下 Ctrl+c 复制####
vmap <C-c> "+y

" ####快捷键编译运行###
map <F5> :call CompileRunGcc()<CR>
func! CompileRunGcc()
exec "w"
exec "!clear"
if &filetype == 'c'
exec "!gcc -Wall % -o %<.count"
exec "!./%<.count"
elseif &filetype == 'cpp'
exec "!g++ -Wall % -o %<.cppout"
exec "!./%<.cppout"
elseif &filetype == 'java'
exec "!javac %"
exec "!java %<"
elseif &filetype == 'python' "关键点
exec "!python %"
endif
endfunc

WeiyiGeek.

WeiyiGeek.


附录

vim练习网站

Vim神级插件

  • Vundle 插件管理
  • YCM 全称YouCompleteMe 编辑器比起IDE最大的缺陷是自动补全,以及函数跳转但是有了YCM便能大大的降低与Vim编辑器和IDE的差距
  • Ctrlp 支持模糊搜索查询文件名,ctrl+j/k进行上线选择然后确定就进行跳转了,非常方便快捷,可以说是居家旅行必备良药。
  • NERDTree 整个项目的目录树非常方便切换, 每次只需要ctrl+e就可以调出来侧边栏,通过ctrl+w进行切换各个窗口。

备注:最后上面的几个插件除了YCM,都可以通过Vundle方式进行安装配置

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
46
#vim插件存放路径
echo $VIMRUNTIME
/usr/share/vim/vim81/plugin

#在.vimrc中加入编辑
git clone https://github.com/gmarik/vundle.git ~/.vim/bundle/Vundle.vim

#第一步:你在此设置Vundle插件运行时路径
#第二步:启动vim,执行BundleInstall即可,vundle常用的命令有:
:BundleList:列举出列表中(.vimrc中)配置的所有插件
:BundleInstall :安装列表中全部插件
:BundleInstall!:更新列表中全部插件
:BundleSearch xx:查找xx插件
:BundleClean:清除列表中没有的插件


#第三步:安装示例,在这里演示一下如何安装NERDTree插件,该插件显示一个目录树,可以执行一下文件的操作命令,首先添加配置:
#在vim中安装及配置NERDTree插件,放在Plugin 'gmarik/Vundle.vim' 之后
:PluginInstall #打开Vim在底行命令中执行就可以安装在配置文件中的插件了


set nocompatible " 不要使用vi的键盘模式,而是vim自己的(这是为了兼容性)

set rtp+=~/.vim/bundle/Vundle.vim

" vundle初始化开始和结束
call vundle#begin()

Plugin 'VundleVim/Vundle.vim'
Plugin 'scrooloose/nerdtree'
" --NERDTree插件配置开始--
" NERDTree 配置:F2快捷键显示当前目录树
map <f2> :NERDTreeToggle<cr>
" 修改树的显示图标
let g:NERDTreeDirArrowExpandable = '+'
let g:NERDTreeDirArrowCollapsible = '-'
""窗口位置
let g:NERDTreeWinPos='left'
""窗口尺寸
let g:NERDTreeSize=25
""窗口是否显示行号
let g:NERDTreeShowLineNumbers=1
""不显示隐藏文件
let g:NERDTreeHidden=0

call vundle#end()

安装插件nerdtree:

WeiyiGeek.vundle使用

WeiyiGeek.vundle使用

F2快捷触发最终效果:

WeiyiGeek.使用效果

WeiyiGeek.使用效果


vim内置函数说明
expand函数
描述:vimrc中的文件名及路径

1
2
3
4
5
6
7
8
#模拟路径 :D:/tmp/file.java)当我们
expand("%") #tmp/file.java #相对路径
expand("%:p") #D:/tmp/file.java #绝对路径
expand("%:h") #tmp
expand("%:t") #file.java
expand("%:e") #java
expand("%:t:r") #file
expand("%:r") #tmpfile


VIM巨坑
(1) vimrc配置文件无法识别.py后缀路径
原因:Vim 称 *.py 文件的 filetype 为 python 而不是 py;
解决方法:

1
2
3
4
5
6
7
8
9
#方式1
au BufRead,BufNewFile *.py set filetype=py

#方式2
if &filetype == 'python'
call Note1()
call append(6, "\#!/usr/bin/python")
call append(7, "")
endif