【发布时间】:2018-07-31 22:48:17
【问题描述】:
问题
我正在尝试应用this SO answer 中的解决方案。我也试图让this solution to the same question 工作,但在这两种情况下我都没有成功。这两个都使用干净/涂抹属性过滤器。
目标是提高 Git 处理要处理的文件 (LaTeX) 的能力。
我做了什么
简短的回答“你做了什么”是“解决方案说要做什么”,但如果我看过一些东西,我会详细介绍。
我研究过的一个潜在问题是答案可能已过时。通过查看Git Attributes Documentation,我认为唯一可能过时的是配置文件的位置。出于这个原因,我在 repo 的根目录中有一个 .gitattributes 文件以及一个 .git/info/attributes 文件。我也只尝试过其中一种。
Word-by-word
虽然不是我希望得到的解决方案,但我认为我应该尝试不止一种,以期更好地确定问题所在。我选择复习这个,因为我至少可以让脚本在 Git 之外工作。
在我的配置文件中
[filter "wordbyword"]
clean = /home/nero/myScripts/wordbyword.clean
smudge = /home/nero/myScripts/wordbyword.smudge
我将上述位置复制并粘贴到前面带有vim 的终端中(所以你知道我没有在那里打错字)并粘贴下面的内容。首先是clean,然后是smudge,尽管要使用后者,前者必须工作。 . .这是问题所在。
#!/usr/bin/perl
use strict;
use warnings;
while (<>)
{
print "$_\n" foreach (m/(.*?\s+)/go);
print '#@#DELIM#@#' . "\n";
}
和
#!/usr/bin/perl
use strict;
use warnings;
while (<>)
{
chomp; '#@#DELIM#@#' eq $_ and print "\n" or print;
}
属性文件就是*.tex filter=wordbyword
但是,当我运行git show HEAD:file.tex 时,它显示它正在正常存储。
我知道脚本有效。当我运行perl wordbyword.clean test.tex 时,输出符合预期。
在四处寻找之后,我发现我实际上确实有两个文件告诉 Git 需要对 .tex 文件做什么。我把一个放在全球位置。哎呀。这个现在有效。 . .还有下一个。至少在清洁方面。在我回答我自己的问题之前,我现在要检查一下污迹。
Sentence by Sentance.
这是我更喜欢的一个。对我来说,以逻辑单元存储文件似乎是最合理的。段落是一个逻辑单元,但它太大而无法有效处理。一个句子是逻辑单元的下一个大小,大约是对的。
这实际上是更简单的一个,因为它不是脚本,而是简单的一行 perl 替换。
[filter "sentencebreak"]
clean = perl -pe \"s/[.]*?(\\?|\\!|\\.|'') /$&%NL%\\n/g unless m/%/||m/^[\\ *\\\\\\]/\"
smudge = perl -pe \"s/%NL%\\n//gm\"
带有属性*.tex filter=sentencebreak
但是,当我使用perl -pe "that long line" < test.tex 运行替换而不是在每个句点打印换行符时,它会在每个空白处打印\n(并且只留下句点)。我发现\\n 似乎正在转义换行符。将其更改为 \n 会导致它产生换行符,但它仍然会在空白处中断,这不是我想要的。
仔细观察那个 perl 替换(我不擅长 perl),我发现它转义了标点符号。删除额外的\“混合”那部分。
【问题讨论】:
-
*.tex filter=wordbyword(k => d). -
我假设这是对我需要做的事情的简要说明,但我不确定我理解您所说的“(k=>d)”是什么意思。
-
哦!我懂了。一个错字。我会解决这个问题,看看它是否有效。我也会检查另一个(我真正想要的)的那种东西。谢谢。那并没有解决问题。它仍然什么都不做。