目录
26. shell命令--vimdiff
功能说明
vimdiff 命令来自英文词组“Vim differences”的缩写,其功能是用于同时编辑多个文本文件。对纯文本文件的比较和合并工具一直是软件开发过程中比较重要的组成部分,vimdiff命令能够比较多个文本文件之间的差异并快速定位,并很容易地进行文件合并操作。
vimdiff 是 Vim 编辑器的一个功能,用于比较两个文件或者两个文件的不同之处,并在一个 Vim 窗口中显示这些差异。它通常用于比较修改前后的文件,或者比较两个版本的文件。
在使用 vimdiff 时,Vim 会将两个文件以并排的方式显示在屏幕上,相同的部分会以相同的颜色显示,而不同的部分则会以不同的颜色或者特殊的标记显示出来。用户可以在这个界面上方便地查看、编辑并保存文件。
vimdiff 优点
vimdiff 具有许多优点,使其成为比较和合并文件的强大工具之一
- 内置于 Vim: vimdiff 是 Vim 编辑器的一部分,因此不需要额外安装或配置,用户可以立即使用。
- 灵活的定制性: Vim 是一个高度可定制的编辑器,用户可以根据自己的喜好和需求定制 vimdiff 的外观和行为,使其更符合个人偏好。
- 强大的编辑功能: 作为一个文本编辑器,Vim 拥有强大的编辑功能,包括搜索替换、文本操作等,这使得在 vimdiff 中查看和编辑差异变得非常方便。
- 支持多种文件格式: vimdiff 不仅可以比较普通的文本文件,还可以比较各种文件格式,如源代码、配置文件等。
- 直观的界面: vimdiff 以并排的方式显示两个文件的差异,相同的部分以相同的颜色显示,不同的部分以不同的颜色或者特殊的标记显示,这种直观的界面使用户能够快速地理解文件之间的差异。
- 支持合并操作: 除了比较文件之外,vimdiff 还支持合并文件的操作,用户可以方便地将两个文件的差异合并到一个文件中。
- 可扩展性: Vim 社区提供了许多插件和脚本,可以进一步扩展 vimdiff 的功能,使其更加强大和易用。
语法格式
SYNOPSIS
vimdiff [options] file1 file2 [file3 [file4]]
gvimdiff
vimdiff [options] file1 file2 [file3]
#file1 和 file2 是要比较的文件。
#file3(可选)是第三个文件,主要用于三个文件之间的比较。
选项说明
vimdiff 继承了 Vim 的许多命令行选项,但以下是与比较功能直接相关的选项:
- -c cmd:在启动 Vim 后执行 Vim 命令 cmd。
- -d:与 vimdiff 命令本身的功能相同(即启动 Vim 的 diff 模式)。
- -R 或 --readonly:以只读模式打开文件。
- -O 或 --vertical:水平分割窗口,而不是默认的垂直分割。
- --remote-tab:在现有的 Vim 实例中打开文件作为新标签页(如果可能)。
常用参数说明
dd:剪切当前行
数字dd:剪切当前行开始的多行
p:粘贴
:qa :同时退出多个文件
u:撤销操作
wa:保存文件
wqa:保存并退出
yy:复制当前行
数字yy:复制当前行开始的多行
窗口切换快捷键
Ctrl-w b #跳转到最底下的窗口
Ctrl-w h #跳转到左边的窗口
Ctrl-w H #把当前窗口移到最左边
Ctrl-w j #跳转到下边的窗口
Ctrl-w J #把当前窗口移到最下边
Ctrl-w k #跳转到上边的窗口
Ctrl-w K #把当前窗口移到最上边
Ctrl-w l #跳转到右边的窗口
Ctrl-w L #把当前窗口移到最右边
Ctrl-w t #跳转到最上面的窗口
Ctrl-w w #跳转到另一个窗口
实践操作
1. 比较两个文件 file1.txt 和 file2.txt
mkdir -p /test/vimdiff
cd /test/vimdiff
seq 100 >file1.txt
seq 100 |rev >file2.txt
vimdiff file1.txt file2.txt
#vimdiff 会打开一个新窗口,左侧显示 file1 的内容,右侧显示 file2 的内容。
#屏幕被垂直分割,左右两侧分别显示被比较的两个文件。
#两个文件中连续的相同的行被折叠了起来,以便使用者能把注意力集中在两个文件的差异上。
#只在某一文件中存在的行的背景色被设置为蓝色,而在另一文件中的对应位置被显示为绿色。
#两个文件中都存在,但是包含差异的行显示为粉色背景,引起差异的文字用红色背景加以突出。
#使用 vimdiff 的移动光标和编辑命令来查看并编辑文件
#如需保存修改,可以按下:wq保存并退出,或者:qa退出而不保存。
#通过 vimdiff,用户可以轻松地比较文件之间的差异,并进行必要的修改和合并。
#这对于程序员、文档编辑者以及任何需要处理多个版本文件的人来说都是非常有用的工具。
1.1 光标移动
1.1.1 屏幕滚动同步
#接下来试试在行间移动光标,可以看到左右两侧的屏幕滚动是同步的。
#这是因为 scrollbind 选项被设置了的结果,vimdiff 会尽力保证两侧文件的对齐。
#如果不想要这个特性,可以设置:
:set noscrollbind #取消屏幕滚动同步
:set scrollbind #设置屏幕滚动同步
1.1.2 各个差异点之间快速移动
#可以使用快捷键在各个差异点之间快速移动。跳转到下一个差异点
]c #从上到下跳转差异
[c #从下到上跳转差异
#如果在命令前加上数字的话,可以跳过一个或数个差异点,从而实现跳的更远。
#比如如果在位于第一个差异点的行输入 2]c,将越过下一个差异点,跳转到第三个差异点。
1.1.3 两个文件之间来回跳转
#如果希望手工修改某一行,可以使用通常的 vimdiff 操作。
#如果希望在两个文件之间来回跳转,可以用下列命令序列:
Ctrl-w, w
1.2 文件合并
1.2.1 文件1复制到文件2
#文件比较的最终目的之一就是合并,以消除差异。
#如果希望把一个差异点中当前文件的内容复制到另一个文件里,可以使用命令:
dp (diff "put") #先用]c,跳到差异点
1.2.2 文件2复制到文件1
#如果希望把另一个文件的内容复制到当前行中,可以使用命令
do (diff "get",之所以不用dg,是因为dg已经被另一个命令占用了)
1.2.3 手工来刷新比较结果
#在修改一个或两个文件之后,vimdiff 会试图自动来重新比较文件,来实时反映比较结果。
#但是也会有处理失败的情况,这个时候需要手工来刷新比较结果:
:diffupdate
1.2.4 撤销修改
#如果希望撤销修改,可以和平常用 vim 编辑一样,直接
<ESC>, u
1.3 文本编辑
#在 vimdiff 中,可以在左右两个窗口中进行文本编辑。
#按i进入插入模式编辑文本。
#使用Esc键退出插入模式。
#使用:w保存修改。
1.4 上下文的展开和查看
#比较和合并文件的时候经常需要结合上下文来确定最终要采取的操作。
#Vimdiff 缺省是会把不同之处上下各 6 行的文本都显示出来以供参考。
#其他的相同的文本行被自动折叠。如果希望修改缺省的上下文行数,可以这样设置:
gg #按gg跳转到行首,来查看差异
:set diffopt=context:3
#可以用简单的折叠命令来临时展开被折叠的相同的文本行:
zo (folding open,之所以用z这个字母,是因为它看上去比较像折叠着的纸)
#然后可以用下列命令来重新折叠:
zc (folding close)
1.5 同时操作两个文件
#在比较和合并告一段落之后,可以用下列命令对两个文件同时进行操作。比如同时退出
:qa (quit all)
#如果希望保存全部文件:
:wa (write all)
#或者是两者的合并命令,保存全部文件,然后退出:
:wqa (write, then quit all)
#如果在退出的时候不希望保存任何操作的结果:
:qa! (force to quit all)
2. 窗口操作的演示
2.1 水平切分
vimdiff -o file1.txt file2.txt
2.2 垂直切分
vimdiff -O file1.txt file2.txt
vimdiff file1.txt file2.txt #默认就是垂直切分
2.3 指定分屏个数
vimdiff 3 file1.txt file2.txt
2.4 多个方向的分屏
vimdiff file1.txt file2.txt
#在 Vimdif 中,可以使用
#:vsplit 命令来垂直分屏,
#:split 命令来水平分屏
2.4.1 分屏:
按下 Ctrl+w v #以垂直分屏
按下 Ctrl+w s #以水平分屏
2.4.2 窗口切换
按下 Ctrl+w l #跳转到右边的窗口
按下 Ctrl+w h #跳转到左边的窗口
按下 Ctrl+w j #跳转到下边的窗口
按下 Ctrl+w k #跳转到上边的窗口
2.4.3 创建新的垂直分屏
#选中其中一个分屏,切换到另一个文件,执行以下命令
#这将会在当前选中的分屏右侧创建一个新的垂直分屏,显示 file3.txt,并进行比较
:vert diffsplit file3.txt
2.4.4 创建新的水平分屏
#选中任何一个分屏,执行以下命令
#这将会在当前选中的分屏下方创建一个新的水平分屏,显示 file4.txt,并进行比较
:vertical res diffsplit file4.txt
2.4.4 退出方法
#要退出 vimdiff 并保存所有文件的更改,使用 :wqall。
#要退出但不保存更改,使用 :qa!。
注意事项
其它说明
在 vimdiff 中,你可以使用以下操作来比较和编辑文件:
- 导航:使用 Vim 的正常导航命令(如 h, j, k, l,或箭头键)在文件之间移动。
- 滚动:使用 Vim 的滚动命令(如 Ctrl-f 或 Ctrl-b)滚动查看文件的其余部分。
- 差异查看:Vim 会高亮显示两个文件之间的差异。你可以通过查看这些差异来比较文件。
- 切换文件:使用 :diffthis 命令将当前窗口中的文件添加到差异比较中,或使用 :diffsplit 命令打开另一个文件进行比较。
- 合并差异:你可以编辑文件以合并差异,或者使用 Vim 的差异合并命令(如 :diffget 或 :diffput)来自动合并某些更改。
- 保存文件:使用 Vim 的正常保存命令(如 :w 或 :wq)保存文件。
退出
- 要退出 vimdiff 并保存所有文件的更改,使用 :wqall。
- 要退出但不保存更改,使用 :qa!。
自定义
你可以通过编辑你的 Vim 配置文件(通常是 ~/.vimrc)来自定义 vimdiff 的外观和行为。例如,你可以更改差异高亮颜色、设置默认的窗口布局等。
示例
假设你有两个文件 file1.txt 和 file2.txt,你可以使用以下命令来比较它们:
vimdiff file1.txt file2.txt
这将启动 Vim 并显示两个垂直分割的窗口,分别包含 file1.txt 和 file2.txt 的内容。你可以通过查看高亮显示的差异来比较这两个文件。
1. 快捷键和高级功能
vimdiff 提供了许多快捷键和高级功能,以进一步提高文件比较和编辑的效率。以下是一些常用的快捷键和功能的简要说明:
- 切换差异:在比较两个文件时,你可以使用 ]c 和 [c 快捷键在差异之间快速切换。
- 跳转到下一个/上一个差异:使用 ]d 和 [d 快捷键可以快速跳转到下一个或上一个差异。
- 折叠/展开差异:vimdiff 支持代码折叠功能,你可以使用 zc 折叠当前差异,使用 zo 展开当前差异。使用 zM 折叠所有差异,使用 zR 展开所有差异。
- 差异合并:除了使用 :diffget 和 :diffput 命令外,你还可以使用 do 快捷键将当前差异从另一个文件合并到当前文件中。
- 跳转到特定行:你可以使用 Vim 的行号跳转功能(如 :10G 跳转到第10行)来快速定位到文件中的特定行。
- 搜索:使用 Vim 的搜索功能(如 /pattern 搜索包含 "pattern" 的文本)来在文件中查找特定的内容。
- 外部命令:在 vimdiff 中,你可以使用 :!command 执行外部命令,并在 Vim 中查看命令的输出。
- 插件和扩展
vimdiff 本身已经非常强大,但你可以通过安装插件和扩展来进一步增强其功能。有许多 Vim 插件专门用于改进差异比较、合并和其他与文件比较相关的任务。你可以在 Vim 的官方网站或其他 Vim 社区网站上找到这些插件。
2. 注意事项
- 在使用 vimdiff 时,请确保你的 Vim 版本支持差异比较功能。大多数现代 Vim 版本都支持此功能,但较旧的版本可能不支持。
- 在编辑和保存文件时,请务必小心谨慎。由于 vimdiff 允许你同时编辑两个或三个文件,因此很容易混淆或意外更改文件内容。在保存更改之前,请务必仔细检查你的更改,并确保它们是你想要的更改。
- 当你完成文件比较和编辑后,记得退出 vimdiff 并保存你的更改(如果适用)。不要忘记保存你的更改,否则你可能会丢失你所做的工作。