跳到主要内容

vim

Linux文本编辑工具之神vim

目录

[toc]

1 vi和vim简介

在Linux中我们经常编辑修改文本文件,即由ASCII, Unicode 或其它编码的纯文字的文件。之前介绍过nano,实际工作中我们会使用更为专业,功能强大的工具。

文本编辑种类

全屏编辑器:nano(字符工具), gedit(图形化工具),vi,vim

行编辑器:sed

vi:Visual editor,文本编辑器,是 Linux 必备工具之一,功能强大,学习曲线较陡峭,学习难度大

vim:VIsual editor iMproved ,和 vi 使用方法一致,但功能更为强大,不是必备软件
官网:www.vim.org
其他相关编辑器:gvim 一个Vim编辑器的图形版本

1.1 vim和vi的爱恨情仇

vim即为vi improved的缩写,是从vi发展起来的一个文本编辑器,其代码补充、编译和错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。这个名称更多是意味着vim已经是vi编辑器的超集,vim的功能已经远远超过了vi。vim是Bill Joy用于unix的vi文本编辑器的补充。vim是由Bram Moolenaar根据Stevie编辑器的源码进行编写的,并在1991年首次公开发布。

1.2 vim概述

2 使用vim初步

2.1 vim 命令格式

vim [OPTION]... FILE...

常用选项

+# 打开文件后,让光标处于第#行的行首,+默认行尾
+/PATTERN 让光标处于第一个被PATTERN匹配到的行行首
-b file 二进制方式打开文件
-d file1 file2… 比较多个文件,相当于 vimdiff
-m file   只读打开文件
-e file   直接进入ex模式,相当于执行ex file
-y file   Easy mode (like "evim", modeless),直接可以操作文件,ctrl+o:wq|q! 保存和不保存退出

说明

如果该文件存在,文件被打开并显示内容

如果该文件不存在,当编辑后第一次存盘时创建它

2.2 三种主要模式和转换

vim 是一个模式编辑器,击键行为是依赖于 vim的 的“模式”。

三种常见模式

(1)命令或普通(Normal)模式:默认模式,可以实现移动光标,剪切/粘贴文本;

(2)插入(Insert)或编辑模式:用于修改文本;

(3)扩展命令(extended command )或命令(末)行模式:保存,退出等;

模式转换

命令模式-->插入模式

i insert, 在光标所在处输入
I 在当前光标所在行的行首输入

a append, 在光标所在处后面输入
A 在当前光标所在行的行尾输入

o 在当前光标所在行的下方打开一个新行
O 在当前光标所在行的上方打开一个新行

插入模式 --- ESC-----> 命令模式

命令模式 ---- : ----> 扩展命令模式

扩展命令模式 ----ESC,enter----> 命令模式

3 扩展命令模式

按“:”进入Ex模式 ,创建一个命令提示符: 处于底部的屏幕左侧。

3.1 扩展命令模式基本命令

w 写(存)磁盘文件

wq 写入并退出
x 写入并退出
wq! == ZZ 强制保存并退出(普通模式下)

X 加密(不常用) #取消加密:输入空口令;

q 退出
q! 不存盘退出,即使更改都将丢失

r filename #读文件内容到当前文件中 注意!
w filename #将当前文件内容写入另一个文件 注意!
!command #执行命令 注意!
r!command #读入命令的输出 注意!

3.2 地址定界

格式

:start_pos,end_pos CMD

3.2.1 地址定界格式

# #具体第#行,例如2表示第2行
#,# #从左侧#表示起始行,到右侧#表示结尾行

#,+# #从左侧#表示的起始行,加上右侧#表示的行数,范例:2,+3 表示2到5行

.   #当前行
$ #最后一行
.,$-1 #当前行到倒数第二行

% #全文, 相当于1,$

/pattern/   #从当前行向下查找,直到匹配pattern的第一行,即:正则表达式
/pat1/,/pat2/ #从第一次被pat1模式匹配到的行开始,一直到第一次被pat2匹配到的行结束
#,/pat/     #从指定行开始,一直找到第一个匹配patttern的行结束
/pat/,$     #向下找到第一个匹配patttern的行到整个文件的结尾的所有行

