*diff.txt*	For Vim バージョン 9.1.  Last change: 2025 Nov 09


		  VIM リファレンスマニュアル	by Bram Moolenaar


				*diff* *vimdiff* *gvimdiff* *diff-mode*
このファイルでは |+diff| 機能 (同じファイルの2つから8つまでのバージョン間の違
いを表示する機能) について解説する。

基本はユーザーマニュアルのセクション|08.7|に記載されている。

1. 差分モードを開始する		|start-vimdiff|
2. 差分を眺める			|view-diffs|
3. 差分へ移動する		|jumpto-diffs|
4. 差分を写す			|copy-diffs|
5. 差分アンカー			|diff-anchors|
6. 差分モードのオプション	|diff-options|

==============================================================================
1. 差分モードを開始する					*start-vimdiff*

差分モードで編集を開始するいちばん簡単な方法は "vimdiff" コマンドである。これ
はVimを通常どおり起動して、加えて引数で与えたファイル間の違いを表示する。 >

	vimdiff file1 file2 [file3 [file4]]

これは以下に等しい: >

	vim -d file1 file2 [file3 [file4]]

"gvimdiff" もしくは "vim -d -g" を使うこともできる。その際はGUIがスタートする。
"viewdiff" もしくは "gviewdiff" を使うこともできる。その際は読込専用モードでス
タートする。
"r" が先頭に付け加われば制限モードになる(|-Z|参照)。

2つ目以降の引数にはディレクトリ名を指定することもできる。その際には第1引数の
ファイル名がそのディレクトリ名に追加され、ファイルを検索するのに利用される。

デフォルトでは、内部diffライブラリが使用される。'diffopt' または 'diffexpr' が
設定されていると外部の "diff" コマンドが使用される。これは、そのようなdiffプロ
グラムが利用可能な場合にのみ機能する。

diff はカレントタブページ |tab-page| にローカルである。他のタブページにある
ウィンドウとの差分を見ることはできない。これによって、複数の差分を同時に見るこ
とが可能になっている。それぞれを別々のタブで開けばよい。

Vimが各ファイルについてウィンドウを開く時に起こることは、|-O|引数を使った時に
起こることに似ている。これには垂直分割が使用される。水平分割を行いたいならば
|-o|引数を追加する: >

	vimdiff -o file1 file2 [file3 [file4]]

常に水平分割にしたければ 'diffopt' に "horizontal" を含めること。

編集される各ファイルには以下のオプションが設定される:

	'diff'		on
	'scrollbind'	on
	'cursorbind'	on
	'scrollopt'	"hor" を入れる
	'wrap'		off、または 'diffopt' が "followwrap" を含むならそのま
			まにする。
	'foldmethod'	"diff"
	'foldcolumn'	2

これらのオプションはウィンドウローカルに設定される。別のファイルを開いた時に
は、これらはグローバルの値へリセットされる。
このオプションはさらにそのファイルを再読み込みするときモードラインから上書きさ
れることがある。しかし 'diff' がオンのとき、'foldmethod' と 'wrap' はモードラ
インからはセットされない。
簡単にオプションを元に戻すには `:diffoff` を参照。

表示される差分はバッファ内の違いである。だからファイルを読み込んだ後に変更を行
えば、その変更分は差分として表示される。特に外部 diff コマンドを使用している際、
全ての変更が即表示に反映されるわけではないので、時々 ":diffupdate" を行うと良
いだろう。

差分モードで起動した時の特別な設定を.vimrcファイルに記すことができる。このよう
にすれば良い: >

	if &diff
	   setup for diff mode
	else
	   setup for non-diff mode
	endif

既にVimを利用している時には、3つの方法で差分モードへ移行することができる。

							*E98*
:diffs[plit] {filename}					*:diffs* *:diffsplit*
		ファイル{filename}の新しいウィンドウを開く。現在と新しく開く
		ウィンドウについて "vimdiff" と同様のオプションをセットする。
		'diffexpr' も参照。

							*:difft* *:diffthis*
:difft[his]	現在のウィンドウを差分ウィンドウの1つにする。これにより
		"vimdiff" と同じオプションが設定される。

