为什么 Ctrl + V 不能粘贴到 Bash (Linux shell) 中?

Yas*_*ani 207 linux clipboard keyboard-shortcuts bash copy-paste

当我将某些内容复制到剪贴板并在 Bash 中按Ctrl+V时,没有任何反应;但是,右键单击并选择粘贴就可以了。

为什么?在 Linux 中,这种行为背后是否有任何合理的问题(我确定有)?

use*_*686 386

在物理终端时代,不存在会话范围的剪贴板,只有少数程序支持内部复制/粘贴——通常以“缓冲区”或“终止环”的名义——并使用各种不同的击键。例如,bash shell 使用CtrlKorCtrlU来“kill”(剪切)、CtrlY“yank”(粘贴);这个来自emacs的编辑器

CtrlC在 Unix 中几乎到处都是“中断”键,用来取消当前的程序或操作。的CtrlV关键往往意味着“逐字插入” -即插入下面的文字真的没有执行任何相关动作。例如,Escvi编辑器中正常切换到命令模式,但是CtrlV,Esc会将ESC字符插入到文档中。

1983 年 Mac OS 和 1990 年 Microsoft Windows 3.x 引入了从会话范围剪贴板CtrlC复制和CtrlV粘贴的使用。(早期的 Windows 版本(1.x 和 2.x),以及 IBM OS/2 ,仅支持IBM CUACtrlIns进行复制和ShiftIns粘贴;所有 Windows 版本仍支持这些快捷方式。)

当支持剪贴板的 GUI 最终到达 Unix 时,Ctrl按键已经被许多终端程序使用。此外,X 图形界面有一些不同的机制:“选择”和“剪切缓冲区”。即使现在您也可以在一个程序中选择文本并使用鼠标中键将其插入,而无需任何明确的复制操作。

简而言之,在编写 Xterm 和 GNOME Terminal 的时候(我猜你用的是后者),CtrlV 多年来已经有了完全不同的含义,无法改变。此外,X11 中已经存在复制文本的替代方法——“选择”——因此,显式复制/粘贴操作可能被认为不像在 Windows 中那么重要。这意味着必须选择不同的键盘快捷键——例如,大多数现代终端程序,如 GNOME 终端,使用CtrlShiftCCtrlShiftV. (如果您使用 Xterm,可以使用XTerm*vt100*translations Xresource手动添加相同的快捷方式。Rxvt 没有这样的选项。)

(大多数 X11 工具包也支持 CUA“复制”和“粘贴”键,这与终端程序不冲突。不幸的是,实现相当不一致——CtrlIns在大多数程序中复制到“剪贴板”(GTK,Qt4,但被忽略Xaw);但是,ShiftIns从大多数 GTK 和 Qt4 程序中的“主要选择”粘贴,但从 Firefox 中的“剪贴板”粘贴,以及从现已过时的 Xaw 中现已过时的剪切缓冲区粘贴。)


尽管如此,某些终端或控制台(特别是 Windows 10 控制台)确实支持这些键。由于 Windows 控制台总是有一个单独的“标记/选择”模式,CtrlC现在基于上下文也有两种含义——在常规模式下它发送一个中断,在选择模式下它复制到剪贴板(就像Enter以前一样)。

