仅使用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
防止less
退出时清除屏幕。 如果输出适合一个屏幕,则-F
可以防止less
用作寻呼机。
- 如果第一个参数是
@full
,则该函数将显示除添加和删除的行以外的所有未更改的行。
请注意此方法与以下方面的区别git diff
:
git diff
报告围绕每个更改的三行上下文。不幸的是,diff
如果您要指定上下文行数同时指定格式选项,似乎会抱怨并退出。(至少在Mac OS X Yosemite中如此)。谢谢diff
程序员。因此,您可以不要求每次更改周围有上下文行,这是默认行为,或者可以通过指定@full
为第一个参数来请求报告文件中所有未更改的行。
- 由于上下文行与的不同
git diff
,因此该函数报告的行号也将与git diff
。
- 您可能会看到报告了单行更改的存在,这是正确的行为,但是当更改的文件包含单行空行插入时,这很烦人。我认为
git diff
可以通过上下文来更好地解决这一问题。diff
如果愿意,您可以尝试传递不同的选项以更好地处理空白。
newtext
在/etc/colordiff
。我认为git使用绿色?