:diffp[atch] {patchfile}			 *E816* *:diffp* *:diffpatch*
		{patchfile}内の差分情報を現在のバッファへ適用し、結果を新しく
		作成したバッファへ出力する。オプションは "vimdiff" と同様に設
		定される。
		{patchexpr}の形式は "patch" プログラムか 'patchexpr' が取り扱
		える形式ならどのようなものでもかまわない。
		{patchfile}は現在のファイルに対して適用可能な差分情報だけを含
		んでなければならないことに注意。もしも{patchfile}が他のファイ
		ル用の差分情報を含んでいた場合は、結果は予想不可能となる。Vim
		は現在のディレクトリのファイルが偶発的に書き換えられてしまうの
		を避けるためディレクトリを/tmpへ変更する。しかし様々な ".rej"
		ファイルが作成されてしまう問題は依然としてある。また差分情報内
		にファイルが絶対パスとして与えられた場合には、やはり適用されて
		しまう。
		"patch" コマンドの使用は、|restricted-mode| では許可されていま
		せん。

このコマンドを垂直分割で使うには、|:vertical|を先行させる。例: >

	:vert diffsplit main.c~
	:vert diffpatch /tmp/diff

常に垂直分割にしたければ 'diffopt' に "vertical" を含めること。

							*E96*
'diff' オプションは最大で8つのバッファにまで同時に設定できる。

オプションの値はバッファへ記憶されるので、しばらくの間異なるファイルを編集し、
また同じファイルへ戻って再び差分モードを継続することができる。

							*:diffo* *:diffoff*
:diffo[ff]	カレントウィンドウの差分モードを終了する。'diff' が設定されて
		いてもいなくても、関連オプションはリセットされる。

:diffo[ff]!	カレントウィンドウとカレントタブページのすべてのウィンドウの差
		分モードを終了する。'diff' が設定されているウィンドウのみ、関
		連オプションがリセットされる。カレントウィンドウの 'diff' オプ
		ションが設定されていない場合は、そのウィンドウの関連オプション
		は変更されない。
		隠れバッファも、diff対象のバッファの一覧から削除される。

コマンド `:diffoff` は関連するオプションを差分モード実行前の設定値に戻す。それ
は `:diffsplit`、`:diffpatch`、`:diffthis` を実行したときの設定値、または Vim
を差分モードで起動したときの設定値である。`:diffoff` を2回実行したときは最後に
保存された値が復元される。
それ以外の場合はデフォルト値に戻す:

	'diff'		off
	'scrollbind'	off
	'cursorbind'	off
	'scrollopt'	"hor" を外す
	'wrap'		on、または 'diffopt' が "followwrap" を含むならそのま
			まにする。
	'foldmethod'	"manual"
	'foldcolumn'	0

'foldenable' はほとんどの場合、オフにリセットされる。これは、'foldmethod' が
"manual" に戻されたときである。折り畳み自体はクリアされないが、表示されるべき
ではない。'foldenable' をリセットすることが、それを行う最善の方法である。

==============================================================================
2. 差分を眺める							*view-diffs*

差分ウィンドウには同じテキストが表示され、異なる部分が強調表示される。テキスト
をスクロールした際には 'scrollbind' オプションにより、他のウィンドウも同じよう
にスクロールされる。垂直分割をしている場合、テキストの位置は正しく同期する。

テキストの位置は次のような場合に狂っていく:
- 'wrap' が有効で、幾つかの行が折り返され複数行を占めている時
- 折り畳みが一方のウィンドウでは開かれているが、もう一方では閉じられている
- 'scrollbind' が無効になっている
- テキストが変更された
- 'diffopt' に "filler" が指定されておらず、削除・追加された行が配置を狂わせて
  いる
'diff' オプションが設定されているウィンドウで編集されている全てのバッファが差
分へ連結される。これは隠し(hidden)バッファにもあてはまる。これを可能にするには
初めに1つのウィンドウでそれらが編集される必要がある。隠れバッファを取り除くに
は、`:diffoff!` を用いること。

					*:DiffOrig* *diff-original-file*
