和大多数人一样,我将其用作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
如果您想要的宽度明显大于实际内容,则该算法看起来(在我看来)很不稳定,因此它可能不是很好的通用算法。
man
less -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
这将实现您所寻求的。