为什么在Bash(Linux shell)中Ctrl + V不能粘贴?
当 我在Bash中按Ctrl + V复制一些东西到剪贴板上 然后按Ctrl + V,什么也没发生;但是,右键点击并选择Paste就能完成。在Linux中,这种行为背后是否有什么合理的问题(我相信有)?
当 我在Bash中按Ctrl + V复制一些东西到剪贴板上 然后按Ctrl + V,什么也没发生;但是,右键点击并选择Paste就能完成。在Linux中,这种行为背后是否有什么合理的问题(我相信有)?
在物理终端的年代,还不存在全会话剪贴板,只有少数程序支持内部复制/粘贴–通常以 “缓冲区 "或 "杀环 "为名–使用各种不同的按键。例如,bash shell使用CtrlK或CtrlU来 "杀"(剪贴),CtrlY来 "挂"(粘贴);这来自于emacs editor。而CtrlV键通常意味着 "逐字插入”–即在不执行任何相关操作的情况下,按字面意思插入下面的字符。例如,普通的Esc键在vi编辑器中切换到命令模式,但CtrlV,Esc键会将ESC
字符插入到文档中。
使用CtrlC键复制,CtrlV键从会话剪贴板中粘贴,是1983年Mac OS和1990年微软Windows 3.x版本中引入的。早期的Windows版本(1.x和2.x)以及IBM OS/2,只支持IBM CUA键CtrlIns复制和ShiftIns粘贴;这些快捷键仍然被所有Windows版本所支持。)
当带剪贴板支持的图形用户界面终于传到Unix时,许多终端程序已经在使用Ctrl键。此外,X的图形界面有一些不同的机制。"选择 “和 "剪切缓冲区"。即使是现在,你也可以在一个程序中选择文字,然后用鼠标中间的按钮插入,而不需要任何明确的复制动作。
总之,在写Xterm和GNOME终端的时候(我猜你用的是后者),CtrlV已经有个完全不同的含义,多年来无法改变。此外,在 X11 中已经有了另一种复制文本的方法–"选择",所以明确的复制/粘贴操作可能没有 Windows 中那么重要。这意味着必须选择不同的键盘快捷键–例如,大多数现代的终端程序,如GNOME终端,都使用CtrlShiftC和CtrlShiftV。(如果你使用Xterm,同样的快捷键可以通过XTermvt100翻译Xresource手动添加。Rxvt没有这样的选项)
(大多数X11工具包也支持CUA的 "复制 "和 "粘贴 "键,这两个键与终端程序不冲突。不幸的是,两者的实现是相当不一致的–CtrlIns在大多数程序中复制到 "剪贴板"(GTK、Qt4,但Xaw忽略了);然而,ShiftIns在大多数GTK和Qt4程序中从 "主选择 "中粘贴,但在Firefox中从 "剪贴板 "中粘贴,在现在已经过时的Xaw中从现在已经过时的剪切缓冲区中粘贴。 )
说了这么多,有些终端或游戏机(尤其是Windows 10控制台)是支持这些按键的。由于Windows控制台总是有一个单独的 "标记/选择 "模式,所以CtrlC现在也有两种含义–在普通模式下,它发送中断,在选择模式下,它复制到剪贴板(就像以前的Enter一样)。然而,在类似Unix的终端上做同样的事情会有更多的问题。
这里是你常用的通用复制粘贴设置:
gnome-terminal(Linux上最流行的) Copy* : CtrlShiftC **Paste* : CtrlShiftV **注* : Select-to-copy和中间点击粘贴也可以,但它使用的是另一个剪贴板。(用鼠标选择,无键盘交互) **粘贴* : 右键单击(或更可靠的是:shift右键单击) 注:
OSX Terminal
Copy* : 采取鼠标输入的应用程序(如vim
和links
)可以窃取右键—shiftRight-click在任何应用程序中都可以工作。AppleC
**粘贴* : AppleV
注:注意:**采用鼠标控制的应用程序(如vim
和links
)可能会覆盖选择文本的意思,在这种情况下,复制不会像你期望的那样工作。在这种情况下,请在拖动鼠标进行选择时按住Control键。在你的终端设置中,鼠标与应用程序的交互是默认禁用的,所以大多数人甚至不会知道这一点。
根深蒂固的传统是,Ctrl键与字母一起产生ASCII控制字符,是通过从大写字母的ASCII值中减去64,就可以找到ASCII控制字符。这种计算方式将Ctrl-A映射为1,以此类推。比如Ctrl-I是Tab键,Ctrl-J是换行键。
对于Ctrl-Shift没有类似的传统。
终端仿真器必须通过透明地通过Ctrl惯例来支持传统,让它作为输入字符出现在通过该终端窗口操作的程序中。基于终端的程序将控制键映射到命令上。例如,Bash使用Ctrl-V作为命令,它的意思是 “按字面意思取下一个字符"。这样可以在命令行中嵌入一个控制字符。如果终端窃取控制键为自己所用,这样的命令就变得不可用了。所以,拦截Ctrl-V的元功能是不可能的(至少在默认配置下是不可能的)。
然而,终端仿真器可以自由地拦截Ctrl-Shift-V,而Ctrl-Shift-V并不指望产生一个字符。Ctrl-Shift-V不是一个标准,它是Gnome终端的东西(可能在其他一些终端中也有)。
在基于X的Unix桌面上,惯例是不需要命令复制。你只需要选择文本。而中间的按钮会将文本粘贴到其他地方。你会发现它在Xterm、Gnome Terminal和Firefox中都可以使用。
Ctrl-V是微软Windows的惯例,它是对Macintosh中的Apple-V的模仿。
在我看来,最简单的复制粘贴方法是:
选择你想要的代码,然后点击鼠标中键粘贴。
你也可以用鼠标的中间按钮,如果你觉得懒,也可以用鼠标的中间按钮,从文本文档、脚本、网页或论坛中选择一个命令。我使用这个方法,因为我使用的是 puppy linux,它似乎不支持右键粘贴的正常行为。)