网上很多地方都说Tmux比GNU Screen要好用,不过无意间看到这篇Switching from tmux to GNU Screen之后,我发现GNU Screen的窗口/区域概念更好,至少是更适合我(虽然相对Tmux有不少小缺点)。
Tmux里面的窗口概念是: 程序是跑在pane里面的,每个window可切分成多个pane,一般我们会并行开多个window.这样每个window多半用于不同的事情.这种方式要把一个window里面的某个pane移动到另外一个windows
GNU Screen的窗口与区域关系更接近Emacs里面buffer与window的关系:
GNU Screen里面没有tmux里面的window那样的东西,它的layout倒是跟tmux的window有点像,虽然我们可以从一个layout切换到另外一个layout,但layout只是region的容器,而不是window的容器,两个layout里面是可以查看同一个应用(window)的.
不实际操作一下的话,不一定能感受到上面的差异.网上找到两个图说明两者概念的不同,也许对读者有所帮助(来自Differences between tmux vs screen - Wesley Tanaka )
gnu screen:
tmux:
这样的好处是:
不过有几个小地方需要注意:
C-a F
调整一下.对应命令是 fit
(change the window size to the size of the current region).screen -r
,但一旦这个session已经被attach了,其它客户端要attach上来,得用screen -x
跟远程机器打交道时比较烦人的一个事情是上传下载文件,尤其是要传送文件的源目录或者目标目录在一个较深的路径的时候.zmodem提供一个比较便捷的方法.
至于具体用法,官方的文档Zmodem - Screen User's Manual讲得很语焉不详,这篇GNU Screen and Zmodem | Adam Monsen 写得很详细:
Send a file from the remote host to the local host:
- start a Screen session on the local host
- configure Screen to “catch” zmodem traffic (CTRL-A:zmodem catch )
- execute
sz FILE
from the command line- hit when Screen brings up the default receive command (
:!!! rz -vv -b -E
)- bam, the file is available on the local host!
Send a file from the local host to the remote host:
- start a Screen session on the local host
- configure Screen to “catch” zmodem traffic (CTRL-A:zmodem catch )
- execute
rz
from the command line (no need to specify filename)- add local filename when Screen brings up the default send command(
:!!! sz -vv -b
), then hit- bam, the file is available on the remote host!
从描述上来看,从远端发送一个文件到screen这边还算比较方便,因为大多数情况下我们在远端机器上已经进入了文件所在的目录,只需要直接发起 sz FILE
就可以了,screen接收后就存放在它的"当前目录";不过从screen发送一个文件就有点不爽,因为这里要输入待发送文件的全路径,这里并没有一个浏览文件的功能.
网上很多比较gnu screen和tmux的文章都列了一个理由是gnu screen不支持纵向分割.不过4.2.0版本(Apr/17/2014)已经支持了( /'-v' parameter to 'split' command for vertical splits/ ).
另外有一点提醒一下: 在漫长的4.1.x时代,一些发行版集成了一个第三方补丁来支持纵向分割,当时实现的纵向分割命令是vert_split
(而4.2.0版本里面实现的是split -v
).如果你的screen不支持split -v
,那么可以试试有没有vert_split
这个命令.
用mousetrack on
命令即可开始鼠标支持(用C-a :
输入,或者放入~/.screenrc
),开启后可以用鼠标切换region.
但它没有tmux的鼠标能力强,不能mouse-select-window
的功能(即使你将hardstatus
配置为显示window列表,也不行),也不能mouse-resize-pane
.
在 ~/.screenrc
里面加入 termcapinfo screen*|term* ti@:te@
可以让screen支持用鼠标滚轮来回滚scroll buffer(注意设置此选项需要重启screen session,而即时通过C-a :
来输入是不行的),但与tmux不同的是它不会自动进入copy-mode, 也就是说需要用C-a[
进入copy-mode后鼠标滚轮才有作用. 对于上述配置的详细解释请参看Using the scrollwheel in GNU screen - Stack Overflow
如果你是emacs用户,要设置以下几个选项:
escape ^Bb
将热键改为C-b, 按C-b b
的时候才向里面的应用程序发送C-b
.因为默认的C-a
在Emacs和命令行里面用的还是比较多的如果这个vbell off
不想在C-g
的时候看到什么闪屏,就设置这个吧defflow auto
不想让C-s
把屏幕锁住,就需要这个,具体请查看: Flow Control - Screen User's Manual