、、、および、のみを使用してbash
、の出力を厳密に概算できます。ただし、プログラマーの近視眼性のために、いくつかの顕著な違いがあります。diff
tput
less
git diff
diff
次のBash関数定義を、ユーザーアカウントによって自動的に取得されるファイルに配置すると、コマンドラインから関数にアクセスできるようになります。
function gdiff()
{
local REG=`tput op`
local GRP=`tput setaf 6`
local ADD=`tput setaf 2`
local REM=`tput setaf 1`
local NL=$'\n'
local GRP_LABEL="${GRP}@@ %df,%dn +%dF,%dN @@${REG}"
local UNCH_GRP_FMT=''
[[ "${1}" == '@full' ]] && {
UNCH_GRP_FMT="${GRP_LABEL}${NL}%="
shift
}
diff \
--new-line-format="${ADD}+%L${REG}" \
--old-line-format="${REM}-%L${REG}" \
--unchanged-line-format=" %L${REG}" \
--new-group-format="${GRP_LABEL}${NL}%>" \
--old-group-format="${GRP_LABEL}${NL}%<" \
--changed-group-format="${GRP_LABEL}${NL}%<%>" \
--unchanged-group-format="${UNCH_GRP_FMT}" \
"${@}" | less -FXR
}
この関数は次のように機能します。
- 最終的に
diff
、ファイル内の変更がどのように表示されるかを指定するために、さまざまなフォーマットオプションで呼び出されます。
tput
これらのフォーマットオプションにANSIカラーコードを挿入するために使用されます。非ANSI端末を使用する場合は、に置き換える必要がある場合があることに注意してtput setaf
くださいtput setf
。
- の出力
diff
はにパイプされless
ます。 -R
ANSIカラーを保持できます。 終了時に画面がクリアされ -X
ないようにします。出力が1つの画面に収まる場合、ポケットベルとして動作するのを防ぎます。less
-F
less
- 最初のパラメーターが
@full
である場合、関数は、追加および削除された行に加えて、変更されていないすべての行を表示します。
このアプローチと次の違いに注意してくださいgit diff
。
git diff
各変更を取り巻く3行のコンテキストを報告します。残念ながら、diff
フォーマットオプションを同時に指定しながら、コンテキスト行の数を指定したい場合は、文句を言って終了するようです。(少なくともMac OS X Yosemiteではそうです)。プログラマーに感謝diff
します。したがって、デフォルトの動作である各変更を囲むコンテキストの行を要求しないか@full
、最初のパラメーターとして指定することにより、ファイル内のすべての変更されていない行も報告するように要求できます。
- コンテキストの行はとは異なるため、
git diff
この関数によって報告される行番号も、によって報告される行番号とは異なりますgit diff
。
- 報告された単一行の変更の存在が表示される場合があります。これは正しい動作ですが、変更されたファイルに単一の空行の挿入が含まれていると煩わしくなります。私は
git diff
、その文脈の線を介して、これをよりよく扱うと思います。必要に応じて、さまざまなオプションをに渡してdiff
、空白をより適切に処理することもできます。