less 能像 fmt 那样换行吗?

less 能像 fmt 那样换行吗?

和大多数人一样,我将其用作less终端寻呼机。偶尔我会查看由很长的纯文本或带标记的文本组成的文件。默认情况下less 褶皱这些行位于终端窗口边缘。也就是说,单词在最后一列被打断,使得文本难以阅读。有没有less办法单词边界处的行,fmt与 Emacs 可视行模式相同?

我知道我可以fmt在查看输入之前简单地将其通过管道传输,但这需要我提前知道我的终端宽度。我希望有某种方法可以less很好地换行,并在调整终端窗口大小时自动重新格式化它们。

答案1

不。为了验证,请下载最新less来源并检查input.c第 178 行左右:

177             /*
178              * The char won't fit in the line; the line
179              * is too long to print in the screen width.
180              * End the line here.
181              */
182             if (chopline || hshift > 0)
183             {
184                 do
185                 {
186                     if (ABORT_SIGS())
187                     {
188                         null_line();
189                         return (NULL_POSITION);
190                     }
191                     c = ch_forw_get();
192                 } while (c != '\n' && c != EOI);
193                 new_pos = ch_tell();
194                 endline = TRUE;
195                 quit_if_one_screen = FALSE;
196             } else

从性能角度来看,以这种方式进行格式化fmt并非易事。该fmt算法是关于50线正向和反向扫描以获得最佳布局。另外,fmt如果您想要的宽度明显大于实际内容,则该算法看起来(在我看来)很不稳定,因此它可能不是很好的通用算法。

manless -is默认使用,在我看来非常好,但不是你想要的。

所以......我认为唯一的方法是,尽管它确实不遵循终端调整大小:

fmt -w $(tput cols) | less

答案2

摘录自更少的手册页

-S or --chop-long-lines
    Causes lines longer than the screen width to be chopped rather than folded.
    That is, the portion of a long line that does not fit in the screen width
    is not shown. The default is to fold long lines; that is, display the
    remainder on the next line.

答案3

我发现最好的选择是使用 fmt 来格式化文本并将其通过管道传输到 less 中。

fmt file_name | less

这将实现您所寻求的。

相关内容