Vim进阶

文章目录
  1. 1. 前言
  2. 2. Vimrc
  3. 3. 四种模式
    1. 3.1. 普通模式
    2. 3.2. 可视模式
    3. 3.3. 插入模式
    4. 3.4. 命令模式
  4. 4. 快捷键
    1. 4.1. 移动跳转
    2. 4.2. 删除复制
    3. 4.3. 修改查找
  5. 5. 多文件编辑
  6. 6. 多窗口与标签分组
  7. 7. 文本对象和宏
  8. 8. Visual模式
  9. 9. 后记

前言

Vim是Linux和Unix上的编辑器,由Vi升级而来。

已经使用了Vim好多年,但是,水平仅仅停留在修改配置文件的水平。不会把它当做主要的编辑器,更不会用它进行编码开发。最近,童钢老师提醒了我,作为运维人员,Vim需要用得更加熟练一些,最好能把Vim作为默认编辑器使用。

所以,本文决定研究一下更高阶的Vim使用技巧,主要参考优雅玩转Vim

Vimrc

Vimrc指的是Vim的配置文件,rc=run command,Vim 的全局配置一般在/etc/vim/vimrc或者/etc/vimrc,对所有用户生效。用户个人的配置在~/.vimrc

如果只对单次编辑启用某个配置项,可以在命令模式下,先输入一个冒号,再输入配置。举例来说,set number这个配置可以写在.vimrc里面,也可以在命令模式输入。

配置项一般都有”打开”和”关闭”两个设置。”关闭”就是在”打开”前面加上前缀”no”。

1
2
3
4
5
" 打开
set number

" 关闭
set nonumber

上面代码中,双引号开始的行表示注释。

查询某个配置项是打开还是关闭,可以在命令模式下,输入该配置,并在后面加上问号。

1
:set number?

上面的命令会返回number或者nonumber。

如果想查看帮助,可以使用help命令。

1
:help number

更多内容参考Vim 配置入门

有一些大神把Vim配置得非常炫酷,比如amixhumiaozuzu

四种模式

普通模式

进入vim后默认普通模式,可以进行移动、复制、粘贴、删除、修改等。其他模式点击Esc返回普通模式。

可视模式

对一块区域进行操作,就像Windows中的鼠标选中。普通模式下点击v进入可视模式。

插入模式

插入模式和普通文本编辑器相同,可以进行输入和删除。普通模式下点击i进入插入模式。

命令模式

在命令模式中可以执行一些指令,就像在shell里一样。普通模式下点击Shift + :进入命令模式。

快捷键

移动跳转

为了减少右手移动距离,h可代替左,j可代替下,k可代替上,l可代替右。

0移动到行首,Shift + 6也是移动到行首(不包含空格)。Shift + 4移动到行尾。

w光标正向移动到下一个单词,3w正向移动3个单词,b反向移动。e正向移动到下一个单词词尾,ge反向移动。W(Shift+w)表示忽略特殊字符,比如逗号句号等。

gg跳回第一行,10gg跳到第10行,G跳到最后一行。g、Ctrl+g显示文件信息。

f、空格,跳到下一个空格。

>>右缩进,<<左缩进。

多行缩进,进入命令模式,输入:

1
2
75,80>
75>6

删除复制

yy复制一行,内容存入无名寄存器和0号寄存器。

准确地来说,Vim中没有删除,只有剪切。dd剪切一行,内容存入无名寄存器和1号寄存器。

p粘贴到光标下一行,P粘贴到光标前一行。
u撤销上一步的操作。
ctrl+r重做。

命令模式下输入reg可以查看寄存器。

yw复制当前单词,y2w复制正向两个单词。x复制当前字符。

dw删除当前单词,dj删除下一行,dk删除上一行,dh删除左边一个字符,dl删除当前字符。

d、Shift+6删除到行首,d、Shift+4删除到行尾。

3dd向下删除3行,5dw正向删除5个单词。

修改查找

shift+i,跳到行首并进入插入模式;shift+a,跳到行尾并进入插入模式。

