为什么我不能用Shift +箭头键在Linux终端仿真器中突出显示文本?


19

这些是标准的文本编辑键盘快捷键,无论何时在终端仿真器以外的任何Linux应用程序中编辑文本时,我都会不断使用它们:

  • 左右箭头可左右移动
  • Ctrl +箭头可移动整个单词
  • 起点/终点移动到行的起点/终点
  • ctrl + c / ctrl + v复制/粘贴[某些终端可以使用shift-ctrl-C / shift-ctrl-V;这是一个很好的替代品]
  • Shift +箭头突出显示文本
  • Shift + Ctrl +箭头突出显示整个单词

我从来没有发现过外壳程序与终端仿真器的组合,它允许此列表中的最后两项有效,这让我发疯。显然,终端仿真器支持突出显示(鼠标可以做到),并且它们支持将ctrl和shift键用作修饰符(它们可以用于将光标移动整个单词并分别大写字母; [edit:]它们甚至可以与shift-ctrl-C和shift-ctrl-V一起用于复制/粘贴,那么阻止此功能的问题是什么?我有几个问题:

  • 这是我的终端仿真器还是我的shell(bash,尽管我愿意更改)的问题?
  • 为什么终端仿真器/外壳不符合此通用标准?
  • 如果有实际原因,它是古老且过时的,还是仍然与大量桌面 linux用户相关?
  • 有什么解决方法吗?
  • 我可以使用一些晦涩的程序来支持它吗?
  • 修改gnome-terminal的来源以支持这一点是否可行?

我知道可以用鼠标复制/粘贴文本,这不是我要的。我在问为什么我无法在终端仿真器中使用键盘来完成这些操作。


请注意,使用鼠标选择文本不会更改光标位置。如果您将文本选择与在键盘上输入常规命令混为一谈,那么这将超出您刚刚键入但尚未执行的命令的范围,真是令人困惑。您是否可以使用键盘在网页上文本框之外选择文本?还请注意,有些程序(例如screen)允许进入其他模式,该模式可以选择整个终端的文本,但是当然不再允许输入命令。
丹尼尔·贝克

1
丹尼尔:例如,Matlab控制台是一个CLI,它允许使用键盘突出显示文本。根据我的经验,它可以完美运行;如果需要的话,它允许选择超出当前尚未执行的命令,我个人对此几乎没有用。
monguin


Answers:


5

我认为如果我一次拍下这张照片会很有用。普遍的问题是:按键是针对谁的?终端还是在终端内部运行的程序?

例如,作为终端的“屏幕”使用Ctrl+ A作为其命令的前缀,以将其与正在运行的程序本身的内容区分开。(并提供一种发送Ctrl+A。)

gnome-terminal 它捕获了用于执行各种操作的多个键,包括您所要求的一些键。

还请记住,终端的“突出显示”与终端的光标位置是分开的。有些终端根本无法突出显示。

现在,一次使用以下组合键:

向左+向右箭头可向左+向右ctrl +箭头可移动整个单词的原点/结尾以移动到行的开始/结尾

左右移动什么?可以将Bash配置为执行此操作,通常默认情况下为Bash。通常,它们移动光标位置。

ctrl + c / ctrl + v复制/粘贴

第一:复制/粘贴甚至有意义吗?如果您正在使用VT,则实际上没有剪贴板,尤其是在X不在运行时。

有些终端可以在输出中复制文本,有些还可以通过模拟您键入剪贴板的内容来“粘贴”。例如,Ctrl+ Shift+ V粘贴在中gnome-terminal,可能会有帮助。(并且Ctrl+ Shift+ C是副本。)如前所述,Ctrl+ CCtrl+ 的最大问题V是它们与常见的终端/程序命令重叠。(Ctrl+ C是发送中断(SIGINT),而Ctrl+ V是逐字记录。)

一些终端还支持两种复制数据的模式:更普通的“正当复制”以及所谓的“块选择”或“块复制”。(例如,按住Ctrl,然后拖动gnome-terminal。)

此外,xsel -b可用于管道剪贴板中的内容。取决于确切的情况,xsel还是终端的粘贴版本更有用。请参阅man xsel

Shift +箭头突出显示文本Shift + Ctrl +箭头突出显示整个单词

终端的突出显示(如果具有此功能)与光标位置是分开的。同样,缺少可用的键组合可能是一个因素。请记住,高光有两个位置:起点和终点,或者左上角和右下角。您如何同时管理两者?

最后,请注意,许多GUI终端,双击一个单词都会突出显示它。(然后在X中,复制到主要选择。)

screen例如,具有用于切换到缓冲区(先前的输出)和复制/粘贴模式的键。

我认为,如果您充分利用xsel和选择了主要内容,您会发现剪贴板操作既罕见又复杂,足以通过鼠标操作。


5
我很感谢您花时间写出答案,但是以某种方式,我觉得我对终端仿真器为什么不提供此功能没有更多的了解。您向我指出了一个新主意-终端仿真器是独特的,因为它可以运行其他程序-但我不明白为什么只有键组合的选定子集无法提供给用户。
monguin

2
终端仿真器模拟物理终端。它们不是从头开始创建以提供命令行界面。诸如Control-C之类的东西早在Microsoft决定选择将它们作为键盘快捷键之前就已经确立了含义,并且终端仿真器必须遵守它们。
chepner

2
我认为魔鬼在这里。这并非不可能:我认为屏幕可以执行您想要的操作。但是要实现它,您必须切换到“我要选择东西”模式。gnome-terminal也会有类似的问题:他们可能没有实现它,因为它并不是您正在做的事情。请记住,shell并不是唯一正在运行的程序:任何程序都可以运行,并且它可能想要出于自身目的使用可用于复制/粘贴的任何键序列。屏幕上有一些方法可以发送覆盖的键,而gnome-terminal则尝试不踩脚趾。
Thanatos

1
块选择是选择矩形的一种方法:按住Control键并在gnome-terminal中拖动,您应该立即看到它的不同之处。大多数GUI终端仿真器都具有此功能,大多数高级文本编辑器也具有此功能。(例如,请参见vim中的可视块。)
Thanatos

1
嗯,那我对块选择很熟悉,但是却不知道它的名字。我也不知道该操作的GUI键盘快捷方式,因此似乎没有必要为了回答我的问题而发明一个。我很感谢大家在这里的评论,但是由于我仍然不满意,我想我现在所能做的就是自己挖源了……
monguin 2013年

1

我不是终端仿真器专家,但是...

诸如bash(readline)之类的应用程序运行到终端仿真器中,对正在运行的X窗口系统及其所在的X窗口一无所知,它们在终端设备(Linux上为ttyS / ttyUSB / tty / pts)上也知道stdin和stdout。

问题不是显示一些突出显示的文本,而是如何通过这些终端设备让X窗口应用程序(终端仿真器)知道已选择文本。

猜想 X终端应用程序会在输入和输出中打开这些设备之一,然后将X键事件转换为正确的输出(从X端)到输入(从bash端)。反之,bash 输出流作为输入到X终端,这里X终端根据bash应用程序的输出,处理此输入以移动光标,用某种颜色填充背景。

就我所知,逸出代码可用于控制特殊行为,例如清除,填充背景,移动光标,也许还可以添加一些自定义逸出代码以使X终端知道文本从行,行到行,行已经选择了,仅作为示例,也许可以只返回所选的文本(实现细节)。

想这不是标准定义,您必须修补要支持它的每个应用程序,以了解按键组合是否已按下并输出适当的转义码,如果您希望在bash中输出相应的转义代码,请在X终端仿真器上使用readline另一端正确处理转义码(最后将信息发送到剪贴板)。可能将其实现为终端功能将使您不必为每个应用程序打补丁。我希望(并猜想)内核中的终端设备驱动程序希望尽可能少地了解转义代码,因此,如果幸运的话,将不需要补丁。

X终端绘制输出,因此当您使用鼠标时,很容易知道要选择的文本/字符。

图形文本窗口小部件知道有关其X窗口的所有信息,以及为什么如此容易实现选择和复制。

编辑

在这里,此urxvt-9.16-image-display补丁程序可能是了解支持新的转义码所需的内容的一个很好的起点。 http://lists.schmorp.de/pipermail/rxvt-unicode/2013q1/001736.html


1

给出的答案很好地解释了为什么这样做很困难。您可以在gnome-terminal中进行设置ctrl-cctrl-v复制和粘贴的操作,同时重新绑定终端规范中的其他键,stty以便SIGINT逐字发送和插入字符。这不是一个完整的解决方案,因为某些程序禁用了终端规则,因此您将无法向它们发送“ ^ C”和“ ^ V”。更多信息在这里

在你的shell启动脚本(例如~/.bashrc~/.zshrc~/.rcrc),做

stty intr '^Q' 2>/dev/null  # To send SIGINT I will use ctrl-q
stty lnext '^A' 2>/dev/null # To insert a character verbatim I will use ctrl-a

然后,在gnome终端的“编辑”>“首选项”>“快捷方式”中,可以将“复制和粘贴”绑定到ctrl-c和ctrl-v。请注意,在将任何内容发送到终端设备之前,终端将获取按键事件,因此从那时起,您将无法向终端上运行的任何进程发送'^ C'和'^ V'。

我就是这样做的,我将看到它的运行方式以及所引起的问题。我仅在运行X时才有条件地应用它们。


1
感谢您的回复。同时,我已经习惯了OSX和Emacs绑定,并且也放弃了终端上ctrl + shift +箭头的梦想……
monguin 16/10/28

1

正如Thanatos所提到的,终端仿真器(在X Windows或Wayland上运行)与在终端内运行的程序之间有区别(尽管它可能不是,但我们称其为“ shell”)。这两件事彼此隔离(请参阅技术细节)。

列表中的第一项(箭头键,Home / End等)直接由终端内的程序处理,因此光标位置由终端内的程序控制。

另一方面,复制和粘贴快捷键(Ctrl + Shift + C和Ctrl + Shift + V)由终端仿真器处理,该终端仿真器了解鼠标(因此您可以使用鼠标选择文本),并且知道什么是在屏幕上(以便它可以复制),并且可以将按键发送到其中的程序(以便它可以粘贴)。

为了支持Shift + Left和Shift + Right,终端仿真器或外壳将必须处理击键。无论哪种方式,我们都有问题:

  1. Shell无法轻松处理这些键,因为最终您将需要将所选文本复制到剪贴板,并且剪贴板是X Windows概念,shell不一定可以访问(请参阅参考资料xclip)。据我所知,如果外壳支持文本选择,那么Linux不会定义任何机制将所选内容通知终端仿真器。
  2. 同时,终端仿真器不负责光标的位置。即使终端仿真器可以更改光标的位置,它也可能不知道当前文本行的开始和结束位置。例如,终端可能包含类似于之类~ $ ls -l的文本,并且终端仿真器不知道只有该ls -l部分属于用户。

不难想象一个支持Shift + Arrows选择的终端仿真器,但是我想它必须隐藏外壳的光标并引入它自己的“伪光标”,该临时存在的临时帮助您选择某些东西,然后按Ctrl键即可。 + C / Ctrl + Shift + C / Ctrl + Ins复制(或Esc取消)并再次显示真实光标。当然,这不具备正常选择的所有功能-特别是不存在剪切和删除功能。


谢谢,我将阅读该TTY文章,但尚未阅读。这可能可以解释我对“终端仿真器”和“处理文本程序的桌面应用程序”之间的区别的理解上的差距。我之前的示例Matlab控制台的行为恰好符合我的要求。我不明白为什么不能有这种行为的桌面应用程序,其中运行的文本程序是Matlab之外的东西。假设我只想使用最基本的Shell命令-ls,cd,cp,mv-那么我看不到任何冲突。我知道诸如screen或tmux之类的程序可能会使事情变得更棘手。
monguin

1

您描述的是CUA键盘绑定,这是80年代中期IBM的标准:

https://zh.wikipedia.org/wiki/IBM_Common_User_Access

它们通常在此后创建的所有桌面环境中实现。DOS,Windows,Motif甚至Netware工具都收敛于此标准。Mac是一个例外,它在同一时间段使用了非常相似但不同的设置(Cmd而不是Ctrl)。

Unix终端远早于该标准,并且几乎忽略了它。同样,如果它们确实实现了这些键绑定,则可能会干扰已经将其用于其他功能的TUI程序。因此,尽管在技术上可行,但也存在问题。

应用:

micro文本编辑器是我在模拟一个GUI文本编辑器,类似于DOS见过的最好的  edit,但更现代的功能一拉崇高文本。 ne是Debian仓库中的较旧版本,甚至nano可以配置合理的键绑定。但是裸终端/外壳,没有。

借助libvte它,可以轻松构建一个可以自己处理这些键绑定的基本虚拟终端。然而,大量的工作却微不足道。


0

我只是通过一个类似的问题帮助了一个伙伴,结果发现剪贴板管理器clipit是罪魁祸首。

sudo apt-get删除clipit

能够使一切恢复正常并对其运行良好。希望可以帮助其他人。


你回答错了吗?这是关于所有终端仿真器功能的一个普遍问题。很明显,没有“解决方案”。我现在不知道,也从未在任何计算机上安装过clipit。
monguin
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.