有办法定制吗?
配置定义在.gitattributes,“定义自定义块头”部分:
首先,在.gitattributes
,您将分配diff
路径的属性。
*.tex diff=tex
然后,您将定义一个“diff.tex.xfuncname
“配置指定与您希望显示为块标头的行相匹配的正则表达式”TEXT
“。将一个部分添加到您的$GIT_DIR/config
文件(或$HOME/.gitconfig
文件)像这样:
[diff "tex"]
xfuncname = "^(\\\\(sub)*section\\{.*)$"
笔记。单级反斜杠会被配置文件解析器吃掉,因此您需要将反斜杠加倍;上面的模式选择以反斜杠开头的行,以及零次或多次出现的 sub,后跟节,后跟左大括号,直到行尾。
有一些内置模式可以使这变得更容易,并且tex
是其中之一,因此您不必在配置文件中编写上述内容(您仍然需要使用属性机制来启用它,通过.gitattributes
).
('csharp
' 是当前内置模式的一部分)
这段摘录来自哪里?
Does git diff
以某种方式识别语言语法?
最初,该算法对于函数名称检测来说相当粗糙:
See 提交 acb7257(Git 1.3.0,2006 年 4 月,作者:Mark Wooding)
xdiff
:在块头中显示函数名称。
内置 diff 生成器的速度很好;但函数名称
显示者diff -p
are really好的。我讨厌必须做出选择。
所以,我们破解xdiff
查找函数名称并打印它们。
函数名称是由一个特别愚蠢的算法解析的
时刻:它只是尝试在“旧”文件中查找之前的行
猛男的开始,他的第一个角色看起来很合理。尽管如此,它还是
绝对是一个开始。
它被精炼为获取函数线(),本身来自提交 f258475(Git 1.5.3,2007 年 9 月,作者:Junio C Hamano(gitster))
你可以在提交测试中看到t/t4018-diff-funcname.sh,测试自定义 diff 函数名称模式。
基于每路径属性的块标头选择。
这使得 ”diff -p
“可通过以下方式自定义大块标题gitattributes
机制。
它基于 Johannes 的早期补丁,允许定义单个
正则表达式可用于一切。
到达用于定义 hunk header 的正则表达式的机制
与其他用途相同gitattributes
.
您分配一个属性,funcname
(因为 ”diff -p
“通常使用补丁所涉及的函数名称作为块头),一个简单的字符串值。
这可以是内置模式的名称之一(目前,java
" 已定义)或自定义模式名称,可从配置文件中查找。
(in .gitattributes)
*.java funcname=java
*.perl funcname=perl
(in .git/config)
[funcname]
java = ... # ugly and complicated regexp to override the built-in one.
perl = ... # another ugly and complicated regexp to define a new one.
目前的xfuncname
语法被引入提交 45d9414,Git 1.6.0.3,2008 年 10 月,作者:Brandon Casey
diff.*.xfuncname
它使用“扩展”正则表达式来选择大块标头
目前,由 ' 生成的大块标头diff -p
' 可通过以下方式定制
设置diff.*.funcname
配置文件中的选项。这 'funcname
' 选项采用基本正则表达式。此功能是使用 GNU 正则表达式库设计的,默认情况下,即使在基本正则表达式模式下,该库也允许使用某些扩展正则表达式运算符的反斜杠版本。例如,以下字符,当使用反斜杠时,将根据扩展正则表达式规则进行解释:?
, +
, and |
.
因此,内置funcname
模式是使用一些扩展创建的
正则表达式运算符。
其他更严格遵守 POSIX 规范的平台则不这样做
解释基本正则表达式中的反斜杠扩展 RE 运算符
模式。这会导致内置 funcname 模式的模式匹配
在这些平台上失败。
引入一个新选项'xfuncname
' 使用扩展正则表达式,并对其进行广告instead of funcname
.
由于大多数用户都在 GNU 平台上,因此大多数funcname
模式是在那里创建和测试的。
仅做广告xfuncname
应该有助于避免创建适用于 GNU 正则表达式但不适用于其他地方的不可移植模式。
此外,扩展的正则表达式可能不那么难看,并且
与基本 RE 相比,它很复杂,因为许多常见的特殊运算符不需要反斜杠。
例如,GNU Basic RE:
^[ ]*\\(\\(public\\|static\\).*\\)$
变为以下扩展 RE:
^[ ]*((public|static).*)$
最后,它被扩展为提交 14937c2,适用于 git 1.7.8(2011 年 12 月),作者为 René Scharfe。
diff
:添加选项以将整个函数显示为上下文
添加选项-W
/--function-context
to git diff.
它类似于相同的选项git grep并扩展了变化块的上下文,以便显示整个周围的功能。
这种“自然”的背景可以让人们更好地理解变化。
它仍在 Git 2.15(2017 年第 4 季度)中进行调整
用于检测 HTML 的“函数标头”的内置模式确实如此
不匹配<H1>..<H6>
没有任何属性的元素,其中有
已修复。
2.15之前,匹配失败<h1>...</h1>
, while <h1 class="smth">...</h1>
火柴。
See commit 9c03cac (23 Sep 2017) by Ilya Kantor (iliakan).
(Merged by Junio C Hamano -- gitster -- in commit 376a1da, 28 Sep 2017)
检测函数边界的模式称为xfuncref
.
See commit a807200 (08 Nov 2019) by Łukasz Niemier (hauleth).
(Merged by Junio C Hamano -- gitster -- in commit 376e730, 01 Dec 2019), for Git 2.25 (Q1 2020)
userdiff: 将 Elixir 添加到支持的 userdiff 语言
Signed-off-by: Łukasz Niemier
Acked-by: Johannes Sixt
添加了对以下内容的支持xfuncref
in Elixir语言是一种类似 Ruby 的语言,运行在Erlang虚拟机 (BEAM)。
And:
See commit d1b1384 (13 Dec 2019) by Ed Maste (emaste).
(Merged by Junio C Hamano -- gitster -- in commit ba6b662, 25 Dec 2019)
userdiff:从中删除空子表达式elixir
regex
Signed-off-by: Ed Maste
Reviewed-by: Jeff King
Helped-by: Johannes Sixt
正则表达式无法在 FreeBSD 上编译。
还添加/* -- */
标记以分隔给定的两个正则表达式条目PATTERNS()
宏,使其与其他内容类型的模式一致。
Git 2.27(2020 年第 2 季度)添加了 Markdown 文档的 userdiff 模式。
See commit 09dad92 (02 May 2020) by Ash Holland (sersorrel).
(Merged by Junio C Hamano -- gitster -- in commit dc4c393, 08 May 2020)
userdiff:支持Markdown
Signed-off-by: Ash Holland
Acked-by: Johannes Sixt
通常在源代码旁边查找 Markdown 文档,并且为文档更改提供更好的上下文非常有用;也可以看看提交 69f9c87d4 ("userdiff
: 添加对 Fountain 文档的支持", 2015-07-21, Git v2.6.0-rc0 --merge列于batch #1).
该模式基于CommonMark 规范 0.29,第 4.2 节 https://spec.commonmark.org/但不匹配空标题,因为在大标题中看到它们不太可能有用。
仅支持 ATX 标题,因为检测 setext 标题需要在模式匹配或匹配多行模式之前打印行。 word-diff 模式与 HTML 的模式相同,因为许多 Markdown 解析器接受内联 HTML。
在 Git 2.30(2021 年第一季度)中,userdiff 模式学会了识别 POSIX shell 中的函数定义和bash
.
See commit 2ff6c34 (22 Oct 2020) by Victor Engmark (l0b0).
(Merged by Junio C Hamano -- gitster -- in commit 292e53f, 02 Nov 2020)
userdiff:支持重击
Signed-off-by: Victor Engmark
Acked-by: Johannes Sixt
支持 POSIX、bashism 和混合函数声明、所有四种复合命令类型、尾随注释和混合空格。
尽管 Bash 允许函数名称中与区域设置相关的字符,仅检测包含以下允许的字符的函数名称POSIX.1-2017为了简单起见。
这应该涵盖绝大多数用例,并产生与系统无关的结果。
由于必须指定单词模式,但没有简单的方法来知道默认的单词模式,因此使用默认的单词模式IFS
初学者的角色。稍后的补丁可以改善这一点。
gitattributes
现在包含在其man page:
-
bash
适用于 Bourne-Again SHell 语言的源代码。
涵盖 POSIX shell 函数定义的超集。
在 Git 2.32(2021 年第 2 季度)中,用户差异模式为“Scheme”已添加。
See commit a437390 (08 Apr 2021) by Atharva Raykar (tfidfwastaken).
(Merged by Junio C Hamano -- gitster -- in commit 6d7a62d, 20 Apr 2021)
userdiff:添加对Scheme的支持
Signed-off-by: Atharva Raykar
为类计划语言添加不同的驱动程序,以识别顶级和本地define
形式,无论是函数定义、绑定、语法定义还是用户定义define-xyzzy
form.
还支持R6RSlibrary
forms, module
形式以及 Racket 中使用的类和结构声明(PLT 方案)。
还支持替代的“def”语法,例如 Gerbil Scheme 中的语法,例如 defstruct、defsyntax 等。
挑选的理由define
hunk headers 的形式是因为它通常是定义程序结构的唯一重要形式,并且它是策划者使用本地函数定义来隐藏其可见性的常见模式,因此它不仅是顶层define
是您感兴趣的。
策划者还使用宏扩展语言以提供他们自己的定义形式(例如,类似define-test-suite
)这也被捕获在 hunk header 中。
由于使用类似形式的变体扩展语法是常见的做法module+
, class*
等等,这些也得到了支持。
正则表达式这个词是尽最大努力去符合R7RS(第 2.1 节)有效的标识符、符号和数字。
gitattributes
现在包含在其man page:
在 Git 2.33(2021 年第 3 季度)中,C# 的 userdiff 模式学习了令牌“record
".
See commit c4e3178 (02 Mar 2021) by Julian Verdurmen (304NotModified).
(Merged by Junio C Hamano -- gitster -- in commit f741069, 08 Jul 2021)
userdiff: 添加对 C# 记录类型的支持
Signed-off-by: Julian Verdurmen
Reviewed-by: Johannes Schindelin
C# 9 中添加记录
代码示例:
public record Person(string FirstName, string LastName);
有关更多信息,请参阅https://learn.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-9
在 Git 2.34(2021 年第 4 季度)中,“java”语言的 userdiff 模式已更新。
See commit a8cbc89 (11 Aug 2021) by Tassilo Horn (tsdh).
(Merged by Junio C Hamano -- gitster -- in commit a896086, 30 Aug 2021)
userdiff: 改进 java hunk header 正则表达式
Signed-off-by: Tassilo Horn
Currently, the git diff(man) hunk headers show the wrong method signature if the method has a qualified return type, an array return type, or a generic return type because the regex doesn't allow dots (.)
, []
, or <
and >
in the return type.
Also, type parameter declarations couldn't be matched.
添加几个 t4018 测试,断言不同情况下的正确块标头:
- 枚举不断变化
- 具有有界类型参数的泛型方法的更改
- 使用通配符更改通用方法
- 嵌套类中的字段更改
而且,在 Git 2.34(2021 年第 4 季度)中,C++ 语言的 userdiff 模式已更新。
See commit 386076e (24 Oct 2021), commit c4fdba3, commit 637b80c, commit bfaaf19 (10 Oct 2021), and commit 350b87c, commit 3e063de, commit 1cf9384 (08 Oct 2021) by Johannes Sixt (j6t).
(Merged by Junio C Hamano -- gitster -- in commit f3f157f, 25 Oct 2021)
例如:
userdiff-cpp:允许在数字中使用数字分隔单引号
Signed-off-by: Johannes Sixt
从 C++17 开始,单引号可以用作数字分隔符:
3.141'592'654
1'000'000
0xdead'beaf
使其为 cpp 驱动程序的单词正则表达式所知,以便数字不会在单引号处拆分为单独的标记。
使用 Git 2.40(2023 年第一季度),userdiff
包括 Java 语言的正则表达式更新。
See commit 93d52ed, commit 575e6fc, commit 39226a8 (08 Feb 2023) by Andrei Rybak (rybak).
(Merged by Junio C Hamano -- gitster -- in commit 4a6e6b0, 15 Feb 2023)
userdiff:支持Java密封类
Signed-off-by: Andrei Rybak
Reviewed-by: Johannes Sixt
Java 17 中添加了一种新的类——密封类(请参阅"JEP 409:密封课程"").1
此功能包括几个可能出现在类声明中的新关键字。
类名之前的新修饰符:“sealed”和“non-sealed”,以及类名后面由关键字“permits”标记的子句。
当前的正则表达式集userdiff.c已经允许修饰符“sealed
”和“permits
”子句,但不是修饰符“non-sealed”,这是Java中第一个连字符的关键字(参见“JEP 草案:Java 语言的关键字管理").
允许类型名称前面的单词中的连字符与“匹配”non-sealed
” 修饰符。