vim 多窗口操作

一、打开文件

  1. vim  index.html index.php a.txt  :打开3个文件

2. vim -o index.html index.php a.txt :  水平分割打开3个文件  -O 垂直分割

  1. vim -p index.html index.php a.txt : 打开3个文件,有tab选项卡,tab卡第一个文件名为当前打开的文件

二、基本命令

:e# 或 Ctrl+ˆ      编辑上一个文档,用于两个文档相互交换编辑时使用。?# 代表的是编辑前一次编辑的文档

:n          编辑下一个文档。

:2n        编辑下两个文档。

:N          编辑上一个文档。注意,该方法只能用于同时打开多个文档。

:b          文档名或编号      移至该文档。

Ctrl+6    下一个文件

:bn         下一个文件

:bp        上一个文件

:f          或者 ctrl+g     :  显示当前文件的基本信息

:f         文档名         改变编辑中的文档名。(file) ,  保存后生成一个新文件, 原来文件内容不变

三、多窗口下

(1) :ls    查看打开的文件

  1.  %a  正在编辑的文件,  #a 上次编辑的文件的文件  a 正常

  2.  后面一个有一个 + 号,表示有修改,没有保存

(2) 切换窗口

  1.  ctrl+w w   依次切换窗口

  2.  ctrl+w  上下左右   hjkl   切换窗口

  3.  ctrl +w   HJKL  可以移动窗口

(3) 关闭窗口

  1. 多窗口下面 :

:q 关闭单个窗口

:qa 关闭所有窗口

  1. ctrl + w  q  : 关闭所处分屏

  2. :only 或者 ctrl+w  o   取消其他分屏,只保留当前分屏

(4) :e 文件 : 打开一个文件

(5) 新建分屏

:new 文件 : 水平分割,打开文件

:sp(split)  文件 : 水平分割,打开指定文件
:vsp(vsplit)  文件 : 垂直分割,打开指定文件

:sv  : 水平分割

:vs : 垂直分割

 

打开当前文件:

ctrl+w 和 s(split)

ctrl+w 和 v(vsplit)

(6) 改变分屏尺寸的操作了。

ctrl+w 和 < 左

ctrl+w 和 > 右

ctrl+w 和 + 上

ctrl+w 和 – 下

