我在 OS X 上使用屏幕。我有两个绑定命令:
bind ( eval "writebuf" "exec sh -c 'pbcopy < /tmp/screen-exchange'"
bind ) eval "exec sh -c 'pbpaste > /tmp/screen-exchange'" "readbuf"
第一个命令获取复制缓冲区中的内容并将其发送到 pbcopy。pbcopy 是一个获取输入并将其写入系统剪贴板的程序。此命令有效。
第二个命令是将 pbpaste(从系统剪贴板)写入屏幕交换文件,然后使用 readbuf 读取该文件。此命令不起作用。我必须输入绑定键 ctrl-a )两次才能使其工作。我想我遗漏了一些简单的东西。任何帮助都很好。
注意:如果我只执行pbpaste > /tmp/screen-exchange
然后在屏幕上执行ctrl-a <
,它就会起作用。所以我认为 pbpaste 命令是正确的,只是我在绑定中遗漏了一些东西。任何帮助都会很棒。
编辑:我仍在寻找一个完整的解决方案,将其绑定到一个键。与此同时,我可以使用以下绑定和按键:
bind ) eval "exec sh -c 'pbpaste > /tmp/screen-exchange'"
然后使用
ctrl-a )
ctrl-a <
实际情况是,我正在将 pbpaste 写入屏幕交换文件,然后手动执行 readbuf 命令。正如我所说,我仍然希望通过一个命令来完成此操作。任何帮助都很好。
答案1
我的解决方案是将命令变为 shell 命令,并用 对其进行排序,&&
而不是将命令变为 screen 命令,并用 对其进行排序eval
。正如 Manwe 指出的那样,eval
效果不太好,因为它不会等待一个命令完成后再开始下一个命令。screen 命令readbuf
变为 shell 命令screen -X readbuf
。
因此,对于你的 Mac 设置,我会尝试以下操作:
bind ) exec sh -c "pbpaste > /tmp/screen-exchange && screen -X readbuf"
我还没有测试过上述内容,但我的 .screenrc 中适用于 xwindows 的工作版本如下:
bind < exec sh -c "xsel -nbo > /tmp/screen-exchange && screen -X readbuf"
答案2
您可能需要考虑在 .screenrc 文件中添加以下几行。如果您没有 .screenrc 文件,您可以在主目录中创建一个。
将以下内容添加到您的 .screenrc 文件中
外壳-$SHELL
这可能会帮助你解决问题,我遇到过类似的问题,我的 .bash_profile 中的别名在屏幕上不起作用,这个解决了这个问题。希望有帮助!
另外,您可能还想在执行此操作时将 startup_message off 添加到文件中。:)
答案3
这个问题让我很恼火。我就是找不到真正有效的解决方案。所以,以下是未来问题解决者需要做的事情,以及使用一个屏幕命令使其工作的技巧。
问题在于,screen eval 显然不会等待 exec 进程完成就运行其余的 eval 选项。如果您使用键盘的速度足够快(例如使用寄存器时),也会发生同样的事情。
以下是我的破解方法。
setenv varfile "exec sh -c 'pbpaste > /tmp/screen-exchange'"
register r "^a:eval \$varfile^M^a:readbuf"
bind ) process r
因此,它所做的就是处理 $varfile 环境并等待用户按下 Enter 来运行 readbuf。因此,只要您“等待”足够长的时间让 pbpasto 完成,然后再按下 Enter。您就会得到您想要的。
Env varfile 只是为了易读。