我刚刚发现我可以将以下行添加到~/.vimrc
.
set mouse=a
:vmap <C-C> "+y
其效果是能够使用鼠标选择文本(即在视觉模式下),然后使用Ctrl+将实际文本复制到 X 剪贴板c。这与终端的默认副本不同,因为它是我正在复制的真实文本,而不是终端看到的内容。例如,如果文本中有制表符,那么以前我会将它们复制为空格。
有没有办法让更少的人以同样的方式行事?即我可以逐字复制我正在查看的文本文件中的内容吗?
答案1
不是一项任务少
不,
我不认为你可以直接这样做,因为 less 一开始就没有游标。
它需要导航到要选择的文本的开头和结尾。
less
只是不是字符级导航的正确工具。
选项卡已展开
您可以使用按键shift和鼠标进行选择;这是由终端处理的,而不是更少。但是终端不知道空格和制表符是如何排列的 - 内部对制表符的解释较少,并且只将普通的“ ”字符写入屏幕。
有像screen
、tmux
和 之类的工具byobu
,它们可以在这个领域做很多令人印象深刻的事情。我没有检查,但我假设这些终端多路复用器没有办法解决这个问题 - 最终是终端 - 并且行为相同。
使用vim
如果您要在 中显示文件less
,有一个很好的解决方案:按in
键打开当前文件- 假设您的等设置为。vless
vim
$EDITOR
vim
当从管道等显示标准输入时,这不起作用,尽管有解决方法。
至少鼠标滚动
但你至少可以用鼠标滚轮滚动:
这似乎甚至是默认启用的,但鼠标滚轮事件被不同的选项抑制。
要进行快速测试,请尝试:
LESS=-r man less
选项-X
( --no-init
) 阻止滚动 - 检查您的环境变量LESS
包含的内容:
$ echo $LESS
根据说法,选项-q
( --quiet
, ) 也会引起麻烦--silent
SU:如何使用 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
将不是其空白行被挤压(因此行号偏移可能是错误的))。