3.2.2 地址定界后跟一个编辑命令

d       #删除
y #复制
w file #将范围内的行另存至指定文件中
r file #在指定位置插入指定文件中的所有内容

3.3 查找并替换

格式

s/要查找的内容/替换为的内容/修饰符

说明

要查找的内容:可使用基末正则表达式模式

替换为的内容:不能使用模式,但可以使用\1, \2, ...等后向引用符号还可以使用“&”引用前面查找时查找到的整个内容;

修饰符

i #忽略大小写
g #全局替换,默认情况下,每一行只替换第一次出现的。
gc #全局替换,每次替换前询问

3.3.1 范例:常规替换

:s/root/zxl/g

:2,10s/root/zxl/g

3.3.2 范例:查找替换中的分隔符/可替换为其它字符,如:#,@

或者加转义符:(麻烦)
s@/etc@/var@g
s#/boot#/#i

3.3.3 范例:替换为的内容:不能使用模式,但可以使用\1, \2, ...等后向引用符号**;**还可以使用“&”引用前面查找时查找到的整个内容;

:% s/xyz/&er/g表示把所有行里面的xyz全部替换为xyzer。

3.3.4  范例:vi/vim 中如何在每行行首或行尾插入指定字符串?

行首 :% s/^/your_word/g
行尾 :% s/$/your_word/g

:/^d ----^意思表示以什么开头 ,,查找以字母d开头的内容
:/t$ -----$意思表示以什么结尾,,查找以字母t结尾的内容

扩展命令模式下正则表达式应用

3.3.5 范例:分组引用的搜索替代用的最多了。

测试1:
#vim新建一个新文件:
[root@localhost ~]# vim fa.txt
root root root
rabt rabt rxyt

#现在想在vim编辑界面如何将root替换为rooter?
:%s/root/root/g #扩展命令行模式下

#替换后效果如下:
rooter rooter rooter
rabt rabt rxyt
测试2:
#vim新建一个新文件:
[root@localhost ~]# vim fa.txt
root root root
rabt rabt rxyt

#现在想在vim编辑界面如何将r..t替换为admin(r..t)er?
:%s#\(r..t\)#admin\1er#g #扩展命令行模式下

#替换后效果如下:
adminrooter adminrooter adminrooter
adminrabter adminrabter adminrxyter

3.4 定制vim的工作特性

扩展命令模式的配置只是对当前vim进程有效,可将配置存放在文件中持久保存。

配置文件:

/etc/vimrc #全局

~/.vimrc #个人

老师自定义vimrc配置脚本(见“脚本库”)

3.4.1 行号

显示:set number,简写 set nu
取消显示:set nonumber, 简写 set nonu

3.4.2 忽略字符的大小写

启用:set ignorecase,简写 set ic
不忽略:set noic

3.4.3 自动缩进

启用:set autoindent,简写 set ai
禁用:set noai

注意:

自动缩进带来的一个缺点就是:复制粘贴会出问题。。。。。缩进乱了。。。。

不同编辑器的tab键(1个tab键代表几个空格)不同,可能会造成影响。。。。。

vim中默认一个tab键需要用8个空格来代替:

现象如下:

解决办法

:set paste保留原格式

3.4.4 复制保留格式

启用:set paste
禁用:set nopaste

3.4.5 显示Tab(^I)和换行符($)显示

启用:set list
禁用:set nolist
#vim fstab
abc$ #每个换行符后面都会出现一个美元符号$
123$
^Ic ^Icdd$ #如果里面含有tab输入,这里就会显示这个`^I`符号!
~
:set list

3.4.6 高亮搜索

启用:set hlsearch
禁用:set nohlsearch

3.4.7 语法高亮

启用:syntax on
禁用:syntax off

#注意:语法高亮默认是开启的;
#注意:cp /etc/passwd /data/下的区别;(后者默认不会出现语法高亮,因为系统认为/etc/目录下就是文件的配置文件所在目录,因此才会显示语法高亮,而后者不是)

