ChatGPT解决这个技术问题 Extra ChatGPT

vim 命令将文本重组/强制为 80 列

我知道有一些方法可以使用 set textwidth(如 Vim 80 column layout concerns)在 vim 中自动设置文本的宽度。我正在寻找类似于 = (缩进行命令)但要换行到 80 的内容。用例有时是您使用 textwidth 编辑文本,在加入行或删除/添加文本后,它会出现包装不佳的情况。

理想情况下,此命令将完全重新组织我选择的行,并在添加短行时切掉长行。一个例子:

long line is long!  
short

运行命令后(假设换行是 13 列):

long line is  
long! short

如果使用真正的 vim 命令无法做到这一点,那么也许有一个命令行程序可以执行此操作,我可以将输入传送到?

搜索后,我发现此参考有更多选项:http://www.cs.swarthmore.edu/help/vim/reformatting.html

您可能也有兴趣了解 Vim 可以将文本格式委托给外部程序,例如 par。我制作了一个截屏视频,演示如何format text with par
@nelstrom 谢谢,关于 par。这是梦幻般的!
当您希望文字看起来很苗条时修剪(剪得好?),总是想到 gq -- Gentleman's Quarterly。 (为男性拟人化道歉,但助记符有效。)

j
jpaugh

textwidth 设置为 80 (:set textwidth=80),移动到文件的开头(可以使用 Ctrl-Homegg 完成),然后键入 { 4}。

gqG 格式化从当前位置开始到文件末尾的文本。如果可能,它将自动加入连续的行。如果您不想将这两行连接在一起,可以在两行之间放置一个空行。


它也适用于视觉选择。即类似:V}gq。通过这种方式,您可以在实际格式化之前看到要格式化的内容。
顺便说一句,q 本身到底是什么?
有没有办法用只有一长串字符的行来做到这一点,没有空格?编辑:我发现了“折叠”实用程序。仍然想知道在 vi 中这样做。
使用 set tw=80 而不是 set textwidth=80 以节省时间
@dmranck set textwidth=76 之后,您的行将在键入时自动换行。我的抱怨是它对正在编辑的现有行没有任何作用。但是 V}gq 在这方面非常有用。 V 进入视觉选择模式,} 向下选择到下一个分节符,gq 在其上执行当前格式化程序(或使用 gw 显式调用 vi 格式化程序)。此外,{ 将向上选择。您可以使用 ggVGgq 选择整个文档和格式,但也许有更简单的方法。使用 @ 将其保存为宏以使其更容易。使用 vipgq 调出当前段落。
A
Alex Hirzel

Michael 的解决方案是关键,但我经常发现我想重新格式化当前段落的其余部分;对于此行为,请使用 gq}


对此进行扩展 - 您可以使用 gq 来格式化您想要的任何内容。
此外,'nojoinspaces' 选项可防止两个空格出现在句点之后,当行在句子边界处连接时。当您的印刷风格是英语句子之间的单个空格时,这很好。
J
JohnGH

您可以将 gq 与任何移动运算符一起使用。例如,如果您只想重新格式化到当前行的末尾(即换行光标所在的行),您可以使用 gq$

您还可以通过在可视模式下选择文本(使用 `v 和移动)然后输入 gq 来重新格式化。

还有其他选项可以强制换行。

如果您希望 vim 在您向其中插入文本时换行,而不是等到最后重新构造文本,您会发现这些选项很有用:

:set textwidth=80
:set wrapmargin=2

(不要被 wraplinebreak 绕道,它们只会重新格式化屏幕上显示的文本,不会更改缓冲区中的文本)


来自 wrapmargin 帮助:当 'textwidth' 不为零时,不使用此选项。
s
shearn89

感谢 DonaldSmith 的评论,我发现了这一点,因为 textwidth 选项没有重新格式化我的长文本行(我正在使用十六进制到字节的转换进行转换):

:%!fold -w 60

这将整个文件(对我来说是一行)重新转换为长度为 60 的行。


这是非常好的。所有的答案都集中在限制线条的宽度上,当一条线被分割成单词时。该解决方案适用于非常长的单词(DNA 序列)。
对于长网址,这是我发现的唯一可行的方法。我已经对 textwidth 有了新的了解,但它不会破坏完整的字符串(这通常是一件好事)
E
Ehtesh Choudhury

如果您正在寻找一种非 Vim 方式,则始终有 UNIX 命令 fmtpar

笔记:

我无法评论 Unicode,它的行为可能不同,也可能不同。

@nelstrom 已经在他的网络广播中提到了使用 par 。

以下是我们将如何将两者用于您的示例。

$ echo -e 'long line is long!\nshort' > 3033423.txt
$ cat 3033423.txt
long line is long!
short
$ fmt -w 13 3033423.txt
long line is
long!  short
$ par 13gr 3033423.txt
long line is
long! short

要在 Vim 内部使用:

:%! fmt -w 13
:%! par 13gr

您还可以将 :formatprg 设置为 par 或 fmt 并覆盖 gq。如需更多信息,请在 Vim 中调用 :help formatprg


n
ncmathsadist

我几乎总是在可视模式下使用 gq。我告诉我的学生它代表“绅士季刊”,这是一本为挑剔的人准备的杂志。