'diff' はウィンドウローカルのオプションであるから、1つのバッファをあるウィンド
ウでは差分モードで、別のウィンドウでは通常のウィンドウで表示することも可能であ
る。ファイルを読み込んで以来バッファに対して行った変更を表示することも可能であ
る。だが、Vimは1つのファイルに対して複数のバッファを持つことはできないから、別
のバッファを作る必要がある。
次のコマンドが便利である: >
	 command DiffOrig vert new | set bt=nofile | r ++edit # | 0d_
		\ | diffthis | wincmd p | diffthis
(これは|defaults.vim|に書かれている)。":DiffOrig" を実行すると、カレントバッフ
ァと元のファイルの差分を見ることができる。

アンロードされたバッファの差分をとることはできない。隠れバッファの差分をとるこ
とはできる。コマンド ":hide" を使うと、バッファをアンロードせずにウィンドウを
閉じることができる。そのときバッファを差分対象から外したいならば、隠れバッファ
にする前に ":set nodiff" をする。

						*:dif* *:diff* *:diffupdate*
:dif[fupdate][!]		差分の強調と折り畳みを更新する。

テキストを変更した時には、Vimは差分情報を最新に保とうと試みる。これの大部分は
挿入と削除をされた行 (複数も可) に着目して行われる。1行内で行われた変更、及び
それよりも複雑な変更に対しては差分情報は更新されない。差分情報を強制的に更新す
るには次のコマンドを使う: >

	:diffupdate

!が含まれている場合、Vimはファイルが外部で変更され、再読み込みが必要かどうかを
チェックする。その際、`:checktime` を使ったときと同様に、変更されたそれぞれの
ファイルについてプロンプトが表示される。

Vimは片方のウィンドウには存在しないがもう一方には存在する行については補充して
表示する。これらはもう一方のファイルで追加されたかこのファイルで削除された行で
ある。'diffopt' オプションから "filler" を削除するとVimはこのような行の補充は
行わない。


変更されていないテキストについては折り畳みを使用して隠される。折り畳みに使用で
きる全てのコマンドについては|folding|を参照。

差分の近辺の折り畳みに含まれない領域はコンテキストと呼び、その行数を 'diffopt'
オプションで設定できる。以下の例ではこのコンテキストを3行に設定している: >

	:set diffopt=filler,context:3


差分は以下のハイライトグループで強調表示される:

|hl-DiffAdd|	DiffAdd		追加(挿入)された行。このバッファに存在する行
				は、別のバッファには存在しない。
|hl-DiffChange|	DiffChange	変更された行。
|hl-DiffText|	DiffText	変更された行の中の変更されたテキスト。Vimは異
				なる最初の文字と、最後の文字を発見する (検索は
				行末から行われる)。その文字の間のテキストが強
				調される。これはその間にあるテキストが例え同じ
				だったとしても強調されることを意味する。ここで
				は 'diffopt' の "iwhite" と "icase" が適用され
				る。
|hl-DiffText|	DiffText	変更された行内の変更されたテキスト。正確な動作
				は、'diffopt' の `inline:` 設定によって異なる。
				`inline:` が "simple" に設定されている場合、
				Vim は異なる最初の文字と異なる最後の文字を検索
				する (行末から検索する)。その間のテキストがハ
				イライトされる。つまり、中間の同じ部分はとにか
				くハイライトされる。ここでは、'diffopt' フラグ
				の "iwhite" と "icase" が使用される。
				`inline:` が "char" または "word" に設定されて
				いる場合、Vim は内部 diff ライブラリを使用し
				て、変更されたブロック間の詳細な diff を実行
				し、2 つのブロック間の正確な違いをハイライトす
				る。内部 diff に影響する 'diffopt' フラグを尊
				重する。
				`inline:` が "none" に設定されている場合は使用
				されない。
|hl-DiffTextAdd|  DiffTextAdd	変更された行内に追加されたテキスト。DiffText
				に似ているが、他のバッファに対応するテキストが
				ない場合に使用される。`inline:` が "simple" ま
				たは "none" に設定されている場合は使用されな
				い。
|hl-DiffDelete|	DiffDelete	削除された行。補充された行についても、実際その
				バッファには存在していないことから、このグルー
				プが適用される。

==============================================================================
3. 差分へ移動する					*jumpto-diffs*

差分へ移動するのに2つのコマンドを使える:
								*[c*
	[c		前(上方)の変更の先頭へ移動する。
			カウントが与えられた場合、その回数繰り返される。
								*]c*
	]c		次(下方)の変更の先頭へ移動する。
			カウントが与えられた場合、その回数繰り返される。