3.4.8 文件格式

启用windows格式:set fileformat=dos
启用unix格式:set fileformat=unix
简写 set ff=dos|unix

注意:
hexdump -C file #hexdump命令可以用来确认文件的格式(linux格式换行符只有oa,而winodws的同时有0d 0a)

dos2unix file #linux-->winodws;
unix2dos file #winodws-->linux;

3.4.9 Tab 用空格代替

启用:set expandtab #默认为8个空格代替Tab
禁用:set noexpandtab
简写:set et

3.4.10 Tab用指定空格的个数代替

启用:set tabstop=# 指定#个空格代替Tab
简写:set ts=4 #常见的编辑器一般1个tab键用4个空格来表示的;

3.4.11 设置文本宽度

 set textwidth=65 (vim only)
set wrapmargin=15

3.4.12 设置光标所在行的标识线

启用:set cursorline,简写 set cul
禁用:set nocursorline

3.4.13 加密

启用: set key=password
禁用: set key=

3.4.14 了解更多

set 帮助
:help option-list
:set or :set all

4 命令模式

命令模式,又称为Normal模式,功能强大,只是此模式输入指令并不在屏幕上显示,所以需要记忆大量的快捷按键才能更好的使用。

4.1 退出VIM

ZZ 保存退出(自己经常使用来着,哈哈)
ZQ 不保存退出

4.2 光标跳转

4.2.1 字符间跳转

 h: 左 L: 右 j: 下 k: 上
#COMMAND:跳转由#指定跳转的字符个数

4.2.2 单词间跳转

 w:下一个单词的词首
e:当前或下一单词的词尾
b:当前或前一个单词的词首
#COMMAND:由#指定一次跳转的单词数

4.2.3 当前页跳转

 H:页首   M:页中间行    L:页底

zt:将光标所在当前行移到屏幕顶端
zz:将光标所在当前行移到屏幕中间
zb:将光标所在当前行移到屏幕底端

4.2.4 行首行尾跳转

 ^ 跳转至行首的第一个非空白字符
0 跳转至行首
$ 跳转至行尾

4.2.5 行间移动

 #G 或者扩展命令模式下 :# 跳转至由第#行
G 最后一行
1G, gg 第一行 (gg和G经常使用)

或者:
:x #在扩展命令行下,输入数字,按回车代表跳转到某行!

