![有没有办法 vim 仅区分两个文件中的某些块?](https://linux22.com/image/1614450/%E6%9C%89%E6%B2%A1%E6%9C%89%E5%8A%9E%E6%B3%95%20vim%20%E4%BB%85%E5%8C%BA%E5%88%86%E4%B8%A4%E4%B8%AA%E6%96%87%E4%BB%B6%E4%B8%AD%E7%9A%84%E6%9F%90%E4%BA%9B%E5%9D%97%EF%BC%9F.png)
我使用 vimdiff 作为我的首选 diff 工具。我想知道是否有办法 vimdiff 两个文件之间的某些块(最好不使用插件)。
例如,将 file1.py 中第 14 至 26 行的 getValues() fn 与 file2.py 中第 30 至 60 行的 getValues() fn 进行比较
答案1
插件解决方案
正如前面提到的,有几个插件:
- BlockDiff工具是一个古老而简约的插件,用于在单独的选项卡页面中查看文本块之间的差异。
- 行差异是一种现代的、更强大的变体,它还可以同步更改,甚至处理合并冲突、用符号显示范围等。
- spotdiff.vim采用了不同的方法:它不是将区域临时复制到单独的缓冲区(在新标签页中),而是在原始窗口中进行差异处理,然后淡出不相关的部分。
- 我自己的AdvancedDiffOptions 插件有一个
:DiffIRange
命令可以通过自定义方式排除 diff 中的某些行'diffexpr'
通过 shell 命令过滤文件。该插件还可以按行和模式进行过滤。
自制
在 Unix 上,你可以将 shell(例如 Bash)功能与常用工具(sed
)结合起来,将提取的文本内容提供给 vim:
vimdiff <(sed -n '14,26p' file1.py) <(sed -n '30,60p' file2.py)
这使用流程替代( <(command)
) 运行command
,并将其输出作为临时文件描述符提供,Vim 可以像读取任何其他文件一样读取它。sed
默认输出抑制 ( -n
) 用于有选择地选择行(通过{range}p
rint 命令);您还可以根据情况使用head
、tail
甚至。grep
这与我的插件类似;缺点是仅有的选定的范围可以在 Vim 内部访问。