在我的一台Linux机器中,我创建了一条长行并将它管道输入gnu,不像这样:
seq -w 1 999 | xargs echo | less
如果我选择从gnu less
(版本394)中显示的文本,并将其复制+粘贴到其他位置,则将长行分解为多行,每行与终端的宽度一样长,这不是我的预期。
如果我在不同的Linux盒子(更少的版本444)中做同样的事情,我可以从gnu less
缓冲区中选择并将其复制+粘贴到其他地方作为一条长行,这是所需的行为。见图:
粘贴到emacs中的效果,首先是未受影响的效果,下面是期望的效果:
在两个linux框中,如果我使用cat
而不是更少并从终端输出中选择,我也可以将所有内容复制+粘贴到一行:
seq -w 1 999 | xargs echo > /tmp/f
cat /tmp/f
相比之下,在两个linux框中,more
命令的行为相反,在选择复制和粘贴时也将长行分解为多行:
seq -w 1 999 | xargs echo > /tmp/f
more /tmp/f
任何想法可能会发生什么?如何从gnu less
缓冲区复制+粘贴,并且具有我在cat
时看到的相同的一致行为?
答案 0 :(得分:2)
less
有一个-S
选项,告诉它打破长线。它默认不启用。
幸运的是,大多数less
标志即使在运行时也可以更改。只需按-S
即可切换长行模式/折线模式
答案 1 :(得分:2)
让我回答你的问题的“发生了什么”而不解决“如何解决它”的问题。从您的终端角度来看,cat
和less
或more
之间的主要区别在于操作模式。当你cat
某事时,终端会看到实际的字符,当它到达行的末尾时,终端模拟器有责任引起换行。现代终端模拟器记住它们是否为每一行进行了这样的换行,当您复制文本时,换行符不包含在复制缓冲区中。
现在less
和more
以完全不同的方式使用您的终端(使用ncurses)。这些工具可以识别终端的宽度,并且不会因溢出线而导致断线。他们将自己发布换行符。您的终端仿真程序无法将这样的换行符与“有意义”的换行符区分开来,因此当您复制文本时,这些换行符将包含在复制缓冲区中。
您实际上可以使用more
选项要求-f
不包含这些换行符,但对于less
,由于您可以向后滚动,因此不存在相应的选项。< / p>
答案 2 :(得分:2)
我编译了较新版本的less,现在它的行为符合预期。
答案 3 :(得分:1)
这可以通过vim完成:
将文本传递给vim:
seq -w 1 999 | xargs echo | vim -
设置包装(http://vim.wikia.com/wiki/Word_wrap_without_line_breaks):
:设置包装 :设置linebreak
:set nolist“list禁用linebreak
:设置非数字“隐藏行号以不复制它们
复制并粘贴!