カーソルの動く方向に変更がなかった場合にはエラーになる。

==============================================================================
4. 差分を写す			*copy-diffs* *E99* *E100* *E101* *E102* *E103*
								*merge*

あるバッファから別のバッファへテキストを複写する2つのコマンドがある。結果的に
ある範囲について2つのバッファの内容は等しくなる。

							*:diffg* *:diffget*
:[range]diffg[et] [bufspec]
		現在のバッファをもう1つのバッファと同じくなるように変更する。
		[bufspec] が与えられた時は、そのバッファが使用される。
		[bufspec] がカレントバッファである場合は何も起こらない。
		そうでなければ差分モードのバッファが他に1つしかない時にだけ動
		作する。
		[range]については以下を参照。

						*:diffpu* *:diffput* *E793*
:[range]diffpu[t] [bufspec]
		もう1つのバッファを現在のバッファと同じくなるように変更する。
		":diffget" と同様だが現在のバッファではなく、もう一方のバッファ
		が変更を受ける。
		[bufspec] が省略され、かつ 'modifiable' がオンで差分モードにあ
		るバッファが2個以上あると、このコマンドは失敗する。
		[range]については以下を参照。

							*do*
[count]do	範囲のない ":diffget" と同じ。"o" は "obtain" の意味 ("dgg" と
		区別できないので、"dg" は使えない)。Note: これはビジュアル
		モードでは機能しない。
		[count] を与えた場合、それは ":diffget" に対して [bufspec]引数
		として用いられる。

							*dp*
[count]dp	範囲のない ":diffput" と同じ。Note: これはビジュアルモードでは
		機能しない。
		[count] を与えた場合、それは ":diffput" に対して [bufspec]引数
		として用いられる。


[range] が指定されていない場合、カーソル位置またはそのすぐ上の差分が影響を受け
る。バッファの最終行の下に削除された行がある場合がある。カーソルがバッファの最
終行にあり、その行より上に差分がなく、[range] が指定されていない場合は、カーソ
ル位置より下の差分が代わりに使用される。

[range] を使用すると、Vim は指定された行のみを put または get しようとする。削
除された行がある場合、それらの行が [range] で指定された行の間にある場合にのみ
使用される。

[range] 内の行を別のバッファに送ったり、別のバッファから取得したりするには、0
と最終行番号に 1 を加えた値を使用できる。このコマンドは、他のバッファからすべ
ての差分を取得する: >

	:0,$+1diffget

削除された行は画面に表示こそされているが、テキストラインとしては数えられていな
いことに注意。消された範囲にカーソルを移動することはできない。もう一方のバッ
ファから、削除された行を ":diffget" で取得するには対象行の下方で行う必要があ
る。
								*E787*
変更を受けるバッファが読み込み専用で、 |FileChangedRO| で引き起こされる自動コ
マンドがバッファを変更するとき、このコマンドは失敗する。
この自動コマンドはバッファを変更してはならない。

引数 [bufspec]にはバッファ番号、バッファ名のパターンもしくはバッファ名の一部を
使用できる。例:

	:diffget		差分モードにある別のバッファを使用する
	:diffget 3		3番のバッファを使用する。
	:diffget v2		差分モードにある "v2" にマッチするバッファを使
				用する (例, "file.c.v2")

==============================================================================
5. 差分アンカー						*diff-anchors*

差分アンカーを使用すると、差分アルゴリズムがファイル間でテキストを揃えて同期さ
せる位置を制御できる。各アンカーは各ファイル内で互いにマッチするため、差分の出
力を制御できる。

これは、変更に複雑な編集が含まれる場合に便利である。例えば、関数が別の場所に移
動され、さらに編集された場合などである。デフォルトでは、アルゴリズムは最小の差
分を作成することを目指す。その結果、その関数全体が削除され、反対側に追加された
とみなされ、実際の編集内容を把握することが困難になる。差分アンカーを使用してそ
の関数をピン留めすることで、差分アルゴリズムはそれに基づいて調整を行う。

