我可以使用鼠标在 less 中正确选择文本吗?

我可以使用鼠标在 less 中正确选择文本吗?

我刚刚发现我可以将以下行添加到~/.vimrc.

set mouse=a
:vmap <C-C> "+y

其效果是能够使用鼠标选择文本(即在视觉模式下),然后使用Ctrl+将实际文本复制到 X 剪贴板c。这与终端的默认副本不同,因为它是我正在复制的真实文本,而不是终端看到的内容。例如,如果文本中有制表符,那么以前我会将它们复制为空格。

有没有办法让更少的人以同样的方式行事?即我可以逐字复制我正在查看的文本文件中的内容吗?

答案1

不是一项任务少

不,
我不认为你可以直接这样做,因为 less 一开始就没有游标。
它需要导航到要选择的文本的开头和结尾。
less只是不是字符级导航的正确工具。

选项卡已展开

您可以使用按键shift和鼠标进行选择;这是由终端处理的,而不是更少。但是终端不知道空格和制表符是如何排列的 - 内部对制表符的解释较少,并且只将普通的“ ”字符写入屏幕。

有像screentmux 和 之类的工具byobu,它们可以在这个领域做很多令人印象深刻的事情。我没有检查,但我假设这些终端多路复用器没有办法解决这个问题 - 最终是终端 - 并且行为相同。

使用vim

如果您要在 中显示文件less,有一个很好的解决方案:按in
键打开当前文件- 假设您的等设置为。vlessvim$EDITORvim

当从管道等显示标准输入时,这不起作用,尽管有解决方法

至少鼠标滚动

但你至少可以用鼠标滚轮滚动:

这似乎甚至是默认启用的,但鼠标滚轮事件被不同的选项抑制。

要进行快速测试,请尝试:

LESS=-r man less

选项-X( --no-init) 阻止滚动 - 检查您的环境变量LESS包含的内容:

$ echo $LESS

根据说法,选项-q( --quiet, ) 也会引起麻烦--silentSU:如何使用 bash 和 gnome-terminal 让鼠标滚轮滚动 less 寻呼机?

答案2

less您可以通过键入以下命令将显示的顶行复制到 X11 CLIPBOARD 选择中less

|.head -n1|xclip -sel c<Enter><Enter>

这会将 less 缓冲区从顶行到.标记(因此实际上是整个屏幕内容)传输到命令head -n1|xclip -sel c(以将第一行存储在剪贴板选择中)

您可以将终端模拟器配置为在给定的按键上粘贴该字符串,或者将其绑定到less键绑定中的键或键组合。例如,将其绑定到Alt+C

printf '%s\n' '#commands' '\ec pipe .head -n1|xclip -sel c\n' | lesskey -

但请注意,您将Enter在此之后按 确认“|完成(按 RETURN)”提示。

使用xterm,您还可以定义一个新的选择模式,例如在Ctrl+Alt扩展选择时按住,告诉less从当前屏幕复制哪些行:

编写lesspaste如下脚本:

#! /bin/sh -
start=${1%%";"*}
end=${1#*" "}
end=${end%";"*}
head -n "$((end))" | tail -n "$((end - start + 1))" | xclip -sel c

并定义 xterm 转换表(此处在命令行上进行测试,但您需要将其添加到 X 资源文件中):

xterm -xrm 'XTerm.VT100.translations: #override \
  Meta Ctrl<Btn1Down>: select-start()\n\
  Meta Ctrl<Btn1Motion>: select-extend()\n\
  Meta Ctrl<Btn1Up>: select-end(SECONDARY) \
    insert-formatted("|.lesspaste '\''%P %p'\''\n\n", SECONDARY)'

然后,您可以通过按住鼠标拖动来标记要粘贴的行Ctrl+Alt,并在释放按钮 1 时,xterm 会告诉 less 将当前屏幕通过管道传输到我们的lesspaste脚本,并将开始和结束坐标作为一个参数传递 ( y1;x1 y2;x2)。

less(请注意,如果调用 来-s挤压空白行(通常由 调用时),则它可能无法正常工作,man因为馈送到的输入lesspaste不是其空白行被挤压(因此行号偏移可能是错误的))。

相关内容