一个计算机技术爱好者与学习者

0%

好好学Linux:Vim进阶

1. 前言

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

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

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

2. 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配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
" 语法高亮
syntax on

" 显示行号
set number

" 回车自动缩进
set autoindent

" 设置tab宽度
set tabstop=4

" shift缩进宽度
set shiftwidth=4

" tab自动转空格
set expandtab

" tab转空格宽度
set softtabstop=4

" 粘贴格式化
set paste

如果cat查看文件可以正常看到中文,vim编辑文件出现乱码,那么可以指定编码方式为 utf8 来解决这个问题。

1
2
3
4
" 解决中文乱码问题
set termencoding=utf-8
set encoding=utf8
set fileencodings=utf8,ucs-bom,gbk,cp936,gb2312,gb18030

设置显示换行等特殊字符。

1
set list

3. 四种模式

3.1. 普通模式

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

3.2. 可视模式

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

3.3. 插入模式

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

3.4. 命令模式

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

4. 快捷键

4.1. 保存退出

Shift + zz,退出或者保存退出。

4.2. 移动跳转

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

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

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

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

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

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

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

1
2
75,80>
75>6

4.3. 删除复制

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

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

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

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

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

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

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

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

4.4. 修改查找

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
3
4
# 替换当前行所有的oldword
:s/oldword/newword/g
# 替换文中所有的oldword
:%s/oldword/newword/g

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

5. 多文件编辑

假设有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。

6. 多窗口与标签分组

vim -o buffer*,分屏打开多个文件,垂直方向分屏。vim -O 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切换标签页。

7. 文本对象和宏

文本对象: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次。

8. Visual模式

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

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

9. 后记

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

  • 本文作者: 好好学习的郝
  • 原文链接: https://www.voidking.com/dev-vim-advance/
  • 版权声明: 本文采用 BY-NC-SA 许可协议,转载请注明出处!源站会即时更新知识点并修正错误,欢迎访问~
  • 微信公众号同步更新,欢迎关注~