文本处理工具之神vim
vi和vim简介
一、vi编辑器
vi是Unix及类Unix系统(如Linux)下最基本的文本编辑器,全称为"visual interface",即视觉界面。尽管其名称中包含"visual",但vi编辑器实际上工作在字符模式下,并不提供图形界面。vi编辑器以其强大的功能和灵活性著称,是Linux系统中不可或缺的工具之一。
vi编辑器具有三种主要的工作模式:
- 命令模式(Command Mode):启动vi后默认进入此模式。在此模式下,用户可以通过键盘输入各种命令来控制光标的移动、文本的复制、粘贴、删除等操作。
- 插入模式(Insert Mode) :在命令模式下,通过输入特定的命令(如
i
、a
等)可以进入插入模式。在插入模式下,用户可以输入文本内容。- 底行模式(Last Line Mode) :在命令模式下,通过输入冒号(
:
)可以进入底行模式。在底行模式下,用户可以执行一些高级命令,如保存文件、退出vi、查找文本等。二、vim编辑器
vim是vi的一个升级版,全称为"VI IMproved"。vim在vi的基础上增加了许多新的特性和功能,如语法高亮、代码折叠、多窗口编辑等,使得文本编辑工作更加高效和便捷。vim同样支持Unix及类Unix系统,并且由于其强大的功能和灵活性,被广大程序员和Linux用户所喜爱。
vim也保留了vi编辑器的三种工作模式,但在每种模式下都增加了更多的命令和特性。例如,在插入模式下,vim支持多种插入方式(如行首插入、行尾插入等);在底行模式下,vim支持更多的高级命令和选项。
三、vi与vim的区别
尽管vi和vim在功能和用法上非常相似,但vim在vi的基础上进行了大量的改进和扩展。主要区别包括:
- 语法高亮:vim支持语法高亮,可以根据不同的编程语言为代码中的关键字、注释等部分标注不同的颜色,极大地提高了代码的可读性。
- 代码折叠:vim支持代码折叠功能,可以将代码块折叠起来,只显示标题行或折叠标记,方便用户快速浏览和定位代码。
- 多窗口编辑:vim支持多窗口编辑功能,可以在一个vim实例中同时打开多个文件窗口进行编辑。
- 插件系统:vim拥有强大的插件系统,用户可以通过安装插件来扩展vim的功能和特性。
综上所述,vi和vim都是Unix及类Unix系统下非常优秀的文本编辑器。vim作为vi的升级版,在功能和特性上更加丰富和强大,是Linux系统中不可或缺的文本编辑工具之一。
vim命令格式
vim [OPTION]... FILE...
+# 打开文件后,让光标处于第#行的行首,+默认行尾
+/PATTERN 让光标处于第一个被PATTERN匹配到的行行首
-b file 二进制方式打开文件
-d file1 file2 ... 比较多个文件,相当于vimdiff
-m file 只读打开文件
-e file 直接进入ex模式,相当于执行ex file
说明:
如果文件存在,文件被打开并显示内容
如果文件不存在,当编辑后第一次存在时创建它
三种主要模式和转换
命令模式->插入模式
i insert,光标所在处输入
I 在当前光标所在处的行首输入
a 在光标所在处的后面输入
A 在光标所在处的行尾输入
o 在光标所在处的下方打开一个新行
O 在光标所在处的上方打开一个新行
插入模式---ESC--->命令模式
命令模式--->:--->扩展命令模式
扩展命令模式--->ESC,enter--->命令模式
扩展命令模式
按:进入Ex模式,创建一个命令提示符:处于底部的屏幕左侧
扩展名改了模式基本命令
w 写(存)如磁盘
wq 写入并退出
x 吸入并退出
X 加密
q 退出
q! 不存盘退出
r filename 读文件内容到当前文件中
w filename 将当前文件内容写入另一个文件
!command 执行命令
r!command 读入命令的输出
地址定界
格式:
:start_pos,end_pos cmd
具体第#行,例如2表示2行
#,# 从左侧#表示起始行,右侧#表示结尾行
#,+# 从左侧#表示起始行,加上右侧#的行数
. 当前行
$ 最后一行
.,$-1 当前行到倒数第二行
% 全文,相当于1,$
/pattern/ 从当前行向下查找,知道匹配pattern的第一行,即:正则表达式
/pat1/,/pat2/ 从第一次被pat1模式匹配的行开始,一直到第一次被pat2匹配到的行结束
#,/pat/ 从指定行开始,一直找到第一个匹配pattern的行结束
/pat/,$ 向下找到第一个匹配pattern的行到整个文件的结尾行
地址定界后跟的一个编辑命令
d 删除
y 复制
w file 将范围内的行另存至指定文件
r file 在指定位置插入指定文件的所有内容
查找并替换
格式:
s/要查找的内容/替换为的内容/修饰符
要查找的内容:可正则表达式模式
替换为的内容:不能使用模式,但可以使用\1,\2...等后向引用符号;还可以使用&引用前面查找时查找到的整个内容.
修饰符:
i 忽略大小写
g 全局替换,默认情况下,每一行只替换第一次出现
gc 全局替换,每次替换前询问.
说明:查找替换中的分隔符/可替换为其它字符,如:#,@
范例:
s@/etc/var@g
s#/boot#/#i
范例:cp
[root@localhost ~]# cp passwd{,.bak}
[root@localhost ~]# ls
anaconda-ks.cfg original-ks.cfg passwd passwd.bak
定制vim的工作特性
配置文件:永久有效
全局:/etc/vimrc
个人:~/.vimrc
扩展命令模式:当前vim进程有效
行号
显示:set number,简写 set nu
取消显示:set nonumber,简写 set nonu
忽略字符的大小写
启用:set ignorecase,简写 set ic
不忽略:se noai
自动缩进
启用:set autoindent,简写 set ai
取消:set noai
复制保留格式
启用:set paste
禁用:set nopaste
显示Tab和换行符^|和$显示
启用:set list
禁用:set nolist
高亮搜索
启用:set hlsearch
禁用:set nohlsearch
语法高亮
启用:syntax on
禁用:syntax off
文件格式
启用widows文件格式:set fileformat=dos
启用unix文件格式:set fileformat=unix
简写:set ff =dos|unix
设置文本宽度
set texwidth=65(vim only)
set wrapmargin=15
设置光标所在行的标识
启用:set cursorline,简写set cul
禁用:set nocursorline
加密
启用:set key=passwd
禁用:set key=
了解更多
set 帮助
:help option-list
:set or :set all
命令模式
Vim的命令模式(Normal Mode)是其核心模式,提供了丰富的文本操作功能。以下是对Vim命令模式详细用法的归纳:
一、光标移动
- 基本移动 :
h
:向左移动光标一个字符。l
:向右移动光标一个字符。j
:向下移动光标一行。k
:向上移动光标一行。- 按单词移动 :
w
:向前移动到下一个单词的开头。e
:向前移动到下一个单词的末尾。b
:向后移动到上一个单词的开头。W
、E
、B
(大写):忽略标点符号,按更大的"单词"单位移动。- 行内跳转 :
0
(数字零):跳转到当前行的行首。^
:跳转到当前行首的第一个非空白字符。$
:跳转到当前行的行尾。- 行间跳转 :
gg
:跳转到文件的第一行。G
:跳转到文件的最后一行。#G
(#为数字):跳转到文件的第#行。- 屏幕移动 :
Ctrl+f
:向下翻一屏。Ctrl+b
:向上翻一屏。Ctrl+d
:向下翻半屏。Ctrl+u
:向上翻半屏。H
:跳转到当前屏幕的第一行。M
:跳转到当前屏幕的中间行。L
:跳转到当前屏幕的最后一行。二、文本操作
- 删除 :
x
:删除光标所在位置的一个字符。#x
(#为数字):删除光标所在位置及之后的#个字符。X
:删除光标所在位置的前一个字符(相当于Shift+x
)。dd
:删除光标所在的整行。#dd
(#为数字):删除从光标所在行开始的#行。dw
:删除从光标开始到单词末尾的字符。d0
:删除从光标位置到行首的内容。d$
:删除从光标位置到行尾的内容。- 复制 :
yy
:复制光标所在的整行。#yy
(#为数字):复制从光标所在行开始的#行。yw
:复制从光标开始到单词末尾的字符。- 粘贴 :
p
:将已复制或剪切的内容粘贴到光标所在行的下一行。P
(大写):将已复制或剪切的内容粘贴到光标所在行的上一行。- 撤销与重做 :
u
:撤销上一次的操作。Ctrl+r
:重做被撤销的操作。三、文本查找与替换
- 查找文本(通过命令行模式实现):
- 按下
/
或?
进入查找模式。- 输入要查找的文本,按
Enter
键。- 使用
n
查找下一个匹配项,N
查找上一个匹配项。- 替换文本(通过命令行模式实现):
- 按下
:
进入命令行模式。- 输入替换命令,如
:s/old/new/g
表示将当前行中所有的old
替换为new
。- 使用
%s/old/new/g
表示在整个文件中替换所有的old
为new
。四、其他常用命令
%
:在匹配括号之间跳转(需要Vim正确识别括号)。.
:重复上一次的编辑命令。Ctrl+o
:跳转到上一个光标位置(在跳转历史中后退)。Ctrl+i
:跳转到下一个光标位置(在跳转历史中前进)。五、文本选择(可视化模式)
虽然可视化模式(Visual Mode)不是命令模式的直接功能,但它是基于命令模式的一个扩展,用于选择文本。
- 进入可视化模式:
- 按
v
进入字符选择模式。- 按
V
进入行选择模式。- 按
Ctrl+v
进入块选择模式。- 在可视化模式下,可以使用方向键选择文本,然后使用
y
复制或d
删除选定的文本。掌握Vim命令模式的详细用法,可以大大提高文本编辑的效率和准确性
可视化模式
Vim的可视化模式(Visual Mode)是一种非常强大的文本选择功能,它允许用户通过键盘操作来选择文本块,然后对该文本块执行复制、删除、替换等操作。Vim提供了三种可视化模式:字符选择模式、行选择模式和块选择模式。以下是这三种模式的详细解释:
1. 字符选择模式
- 进入方式 :在命令模式下,按小写
v
键进入。- 功能:该模式下,用户可以通过移动光标来选择字符。选中的文本区域由光标经过的所有字符组成,但光标所在字符不包含在选区中。
- 操作 :使用
h
、j
、k
、l
方向键或其他光标移动命令来选择文本。选中的文本区域由两个端点(左上角和右下角)来标识。默认情况下,移动光标会控制右下角端点的位置。可以使用o
键在左上角和右下角之间切换活动端点。2. 行选择模式
- 进入方式 :在命令模式下,按大写
V
键(或Shift+v
,具体取决于Vim的配置)进入。- 功能:该模式下,用户可以通过移动光标来选择整行文本。选中的文本区域由光标经过的所有行组成。
- 操作 :与字符选择模式类似,使用
h
、j
、k
、l
方向键或其他光标移动命令来选择文本行。但在此模式下,光标移动会整行整行地选择文本。3. 块选择模式
- 进入方式 :在命令模式下,按
Ctrl+v
键进入。- 功能:该模式下,用户可以选择一个矩形区域的文本。选中的文本区域由光标起始位置和移动光标形成的矩形框表示。
- 操作 :使用
h
、j
、k
、l
方向键来选择矩形区域。在块选择模式下,可以非常方便地选择表格中的列或进行列编辑。通用操作
- 复制 :在可视化模式下,按
y
键将选中的文本复制到剪贴板。- 删除 :在可视化模式下,按
d
键删除选中的文本。- 粘贴 :在任何模式下,按
p
键将剪贴板中的内容粘贴到光标之后,按P
(大写)键将内容粘贴到光标之前。- 切换选区 :在可视化模式下,可以使用
o
键在选区的两个端点之间切换,以便调整选区的位置。- 重复操作 :在可视化模式下执行的操作(如复制、删除等)会被记录下来,之后可以使用
.
(点命令)重复执行上一次的操作。注意事项
- 在可视化模式下,光标所在位置并不包含在选区中。
- 在可视化模式下,可以使用普通模式下的光标移动命令来选择文本。
- 使用
gv
命令可以重新选择上次可视化模式下选中的文本区域(如果文本未被删除或移动)。Vim的可视化模式极大地提高了文本编辑的灵活性和效率,是Vim用户必须掌握的一项功能。
多文件模式
Vim的多文件模式是其功能强大的一部分,允许用户同时打开、编辑和切换多个文件。以下是对Vim多文件模式的详细解析:
一、打开多个文件
- 启动时打开 :
- 在终端中,可以直接使用
vim
命令后跟多个文件名来同时打开这些文件。例如,vim file1 file2 file3
会同时打开这三个文件,但默认只显示第一个文件的内容。- 已启动后打开 :
- 在Vim已经启动的情况下,可以通过在命令模式下输入
:e 文件名
或简写为:open 文件名
(部分Vim版本可能不支持:open
,更常用的是:e
)来打开新的文件。- 使用
:files
命令可以列出当前Vim实例中打开的所有文件及其缓冲区编号。二、文件间切换
- 使用快捷键 :
Ctrl+6
:在最近两个文件间切换。:bn
(buffer next的缩写):切换到下一个文件。:bp
(buffer previous的缩写):切换到上一个文件。:n
和:N
也分别用于切换到下一个和上一个文件,但它们的行为可能与:bn
和:bp
略有不同,具体取决于Vim的配置和版本。- 通过缓冲区列表切换 :
- 使用
:ls
或:buffers
命令可以列出所有打开的缓冲区(即文件)及其编号。然后,可以通过:b 缓冲区编号
或:b 文件名
来切换到指定编号或名称的文件。三、同时显示多个文件
- 分屏显示 :
- Vim支持水平分屏(
:split
或简写为:sp
)和垂直分屏(:vsplit
或简写为:vsp
)来同时显示多个文件的内容。- 分屏后,可以使用
Ctrl+w
加方向键(如h
、j
、k
、l
)来在不同的窗口间切换。- 标签页 :
- Vim还提供了标签页功能,允许用户在不同的标签页中打开多个文件。使用
:tabe 文件名
可以在新标签页中打开指定文件,使用:tabnext
、:tabprev
等命令可以在标签页间切换。四、关闭文件
- 在命令模式下,可以使用
:bd
(buffer delete的缩写)来关闭当前缓冲区(即文件),但通常不会退出Vim。- 要关闭所有打开的文件并退出Vim,可以使用
:qa
(quit all的缩写)命令。五、其他注意事项
- 在进行文件切换或编辑时,建议先保存当前文件的更改,以避免数据丢失。
- Vim的多文件模式非常灵活,用户可以通过配置文件(如
.vimrc
)和插件来进一步定制和增强其功能。- Vim的命令行模式(按
Shift + :
进入)提供了丰富的命令和选项,用于管理和操作多个文件,包括但不限于打开、关闭、切换、保存等。综上所述,Vim的多文件模式为用户提供了高效、灵活的方式来同时处理多个文件,是Vim作为文本编辑器强大功能的重要组成部分。
多窗口模式
Vim的多窗口模式是其功能强大的一部分,允许用户同时打开、编辑和查看多个文件或文件的不同部分。以下是对Vim多窗口模式的详细解析:
一、打开多窗口
- 启动时打开 :
- 在终端中,可以使用
vim
命令结合特定的选项和文件名来在启动时打开多个窗口。例如,vim -o file1 file2
会以水平分割的方式打开file1和file2,而vim -O file1 file2
则会以垂直分割的方式打开它们。- 已启动后打开 :
- 在Vim已经启动的情况下,可以通过在命令模式下输入特定的命令来打开新的窗口。例如,
:split
(或简写为:sp
)用于在当前窗口下方水平分割出一个新窗口,:vsplit
(或简写为:vsp
)则用于在当前窗口右侧垂直分割出一个新窗口。这两个命令都可以接受一个文件名作为参数,以在新窗口中打开指定的文件;如果不指定文件名,则会在新窗口中打开当前文件的另一个视图。二、窗口间切换
- 在Vim的多窗口模式下,可以使用
Ctrl+w
加上方向键(h
、j
、k
、l
)来在不同的窗口间切换。其中,h
表示向左切换,j
表示向下切换,k
表示向上切换,l
表示向右切换。- 另外,
Ctrl+w t
可以将当前窗口切换到顶部窗口,Ctrl+w b
可以将当前窗口切换到底部窗口。- 还有一些其他的快捷键组合可以用于窗口切换,如
Ctrl+w p
切换到上一个光标所在的窗口,Ctrl+w w
依次轮询切换窗口等。三、窗口大小调整
- Vim允许用户根据需要调整窗口的大小。在命令模式下,可以使用
:resize
(或简写为:res
)命令后跟一个数字来指定当前窗口的新高度(行数)。例如,:res 10
会将当前窗口的高度调整为10行。- 对于垂直分割的窗口,可以使用
:vertical resize
(或简写为:vertical res
)命令来调整窗口的宽度(列数)。- Vim还提供了增量式调整窗口大小的命令,如
:resize+
(增加当前窗口高度),:resize-
(减少当前窗口高度),:vertical resize+
(增加当前窗口宽度),:vertical resize-
(减少当前窗口宽度)等。四、关闭窗口
- 在Vim中,可以使用
:close
(或简写为:cl
)命令来关闭当前窗口。但是,如果只有一个窗口是打开的,那么:close
命令将不会执行任何操作,因为Vim至少需要一个窗口来显示内容。- 要关闭所有窗口并退出Vim,可以使用
:qa
(quit all的缩写)命令。这个命令会保存所有已修改的文件(如果设置了自动保存或用户明确执行了保存操作),然后退出Vim。五、其他注意事项
- 在Vim的多窗口模式下,所有打开的窗口都共享同一个Vim实例,因此它们之间的操作(如复制、粘贴)可以相互影响。
- Vim的多窗口模式非常灵活,用户可以通过配置文件(如
.vimrc
)和插件来进一步定制和增强其功能。- 在使用Vim的多窗口模式时,建议熟悉并掌握其快捷键和命令,以提高编辑效率。
VIM寄存器
Vim的寄存器是一个可自定义的多重剪切板,它允许用户存储、查看、复制和粘贴文本内容,从而提高编辑效率。Vim中共有九类寄存器,它们各自具有不同的特性和用途。以下是Vim寄存器的详细解析:
1. 无名(unnamed)寄存器:""
- 功能:缓存最后一次操作的内容。这是Vim默认的寄存器,当执行复制(yank)或删除(delete)操作时,如果没有指定其他寄存器,内容将被存储到无名寄存器中。
- 使用 :通过
p
命令粘贴时,默认使用的是无名寄存器中的内容。2. 数字(numbered)寄存器:"0~"9
- 功能:缓存最近的操作内容,但复制与删除操作有所区别。"0"寄存器缓存最近一次复制的内容,"1"~"9"寄存器缓存最近9次删除的内容。
- 使用 :如果要粘贴特定数字寄存器中的内容,可以使用
"<number>p
(例如,"2p
粘贴第二次删除的内容)。3. 行内删除(small delete)寄存器:"-"
- 功能:缓存行内删除的内容。如果删除的文本不含换行符(即不足一整行),则文本会被送到这个寄存器。
- 使用 :这个寄存器通常与
x
、d2h
等命令一起使用,用于处理行内的文本删除。4. 具名(named)寄存器:"a~"z 或 "A~"Z
- 功能:用户指定的寄存器,可以存储和访问特定的文本内容。
- 使用 :在复制或删除命令前加上寄存器的名称(例如,
"ayy
复制当前行到"a"寄存器),然后使用"<letter>p
(例如,"ap
粘贴"a"寄存器中的内容)来粘贴。大写字母表示追加内容到寄存器,小写字母表示覆盖原有内容。5. 只读(read-only)寄存器:":", ".", "%", "#"
- 功能:分别缓存最近命令、最近插入的文本、当前文件名和当前交替文件名。
- 使用:这些寄存器主要用于特定的场景,如查看最近插入的文本或当前文件名。
6. 表达式(expression)寄存器:"="
- 功能:只读,用于执行表达式命令。
- 使用 :可以通过在寄存器名前加上
=
来执行Vim的表达式功能,但通常不直接用于文本内容的存储和粘贴。7. 选择及拖拽(selection and drop)寄存器:"*", "+", "~"
- 功能:存取GUI选择文本,可用于与外部应用交互。
- 使用 :在GUI模式下,这些寄存器对应于系统剪贴板的内容。通过
"*yy
和"+yy
等命令可以将文本复制到系统剪贴板,通过"*p
和"+p
等命令可以将系统剪贴板的内容粘贴到Vim中。8. 黑洞(black hole)寄存器:"_"
- 功能:不缓存操作内容(干净删除)。
- 使用 :使用这个寄存器进行删除或复制的内容都会被丢弃,类似于Linux中的
/dev/null
文件。这可以用于避免删除或复制操作影响默认寄存器的内容。9. 模式寄存器(last search pattern):"/"
- 功能:缓存最近的搜索模式。
- 使用:这个寄存器用于保存上一次搜索所使用的正则表达式或文本模式,可以在后续的搜索和替换命令中使用。
查看寄存器内容
Vim提供了
:reg
命令来查看所有寄存器的内容,也可以通过:reg <register-name>
来查看特定寄存器的内容。总结
Vim的寄存器是一个功能强大的特性,它允许用户以灵活的方式存储、查看和粘贴文本内容。通过熟练使用寄存器,可以大大提高Vim的编辑效率。
标记和宏
Vim 中的标记(marks)和宏(macros)是两个不同的功能,但它们都能帮助用户提高编辑效率。下面分别解释这两个概念及其在 Vim 中的应用。
标记(Marks)
Vim 的标记是一种在文件中设置和跳转到特定位置的方法。每个标记都有一个名称(通常是一个单字母),你可以使用这个名称来快速返回到文件中你之前标记过的位置。
设置标记
- 使用
m<letter>
命令来设置一个标记,其中<letter>
是你想要分配给该位置的标记名称(必须是单个字母,大写或小写)。例如,ma
会在当前位置设置一个名为 'a' 的标记。跳转到标记
- 使用
'<letter>
命令(单引号加标记名称)来跳转到之前设置的标记位置。例如,'a
会跳转到之前用ma
设置的标记位置。- 如果你想跳转到标记所在行的行首,可以使用 ```<letter>` 命令(反引号加标记名称)。
注意事项
- 标记是全局的,即它们在整个 Vim 会话中都是有效的,直到你关闭 Vim。
- 当你退出 Vim 并重新打开时,标记会丢失,除非你将它们保存在
viminfo
文件中(Vim 的默认行为)。宏(Macros)
Vim 的宏允许你录制一系列的按键操作,并将它们保存为一个可重用的命令。这对于执行重复的任务非常有用。
录制宏
- 首先,将光标移动到你想要开始录制宏的位置。
- 按下
q
键进入录制模式,然后紧接着输入一个寄存器名称(通常是小写字母)来指定宏将被保存在哪个寄存器中。例如,qa
会开始录制宏并将其保存在寄存器 'a' 中。- 执行你想要录制的操作。例如,移动光标、删除文本、插入文本等。
- 按下
q
键停止录制。播放宏
- 将光标移动到你想要执行宏的位置。
- 按下
@
键,然后输入你之前用来录制宏的寄存器名称(例如,@a
会播放保存在寄存器 'a' 中的宏)。- 你可以通过重复按下
@<register>
来多次执行宏。注意事项
- 宏是 Vim 中非常强大的功能,但也需要谨慎使用,因为它们会执行录制的所有操作,包括任何可能的错误操作。
- 宏可以嵌套使用,即你可以在录制宏的过程中再次进入录制模式来录制另一个宏。
- 宏可以被保存到文件中,并在需要时通过 Vim 脚本或其他方式加载和执行。
通过使用 Vim 的标记和宏,你可以显著提高编辑效率和准确性,尤其是在处理重复性或模式化的编辑任务时。
编辑二进制文件
#以二进制的方式打开文件
vim -b binaryfile
#扩展命令模式下,利用xxd命令转换为可读的16进制
:%!xxd
#插入模式下编辑二进制工具
#扩展命令模式下,利用xxd命令转换二进制
:%!xxd -r
#保存退出
帮助
:help
:help topic
vimtutor