GNU Screen (简体中文)

From ArchWiki
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Tango-preferences-desktop-locale-modified.png这篇文章或章节的翻译不反映原文。Tango-preferences-desktop-locale-modified.png

原因:Last updated in 2018 (532799), out of sync with English page(在 Talk:GNU Screen (简体中文)# 中讨论)

GNU Screen是一个全屏窗口管理器,它在多个进程(通常是交互式shell)之间复用物理终端。当屏幕当前不可见时,甚至整个屏幕会话与用户终端分离时,Screen中运行的程序也会继续运行。 有关功能的说明,请参阅官方GNU手册(GNU Screen manual)。

安装

可以用官方软件仓库中的 screen 包来安装 GNU Screen.

基础

可以通过 Ctrl+a 和其他键来输入命令。通过 ~/.screenrc 中的escape选项来改变 escape 键。例如:

escape ``

将 escape 键设为 `

常见命令

C-a ?

列出命令和默认按键(非常重要)

C-a "

窗口列表

C-a 0

打开窗口 0

C-a A

重命名当前窗口

C-a c

创建新窗口

C-a S

将当前区域划分为两个区域

C-a <TAB>

将输入焦点转至下一区域

C-a C-a

在当前区域和之前区域间转换

C-a <ESC>

进入复制模式(用 enter 键来选择一段文本)

C-a ]

粘贴文本

C-a Q

关闭除当前区域外所有区域

C-a d

从当前 screen 会话断开,并保持其运行。用 screen -r 来恢复。

从窗口 1 开始

默认的第一个窗口是 0 号。如果不想要窗口 0,而是从 1 号开始,将以下内容写入 ~/.screenrc

bind c screen 1
bind ^c screen 1
bind 0 select 10                                                            
screen 1

嵌套的 Screen 会话

在一个嵌套的 screen 会话中卡住是非常容易的。一个常见的情况是:你从一个 screen 会话内启动了一个 ssh 会话,在这个 ssh 会话中,你又启动了 screen。默认地,响应 C-a 命令的是最先启动的外层screen。如果要向内层 screen 输入命令,用 C-a a 加上你的命令。例如:

C-a a d

断开内层 screen 会话

C-a a K

杀死内层 screen 会话

消除残余的编辑文本

当你在 screen 内打开文本编辑器再关掉它,文本内容仍然会在终端上显示。要解决这点,将下列内容加入 ~/.screenrc 中:

altscreen on

使用 256 色

默认地,screen 使用 8 色终端模拟器。如果你用的是支持 256 色的终端,可以通过如下命令来支持更多的色彩:

term screen-256color

如果在 xterm 中仍不能显示 256 色,试试下面的命令:

attrcolor b ".I"    # 允许加粗色彩--由于某些原因是必须的
termcapinfo xterm 'Co#256:AB=\E[48;5;%dm:AF=\E[38;5;%dm'   # 告诉screen如何设置颜色。AB 指背景,AF 指前景
defbce on    # 使用当前背景色来显示删除的字符

在 Rxvt-Unicode (urxvt) 中使用 256 色

如果你用的是官方软件仓库中的 rxvt-unicode,你可以将下面这行加入你的 ~/.screenrc 来启用256色:

terminfo rxvt-unicode 'Co#256:AB=\E[48;5;%dm:AF=\E[38;5;%dm'

信息状态栏

默认的信息状态栏可能会有些简单。你可以使它变得更有用:

hardstatus off
hardstatus alwayslastline
hardstatus string '%{= kG}[ %{G}%H %{g}][%= %{= kw}%?%-Lw%?%{r}(%{W}%n*%f%t%?(%u)%?%{r})%{w}%?%+Lw%?%?%= %{g}][%{B} %m-%d %{W} %c %{g}]'

关闭欢迎信息

将下面这行加入到 ~/.screenrc

startup_message off

让标题栏动态显示 urxvt|xterm|aterm 窗口名称

这非常简单,只是将你当前的 hardstatus 栏变成 caption 栏,并编辑对应项:

backtick 1 5 5 true
termcapinfo rxvt* 'hs:ts=\E]2;:fs=\007:ds=\E]2;\007'
hardstatus string "screen (%n: %t)"
caption string "%{= kw}%Y-%m-%d;%c %{= kw}%-Lw%{= kG}%{+b}[%n %t]%{-b}%{= kw}%+Lw%1`"
caption always

这会在你的终端模拟器标题栏显示 "screen (0 bash)" 之类的内容。标题栏提供日期、当前时间,并给 screen 窗口加上颜色。

使用 X 滚动机制

滚动缓存可以用 C-a [ 来查看。但是这很不方便。要使用滚动条,如 xterm 或 konsole,将下面这行加入 ~/.screenrc

termcapinfo xterm* ti@:te@

添加 GRUB 条目来启动进入 Screen

如果你主要使用 X,但偶尔将Screen作为窗口管理器运行,这里有种通过为 Screen 添加 GRUB 条目的方法。

GRUB 允许你指明想要的运行级别,因此在这里我们使用运行级别 4。复制一条合适的 GRUB 条目,并给内核选项表添加 4,像这样:

# (0) Arch Linux
title  Arch Linux Screen
root   (hd0,2)
kernel /vmlinuz-linux root=/dev/disk/your_disk ro acpi_no_auto_ssdt irqpoll 4
initrd /initramfs-linux.img

/etc/inittab 添加一些条目来指明哪些将在运行级别 4 下进行,将 <user> 换为你的用户名:

# GNU Screen on runlevel 4
scr2:4:respawn:/sbin/mingetty --autologin <user> tty1 linux

上面这行使用 mingetty 来启动时自动登陆。你需要安装[Official repositories (简体中文)|官方软件仓库]]中的 (mingettyAUR。inittab 的行分隔符是冒号。第一部分(scr*)仅仅是一个id。第二部分是运行级别:只在运行级别 4 下进行(默认地 4 没有被使用--3 是默认的字符界面登陆,5 是 X 登陆)。'Respawn' 让 init 重复这条命令(即自动登陆),如果用户注销。 当我们使用运行级别 4 时,我们需要没有其他任何程序在虚拟终端 1 下运行。所以将 4从 agetty 的第一行移去:

c1:235:respawn:/sbin/agetty -8 38400 vc/1 linux

一旦我们登陆,我们想要保证 screen 已经启动。将下列内容添加到你的~/.bash_profile

vico="$(tty | grep -oE ....$)"
case "$vico" in
  tty1) TERM=screen; exec /usr/bin/screen -R arch;;
esac

这会检查当前运行级别,如果是 4 就在自动登陆后立即启动一个 screen 会话。

也可以改成 X 之后在一个虚拟终端里运行 screen,只需检查当前的 tty 而不是运行级别即可。下面是检查我们是否在虚拟终端 3 上:

vico="$(tty | grep -oE ....$)"
case "$vico" in
  vc/3) TERM=screen; exec /usr/bin/screen;;
esac

将 inittab/mingetty 设为在运行级别 5 下自动登陆到 vc/3 即可。

修正启动 screen 时 Midnight Commander 无反应的问题

这个问题在某些情况下(需要进一步检查)old gpm bug 会出现。所以在 screen 内运行 mc,会得到无反应的 screen 窗口。尝试在运行 mc 之前杀死 gpm 守护进程,或是在 /etc/rc.conf 中禁止 gpm。 In some cases (need deeper inspection) old gpm bug gets alive. So, then you try to run mc inside screen, you get a frozen screen window. Try to kill gpm daemon before starting mc and/or disable it in /etc/rc.conf.

参见