同时,Windows 命令行工具从未真正用于 CtrlV任何事情,因此它必然会“粘贴”而不会干扰任何事情。然而,在类 Unix 终端上做同样的事情会更成问题。

  • [是的,我确定。](http://www.gnu.org/software/bash/manual/bashref.html#index-yanking-text-278) Bash 从 [他们的 Emacs 等效项]( http://www.emacswiki.org/emacs/KillingAndYanking)。 (13认同)
  • 唔。在 Vim 中,“yank”的意思是复制而不是粘贴。这似乎也更有意义。你确定这个词在这里的意思吗? (11认同)
  • @grawity:你的最后一条评论有点误导。Bash 提供了两种命令行编辑模式,vim-mode 和 emacs-mode。碰巧 emacs-mode 是大多数安装的默认设置。这确实增加了使用 *yank* 一词的歧义,即使对于 bash 也是如此。 (4认同)
  • @Colin:您仍然错过了剪贴板和 X 选择之间的区别。有几个选择(主要、次要、剪贴板),但通常只有其中一个被称为“剪贴板”——剪贴板选择,因为这是 Ctrl-C 复制到的地方,也是 Ctrl-V 粘贴的地方。主要选择不是剪贴板。 (2认同)

Aka*_*ash 50

使用CtrlShiftV粘贴。

Ctrl 与其他字符通常由外壳用于特殊功能。

  • 在出现具有剪切和粘贴功能的图形终端和 GUI 之前,Shell 已经存在,因此您的论点并不真正有效。@YasserZamani (22认同)
  • Ctrl+Shift+V 由终端模拟器执行(假设您使用的是 GNOME 终端),而不是由 `bash` 本身执行。如果您曾经在 GUI 环境之外,或者如果您正在使用另一个术语模拟器,这可能不起作用。不要认为这个命令是可移植的。 (9认同)
  • 那么为什么 Linux 不为特殊功能注册 CTRL+SHIFT 呢?我认为复制粘贴对于某些用户来说比特殊功能更典型,对吗? (5认同)
  • 可能没有一个用于访问剪贴板(只有 Shift+Ins 用于主要选择)。甚至剪贴板本身也是 X11 的东西,无法从 tty 访问。但是,GNOME 终端、Xfce4 终端、KDE ​​Konsole 支持 Ctrl+Shift+V;这涵盖了最流行的 GUI 环境。 (2认同)

tyl*_*erl 23

这是您使用流行终端的通用复制粘贴设置:

gnome-terminal(Linux 上最流行)
Copy : CtrlShiftC
Paste :CtrlShiftV
注意:Select-to-copy 和middle-clickto paste 也有效,但它使用备用剪贴板。

腻子(在Windows最流行的终端)
复制:(鼠标选择,没有键盘交互)
粘贴Right-click (或更可靠:shiftRight-click
:应用该拿鼠标输入(如vimlinks)可以窃取Right-click-shiftRight-click永远在任何应用程序的工作。

OSX 终端
复制AppleC
粘贴AppleV
注意:使用鼠标控制(如vimlinks)的应用程序可能会覆盖选择文本的含义,在这种情况下,复制将无法按您预期的方式工作。在这些情况下,按住Control鼠标拖动鼠标进行选择。终端设置中默认禁用鼠标与应用程序的交互,因此大多数人甚至不知道这一点。

  • @Ben:它根本不是终端——只是一个外壳。Windows 中的默认终端是 csrss 的“Windows 控制台”组件。 (3认同)

Kaz*_*Kaz 18

这是一个根深蒂固的传统,Ctrl键和字母一起生成 ASCII 控制字符,通过从大写字母的 ASCII 值中减去 64 得到。此计算映射Ctrl-A到 1,依此类推。例如Ctrl-ITabCtrl-J是换行。

Ctrl-没有类似的传统ShiftCtrl- Shift-V预计不会产生任何特定字符。

终端仿真器必须通过透明地传递Ctrl约定来支持传统,让它作为字符输入出现在通过该终端窗口运行的程序中。基于终端的程序将控制键映射到命令。例如,Bash 使用Ctrl-V作为命令,意思是“从字面上取下一个字符”。这允许您在命令行中嵌入控制字符。如果终端窃取控制密钥供自己使用,则此类命令将不可用。所以拦截Ctrl-V对于元功能是不可能的(至少在默认配置中)。

但是,终端模拟器可以自由拦截Ctrl- Shift-V预计不会生成字符。Ctrl- Shift-V不是标准;这是一个 Gnome 终端的东西(可能在其他一些终端中)。

在基于 X 的 Unix 桌面上,约定是不需要复制命令。您只需选择文本。中间按钮将该文本粘贴到其他地方。您会发现它在 Xterm、Gnome 终端和 Firefox 中都可以使用。

Ctrl-V是 Microsoft Windows 的约定,它是对 Macintosh 中的Apple-的模仿V

  • 这不是*完全*减法——传统上 Ctrl 已经[清除了第 6 位和第 7 位](http://en.wikipedia.org/wiki/Control_key#History) ;因此,Ctrl+Shift+letter 在大多数终端中的作用与 Ctrl+Letter 相同(除非它被终端明确覆盖,如复制/粘贴快捷方式的情况)。 (3认同)