6

在我的一台 Linux 机器上,我创建了一条长线并将其通过管道传输到 gnu 中,如下所示:

seq -w 1 999 | xargs echo | less

如果我选择从 gnu less(版本 394)出现的文本,然后将其复制并粘贴到其他地方,那么长行将分成多行,每行与终端的宽度一样长,这不是我所期望的。

如果我在不同的 Linux 机器(版本 444)中做同样的事情,我可以从 gnuless缓冲区中选择并将其复制粘贴到其他地方作为一个单一的长行,这是所需的行为。见图片:

在此处输入图像描述

粘贴到emacs中的效果,首先效果欠佳,想要的效果如下:

在此处输入图像描述

在这两个 linux 框中,如果我使用cat而不是 less 并从终端的输出中选择,我还可以在一行中复制+粘贴所有内容:

seq -w 1 999 | xargs echo > /tmp/f
cat /tmp/f

相比之下,在这两个 linux 框中,该more命令的行为相反,在选择复制+粘贴时也将长行分解为多行:

seq -w 1 999 | xargs echo > /tmp/f
more /tmp/f

任何想法可能会发生什么?如何从 gnuless缓冲区复制+粘贴,并具有与我在执行操作时看到的相同的一致行为cat

4

4 回答 4

2

让我回答您问题的“发生了什么”部分,而不涉及“如何解决它”部分。从终端的角度来看,cat两者之间less的主要区别在于操作模式。more当你cat做某事时,终端会看到实际的字符,当它到达行尾时,终端仿真器有责任导致换行。现代终端仿真器会记住他们是否为每一行都做了这样的换行符,并且当您复制文本时,换行符不包含在复制缓冲区中。

现在lessmore以完全不同的方式使用您的终端(使用 ncurses)。这些工具知道终端的宽度,不会因溢出行而导致换行。他们将自己发出换行符。您的终端仿真器无法区分这样的换行符和“有意义的”换行符,因此当您复制文本时,这些换行符包含在复制缓冲区中。

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

于 2013-09-14T18:53:30.863 回答
2

less有一个-S选项告诉它打破长线。默认情况下未启用。

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

于 2013-09-13T08:45:50.477 回答
2

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

于 2013-09-15T16:58:05.740 回答
1

这可以用 vim 完成:

  1. 管道文本到 vim:

    序列-w 1 999 | xargs 回声 | vim -

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

    :set wrap
    :set linebreak
    :set nolist " 列表禁用
    换行 :set nonumber " 隐藏行号不复制它们

  3. 复制和粘贴!

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

于 2014-12-24T19:12:31.267 回答