使用するには、各ファイル内の {address} をコンマ区切りでリスト化した
'diffanchors' を使ってアンカーを設定し、'diffopt' に "anchor" を追加する。Vim
は内部的に各ファイルをアンカーによって分割されたセクションに分割する。そして、
各セクションのペアごとに個別に diff を実行し、結果をマージする。

'diffanchors' を設定すると、差分が即座に更新される。アンカーがマークに結び付け
られており、マークの参照先を変更した場合は、更新された差分結果を取得するため
に、後で手動で |:diffupdate| を呼び出す必要がある。

例:

以下のファイルが並んでいるとする。ここで注目したいのは、編集と移動の両方が行わ
れた関数 `foo()` の変更点である。

ファイル A: >
	int foo() {
	    int n = 1;
	    return n;
	}

	int g = 1;

	int bar(int a) {
	    a *= 2;
	    a += 3;
	    return a;
	}
ファイル B: >
	int bar(int a) {
	    a *= 2;
	    a += 3;
	    return a;
	}

	int foo() {
	    int n = 999;
	    return n;
	}

	int g = 1;
<
通常の差分では、通常、以下のように差分結果が整列される: >

	int foo() {     |----------------
	    int n = 1;  |----------------
	    return n;   |----------------
	}               |----------------
	                |----------------
	int g = 1;      |----------------
	                |----------------
	int bar(int a) {|int bar(int a) {
	    a *= 2;     |    a *= 2;
	    a += 3;     |    a += 3;
	    return a;   |    return a;
	}               |}
	----------------|
	----------------|int foo() {
	----------------|    int n = 999;
	----------------|    return n;
	----------------|}
	----------------|
	----------------|int g = 1;
<
我々が望むのは、代わりに差分を `foo()` で揃えることである: >

	----------------|int bar(int a) {
	----------------|    a *= 2;
	----------------|    a += 3;
	----------------|    return a;
	----------------|}
	----------------|
	int foo() {     |int foo() {
	    int n = 1;  |    int n = 999;
	    return n;   |    return n;
	}               |}
	                |
	int g = 1;      |int g = 1;
	                |----------------
	int bar(int a) {|----------------
	    a *= 2;     |----------------
	    a += 3;     |----------------
	    return a;   |----------------
	}               |----------------
<

以下に、上記の結果を得るための差分アンカーの設定方法をいくつか示す。各例におい
て、この設定を有効にするには、'diffopt' に `anchor` が設定されている必要があ
る。

マーク: アンカーを設定する前に、各ファイルの `int foo()` 行に |'a| マークを設
定する: >
	set diffanchors='a

