我可以使用鼠标正确选择更少的文字吗?


9

我刚刚发现可以在中添加以下行~/.vimrc

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

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

有没有办法减少行为方式相同的行为?即我可以逐字复制正在查看的文本文件中的内容吗?


您是否尝试过gpm?
YoMismo

@YoMismo不。我不确定如何帮助,因为在上面的示例中,终端仿真器仍将包含文字空间而不是制表符。
Sparhawk

抱歉,我以为您在控制台而不是X终端中工作:-/
YoMismo 2014年

Answers:


5

少花一笔钱

不,
我认为您不能直接做到这一点,因为less开头没有光标。
它需要一个导航才能选择文本的开头和结尾。
less并不是字符级导航的正确工具。

标签页已展开

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

有喜欢的工具screentmux 并且byobu,它可以做很多让人印象深刻在这个区域。我没有检查,但我假设这些终端多路复用器没有解决办法-最终是终端-并会表现相同。

使用vim

如果您在显示一个文件less,有一个很好的解决方案:
按键vless中打开当前文件vim- asuming你$EDITOR等设置的vim

从管道等显示stdin时,此方法不起作用,尽管有解决方法

至少滚动鼠标

但是您至少可以使用鼠标滚轮滚动:

这似乎甚至默认情况下处于启用状态,但是鼠标滚轮事件被其他选项抑制。

为了进行快速测试,请尝试:

LESS=-r man less

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

$ echo $LESS

选项-q--quiet--silent)也引起麻烦,根据SU:如何使鼠标滚轮滚动使用bash和gnome末端少寻呼机?


好答案。该v关键是太棒了!(我已经采取了一种很酷的解决方法来使它也可以在管道中使用。)终端仿真器(终止符)中的FWIW选择文本时,我不必按住shift键。
Sparhawk

@Sparhawk嘿,解决方法至少同样出色!
Volker Siegel 2014年

2
此外,还有一个称为的传呼机vimpager,您可以用它来代替less批发。它实际上只是使用vim包装在一个小的脚本中的。
HalosGhost 2014年

1
@HalosGhost谢谢你。vimpager看起来很酷,但是拉动确实存在问题,这使我更喜欢使用更少和v
Sparhawk

@Sparhawk从技术上讲,您可以比较使用的vimrc,或使用正常vimrc的一部分进行vimpager工作,直到它起作用为止。(我努力在启动vim时不激活所有插件vimpager...)
Volker Siegel 2014年

3

您可以less通过输入来将显示的第一行复制到X11 CLIPBOARD选择中less

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

这会将较少的缓冲区从顶行到.标记(实际上是整个屏幕内容)通过head -n1|xclip -sel c管道传递给命令(以将其第一行存储在CLIPBOARD选择中)

您可以配置终端仿真器以在给定的按键上粘贴该字符串,或将其绑定到按键绑定中的按键或按键组合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,并在释放Button 1时,xterm不会告诉我们将当前屏幕通过lesspaste脚本的开始和结束坐标作为一个参数(y1;x1 y2;x2)传递给脚本。

(请注意,如果less与一起使用它-s来挤压空白行,则它可能无法正常工作(这是由调用时的典型情况man),因为馈入的输入lesspaste不会挤压其空白行(因此行号偏移量可能是错误的)) 。


@Sparhawk,请参阅编辑。
斯特凡Chazelas

它似乎对我不起作用。剪贴板上没有新内容。是less应该给任何形式的反馈?j似乎没有为我做任何事情。
Sparhawk

@Sparhawk,您是否有的任何自定义键绑定less,在默认键绑定中j向下滚动一行(forw-line)(实际上Jforw-line-force)会更好,我将进行编辑)。|应该给您一些反馈。(提示输入标记,然后输入命令)。
斯特凡Chazelas

不,我没有,但是我正在测试小于一页长的文本,所以也许这就是为什么j什么都不做的原因。现在第一个选项有效(+1)。第二个选择似乎有些复杂,但有一些警告,所以我没有尝试。我认为v对我来说已经足够了。
Sparhawk
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.