【问题标题】:Change wrap width in a text file using Vim使用 Vim 更改文本文件中的换行宽度
【发布时间】:2009-08-23 12:40:11
【问题描述】:

我想格式化 srt 字幕文本文件以避免在我的媒体播放器上出现换行问题。

我需要将换行宽度设置为多个字符,例如43

我可以使用 Editplus 来做到这一点,它是一个内置功能并且运行良好。我想在 Vim 中做的原因,首先 Editplus 只能在 PC 上使用,其次 Vim 很糟糕。

我在网上找到了以下解决方案..

:set tw=43
gggqG

它确实有效,但不完全是我想要的。

例如

我有这段文字:

557
00:47:39,487 --> 00:47:42,453
我将不得不完成一些程序,
我让你看看它们对我来说是什么

格式化后,我得到:

557 00:47:39,487 --> 00:47:42,453 我会
必须完成一些手续,我
要求您检查它们的用途

它似乎忽略了换行符/CR。如您所见,“我会”已添加到第一行。

如何让它不忽略换行符?

编辑:关于格式的apoligies,第一次使用stackoverflow!

【问题讨论】:

  • 它看起来像是按段落格式化的(奇怪的是你的命令是正确的)。

标签: text formatting editor vim


【解决方案1】:

您可以使用formatoptions 的空白选项,并将要换行的行以空白结尾。

:set tw=43
:set fo+=w
:g/^\a/s/$/ /
gggqG

第三行在任何以字母开头的行末尾添加一个空格,fo+=w 阻止gq 加入不以空格结尾的行。

见:

:help fo-table
:help 'formatoptions'
:help gq
:help :g

响应 cmets 编辑

:g/^\a/s/$/ /

这转化为:

:g/   " Search the file
^\a   " For lines starting (^) with an alphabetic character (\a - equivalent to [A-Za-z])
/     " Then on each line that the regexp matches (i.e. each line starting with an alphabetic character)
s/    " Substitute...
$     " The end of line (zero-width match at the end of the line)
/ /   " With a space (slashes are delimiters)

全局 (:g) 命令只会对当前文件进行操作,但 textwidthformatoptions 行将持续整个会话。如果您希望这些选项仅用于当前缓冲区,请改用 :setlocal

:setlocal tw=43
:setlocal fo+=w
:help :setlocal

【讨论】:

  • 太棒了!这现在模仿了 Editplus 的行为。但是,erichui 的答案的某些方面效果更好。因为这个解决方案仍然考虑换行符,如果一个单词超过 43 个字符标记,它会被推到下面的行,但它仍然会保持原始换行符,因此一行可能只有一个单词,然后是另一个线,只是看起来很奇怪。但这只是现在大惊小怪!谢谢艾尔:)
  • “:g/^\a/s/$/ /”到底是什么意思?同样,一旦我运行了该命令,Vim 似乎会为我在该会话中打开的任何文档记住它,如何在不重新打开 Vim 的情况下将其重置为默认值?
  • @Jon:我添加了对 :g/// 的解释。还解释了如何使设置缓冲区本地化。我不确定我是否理解关于一行有一个单词的评论:据我了解,如果所有行都以空格结尾,gq 应该将它们整理出来。或许你可以举个例子?
【解决方案2】:

如果您要换行的唯一行是以文本开头的行(忽略以数字开头的行),您可以使用以下内容。

:g/^[a-zA-Z]/normal gqq

这将在文件的每个文本行上运行p00ya's command

【讨论】:

    【解决方案3】:

    使用以下文本(即只有 3 行):

    557
    00:47:39,487 --> 00:47:42,453
    I will have to complete some procedures, and I asked you to check out what they are for me
    

    在设置tw 后,在第三行使用gqq(格式化当前行)。按段落格式化将不起作用,因为 vim 会将所有 3 行视为同一段落的一部分(段落仅以空行结尾)。

    【讨论】:

    • 不幸的是,这不适合,因为单个文本文件将由数百个“块”组成。从第 577 个例子来看!所以编辑一个段落会很费时间。我正在寻找一种方法来自动化整个文件的过程,就像 gggqG 所做的那样。
    【解决方案4】:

    虽然不是很健壮(或优雅),但如果您可以假设字幕行不以数字开头,您可以将 Vim 配置为将它们视为 cmets。

    :set comments=:0,:1,:2,:3,:4,:5,:6,:7,:8,:9
    gggqG
    

    以 0-9 开头的行将被视为 cmets,不会与文本合并在一起。

    【讨论】:

      【解决方案5】:

      由于您帖子的格式,我无法确切看到问题出在哪里,但您可能想查看 vim 帮助中的 'formatoptions' 设置,特别是 :he fo-table,其中包含一堆自定义标志。

      This link 可能有用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-05
        • 2014-05-07
        • 2011-09-30
        • 1970-01-01
        • 2011-03-29
        • 1970-01-01
        相关资源
        最近更新 更多