我可以在Vim中证明文本合理吗?


38

我曾经在Pico或Nano中而不是在Vim中编辑文本文件的唯一原因是其“ Justify”命令^J。它将重新格式化文本的一段,在换行符处创建换行符,以便文本可以很好地浮动在固定宽度的屏幕上-格式化文本以适合预定义的80列,仅在换行符之间创建换行符。由于功能的局限性,无论是格式化冗长的注释块,文档文件,还是只是用更易读的内容替换无尽的参数行,它都非常有用。

我可以在Vim中做类似的事情吗?

Answers:


37

可以将gqgw运算符与运动命令结合使用。默认情况下,它使用fmt程序(在Linux中)格式化给定的文本。但是,据我所知,它不能使线条合理,因此您将获得边缘不整齐的空白。

我使用它的方式是gwip将光标放在段落上(正常模式)。这将格式化当前段落,使光标保持在同一位置。我用这种方式来确保仅格式化当前段落。编辑文本文件时,gwG在文件开始处发出(普通模式)将格式化整个文本。作为一种好习惯,请确保在段落之间至少留出一个空白行。

有很多可以完成的配置。首先,这里有一些相关的帮助::h gq:h gw:h fo(格式选项), :h fp(格式化程序), :h fo-table(可能的选项的说明)。


1
gq / gw绝对是必经之路。要添加到此消息,您可以更改格式程序以使其具有更多选项。结帐vimcasts.org/episodes/formatting-text-with-par
Bambu

3
默认情况下,Vim不使用任何外部程序,尽管您可以通过设置'formatprg'选项来选择使用一个外部程序。
jamessan 2015年

15

这个主题上有很棒的VimCast。

http://vimcasts.org/episodes/formatting-text-with-par/

基本上,您需要安装par

$ brew install par
# or
$ sudo apt-get install par

然后,由于您希望将列包装为80列:

:set formatprg=par\ -w80

现在,您可以gq像其他答案(例如gqip)一样使用运算符,它将使用Par代替Vim的内置格式化程序。

Par非常高级,它将很好地格式化注释:

/* This is a long */
/* multiline comment */

11

来自:help usr_25

JUSTIFYING TEXT                                                                 

Vim has no built-in way of justifying text.  However, there is a neat macro     
package that does the job.  To use this package, execute the following          
command:                                                                        

        :runtime macros/justify.vim                                             

This Vim script file defines a new visual command "_j".  To justify a block of  
text, highlight the text in Visual mode and then execute "_j".

所以,您要做的就是运行

:ru macros/justify.vim

然后输入

_j

使整个文件中的文本对齐。

(当然,您也可以添加ru macros/justify.vim.vimrc,这样就不必每次都键入它。)

:这并不能添加换行符为您服务。您必须使用手动添加gq。为此,您还必须通过以下方式将textwidth(默认值为0)设置为所需的值

set textwidth=80

以及(如果需要)通过设置t-flag通过

set formatoptions+=t

如果需要,可以在.vimrc中设置一个映射来为您完成整个操作:

nnoremap <C-j> gggqG_j

这将移至文件(gg)的开头,包装所有行(gq直到G),然后_j修饰文本。


有关格式的详细信息,请参阅:VIM用户手册-编辑格式化的文本
Suuuehgi 2015年

我刚刚发现了:set fo+=a用于自动重新格式化整个段落的非常有用的选项。看看:help fo-table其他选项。还有是一个很好的视频教程在这里
Suuuehgi 2015年

+1是一个完全内置的解决方案。_j宏添加的映射似乎为我证明了整个文件的合理性,或者可以通过逐行视觉选择来限制它。
ches

5

虽然nano的帮助将^J命令称为“ Justify”,但实际上并不能证明文本的合理性,它会重新格式化文本,以在屏幕右边界(或我认为在某些可配置的列)之前的行前打断行。

您可以通过textwidth:help 'textwidth'以下位置设置变量在VIM中执行相同的操作:

所插入文字的最大宽度。空格后,较长的线将被折断以获得该宽度。零值将禁用此功能。

也就是说:在键入时,如果一行比textwidth字符长,VIM将在第一行换行以使行长小于或等于textwidth

为此,该选项formatoptions必须包含字母t。请参阅:help 'formatoptions':help fo-table中的可用选项,例如,您可能c对使格式化与注释一起使用的选项感兴趣。

编辑:您可以执行相同的操作,而不需要把tformatoptions使用命令gw{motion},它格式化当前光标位置和之后的光标位置之间的文本{motion}。该gw命令在可视模式下也可用,它格式化选定的文本。


1
这对打字很有好处。我可以将其应用于预先存在的文本吗?
SF。

3

这是两个简单的选项:

  1. 选择一个文本块,键入 !fmt
  2. 将光标放在块的开始处,键入 !}fmt

两者都向unix发送了一段文本fmt,请参见man fmt选项。您可以从vim传递选项参数。例如,要格式化50个字符宽的块,请键入!}fmt -w 50


对此感到抱歉,现在已修正
kaan 2015年

如果您不喜欢结果,也可以通过键入:%!fmt和单个撤消来格式化整个文件u
2015年

-1

使用可视命令标记文本,然后使用:

:!par 40j 

其中40是列宽,j表示对齐。


2
欢迎来到我们的网站!您的问题当前质量低下,因为它缺少有关您正在使用的工具(par)以及解决方案为何起作用的解释。您可能需要添加更多详细信息,以提高答案的质量并使之对将来的读者更有用。
statox
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.