linux gnu less:复制+粘贴时缓冲区中的长行分解

时间:2013-09-12 12:32:55

标签: bash gnu gnu-coreutils

在我的一台Linux机器中,我创建了一条长行并将它管道输入gnu,不像这样:

seq -w 1 999 | xargs echo | less

如果我选择从gnu less(版本394)中显示的文本,并将其复制+粘贴到其他位置,则将长行分解为多行,每行与终端的宽度一样长,这不是我的预期。

如果我在不同的Linux盒子(更少的版本444)中做同样的事情,我可以从gnu less缓冲区中选择并将其复制+粘贴到其他地方作为一条长行,这是所需的行为。见图:

enter image description here

粘贴到emacs中的效果,首先是未受影响的效果,下面是期望的效果:

enter image description here

在两个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时看到的相同的一致行为?

4 个答案:

答案 0 :(得分:2)

less有一个-S选项,告诉它打破长线。它默认不启用。

幸运的是,大多数less标志即使在运行时也可以更改。只需按-S即可切换长行模式/折线模式

答案 1 :(得分:2)

让我回答你的问题的“发生了什么”而不解决“如何解决它”的问题。从您的终端角度来看,catlessmore之间的主要区别在于操作模式。当你cat某事时,终端会看到实际的字符,当它到达行的末尾时,终端模拟器有责任引起换行。现代终端模拟器记住它们是否为每一行进行了这样的换行,当您复制文本时,换行符不包含在复制缓冲区中。

现在lessmore以完全不同的方式使用您的终端(使用ncurses)。这些工具可以识别终端的宽度,并且不会因溢出线而导致断线。他们将自己发布换行符。您的终端仿真程序无法将这样的换行符与“有意义”的换行符区分开来,因此当您复制文本时,这些换行符将包含在复制缓冲区中。

您实际上可以使用more选项要求-f不包含这些换行符,但对于less,由于您可以向后滚动,因此不存在相应的选项。< / p>

答案 2 :(得分:2)

我编译了较新版本的less,现在它的行为符合预期。

答案 3 :(得分:1)

这可以通过vim完成:

  1. 将文本传递给vim:

      

    seq -w 1 999 | xargs echo | vim -

  2. 设置包装(http://vim.wikia.com/wiki/Word_wrap_without_line_breaks):

      

    :设置包装   :设置linebreak
      :set nolist“list禁用linebreak
      :设置非数字“隐藏行号以不复制它们

  3. 复制并粘贴!

  4. afaik,唯一的缺点是vim打开大文件(几十兆字节)比慢一点慢。虽然可以修复,但请参阅http://vim.wikia.com/wiki/Faster_loading_of_large_files