Vim、LaTeX、自动换行和版本控制

10
我正在vim中编写LaTeX文档,将其硬换行到80个字符以便于阅读。但是,这会导致在版本控制中跟踪更改时出现问题。例如,在此文本开头插入“Lorem ipsum”:

1 Dolor sit amet, consectetur adipiscing elit. Phasellus bibendum lobortis lectus
2 quis porta. Aenean vestibulum magna vel purus laoreet at molestie massa
3 suscipit. Vestibulum vestibulum, mauris nec convallis ultrices, tellus sapien
4 ullamcorper elit, dignissim consectetur justo tellus et nunc. 

结果为:

1 Lorum ipsum dolor sit amet, consectetur adipiscing elit. Phasellus bibendum
2 lobortis lectus quis porta. Aenean vestibulum magna vel purus laoreet at
3 molestie massa suscipit. Vestibulum vestibulum, mauris nec convallis ultrices,
4 tellus sapien ullamcorper elit, dignissim consectetur justo tellus et nunc.

当我在git中查看此更改时,它告诉我整段文字的所有行都因换行而更改,即使只有一个语义上的更改发生。解决此问题的一种方法是让每个句子单独占一行。这在呈现的文档中看起来相同,但源代码现在难以阅读,因为每行长度相差很大:

1 Lorum ipsum dolor sit amet, consectetur adipiscing elit.
2 Phasellus bibendum lobortis lectus quis porta.
3 Aenean vestibulum magna vel purus laoreet at molestie massa suscipit.
4 Vestibulum vestibulum, mauris nec convallis ultrices, tellus sapien ullamcorper elit, dignissim consectetur justo tellus et nunc.

(如果我在80个字符上换行,情况仍然不好,只是以另一种方式出现了问题。)

是否可能将文本保存在磁盘上,每个句子之间有一个换行符,但在vim中显示和编辑时,每段文本都像一行长文本一样软换行到80个字符?我假设这需要一些vim技巧而不是调整git或LaTeX。


嗯,之前看到过这个问题,我认为你对软换行的解决方案的猜测是正确的,但我不记得在哪里可以找到那个“vim-foo”了... - Gabriel Ščerbák
3个回答

17

无需引入奇怪的编辑策略:你要找的 git 功能是使用 git diff --color-words 来查看更改。


3
谢谢!这比我预期的要简单得多。 - Bkkbrad
3
为了澄清,Git 仍将所有行视为更改,但它会很好地突出显示已更改的单词。 - Bkkbrad
1
@Bkkbrad:是的,它只是改变了diff向您呈现该更改的方式。顺便说一下,对于git、CVS或SVN,您可以使用vim的差异视图和vcscommand插件(http://code.google.com/p/vcscommand/)。它除了突出显示更改的块外,还会突出显示更改的单词。 - Benjamin Bannier
谢谢!我期待着尝试一下。 - Bkkbrad

1

我认为另一种方法是像我通常做的那样改变vim窗口的宽度:

  1. 首先,在.vimrc中添加"set wrap"以启用"wrap"功能;

  2. 对于在虚拟终端中运行vim,我总是将终端窗口宽度设置为80个字符(例如"urxvt -geometry 80x38")。因此,每当我在虚拟终端中编辑文件时,如果一行包含超过80个字符,它将自动换行。

  3. 如果您喜欢gvim(gtk-vim,gnome-vim),您可以通过在.gvimrc中添加一行来设置gvim窗口的大小,例如"set lines=38 columns=80"。

希望这有所帮助。 :-)


0
我自己也一直在思考这样的事情,最终我只能尝试几种不同的方法来看看哪种方法有效。有一件事情我肯定不满意,那就是硬换行(可以通过set textwidth=80实现),原因有几个:
每当我回去编辑以前的文本时,硬换行会出现在错误的位置。它要么超过了我的80个字符限制,要么离我的80个字符限制太远。当然,我可以通过使用不同变体的gq操作符(例如gqipgqap、可视模式然后gq)在Vim中修复这个问题,但这很繁琐,而且我经常错过gq的目标区域。对我来说,这是硬换行最大的缺点。(如果您使用gq来修复段落,则可能需要使用set nojoinspace来避免在每个句号后面获得恼人的双空格。)
我经常将Vim和PDF并排打开。每当我想在PDF的特定位置编辑某些内容时,我只需搜索文本的片段。你会惊讶于在文本中使用两个相当常见的单词的特定顺序的地方有多少,所以这确实非常有效。除非你在单词之间有硬换行,否则这会延迟我的工作流程。
我经常使用fFtT在句子内导航。这仅适用于同一行内。
还有OP提到的问题,即Git无法很好地处理硬换行的段落。当然,您仍然可以使差异看起来很好,所以这并不是一个大问题。

对我来说,使用软换行(例如每行一个句子或段落)并不是为了适应 Git 而采用的“奇怪编辑策略”。这是一种(也许有点奇怪的)编辑策略,我使用它来方便和高效地编辑。特别是在单词中间出现的软换行看起来很丑,但可以通过 set linebreak 关闭。

如果此外你每行一个段落,你应该会得到与硬换行相同的“外观”(可以通过 gq 正确维护),并且你可以使用 () 在句子之间导航。每行一个句子将会得到更加不规则的右边缘,但是由于 Git 和 Vim 提供的每行一个句子的优势,你可以尝试两种方式并决定哪种更适合你(我自己还没有决定)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接