非 X Linux 有剪贴板吗?

非 X Linux 有剪贴板吗?

我知道带有窗口管理器的Linux桌面(例如基于X11的系统)有一个系统剪贴板,但是如果不使用窗口管理器,是否有剪贴板?

例如,在 Vim 中,可以通过 + 寄存器访问系统剪贴板,但这仅适用于在 X-windows 上运行的 GUI 版本的 Vim,因为它使用窗口管理器的剪贴板。如果您使用基于文本的 Vim 版本,例如从终端或虚拟控制台,则它不起作用。例如,如果您在不同的虚拟控制台中打开两个不同的 Vim 实例,您将如何在它们之间进行复制和粘贴?

答案1

screentmux支持复制粘贴缓冲区,因此这是一种可能的方法(有关详细信息,请参阅其他答案)。

仅使用 Linux 虚拟控制台,您可以运行gpm(或其libinput替代品,consolation)提供基于鼠标的复制粘贴:用鼠标左键选择文本,用鼠标中键粘贴。

据我所知,它们都没有与 Vim 直接集成,因此您只能复制屏幕上或回滚缓冲区中可见的内容(如果有的话)。

答案2

tmux具有类似于 X 剪贴板的“粘贴缓冲区”,并且可以在同一主机上运行的不同会话之间访问。在会话中启动每个vim实例tmux(无论是在单个会话中,还是每个实例都在自己的会话中 - 对于这些目的来说并不重要),并且您可以轻松地在它们之间复制和粘贴文本:

假设默认键绑定为,您可以通过按+tmux进入复制模式。导航到要复制的文本的开头并点击+ ,移动光标以突出显示所需的文本并点击。这会将所选内容复制到粘贴缓冲区。现在您可以切换到其他会话(或在 下运行的任何其他程序),然后按+将缓冲区内容粘贴到当前窗格中。CTRLB[CTRLSPACEENTERvimtmuxCTRLB]

tmux维护多个粘贴缓冲区;您可以按CTRL+B#查看全部内容,或按CTRL+B=直观地选择粘贴缓冲区并将其内容插入当前窗格中。

答案3

当 X 运行时,Vim 只是从 xclip 中拉出。这意味着大多数人认为的应用程序之间的复制粘贴确实是一项 X 功能。

虽然许多应用程序具有复制粘贴功能或缓冲区才能真正成为剪贴板,但它需要通过某种形式的 IPC 成为应用程序之间的共享功能。

下面的 2 个大工具包实际上在某种程度上通过 dbus 来支持这一点。即使他们在后台使用 X,无论如何,重点是这些是其他应用程序可以使用的接口。

https://developer.gnome.org/gtk3/stable/gtk3-Clipboards.html

http://doc.qt.io/qt-5/qclipboard.html

这两个接口都抽象了底层窗口系统剪贴板,因此这将包括与 Wayland 一起使用,这是更通用的“数据共享”概念

https://wayland.freedesktop.org/docs/html/ch04.html#sect-Protocol-data-sharing

从技术上讲,在控制台上复制和粘贴与保存和加载任何缓冲区相同,因此只需重定向您需要的内容即可。所以这是在操作系统级别的复制和粘贴:

mkfifo clipboard && (echo -e "$copy" > clipboard && rm clipboard) &
paste=$(<clipboard)

在 bash/命令解释器级别复制和粘贴只是:

copy="some text"
echo $copy

我还意识到第一个也使用变量。但它使用操作系统的功能作为演示。

答案4

关键

在 init.vim 中,使用 '+': ['tmux', 'load-buffer', '-w', '-'], '+': ['tmux', 'load-buffer', '-'](如图所示:help g:clipboard),

然后ctrl-v在本地win10上需要你"+y在nvim中复制。


关于我的网络

我使用win10作为我的本地机器,ssh到校园中的ubuntu机器(通过VPN,借助一个叫做轻松连接的软件)。在本地计算机上,这有效:( 使用 pwsh7,Windows 终端)。ssh [email protected]

然后在远程 shell 中,echo $SSH_CLIENT获取10.11.220.32 50859 22;让我们表示10.11.220.32win_ip。仍然在远程 shell 中,ssh -v win_ip 得到:

.....something ... 
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 19: include /etc/ssh/ssh_config.d/*.conf matched no files
debug1: /etc/ssh/ssh_config line 21: Applying options for *
debug1: Connecting to win_ip [win_ip] port 22.
ssh: connect to host win_ip port 22: Connection timed out

如果我在同一台本地计算机上使用 wsl2 (ubuntu) 到该远程计算机,则会发生同样的情况。

另外scp,,,,失败xclipxlogo

多路复用器

在 ~/.config//tmux/tmux.conf 中,我有:

bind -n M-v  run-shell "tmux copy-mode"
bind  'v' run-shell "tmux copy-mode ; tmux send -X begin-selection"
bind -T copy-mode-vi 'y' send -X copy-selection-and-cancel

所以如果我按顺序:

  • Alt-v
  • v
  • 并选择一些文本(例如我是远程)与h j kl...
  • y

在tmux中,ctrl-b =显示有“I_am_remote”(见图1),ctrl-b ]可以粘贴“I_am_remote”。

在 chrome 等应用程序中当地的win10,ctrl-v获取选中的文本。

nvim 和 tmux

在 init.vim 中,我设置了 g:clipboard。 :echo g:clipboard得到

{
    \ 'paste': {
        \ '*': ['tmux', 'save-buffer', '-'],
        \ '+': ['tmux', 'save-buffer', '-'],
       \ },
    \ 'cache_enabled': 1,
    \ 'name': 'ClipboarD-no-x11',
    \ 'copy': {
        \ '*': ['tmux', 'load-buffer', '-w', '-'],
        \ '+': ['tmux', 'load-buffer', '-w, '-'],
       \ },
   \ }

然后ctrl-v在本地win10上需要你"+y在nvim中复制。

ps:"+y有时会使 nvim 显示: clipboard: error invoking xclip: Error: Can't open display: win_ip:47 即使出现错误消息,也可以通过ctr-b =或找到“I_am_remote” ctrl-b ]

相关内容