o进入下一行插入模式,O进入上一行插入模式。

3i进入插入模式,输入内容,Esc,输入的内容会被复制3次。

5o进入下一行插入模式,输入内容,Esc,输入的内容会插入5行。

~单个字符大小写转换,g~w整个单词大小写转换,g~$整行大小写转换,.对上一个操作重复。

fa在行内查找a,Fa在行内反向查找a。

/word查找word,n查找下一个,N查找上一个。在命令模式下设置set hlsearch可以高亮显示。

进入命令模式,进行替换:

1
2
:s/oldword/newword/g
:%s/oldword/newword/g

r替换单个字符,shift+r替换当前行,cw替换当前单词,c$修改光标后的内容。

多文件编辑

假设有buffer1.txt、buffer2.txt、buffer3.txt三个文件,那么可以使用vim buffer*打开三个文件。当前显示buffer1.txt,进入命令行模式,查看缓冲区列表:

1
2
3
:files
:buffers
:ls

badd buffer4.txt打开一个缓冲区,bn切换下一个缓冲区,bp切换上一个缓冲区,bf切换到第一个缓冲区,bl切换到最后一个缓冲区,b3切换到第三个缓冲区,b buffer1.txt切换到buffer1.txt,ball编辑所有缓冲区,1,3bd删除1-3缓冲区列表,%bd删除所有缓冲区列表,qall退出所有。

bufdo set number所有缓冲区设置number。

多窗口与标签分组

vim -o3 buffer*,分屏打开三个文件,垂直方向分屏。vim -O3 buffer*,分屏打开三个文件,竖直方向分屏。

ctrl+w、s垂直复制分屏,ctrl+w、v水平复制分屏,ctrl+w、q删除分屏。

sp buffer4.txt打开buffer4.txt并且上下分屏,vsp buffer4.txt打开buffer4.txt并且左右分屏。

ctrl+w、h向左移动,ctrl+w、j向下移动,ctrl+w、k向上移动,ctrl+w、l向右移动。
ctrl+w、+增加高度,ctrl+w、-减少高度,ctrl+w、=设置高度相等。

标签里面可以包含多个窗口,使用类似于buffers。
命令模式下,tabnew创建标签,tabfind查找并在新标签中打开文件,tabs查看打开的标签列表,tabclose关闭当前标签页,tabonly只保留当前标签页,tabn/p/first/last切换标签页,tabm 0将标签页放到第一个位置。
普通模式下,gt/gT切换标签页。

文本对象和宏

文本对象:w代表word,s代表sentence,p代表paragraph,此外还有textblock块对象。

操作:

1
2
3
4
5
6
{operator}{i}{object}
{operator}{a}{object}
daw = delete a word
==a==n object: include the tail space
ciw = change inner word
==i==nner object: not include the tail space

viw选中单词,v3iw选中三个单词,vis选中句子,vip选中段落,vi(选中圆括号中的内容,vi[选中中括号中的内容,vit选中标签中的内容。

使用宏输入1到99:
普通模式下,o进入下一行插入,输入1,Esc返回普通模式,qa开始录制,yyp复制粘贴一行,ctrl+a当前数字加一,q完成录制,97@a执行97次。

Visual模式

在可视模式下,可以对一个文本块的整体进行操作。可视模式有三种子模式,v激活面向字符的可视模式,V激活面向行的可视模式,ctrl+v激活面向列块的可视模式。

gv重选刚才选择的选区,o在选择区两端跳动。
ctrl+v、3j垂直下拉三列,r进行替换。
ctrl+v、3j垂直下拉三列,e选择单词直到词尾,c进行单词替换,输入完成,Esc。
ctrl+v、3j垂直下拉三列,$选择到行尾,A进行插入,输入完成,Esc。

后记

至此,已经系统学习了Vim的高阶知识点,包括Vim配置、四种模式、快捷键、多文本编辑、多窗口标签、文本对象和宏、可视模式等。接下来,就是在学习工作中多多使用Vim,最终熟能生巧。