4.2.6 句间移动

 ) 下一句   ( 上一句

#注意,句是用.来隔开的;

4.2.7 段落间移动

 } 下一段 { 上一段

#注意:段是用空行来分隔的;

4.2.8 命令模式翻屏操作

Ctrl+f 向文件尾部翻一屏
Ctrl+b 向文件首部翻一屏
Ctrl+d 向文件尾部翻半屏
Ctrl+u 向文件首部翻半屏

4.3 字符编辑

x 删除光标处的字符
#x 删除光标处起始的#个字符
xp 交换光标所在处的字符及其后面字符的位置
~ 转换大小写
J 删除当前行后的换行符

4.4 替换命令(replace)

r 只替换光标所在处的一个字符
R 切换成REPLACE模式(在末行出现-- REPLACE -- 提示),按ESC回到命令模式

4.5 删除命令(delete )

d 删除命令,可结合光标跳转字符,实现范围删除

d$ 删除到行尾 (经常使用!!!)
d^ 删除到非空行首
d0 删除到行首

dw (经常使用!!!)
de
Db

#COMMAND


dd: 剪切光标所在的行
#dd 多行删除
dG 删除从本行到后面全部内容: dG 这里注意G一定要大写


D:从当前光标位置一直删除到行尾,等同于d$

vim扩展命令行模式下删除当前所有内容:%d

4.6 复制命令(yank)

y 复制,行为相似于d命令

y$
y0
y^

ye
yw
yb
#COMMAND

yy:复制行
#yy 复制多行
Y:复制整行

4.7 粘贴命令(paste)

p 缓冲区存的如果为整行,则粘贴当前光标所在行的下方;否则,则粘贴至当前光标所在处的后面
P 缓冲区存的如果为整行,则粘贴当前光标所在行的上方;否则,则粘贴至当前光标所在处的前面

#普通模式下,用p命令取回方才删除的数据:
vim在删除数据时,实际上会将数据保存在单独的一个寄存器中。可以用p命令取回数据。

举例来说,可以用dd命令删除一行文本,然后把光标移动到缓冲区的某个要放置该行文本的位置,然后用p命令。该命令会将文本插入到当前光标所在行之后。可以将它和任何删除文本的命令一起搭配使用。

4.8 改变命令(change)

c: 删除后切换成插入模式
c$
c^
c0

cb
ce
cw
#COMMAND
cc:删除当前行并输入新内容,相当于S
#cc
C:删除当前光标到行尾,并切换成插入模式,相当于c$

4.9 查找

/PATTERN:从当前光标所在处向文件尾部查找
?PATTERN:从当前光标所在处向文件首部查找
n:与命令同方向
N:与命令反方向

4.10 撤销更改

u 撤销最近的更改,相当于windows中ctrl+z

#u 撤销之前多次更改
U 撤消光标落在这行后所有此行的更改
Ctrl - r 重做最后的“撤消”更改,相当于windows中crtl+y
. 重复前一个操作
#. 重复前一个操作#次

4.11 高级用法

<start position><command><end position>
常见Command:y 复制、d 删除、gU 变大写、gu 变小写

0y$ 命令
0 → 先到行头
y → 从这里开始拷贝
$ → 拷贝到本行最后一个字符

例子:粘贴“wang”100次
100iwang [ESC]

di" 光标在” “之间,则删除” “之间的内容
yi( 光标在()之间,则复制()之间的内容
vi[ 光标在[]之间,则选中[]之间的内容
dtx 删除字符直到遇见光标之后的第一个 x 字符
ytx 复制字符直到遇见光标之后的第一个 x 字符

5 可视化模式

在末行有”-- VISUAL -- “指示,表示在可视化模式;

可视化键可用于与移动键结合使用

突出显示的文字可被删除,复制,变更,过滤,搜索,替换等;

允许选择的文本块

(1)v 面向字符,-- VISUAL --

(2)V 面向整行,-- VISUAL LINE --

(3)ctrl-v 面向块,-- VISUAL BLOCK --

案例:批量注释多行与去注释多行方法(很实用)

(1)注释:ctrl+v 进入列编辑模式(visual block模式),向下或向上移动光标,把需要注释的行的开头标记起来,然后按大写的I,再插入注释符,比如”#”,再按Esc,就会全部注释了。
(2)删除:按ctrl+v 进入列编辑模式(visual block模式);向下或向上移动光标 ;选中注释部分,然后按d, 就会删除注释符号。

PS:当然不一定是shell的注释符”#”,也可以是”//”,或者其他任意的字符;vim才不知道什么是注释符呢,都是字符而已。

6 多文件模式

这种方式用的不多!

vim FILE1 FILE2 FILE3 ...
:next 下一个
:prev 前一个
:first 第一个
:last 最后一个
:wall 保存所有
:qall 不保存退出所有
:wqall保存退出所有

7 多窗口模式

7.1 多文件分割

vim -o|-O FILE1 FILE2 ...
-o: 水平或上下分割
-O: 垂直或左右分割(vim only)
在窗口间切换:Ctrl+w, Arrow

7.2 单文件窗口分割

Ctrl+w,s:split, 水平分割,上下分屏
Ctrl+w,v:vertical, 垂直分割,左右分屏
ctrl+w,q:取消相邻窗口
ctrl+w,o:取消全部窗口
:wqall 退出

8 vim的寄存器

有26个命名寄存器和1个无命名寄存器,常存放不同的剪贴版内容,可以在同一个主机的不同会话(终端窗口)间共享(666)。
寄存器名称a,b,…,z,格式: ”寄存器放在数字和命令之间

范例:
3"tyy 表示复制3行到t寄存器中 ,末行显示 3 lines yanked into "t
"tp 表示将t寄存器内容粘贴

未指定,将使用无命名寄存器

有10个数字寄存器,用0,1,…,9表示,0存放最近复制内容,1存放最近删除内容。当新的文本变更和删除时,1转存到2,2转存到3,以此类推。数字寄存器不能在不同会话间共享。

9 标记和宏(macro)

ma 将当前位置标记为a,26个字母均可做标记, mb 、 mc 等等
'a 跳转到a标记的位置,实用的文档内标记方法,文档中跳跃编辑时很有用

qa 录制宏 a,a为宏的名称,末行提示: recording @a
q 停止录制宏
@a 执行宏 a
@@ 重新执行上次执行的宏

10 编辑二进制文件

#vim编辑二进制文件方法:
vim -b binaryfile
#扩展命令模式下,利用xxd命令转换为可读的十六进制
:%!xxd

#切换至插入模式下,编辑二进制文件

#切换至扩展命令模式下,利用xxd命令转换回二进制
:%!xxd  -r
#保存退出
[root@centos76 ~]#dd if=/dev/zero of=test.img bs=1 count=3 #特别注意:用dd命令创建的文件默认就是二进制文件,bs的单位是字节B
3+0 records in
3+0 records out
3 bytes (3 B) copied, 0.0001449 s, 20.7 kB/s
[root@centos76 ~]#file test.img
test.img: data #file命令这里的输出为data;
[root@centos76 ~]#ll
total 4
-rw-r--r-- 1 root root 3 Jan 20 07:27 test.img
[root@centos76 ~]#cat test.img #cat命令查看输出为空,当时是这样了,因为当时仅仅只设置为3B大小


[root@centos76 ~]#hexdump -C test.img #虽然次文件内容为空,但用二进制命令查看里面是有内容的。是用0字节进行填充的;
00000000 00 00 00 |...|
00000003
[root@centos76 ~]#xxd test.img
0000000: 0000 00 ...
[root@centos76 ~]#
[root@centos76 ~]#vim -b test.img #用vim以二进制(-b参数)方式打开,显示如下:
^@^@^@

"test.img" [noeol] 1L, 3C
[root@centos76 ~]#vim test.img #用vim以正常方式打开,显示也是一样的:
^@^@^@

"test.img" [noeol] 1L, 3C
[root@centos76 ~]#cat test.img #但是用cat命令查看输出是为空的,当时是这样了,因为当时仅仅只设置为3B大小

#开始进行编辑二进制文件:
[root@centos76 ~]#vim -b test.img
^@^@^@
~
:%!xxd #进到扩展命令模式,输入"!xxd"


00000000: 0000 00 ...
~

:%!xxd

进到插入模式:开始编辑,插入abc对应的16进制数字:61,62,63(可以用man ascii来查看)
00000000: 6162 63

:%!xxd -r
保存退出!

#查看编辑二进制效果:
[root@centos8 tmp]#ll
total 4
-rw-r--r--. 1 root root 3 Jan 20 10:22 test.img
[root@centos8 tmp]#cat test.img
abc[root@centos8 tmp]#xxd test.img
00000000: 6162 63 abc
[root@centos8 tmp]#hexdump -C test.img
00000000 61 62 63 |abc|
00000003
[root@centos8 tmp]#

11 帮助

(1)vim打开文件后,需求help:

:help #扩展命令模式下输入help
:help topic
Use :q to exit help

(2)vimtutor

[root@centos76 ~]#which vimtutor
/usr/bin/vimtutor
[root@centos76 ~]#vimtutor #这个软件本来就是用来练习vim的,无论如何更改该文件,再次打开,文件内容是不会改变的。

12 vim其它

#注意:检查 vim 软件包
在开始研究vim编辑器之前,最好先搞明白你所用的Linux系统是哪种vim软件包。在有些发行版中安装的是完整的vim,另外还有一个vi命令的别名,就像下面所显示的CentOS发行版中的那样。
$ alias vi
alias vi='vim'
$
$ which vim
/usr/bin/vim
$
$ ls -l /usr/bin/vim
-rwxr-xr-x. 1 root root 1967072 Apr 5 2012 /usr/bin/vim
$
注意,上面的程序文件长列表中并没有显示出任何的链接文件。如果vim程序被设置了链接,它可能会被链接到一个功能较弱的编辑器。所以最好还是检查一下链接文件。

在其他发行版中,你会发现各种各式各样的vim编辑器。要注意的是,在Ubuntu发行版中不仅没有vi命令的别名,而且/usr/bin/vi程序属于一系列文件链接中的一环。
$ alias vi
-bash: alias: vi: not found
$
$ which vi
/usr/bin/vi
$
$ ls -l /usr/bin/vi
lrwxrwxrwx 1 root root 20 Apr 22 12:39
/usr/bin/vi -> /etc/alternatives/vi
$
$ ls -l /etc/alternatives/vi
lrwxrwxrwx 1 root root 17 Apr 22 12:33
/etc/alternatives/vi -> /usr/bin/vim.tiny
$
$ ls -l /usr/bin/vim.tiny
-rwxr-xr-x 1 root root 884360 Jan 2 14:40
/usr/bin/vim.tiny
$
$ readlink -f /usr/bin/vi
/usr/bin/vim.tiny
因此,当输入vi命令时,执行的是程序/usr/bin/vim.tiny。vim.tiny只提供少量的vim编辑器功能。如果特别需要vim编辑器,而且使用的又是Ubuntu,那至少应该安装一个基础版本的vim包。

在Ubuntu发行版中安装基础版的vim包非常简单。
$ sudo apt-get install vim
[...]
The following extra packages will be installed:
vim-runtime
Suggested packages:
ctags vim-doc vim-scripts
The following NEW packages will be installed:
vim vim-runtime
[...]
$
$ readlink -f /usr/bin/vi
/usr/bin/vim.basic
$
基础版的vim现在安装好了,/usr/bin/vi的文件链接会自动更改成指向/usr/bin/ vim.basic。以后再输入vi命令的时候,使用的就是基础版的vim编辑器了。

13 vim总结图

14 .vimrc脚本版

vim ~/.vimrc

set ts=4
set expandtab
set ignorecase
set cursorline
set autoindent
set paste
autocmd BufNewFile *.sh exec ":call SetTitle()"
func SetTitle()
if expand("%:e") == 'sh'
call setline(1,"#!/bin/bash")
call setline(2,"#")
call setline(3,"#***************************************************************")
call setline(4,"#Author: hg" )
call setline(5,"#QQ: 2675263825")
call setline(6,"#Date: ".strftime("%Y-%m-%d"))
call setline(7,"#FileName: ".expand("%"))
call setline(8,"#URL: https://www.onedayxyy.cn")
call setline(9,"#Description: The test script" )
call setline(10,"#Copyright (c) : ".strftime("%Y")." All rights reserved")
call setline(11,"#***************************************************************")
call setline(12,"")
endif
endfunc
autocmd BufNewFile * normal G

测试效果:

image-20240329122752062

关于我

我的博客主旨:

  • 排版美观,语言精炼;
  • 文档即手册,步骤明细,拒绝埋坑,提供源码;
  • 本人实战文档都是亲测成功的,各位小伙伴在实际操作过程中如有什么疑问,可随时联系本人帮您解决问题,让我们一起进步!

🍀 微信二维码

x2675263825 (舍得), qq:2675263825。

🍀 微信公众号

《云原生架构师实战》

🍀 csdn

https://blog.csdn.net/weixin_39246554?spm=1010.2135.3001.5421

🍀 博客

www.onlyyou520.com

🍀 知乎

https://www.zhihu.com/people/foryouone

🍀 语雀

https://www.yuque.com/books/share/34a34d43-b80d-47f7-972e-24a888a8fc5e?# 《云笔记最佳实践》

最后

好了,关于本次就到这里了,感谢大家阅读,最后祝大家生活快乐,每天都过的有意义哦,我们下期见!


0%