ctrl+w 和 = 恢复均等(

这里顺便简单提一下复制,剪切与粘贴操作命令

yy     复制光标所在行

dd     剪切光标所在行

d0  或者 d^   删除光标到行开始的内容

d$  删除光标到行结束的位置

5yy    复制从光标所在行开始计数的下五行文本

5dd    剪切从光标所在行开始计数的下五行文本

v(小写)      visual模式,通过上下左右键选择光标“扫过”的所有字符

V (大写)    visual line 模式,通过上下键选择光标“扫过”的所有行

ctrl + v        visual block 模式,通过上下左右键选择一个矩形文本

y    复制在visual模式, visual line模式和visual block 模式下选择的文本

d    剪切在visual模式, visual line模式和visual block 模式下 选择的文本

p(小写)  粘贴,  粘贴位置为光标所在行的下一行

P(大写)  粘贴,  粘贴位置为光标所在行的上一行

u: 撤销操作

r: 重做操作

提示:

(1) 假若我们通过vim打开了多个文件后,想在不关闭vim的情况下继续打开其他文件,如文件file,可在vim中使用如下命令:

:e  file   不会分割窗口

:sp  file  将会水平分割窗口

:vsp  file  将会垂直分割窗口

(2)  vim和shell之间切换

:shell   切换到shell,此时vim在后台运行,在shell中输入命令exit,切换回vim

(3)  在vim中执行shell命令(不切换到shell)

:!command        在执行的命令前加上!,如!ls ,!ls -a
 r  !command       将command命令的执行结果插入到文本当前行的下一行
 3  !command      将文本中第三行的内容输入到命令command中进行处理,并将第三行的内容替换为命令的执行结果
:1,3   !command    将文本中第一行到第三行的内容输入到命令command中进行处理,并将第一行到第三行的内容替换为命令的执行结果
 3  w !command      将文本中第三行的内容输入到命令command中进行处理,不改变当前编辑文件的内容.

:1,3  w  !command    将文本中第一行到第三行的内容输入到命令command中进行处理,不改变当前编辑文件的内容

vim的基本操作

vim的基本操作

基本操作

移动光标的方法

  1. 光标
  • h 或 向左箭头键(←) :光标向左移动一个字符

  • j 或 向下箭头键(↓) :光标向下移动一个字符

  • k 或 向上箭头键(↑) :光标向上移动一个字符

  • l 或 向右箭头键(→) : 光标向右移动一个字符

    • : 光标移动到非空格符的下一列
  • 光标移动到非空格符的上一列

  • n<space> : 那个 n 表示『数字』,例如 20 。按下数字后再按空格键,光标会向右移动这一行的 n 个字符。例如 20<space> 则光标会向后面移动20 个字符距离。

  • 0 或功能键[Home] : 这是数字『 0 』:移动到这一行的最前面字符处 (常用)

  • ^ : 移动到这一行的开始的字符处

  • $ 或功能键[End] : 移动到这一行的最后面字符处(常用)

  1. 翻页
  • [Ctrl] + [f] : 屏幕『向下』移动一页,相当于 [Page Down]按键 (常用)

  • [Ctrl] + [b] : 屏幕『向上』移动一页,相当于 [Page Up] 按键 (常用)

  • [Ctrl] + [d] : 屏幕『向下』移动半页

  • [Ctrl] + [u] : 屏幕『向上』移动半页

  1. 页面光标
  • H : 光标移动到这个屏幕的最上方那一行的第一个字符

  • M : 光标移动到这个屏幕的中央那一行的第一个字符

  • L : 光标移动到这个屏幕的最下方那一行的第一个字符

  • G : 移动到这个档案的最后一行(常用)

  • nG : n 为数字。移动到这个档案的第 n 行。例如 20G 则会移动到这个档案的第 20 行(可配合 :set nu)

  • 移动到这个档案的第一行,相当于 1G 啊! (常用)

搜索与取代

  1. 搜索
  • /word: 向光标之下寻找一个名称为 word 的字符串。例如要在档案内搜寻vbird 这个字符串,就输入 /vbird 即可! (常用)

  • ?word : 向光标之上寻找一个字符串名称为 word 的字符串。

  • n : 这个 n 是英文按键。代表『重复前一个搜寻的动作』。举例来说, 如果刚刚我们执行 /vbird 去向下搜寻 vbird 这个字符串,则按下 n后,会向下继续搜寻下一个名称为 vbird 的字符串。如果是执行 ?vbird 的话,那么按下 n 则会向上继续搜寻名称为 vbird 的字符串!

  • N : 这个 N 是英文按键。与 n 刚好相反,为『反向』进行前一个搜寻动作。 例如 /vbird 后,按下 N 则表示『向上』搜寻 vbird 。

  1. 替换
  • :n1,n2 s/word1/word2/g: n1 与 n2 为数字。在第 n1 与 n2 行之间寻找 word1 这个字符串,并将该字符串取代为 word2 !举例来说,在 100 到 200 行之间搜寻vbird 并取代为 VBIRD 则:『:100,200s/vbird/VBIRD/g』。(常用)

  • :1,$s/word1/word2/g: 从第一行到最后一行寻找 word1 字符串,并将该字符串取代为word2 !(常用)

  • :1,$s/word1/word2/gc : 从第一行到最后一行寻找 word1 字符串,并将该字符串取代为word2 !且在取代前显示提示字符给用户确认 (confirm) 是否需要取代!(常用)

删除、复制与贴上

  1. 删除
  • x, X : 在一行字当中,x 为向后删除一个字符 (相当于 [del] 按键), X 为向前删除一个字符(相当于 [backspace] 亦即是退格键) (常用)

  • nx : n 为数字,连续向后删除 n 个字符。举例来说,我要连续删除 10 个字符, 『10x』。

  • dd : 删除游标所在的那一整列(常用)

  • ndd : n 为数字。删除光标所在的向下 n 列,例如 20dd 则是删除 20 列 (常用)

  • dnG [x] : 删除光标所在到第n行之间的所有数据

  • dG : 删除光标所在到最后一行的所有数据

  • d$ : 删除游标所在处,到该行的最后一个字符

  1. 复制和粘贴
  • yy : 复制游标所在的那一行(常用)

  • nyy : n 为数字。复制光标所在的向下 n 列,例如 20yy 则是复制 20 列(常用)

  • ynG : 复制光标所在列到第一列的所有数据

  • yG : 复制光标所在列到最后一列的所有数据

  • y0 : 复制光标所在的那个字符到该行行首的所有数据

  • y$ : 复制光标所在的那个字符到该行行尾的所有数据

  • p, P : p 为将已复制的数据在光标下一行贴上,P 则为贴在游标上一行! 举例来说,我目前光标在第 20 行,且已经复制了 10 行数据。则按下 p后, 那 10 行数据会贴在原本的 20 行之后,亦即由 21 行开始贴。但如果是按下 P 呢? 那么原本的第 20 行会被推到变成 30 行。 (常用)

  1. 其他指令
  • J : 将光标所在列与下一列的数据结合成同一列

  • c : 重复删除多个数据,例如向下删除 10 行,[ 10cj ]

  • u : 复原前一个动作。(常用)

  • [Ctrl]+r : 重做上一个动作。(常用)

一般模式切换到编辑模式的可用的按钮说明

  1. 进入插入或取代的编辑模式
  • i, I : 进入插入模式(Insert mode):i 为『从目前光标所在处插入』, I 为『在目前所在行的第一个非空格符处开始插入』。 (常用)

  • a,A : 进入插入模式(Insert mode):a 为『从目前光标所在的下一个字符处开始插入』, A 为『从光标所在行的最后一个字符处开始插入』。(常用)

  • o,O : 进入插入模式(Insert mode):这是英文字母 o 的大小写。o 为『在目前光标所在的下一行处插入新的一行』; O 为在目前光标所在处的上一行插入新的一行!(常用)

  • r, R : 进入取代模式(Replace mode):r 只会取代光标所在的那一个字符一次;R 会一直取代光标所在的文字,直到按下 ESC 为止;(常用)

  • [Esc] : 退出编辑模式,回到一般模式中(常用)

指令列模式的可用的按钮说明

  1. 指令列的储存、离开等指令
  • :w : 将编辑的数据写入硬盘档案中(常用)

  • :w! : 若文件属性为『只读』时,强制写入该档案。不过,到底能不能写入, 还是跟你对该档案的档案权限有关啊!

  • :q : 离开 vi (常用)

  • :q! : 若曾修改过档案,又不想储存,使用 ! 为强制离开不储存档案。

  • :wq! : 储存后离开,若为 :wq! 则为强制储存后离开 (常用)

  • ZZ : 这是大写的 Z 喔!若档案没有更动,则不储存离开,若档案已经被更动过,则储存后离开!

  • :w [filename] : 将编辑的数据储存成另一个档案(类似另存新档)

  • :r [filename] : 在编辑的数据中,读入另一个档案的数据。亦即将 『filename』 这个档案内容加到游标所在行后面

  • :n1,n2 w [filename] : 将 n1 到 n2 的内容储存成 filename 这个档案。

  • :! command : 暂时离开 vi 到指令列模式下执行 command 的显示结果!例如『:! ls /home』即可在 vi 当中察看 /home 底下以 ls 输出的档案信息!

  1. vim 环境的变更
  • set nu : 显示行号,设定之后,会在每一行的前缀显示该行的行号

  • set nonu : 与 set nu 相反,为取消行号!

tips

  1. 特别注意,在 vi 中,『数字』是很有意义的!数字通常代表重复做几次的意思! 也有可能是代表去到 第几个什么什么的意思。举例来说,要删除 50 行,则是用 『50dd』 对吧! 数字加在动作之前~那我 要向下移动 20 行呢?那就是『20j』或者是『20↓』即可。

额外功能

区块选择

  1. v : 字符选择,会将光标经过的地方反白选择!

  2. V : 行选择,会将光标经过的行反白选择!

  3. [Ctrl]+v : 区块选择,可以用长方形的方式选择资料

  4. y : 将反白的地方复制起来

  5. d : 将反白的地方删除

多档案编辑的按键

  1. :n : 编辑下一个档案

  2. :N : 编辑上一个档案

  3. :files : 列出目前这个 vim 的开启的所有档案

多窗口情况下的按键功能

1 . 多窗口

  • :sp [filename] : 开启一个新窗口,如果有加 filename, 表示在新窗口开启一个新档案,否则表示两个窗口为同一个档案内容(同步显示)。

  • [ctrl]+w+ j [ctrl]+w+↓ : 按键的按法是:先按下 [ctrl] 不放, 再按下 w 后放开所有的按键,然后再按下 j (或向下箭头键),则光标可移动到下方的窗口。

  • [ctrl]+w+ k [ctrl]+w+↑ : 同上,不过光标移动到上面的窗口。

  • [ctrl]+w+ q : 其实就是 :q 结束离开啦! 举例来说,如果我想要结束下方的窗口,那么利用 [ctrl]+w+↓ 移动到下方窗口后,按下 :q 即可离开, 也可以按下[ctrl]+w+q 啊!

环境设置与记录

记录

  1. vim 环境设定与记录: ~/.vimrc, ~/.viminfo

vim 的环境设定参数

  1. 环境设置
  • :set nu :set nonu : 就是设定与取消行号啊!

  • :set hlsearch :set nohlsearch : hlsearch 就是 high light search(高亮度搜寻)。 这个就是设定是否将搜寻的字符串反白的设定值。默认值是 hlsearch

  • :set autoindent :set noautoindent : 是否自动缩排?autoindent 就是自动缩排。

  • :set backup : 是否自动储存备份档?一般是 nobackup 的, 如果设定 backup 的话,那么当你更动任何一个档案时,则源文件会被另存成一个档名为filename~ 的档案。 举例来说,我们编辑 hosts ,设定 :set backup ,那么当更动 hosts 时,在同目录下,就会产生 hosts~ 文件名的档案,记录原始的 hosts 档案内容

  • :set ruler : 还记得我们提到的右下角的一些状态栏说明吗? 这个 ruler 就是在显示或不显示该设定值的啦!

  • :set showmode : 这个则是,是否要显示 –INSERT– 之类的字眼在左下角的状态栏。

  • :set backspace=(012) : 一般来说, 如果我们按下 i 进入编辑模式后,可以利用退格键(backspace) 来删除任意字符的。 但是,某些 distribution 则不许如此。此时,我们就可以透过 backspace 来设定啰~ 当 backspace 为 2时,就是可以删除任意值;0 或 1 时,仅可删除刚刚输入的字符, 而无法删除原本就已经存在的文字了!

  • :set all : 显示目前所有的环境参数设定值。

  • :set : 显示与系统默认值不同的设定参数, 一般来说就是你有自行变动过的设定参数啦!

  • :syntax on :syntax off : 是否依据程序相关语法显示不同颜色? 举例来说,在编辑一个纯文本档时,如果开头是以 # 开始,那么该行就会变成蓝色。 如果你懂得写程序,那么这个 :syntax on 还会主动的帮你除错呢!但是, 如果你仅是编写纯文本档案,要避免颜色对你的屏幕产生的干扰,则可以取消这个设定。

  • :set bg=dark :set bg=light : 可用以显示不同的颜色色调,预设是『 light 』。如果你常常发现批注的字体深蓝色实在很不容易看, 那么这里可以设定为 dark 喔!试看看,会有不同的样式呢!

  1. vim的默认配置一般 在 /etc/vimrc 里面,但一般在 ~/.vimrc (如果没有的话,可以自行建立)里面设置自定义个性化设置

  2. 出现乱码

  • 你的 Linux 系统默认支持的语系数据:这与 /etc/sysconfig/i18n 有关;

  • 你的终端界面 (bash) 的语系: 这与 LANG 这个变数有关;

  • 你的档案原本的编码;

  • 开启终端机的软件,例如在 GNOME 底下的窗口接口。

DOS 与 Linux 的断行字符

  1. 区别
  • linux断行符 : $ (LF)

  • window 断行符 :^M$ (CR/LF)

  1. 系统换行问题
  • Dos和windows: 采用回车+换行CR/LF表示下一行.

  • UNIX/Linux : 采用换行符LF表示下一行.

  • MAC OS : 采用回车符CR表示下一行.

  1. dos2unix unix2dos : dos和linux文档转化

  2. iconv : 编码转化

  • iconv –list : 查看系统支持的编码方式

linux screen

一、背景

系统管理员经常需要SSH 或者telent 远程登录到Linux 服务器,经常运行一些需要很长时间才能完成的任务,比如系统备份、ftp 传输等等。通常情况下我们都是为每一个这样的任务开一个远程终端窗口,因为它们执行的时间太长了。必须等待它们执行完毕,在此期间不能关掉窗口或者断开连接,否则这个任务就会被杀掉,一切半途而废了。

二、简介

GNU Screen是一款由GNU计划开发的用于命令行终端切换的自由软件。用户可以通过该软件同时连接多个本地或远程的命令行会话,并在其间自由切换。

GNU Screen可以看作是窗口管理器的命令行界面版本。它提供了统一的管理多个会话的界面和相应的功能。

  • 会话恢复
只要Screen本身没有终止,在其内部运行的会话都可以恢复。这一点对于远程登录的用户特别有用——即使网络连接中断,用户也不会失去对已经打开的命令行会话的控制。只要再次登录到主机上执行screen -r就可以恢复会话的运行。同样在暂时离开的时候,也可以执行分离命令detach,在保证里面的程序正常运行的情况下让Screen挂起(切换到后台)。这一点和图形界面下的VNC很相似。
  • 多窗口
在Screen环境下,所有的会话都独立的运行,并拥有各自的编号、输入、输出和窗口缓存。用户可以通过快捷键在不同的窗口下切换,并可以自由的重定向各个窗口的输入和输出。Screen实现了基本的文本操作,如复制粘贴等;还提供了类似滚动条的功能,可以查看窗口状况的历史记录。窗口还可以被分区和命名,还可以监视后台窗口的活动。
  • 会话共享
Screen可以让一个或多个用户从不同终端多次登录一个会话,并共享会话的所有特性(比如可以看到完全相同的输出)。它同时提供了窗口访问权限的机制,可以对窗口进行密码保护。

GNU’s Screen 官方站点:http://www.gnu.org/software/screen/

三、语法

# screen [-AmRvx -ls -wipe][-d <作业名称>][-h <行数>][-r <作业名称>][-s ][-S <作业名称>]

参数说明

-A  将所有的视窗都调整为目前终端机的大小。
-d <作业名称>  将指定的screen作业离线。
-h <行数>  指定视窗的缓冲区行数。
-m  即使目前已在作业中的screen作业,仍强制建立新的screen作业。
-r <作业名称>  恢复离线的screen作业。
-R  先试图恢复离线的作业。若找不到离线的作业,即建立新的screen作业。
-s  指定建立新视窗时,所要执行的shell。
-S <作业名称>  指定screen作业的名称。
-v  显示版本信息。
-x  恢复之前离线的screen作业。
-ls或–list  显示目前所有的screen作业。
-wipe  检查目前所有的screen作业,并删除已经无法使用的screen作业。

四、常用screen参数

screen -S yourname -> 新建一个叫yourname的session
screen -ls -> 列出当前所有的session
screen -r yourname -> 回到yourname这个session
screen -d yourname -> 远程detach某个session
screen -d -r yourname -> 结束当前session并回到yourname这个session

在每个screen session 下,所有命令都以 ctrl+a(C-a) 开始。
C-a ? -> 显示所有键绑定信息
C-a c -> 创建一个新的运行shell的窗口并切换到该窗口
C-a n -> Next,切换到下一个 window
C-a p -> Previous,切换到前一个 window
C-a 0..9 -> 切换到第 0..9 个 window
Ctrl+a [Space] -> 由视窗0循序切换到视窗9
C-a C-a -> 在两个最近使用的 window 间切换
C-a x -> 锁住当前的 window,需用用户密码解锁
C-a d -> detach,暂时离开当前session,将目前的 screen session (可能含有多个 windows) 丢到后台执行,并会回到还没进 screen 时的状态,此时在 screen session 里,每个 window 内运行的 process (无论是前台/后台)都在继续执行,即使 logout 也不影响。
C-a z -> 把当前session放到后台执行,用 shell 的 fg 命令则可回去。
C-a w -> 显示所有窗口列表
C-a t -> Time,显示当前时间,和系统的 load
C-a k -> kill window,强行关闭当前的 window
C-a [ -> 进入 copy mode,在 copy mode 下可以回滚、搜索、复制就像用使用 vi 一样
C-b Backward,PageUp
C-f Forward,PageDown
H(大写) High,将光标移至左上角
L Low,将光标移至左下角
0 移到行首
$ 行末
w forward one word,以字为单位往前移
b backward one word,以字为单位往后移
Space 第一次按为标记区起点,第二次按为终点
Esc 结束 copy mode
C-a ] -> Paste,把刚刚在 copy mode 选定的内容贴上

五、使用 screen

5.1 安装screen

流行的Linux发行版(例如Red Hat Enterprise Linux)通常会自带screen实用程序,如果没有的话,可以从GNU screen的官方网站下载。

[root@TS-DEV ~]# yum install screen
[root@TS-DEV ~]# rpm -qa|grep screen
screen-4.0.3-4.el5
[root@TS-DEV ~]#

5.2 创建一个新的窗口

安装完成后,直接敲命令screen就可以启动它。但是这样启动的screen会话没有名字,实践上推荐为每个screen会话取一个名字,方便分辨:

[root@TS-DEV ~]# screen -S david

screen启动后,会创建第一个窗口,也就是窗口No. 0,并在其中打开一个系统默认的shell,一般都会是bash。所以你敲入命令screen之后,会立刻又返回到命令提示符,仿佛什么也没有发生似的,其实你已经进入Screen的世界了。当然,也可以在screen命令之后加入你喜欢的参数,使之直接打开你指定的程序,例如:

[root@TS-DEV ~]# screen vi david.txt

screen创建一个执行vi david.txt的单窗口会话,退出vi 将退出该窗口/会话。

5.3 查看窗口和窗口名称

打开多个窗口后,可以使用快捷键C-a w列出当前所有窗口。如果使用文本终端,这个列表会列在屏幕左下角,如果使用X环境下的终端模拟器,这个列表会列在标题栏里。窗口列表的样子一般是这样:

0$ bash  1-$ bash  2*$ bash

这个例子中我开启了三个窗口,其中*号表示当前位于窗口2,-号表示上一次切换窗口时位于窗口1。

Screen默认会为窗口命名为编号和窗口中运行程序名的组合,上面的例子中窗口都是默认名字。练习了上面查看窗口的方法,你可能就希望各个窗口可以有不同的名字以方便区分了。可以使用快捷键C-a A来为当前窗口重命名,按下快捷键后,Screen会允许你为当前窗口输入新的名字,回车确认。

5.4 会话分离与恢复

你可以不中断screen窗口中程序的运行而暂时断开(detach)screen会话,并在随后时间重新连接(attach)该会话,重新控制各窗口中运行的程序。例如,我们打开一个screen窗口编辑/tmp/david.txt文件:

[root@TS-DEV ~]# screen vi /tmp/david.txt

之后我们想暂时退出做点别的事情,比如出去散散步,那么在screen窗口键入C-a d,Screen会给出detached提示:

暂时中断会话

半个小时之后回来了,找到该screen会话:

[root@TS-DEV ~]# screen -ls

重新连接会话:

[root@TS-DEV ~]# screen -r 12865

一切都在。

当然,如果你在另一台机器上没有分离一个Screen会话,就无从恢复会话了。

这时可以使用下面命令强制将这个会话从它所在的终端分离,转移到新的终端上来:

5.5 清除dead 会话

如果由于某种原因其中一个会话死掉了(例如人为杀掉该会话),这时screen -list会显示该会话为dead状态。使用screen -wipe命令清除该会话:

5.6 关闭或杀死窗口

正常情况下,当你退出一个窗口中最后一个程序(通常是bash)后,这个窗口就关闭了。另一个关闭窗口的方法是使用C-a k,这个快捷键杀死当前的窗口,同时也将杀死这个窗口中正在运行的进程。

如果一个Screen会话中最后一个窗口被关闭了,那么整个Screen会话也就退出了,screen进程会被终止。

除了依次退出/杀死当前Screen会话中所有窗口这种方法之外,还可以使用快捷键C-a :,然后输入quit命令退出Screen会话。需要注意的是,这样退出会杀死所有窗口并退出其中运行的所有程序。其实C-a :这个快捷键允许用户直接输入的命令有很多,包括分屏可以输入split等,这也是实现Screen功能的一个途径,不过个人认为还是快捷键比较方便些。

六、screen 高级应用 

6.1 会话共享

还有一种比较好玩的会话恢复,可以实现会话共享。假设你在和朋友在不同地点以相同用户登录一台机器,然后你创建一个screen会话,你朋友可以在他的终端上命令:

[root@TS-DEV ~]# screen -x

这个命令会将你朋友的终端Attach到你的Screen会话上,并且你的终端不会被Detach。这样你就可以和朋友共享同一个会话了,如果你们当前又处于同一个窗口,那就相当于坐在同一个显示器前面,你的操作会同步演示给你朋友,你朋友的操作也会同步演示给你。当然,如果你们切换到这个会话的不同窗口中去,那还是可以分别进行不同的操作的。

6.2 会话锁定与解锁

Screen允许使用快捷键C-a s锁定会话。锁定以后,再进行任何输入屏幕都不会再有反应了。但是要注意虽然屏幕上看不到反应,但你的输入都会被Screen中的进程接收到。快捷键C-a q可以解锁一个会话。

也可以使用C-a x锁定会话,不同的是这样锁定之后,会话会被Screen所属用户的密码保护,需要输入密码才能继续访问这个会话。

6.3 发送命令到screen会话

在Screen会话之外,可以通过screen命令操作一个Screen会话,这也为使用Screen作为脚本程序增加了便利。关于Screen在脚本中的应用超出了入门的范围,这里只看一个例子,体会一下在会话之外对Screen的操作:

[root@TS-DEV ~]# screen -S sandy -X screen ping www.baidu.com

这个命令在一个叫做sandy的screen会话中创建一个新窗口,并在其中运行ping命令。

6.4 屏幕分割

现在显示器那么大,将一个屏幕分割成不同区域显示不同的Screen窗口显然是个很酷的事情。可以使用快捷键C-a S将显示器水平分割,Screen 4.00.03版本以后,也支持垂直分屏,快捷键是C-a |。分屏以后,可以使用C-a <tab>在各个区块间切换,每一区块上都可以创建窗口并在其中运行进程。

可以用C-a X快捷键关闭当前焦点所在的屏幕区块,也可以用C-a Q关闭除当前区块之外其他的所有区块。关闭的区块中的窗口并不会关闭,还可以通过窗口切换找到它。

6.5 C/P模式和操作

screen的另一个很强大的功能就是可以在不同窗口之间进行复制粘贴了。使用快捷键C-a <Esc>或者C-a [可以进入copy/paste模式,这个模式下可以像在vi中一样移动光标,并可以使用空格键设置标记。其实在这个模式下有很多类似vi的操作,譬如使用/进行搜索,使用y快速标记一行,使用w快速标记一个单词等。关于C/P模式下的高级操作,其文档的这一部分有比较详细的说明。

一般情况下,可以移动光标到指定位置,按下空格设置一个开头标记,然后移动光标到结尾位置,按下空格设置第二个标记,同时会将两个标记之间的部分储存在copy/paste buffer中,并退出copy/paste模式。在正常模式下,可以使用快捷键C-a ]将储存在buffer中的内容粘贴到当前窗口。

6.6 更多screen功能

同大多数UNIX程序一样,GNU Screen提供了丰富强大的定制功能。你可以在Screen的默认两级配置文件/etc/screenrc和$HOME/.screenrc中指定更多,例如设定screen选项,定制绑定键,设定screen会话自启动窗口,启用多用户模式,定制用户访问权限控制等等。如果你愿意的话,也可以自己指定screen配置文件。

以多用户功能为例,screen默认是以单用户模式运行的,你需要在配置文件中指定multiuser on 来打开多用户模式,通过acl*(acladd,acldel,aclchg…)命令,你可以灵活配置其他用户访问你的screen会话。更多配置文件内容请参考screen的man页。