我有点不好意思问这个问题,但是这个话题好像特别难搜。
在 Linux 系统上,我几乎只使用终端,并通过终端模拟器使用 SSH 访问系统(最常见的是从 macOS)。
一般来说,当涉及终端多路复用器时,复制和粘贴代码片段以及日志中的错误等是跨系统遍历缓冲区的一个棘手问题,这通常是通过终端仿真器自己的选择功能进行复制和使用客户端操作系统的粘贴缓冲区。这个问题与此无关。
我的问题是当我在单个 Linux 服务器上打开大量 vim 实例时。我处于运行级别 3 并且不运行 GUI。我没有可用的xclip,主要是因为没有安装X。
当我处于这个工作流程中时,我发现需要拉出部分文件并将它们粘贴到同一个删除框中的其他 vims 中。 Vim 的内置缓冲区+
和*
复制/粘贴缓冲区不起作用。 (这些系统上未启用 vim 中的剪贴板编译选项)
然而,有效的方法是,如果我在一个 vim 实例中拉出一些文本,退出它,然后打开另一个 vim 实例,然后粘贴就可以了。所以退出 vim 的一些事情会将缓冲区保留在某个地方。我认为如果我可以让这个系统的任何功能实时工作而不必关闭 vims,那就太好了。我想避免必须对拉取和删除进行分层绑定来实现我自己的拉取/粘贴实现。
答案1
这是.viminfo
文件(:h viminfo
)。
当您退出 vim 时,它会将当前状态(例如命令历史记录和寄存器值)写入该文件。当它启动时,它会读取该文件并恢复它所描述的任何状态。这意味着连续vim 会话(似乎)共享某些状态,但并发会话则不然。
您可以使用以下命令强制重新读取 viminfo 文件:rv
/:rviminfo
命令,并手动写出:wv
。因此,y :wv在一个编辑器中,:rv p在另一个编辑器中都可以工作,但会有副作用:全部您的寄存器值和命令历史记录可能会被重置,还有很多其他事情,这对您来说可能重要也可能不重要。
这也可能是一个优点:您可以使用全部寄存器在编辑器之间获取多个复制缓冲区,这是系统剪贴板不提供的。另一方面,除非您重新绑定y
以自动执行此操作,否则这并不是很方便,并且p
您可能不想每次都读取该文件。我已经读/写了绑定到领导者命令的 viminfo,但这只为我节省了一次按键(听起来你会更频繁地使用它)。
您还可以使用其他一些方法,例如手动调出到特定文件自己做,这样可以避免副作用。听起来你并不想要这样,但这是一个选择。还有一些插件可以或多或少地完成您正在寻找的功能,还有会话系统。它们不是您问题的直接答案,但它们可能会告诉您最终想要的结果。
答案2
按照承诺:
Linux 特定脚本(my$HOME/util
在 my 中$PATH
):
~/util ❯❯❯ cat linux_pb/pbcopy ✘ 130 master b28083b $ ◼
#!/bin/bash
# pbcopy impl for linux!
# pipe the stdin to a file using cat. Not using bash builtins due to concerns
# about NULs.
FILE="$HOME/.clipboard"
touch $FILE
chmod 600 $FILE
cat > $FILE
~/util ❯❯❯ cat linux_pb/pbpaste master b28083b $ ◼
#!/bin/bash
# pbpaste impl for linux!
# just use the content of the file.
cat ~/.clipboard
vim 绑定:
vnoremap <silent> <Leader>y :w !pbcopy<CR><CR>
" the leader y works like normal yy (but for my clipboard)
nnoremap <silent> <Leader>y :.w !pbcopy<CR><CR>
nnoremap <Leader>p :read !pbpaste<CR>
幂等 shell 别名脚本(我从 bash 和 zsh 获取此别名脚本):
if [ "$(uname)" = Linux ] && ! [[ "$PATH" = *"/linux_pb"* ]]; then
PATH="$PATH:$HOME/util/linux_pb"
fi
当我开始使用带有 X 的实际 Linux 时,我可能会进一步充实 Linux 配置,这样我也可以利用它的粘贴缓冲区。它需要某种机制来创建pbcopy
和pbpaste
类似的程序这。
该方法是程序级别的统一方法之一,因此 Vim 可以利用该功能,就像我现在可以从 shell 中一样。