我知道带有窗口管理器的Linux桌面(例如基于X11的系统)有一个系统剪贴板,但是如果不使用窗口管理器,是否有剪贴板?
例如,在 Vim 中,可以通过 + 寄存器访问系统剪贴板,但这仅适用于在 X-windows 上运行的 GUI 版本的 Vim,因为它使用窗口管理器的剪贴板。如果您使用基于文本的 Vim 版本,例如从终端或虚拟控制台,则它不起作用。例如,如果您在不同的虚拟控制台中打开两个不同的 Vim 实例,您将如何在它们之间进行复制和粘贴?
答案1
screen
并tmux
支持复制粘贴缓冲区,因此这是一种可能的方法(有关详细信息,请参阅其他答案)。
仅使用 Linux 虚拟控制台,您可以运行gpm
(或其libinput
替代品,consolation
)提供基于鼠标的复制粘贴:用鼠标左键选择文本,用鼠标中键粘贴。
据我所知,它们都没有与 Vim 直接集成,因此您只能复制屏幕上或回滚缓冲区中可见的内容(如果有的话)。
答案2
tmux
具有类似于 X 剪贴板的“粘贴缓冲区”,并且可以在同一主机上运行的不同会话之间访问。在会话中启动每个vim
实例tmux
(无论是在单个会话中,还是每个实例都在自己的会话中 - 对于这些目的来说并不重要),并且您可以轻松地在它们之间复制和粘贴文本:
假设默认键绑定为,您可以通过按+tmux
进入复制模式。导航到要复制的文本的开头并点击+ ,移动光标以突出显示所需的文本并点击。这会将所选内容复制到粘贴缓冲区。现在您可以切换到其他会话(或在 下运行的任何其他程序),然后按+将缓冲区内容粘贴到当前窗格中。CTRLB[CTRLSPACEENTERvim
tmux
CTRLB]
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.32
为win_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
,,,,失败xclip
。xlogo
多路复用器
在 ~/.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
k
或l
... 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
]
。