vimdiff及vim split

参见:

http://blog.csdn.net/swust_long/article/details/6990033

http://www.ibm.com/developerworks/cn/linux/l-vimdiff/

最简单的打开新窗口的命令::split

关闭窗口::close, 或 :quit 或 ZZ。但close可以避免在剩下一个窗口的时候不小心退出vim。

关闭除当前窗口以外的所有窗口: :only

vsplit

vnew


Vimdiff的基本用法就是:

# vimdiff  FILE_LEFT  FILE_RIGHT
或者
# vim -d  FILE_LEFT  FILE_RIGHT


从上图我们可以看到一个清晰的比较结果。屏幕被垂直分割,左右两侧分别显示被比较的两个文件。两个文件中连续的相同的行被折叠了起来,以便使用者能把注意力集中在两个文件的差异上。只在某一文件中存在的行的背景色被设置为蓝色,而在另一文件中的对应位置被显示为绿色。两个文件中都存在,但是包含差异的行显示为粉色背景,引起差异的文字用红色背景加以突出。
除了用这种方法启动vim的diff模式之外,我们还可以用分割窗口命令来启动diff模式:
# vim FILE_LEFT
然后在vim的ex模式(也就是"冒号"模式)下输入:
:vertical diffsplit FILE_RIGHT
也可以达到同样的效果。如果希望交换两个窗口的位置,或者希望改变窗口的分割方式,可以使用下列命令:
1. Ctrl-w K(把当前窗口移到最上边)
2. Ctrl-w H(把当前窗口移到最左边)
3. Ctrl-w J(把当前窗口移到最下边)
4. Ctrl-w L(把当前窗口移到最右边)
其中1和3两个操作会把窗口改成水平分割方式。

光标移动

接下来试试在行间移动光标,可以看到左右两侧的屏幕滚动是同步的。这是因为"scrollbind"选项被设置了的结果,vim会尽力保证两侧文件的对齐。如果不想要这个特性,可以设置:
:set noscrollbind
可以使用快捷键在各个差异点之间快速移动。跳转到下一个差异点:
]c
反向跳转是:
[c
如果在命令前加上数字的话,可以跳过一个或数个差异点,从而实现跳的更远。比如如果在位于第一个差异点的行输入"2]c",将越过下一个差异点,跳转到第三个差异点。

文件合并

文件比较的最终目的之一就是合并,以消除差异。如果希望把一个差异点中当前文件的内容复制到另一个文件里,可以使用命令
dp (diff "put")
如果希望把另一个文件的内容复制到当前行中,可以使用命令
do (diff "get",之所以不用dg,是因为dg已经被另一个命令占用了)
如果希望手工修改某一行,可以使用通常的vim操作。如果希望在两个文件之间来回跳转,可以用下列命令序列:
Ctrl-w, w
在修改一个或两个文件之后,vimdiff会试图自动来重新比较文件,来实时反映比较结果。但是也会有处理失败的情况,这个时候需要手工来刷新比较结果:
:diffupdate
如果希望撤销修改,可以和平常用vim编辑一样,直接
, u
但是要注意一定要将光标移动到需要撤销修改的文件窗口中。

同时操作两个文件

在比较和合并告一段落之后,可以用下列命令对两个文件同时进行操作。比如同时退出:
:qa (quit all)
如果希望保存全部文件:
:wa (write all)
或者是两者的合并命令,保存全部文件,然后退出:
:wqa (write, then quit all)
如果在退出的时候不希望保存任何操作的结果:
:qa! (force to quit all)

上下文的展开和查看

比较和合并文件的时候经常需要结合上下文来确定最终要采取的操作。Vimdiff 缺省是会把不同之处上下各 6 行的文本都显示出来以供参考。其他的相同的文本行被自动折叠。如果希望修改缺省的上下文行数,可以这样设置:
:set diffopt=context:3
可以用简单的折叠命令来临时展开被折叠的相同的文本行:
zo (folding open,之所以用z这个字母,是因为它看上去比较像折叠着的纸)
然后可以用下列命令来重新折叠:
zc (folding close)


自动折行就是set wrap,让超过屏幕宽度的字符到下一行显示。

textwidth设置一行的最大宽度,超过的部分会自动到下一行中,如果设置为0那么就不会有这种效果了。这个换行是会在行尾加上一个\n的,所以如果printf引号中的内容过长就会有问题了。

而让我比较困惑的是wrapmargin 按说wrap是折行,也就是超过屏幕宽度的行会自动回绕然后在下一行继续,但是这中间没有\n,也就是本质上还是一行而不是两行。这个wm第一感觉应该是回绕的宽度,也就是到一个指定的宽度回绕而不是换行,即使你的屏幕宽度还有不少。但是实际效果不是那么回事,设置了wm为80它好像在70多的地方就换行了,注意是换行而不是折行。然后终于找到了关于这个的详细说明……
The 'wrapmargin' option does almost the same.  The difference is that 'textwidth' has a fixed width while 'wrapmargin' depends on the width of the screen.  When using 'wrapmargin' this is equal to using 'textwidth' with a value equal to (columns - 'wrapmargin'), where columns is the width of the
screen.
也就是它设置的是屏幕右边空白的宽度,也就是字面上margin的大小,实际效果还是折行的。因为我的gnome-terminal全屏之后宽度是153,wm=80那么相当于tw=153-80=73,所以就有上边的现象了,清楚了这个,那我还是直接设置tw参数吧……折腾了一下午了

还有关于formatoptions的设置。默认的是fo=tcq,具体资料可以:help fo-table,这里说说自己添加的几个参数:
fo+=ro 这两个参数是自动添加comment leader的
r       Automatically insert the current comment leader after hitting
         in Insert mode.
fo+=mM 这两个是宽字符相关的,还没测试
m       Also break at a multi-byte character above 255.  This is useful for
        Asian text where every character is a word on its own.
M       When joining lines, don't insert a space before or after a multi-byte
        character.  Overrules the 'B' flag.

你可能感兴趣的:(Linux)