パターン:  |pattern| (|:/| を参照) を使用してアンカーを指定する。ここでは、一
貫性を保つために、常に 1 行目から検索を開始するようにしている: >
	set diffanchors=1/int\ foo(/
<
選択: ビジュアルモードを使用して、各ファイルの `foo()` 関数本体全体を選択する。
ここでは 2 つのアンカーを使用している。これにより、関数本体のみが互いにアンカー
され、それ以降の行はアンカーされないようになる。Note 下の `'>+1` に注目。
"+1" が必要なのは、関数の最終行の上ではなく下で分割が行われるようにするためで
ある: >
	set diffanchors='<,'>+1
<
バッファローカルなオプションを介して行番号を使用し 2 つのアンカーを手動で設定
する: >
	setlocal diffanchors=1,5
	wincmd w
	setlocal diffanchors=7,11
<
==============================================================================
6. 差分モードオプション					*diff-options*

'diffopt' と 'fillchars' の "diff" 項目も参照。

					    *diff-slow* *diff_translations*
行がとても長いと diff 構文ハイライトが遅くなるかもしれない。その場合は特にたく
さんの異なったローカライゼーションをマッチしようと試みるからである。ローカライ
ゼーションを無効化して構文ハイライトを高速化するには、グローバル変数
g:diff_translations を 0 に設定する: >

    let g:diff_translations = 0
<
この変数を設定した後、構文スクリプトを再読み込みする: >

    set syntax=diff
<


☆差分を発見する					*diff-diffexpr*

'diffexpr' オプションは、2つのファイルを比較し差分を取得する内部diffサポートも
しくは標準的な "diff" プログラム以外の何かを利用する場合に設定する。 *E959*

'diffexpr' が空ならば、Vimはfile1とfile2間の差分を得るために次のコマンドを使用
する: >

	diff file1 file2 > outfile

">" は 'shellredir' の値に置き換えられる。

"diff" の出力は通常の "ed" 形式の差分またはユニファイド差分でなければならない。
コンテキスト差分では動作しない。またユニファイド差分ではコンテキスト行なしが利
用できる。つまり "diff -u" では動作せず、"diff -U0" を使うこと。

この例は、Vimが "ed" 形式の差分に求めるフォーマットを示している: >

	1a2
	> bbb
	4d4
	< 111
	7c7
	< GGG
	---
	> ggg

項目 "1a2" が 行 "bbb" を追加する。
項目 "4d4" が 行 "111" を削除する。
項目 "7c7" が 行 "GGG" を 行 "ggg" で置き換える。

'diffexpr' が空でなければ、差分ファイルを述べた形式で取得するためにそれを評価
実行する。これらの変数がファイル名として設定される:

	v:fname_in		基準となるファイル
	v:fname_new		同ファイルの新バージョン
	v:fname_out		結果の差分ファイルを書き込む場所

その上、'diffexpr' は 'diffopt' オプションの "icase" と "iwhite" についても考
慮するべきだろう。'diffexpr' は 'lines' と 'columns' の値を変更できない。

引数なしでの関数呼び出しを使用する利点は高速なことである、
|expr-option-function| を参照のこと。

例 (これは 'diffexpr' が空の時とほぼ同じように働く): >

	set diffexpr=MyDiff()
	function MyDiff()
	   let opt = ""
	   if &diffopt =~ "icase"
	     let opt = opt .. "-i "
	   endif
	   if &diffopt =~ "iwhite"
	     let opt = opt .. "-b "
	   endif
	   silent execute "!diff -a --binary " .. opt .. v:fname_in .. " " .. v:fname_new ..
		\  " > " .. v:fname_out
	   redraw!
	endfunction

引数の "-a" は強制的にテキストファイルとして比較するために使われる。バイナリで
の比較は使いにくい。引数の "--binary" はファイルをバイナリモードで読み込むため
に使われる。DOSでCTRL-Zをテキストの終わりとしないためである。

シェルコマンドを実行し、ディスプレイに何かが表示されるかどうかによっては、
`redraw!` コマンドは必要ないかもしれない。

'diffexpr' の式が s: か |<SID>| で始まる場合、スクリプトID(|local-function|)
に置き換えられる。例: >
		set diffexpr=s:MyDiffExpr()
		set diffexpr=<SID>SomeDiffExpr()
そうでない場合、式はオプションが設定されたスクリプトのコンテキストで評価され、
その結果スクリプトローカルな要素を使用できる。

						*E810* *E97*
Vimは差分の出力結果が妥当であるか検証する。妥当でない場合、エラーメッセージを
得るだろう。起こりうるエラーは:
-  プログラム "diff" を実行できなかった。
-  プログラム "diff" が通常の "ed" スタイルの差分を出力しなかった(上記参照)。
-  'shell' と関連するオプションが正しく設定されていなかった。":!sort" のような
   フィルタリングコマンドが正しく動作するか確認すること。
-  'diffexpr' を使っているが動作しなかった。
エラーメッセージがよくわからないときは 'verbose' オプションを設定してより多く
のメッセージを見ることができる。

MS-Windows 用の Vim インストーラには diff プログラムが含まれている。もし diff
プログラムを持っていない場合はどこかから diff.exe をダウンロードすること。例え
ば次の場所から入手できる。
http://gnuwin32.sourceforge.net/packages/diffutils.htm.


☆パッチを使用する				*diff-patchexpr*

'patchexpr' オプションは、標準的な "patch" プログラム以外の何かを利用する場合
に設定する。

'patchexpr' が空ならば、Vimは "patch" を次のように呼び出す: >

	patch -o outfile origfile < patchfile

これはほとんどのバージョンの "patch" で正しく働くだろう。行中間のCRが、改行記
号として解釈され問題を起こすことはあるかもしれない。

デフォルトが正しく働かないのならば、同様の働きをする式を 'patchexpr' に設定す
る。これらの変数がファイル名として設定される。

	v:fname_in		基準となるファイル
	v:fname_diff		パッチファイル
	v:fname_out		パッチ適用結果を出力するファイル

引数なしでの関数呼び出しを使用する利点は高速なことである、
|expr-option-function| を参照のこと。

例 (これは 'patchexpr' を空にしたのと同じ働きをする): >

	set patchexpr=MyPatch()
	function MyPatch()
	   :call system("patch -o " .. v:fname_out .. " " .. v:fname_in ..
	   \  " < " .. v:fname_diff)
	endfunction

利用する "patch" プログラムが望んでいない副作用をしていないことを確認する必要
がある。例えば消されるべき付加的なファイルが生成されていないか用心する必要があ
る。ファイルにパッチをあてる以上のことは何もすべきではない。
   Vimは 'patchexpr' を実行する前に "/tmp" か他の一時ディレクトリへ現在のディ
レクトリを移動する。これにはカレントディレクトリの別のファイルへ偶然にパッチが
あたってしまうのを避ける狙いがある。Vimはv:fname_inで始まり ".rej" や ".orig"
で終わる名前のファイルを消すこともする。

'patchexpr' の式が s: か |<SID>| で始まる場合、スクリプトID(|local-function|)
に置き換えられる。例: >
		set patchexpr=s:MyPatchExpr()
		set patchexpr=<SID>SomePatchExpr()
そうでない場合、式はオプションが設定されたスクリプトのコンテキストで評価され、
その結果スクリプトローカルな要素を使用できる。


☆diff 関数の例					*diff-func-examples*

|diff()| 関数を使用して 2 つの文字列のリスト間の差分インデックスを計算する例を
以下に示す。
>
  " いくつかの行が変更された
  :echo diff(['abc', 'def', 'ghi'], ['abx', 'rrr', 'xhi'], {'output': 'indices'})
   [{'from_idx': 0, 'from_count': 3, 'to_idx': 0, 'to_count': 3}]

  " 冒頭に数行を追加した
  :echo diff(['ghi'], ['abc', 'def', 'ghi'], {'output': 'indices'})
   [{'from_idx': 0, 'from_count': 0, 'to_idx': 0, 'to_count': 2}]

  " 冒頭から数行を削除した
  :echo diff(['abc', 'def', 'ghi'], ['ghi'], {'output': 'indices'})
   [{'from_idx': 0, 'from_count': 2, 'to_idx': 0, 'to_count': 0}]

  " 途中に数行を追加した
  :echo diff(['abc', 'jkl'], ['abc', 'def', 'ghi', 'jkl'], {'output': 'indices'})
   [{'from_idx': 1, 'from_count': 0, 'to_idx': 1, 'to_count': 2}]

  " 途中の数行を削除した
  :echo diff(['abc', 'def', 'ghi', 'jkl'], ['abc', 'jkl'], {'output': 'indices'})
   [{'from_idx': 1, 'from_count': 2, 'to_idx': 1, 'to_count': 0}]

  " 末尾に数行を追加した
  :echo diff(['abc'], ['abc', 'def', 'ghi'], {'output': 'indices'})
   [{'from_idx': 1, 'from_count': 0, 'to_idx': 1, 'to_count': 2}]

  " 末尾から数行を削除した
  :echo diff(['abc', 'def', 'ghi'], ['abc'], {'output': 'indices'})
   [{'from_idx': 1, 'from_count': 2, 'to_idx': 1, 'to_count': 0}]

  " ばらばらな変更
  :echo diff(['ab', 'def', 'ghi', 'jkl'], ['abc', 'def', 'ghi', 'jk'], {'output': 'indices', 'context': 0})
   [{'from_idx': 0, 'from_count': 1, 'to_idx': 0, 'to_count': 1},
    {'from_idx': 3, 'from_count': 1, 'to_idx': 3, 'to_count': 1}]

  " コンテキスト長 1 のばらばらな変更
  :echo diff(['ab', 'def', 'ghi', 'jkl'], ['abc', 'def', 'ghi', 'jk'], {'output': 'indices', 'context': 1})
   [{'from_idx': 0, 'from_count': 4, 'to_idx': 0, 'to_count': 4}]

<

 vim:tw=78:ts=8:noet:ft=help:norl:
