分屏:

1.在终端输入screen命令

2.Ctrl+a 然后shift+s 上下分屏,切换到下方Ctrl+a tab然后新建一个window(Ctrl+a c)

3.切换到上方,Ctrl+a tab,关闭window(Ctrl+a x或者输入exit)

左右分屏在centos下好像不可以,据说要ubuntu、debian(Ctrl+a |)

一、使用screen管理会话

在使用SSH或telnet远程连接服务器时,可能都遇到为一些长时间运行的任务而头疼,比如系统备份、ftp 传输等等。通常情况下我们都是为每一个这样的任务开一个远程终端窗口,因为他们执行的时间太长了。必须等待它执行完毕,在此期间可不能关掉窗口或者断开连接,否则这个任务就会被杀掉,一切半途而废了。也许nohup命令可以达到这个目的,如果程序的标准输出/标准错误是终端, nohup默认将其重定向到nohup.out文件。值得注意的是nohup命令只是使得程序忽略SIGHUP信号,还需要使用标记&把它放在后台运行。

nohup <command> [argument…] &

虽然nohup很容易使用,但还是比较“简陋”的,对于简单的命令能够应付过来,对于复杂交互的程序就麻烦了。那么现在过来瞧瞧screen吧!

screen是一个可以在多个进程之间多路复用一个物理终端的窗口管理器。screen中有会话的概念,用户可以在一个screen会话中创建多个screen窗口,在每一个screen窗口中就像操作一个真实的telnet/SSH连接窗口那样。当断开或关闭终端时,只要不杀死screen的进程,待重新连接后任能继续断开前的操作。

启动screen方式有两种,一种是直接在命令提示符下输入screen,这时Screen将创建一个执行shell的全屏窗口。你可以执行任意shell程序,就像在ssh窗口中那样。在该窗口中键入exit退出该窗口,如果这是该screen会话的唯一窗口,该screen会话退出,否则screen自动切换到前一个窗口。另一种方式是在screen命令后跟你要执行的程序,例如“ screen ftp”,Screen创建一个执行ftp命令的单窗口会话,退出ftp将退出该窗口/会话。

screen的语法格式如下:

screen [ -options ] [ cmd [ args ] ]

常用的选项有:

    -c file	使用配置文件file,而不使用默认的$HOME/.screenrc
-d|-D [pid.tty.host] 不开启新的screen会话,而是断开其他正在运行的screen会话
  -h<行数>  指定视窗的缓冲区行数。
  -m  即使目前已在会话中的screen会话,仍强制建立新的screen会话。
  -r sessionowner/ [pid.tty.host] 重新连接一个断开的会话。多用户模式下连接到其他用户screen会话需要指定sessionowner,需要setuid-root权限。
  -R  先试图恢复离线的会话。若找不到离线的会话,即建立新的screen会话。
  -s  指定建立新screen会话时,所要执行的shell。
  -S sessionname 创建screen会话时为会话指定一个名字
  -v  显示版本信息。
  -x  恢复之前离线的screen会话。
  -ls或--list  显示目前所有的screen会话。
  -wipe  检查目前所有的screen会话,并删除已经无法使用的screen会话。

screen常用的组合键描述如下:

Screen常用选项

使用键绑定C-a ?命令可以看到, 默认的命令字符(Command key)为C-a,转义C-a(literal ^a)的字符为a:

Screen 常用选项

因为screen把C-a看作是screen命令的开始,所以如果你想要screen窗口接收到C-a字符,就要输入C-a a。Screen也允许你使用-e选项设置自己的命令字符和转义字符,其格式为:

-exy x为命令字符,y为转义命令字符的字符

下面命令启动的screen会话指定了命令字符为C-t,转义C-t的字符为t,通过C-t ?命令可以看到该变化。

[root@tivf18 root]# screen -e^tt
自定义命令字符和转义字符

其他常用的命令选项有:

-c file 使用配置文件file,而不使用默认的$HOME/.screenrc
-d|-D [pid.tty.host] 不开启新的screen会话,而是断开其他正在运行的screen会话
-h num 指定历史回滚缓冲区大小为num行
-list|-ls 列出现有screen会话,格式为pid.tty.host
-d -m 启动一个开始就处于断开模式的会话
-r sessionowner/ [pid.tty.host] 重新连接一个断开的会话。多用户模式下连接到其他用户screen会话需要指定sessionowner,需要setuid-root权限
-S sessionname 创建screen会话时为会话指定一个名字
-v 显示screen版本信息
-wipe [match] 同-list,但删掉那些无法连接的会话

下例显示当前有两个处于detached状态的screen会话,你可以使用screen -r <screen_pid>重新连接上:

[root@tivf18 root]# screen –ls
There are screens on:
8736.pts-1.tivf18 (Detached)
8462.pts-0.tivf18 (Detached)
2 Sockets in /root/.screen. [root@tivf18 root]# screen –r 8736

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

[root@tivf18 root]# kill -9 8462
[root@tivf18 root]# screen -ls
There are screens on:
8736.pts-1.tivf18 (Detached)
8462.pts-0.tivf18 (Dead ???)
Remove dead screens with 'screen -wipe'.
2 Sockets in /root/.screen. [root@tivf18 root]# screen -wipe
There are screens on:
8736.pts-1.tivf18 (Detached)
8462.pts-0.tivf18 (Removed)
1 socket wiped out.
1 Socket in /root/.screen. [root@tivf18 root]# screen -ls
There is a screen on:
8736.pts-1.tivf18 (Detached)
1 Socket in /root/.screen. [root@tivf18 root]#

-d –m 选项是一对很有意思的搭档。他们启动一个开始就处于断开模式的会话。你可以在随后需要的时候连接上该会话。有时候这是一个很有用的功能,比如我们可以使用它调试后台程序。该选项一个更常用的搭配是:-dmS sessionname

启动一个初始状态断开的screen会话:

[root@tivf06 tianq]# screen -dmS mygdb gdb execlp_test

连接该会话:

[root@tivf06 tianq]# screen -r mygdb

例如当我们ssh登录服务器后,使用scp在传输大文件时,通常的情况就是要耐心的等待文件传输完成才能将终端关闭,那么下面来看看通过screen带来的方便。

首先使用ssh登录服务器,在命令提示符下输入screen:

# screen

在screen shell中输入scp命令,输入密码后开始文件传输。如果不愿意等待,那么直接按下”Ctrl+a+d”的组合键,或者关闭当前的终端,随便怎么操作,只要不杀死screen会话就行。

# scp -r images 172.16.78.111:~
root@172.16.78.111's password:
mondorescue.iso 0% 22MB 22.2MB/s 00:01

使用screen -ls可以查看当前系统所打开的screen会话,如下:

# screen -ls
There are screens on:
20642.pts-1.white (Detached)
20713.pts-1.white (Detached)
2 Sockets in /tmp/screens/S-root.

若要其中的会话,则输入screen -r PID,如下:

# screen -r 20713

执行该命令后,马上就能看到刚才正在进行的scp命令的完成情况 。

screen:第一次使用的时候,输入screen,即新建了一个session,然后默认有一个shell窗口,下面会有状态栏显示窗口的名称,通常是“0 bash”。ctra a + A:假如你想重命名这个窗口,按ctra a,然后A,就可以重命名ctrl a + c:新建窗口screen -t name:新建名字为name的窗口ctrl a + n or p:切换窗口,n next,p previousctrl a + “:列出所有的窗口,也可以在状态栏观察到screen -S name:新建一个session 名字为namectra a + d:使得当前的session detached,这个是很重要的一个命令,这个命令使得你临时退出了该session,而下次可以进行重新连接screen -ls:想进行重新连接的时候,你需要知道你的screen session是哪一个,然后使用screen -r id命令,ls列出了所有的screen session的id,当然假如你使用screen -S name创建的session的话,会有一个名字,更便于记忆screen -r id/name:重新连接screen session id/name,即恢复访问你之前打开的诸多窗口exit:退出当前的窗口ctrl a + K:kill当前窗口

哈利波特有魔杖,雷神托尔有金色的巨锤,Buckethead 有斧子,但是这些武器与 QWERTY 键盘相比只是小儿科。只需在命令行上敲几下,就可以启动网站、招募军团或击败可怕的火龙。

但是,QWERTY 键盘有一个严重的缺点:它很容易发生连接中断。电话线上的噪音、无线连接中断或者网络超时都可能导致远程 shell 中断。如果您已经在某个工作(比如调试一个应用程序)上花费了好几小时,而一下子就丢失了所有成果,一定会很沮丧的。

不过这种灾难是可以避免的。使用 GNU Screen 就可以了。Screen 可以在一个控制台(即与主机物理连接的哑终端)、xterm 窗口或 Secure Shell (SSH) 登录 shell 中创建和管理多个 shell 窗口。可以从一个 shell 窗口迅速切换到另一个窗口,可以离开正在运行的 shell 并在任何时候重新连接。实际上,Screen 提供许多虚拟化的控制台。

图 1 到图 5 展示 Screen 的特性和操作。看一下 图 1,这里假设用户已经使用 SSH 登录到一台远程主机。最初,在本地主机(比如您的笔记本或桌面计算机)上有一个本地 shell 和一个远程 shell。通常,使用远程 shell 在远程主机上运行命令;输出经过加密之后通过 SSH 连接发送到本地 shell。(在各张图中,用蓝色表示当前可见的 shell 输出)。但是,如果本地 shell 或远程 shell 或它们之间的连接中断了,远程 shell 就会终止,您的工作成果就会丢失。

图 1. 典型的 SSH 连接

图 2 显示在远程主机上启动 Screen 之后的情况。Screen 实用程序启动,进而启动一个新的 shell 窗口A,可以在此窗口中运行命令。A 的输出是可见的(由蓝色表示);这个 shell 的输出经过 Screen,再经过远程登录 shell,最后通过 SSH 到达本地登录 shell。

图 2. Screen 管理 shell 窗口

Screen 本身并不 “露面”;它是一个代理,其作用是在它管理的正在运行的可用窗口中做出选择。在任何时候,Screen 只能显示一个窗口的输出。可以把 Screen 看作虚拟的键盘-视频-鼠标 (KVM) 开关。

但是,也可以断开与 Screen 的连接,见 图 3。Screen 代理仍然存在,它控制的所有窗口也还存在,但是与 Screen 的连接临时切断了,这会让用户返回到远程登录 shell。

图 3. 可以断开与 Screen 的连接,而它管理的窗口仍然存在

图 4 显示一种可能出现的情况。已经重新建立了到 Screen 的连接,还创建了另外两个窗口(B 和C)。窗口 A 和 B 继续运行 shell 和所有附属作业,但是只有 C 的输出是可见的。当然,可以在窗口之间切换以监视各个作业的状态。

图 4. Screen 可以管理多个窗口

最后,图 5 显示中断与 Screen 的连接并终止远程登录 shell 的情况。Screen 和它的窗口仍然存在。可以重新登录并连接 Screen(并通过 Screen 代理连接到它的窗口),继续您的工作。

图 5. 可以随意中断与 Screen 的连接和重新连接

如果您常常要访问远程服务器以执行维护或开发软件,那么 GNU Screen 是必不可少的工具。

构建并安装 Screen

Screen 的最初版本早在 10 多年前就发布了,所以您的系统上很可能有这个实用程序(通常名为 /usr/bin/screen)。但是,如果系统上没有 Screen,也很容易通过发行版的包管理器安装它。例如,如果您使用 Debian Linux® 的变体(比如 Ubuntu),那么可以用apt-get 简便地安装 Screen:

  $ sudo apt-get install screen

另外,如果您喜欢从源代码构建软件,可以访问 GNU Screen 项目页面(见 参考资料 中的链接)并下载最新的代码包。在撰写本文时,Screen 的最新版本是 4.0.3,于 2008 年 8 月发布。下载并提取代码,进入生成的源代码目录,然后依次运行./configuremake 和sudo make install

$ wget http://ftp.gnu.org/gnu/screen/screen-4.0.3.tar.gz
$ tar xzf tar xzf screen-4.0.3.tar.gz
$ cd screen-4.0.3
$ ./configure
this is screen version 4.0.3
...
$ make
CPP="gcc -E " srcdir=. sh ./osdef.sh
...
$ sudo make install
...
You may also want to install ./etc/etcscreenrc in
/usr/etc/screenrc.
$ sudo cp ./etc/etcscreenrc /usr/etc/screenrc

Screen 现在就安装好了,可以使用了。输入 man screen 查看 Screen 的手册页。

开始使用 Screen

启动 Screen。在出现许可协议消息时,按 Return;现在应该会看到一个新的登录 shell 提示。(在下面的清单中,在每个 shell 提示前面人为地添加一个昵称,以此区分各个 shell 实例并与图 1 到图 5 联系起来)。

Local $ ssh remote.example.com
Last login: Sun Dec 21 17:23:16 2008 from local.example.com
Remote $ hostname
remote.example.com
Remote $ screen
A $ top

现在处于 图 2 所示的状态。一个 Screen 会话正在运行(尽管看不到),窗口 A 处于活动状态,它正在运行系统监视器 top,每隔几秒刷新一次系统性能信息。

为了临时断开与 Screen 会话及其所有窗口的连接,按 Ctrl-a,然后按 d(小写的字母 D,代表 “detach”)。Ctrl-a 是 Screen 命令的前缀,d 是用于断开连接的命令。现在处于图 3 所示的状态。Screen 会话和窗口 A 仍然存在。可以通过运行screen -list 确认这一点:

$ screen -list
There is a screen on:
21020.pts-2.remote (Detached)
1 Socket in /tmp/screens/S-strike.

screen -list 命令显示所有可用的 Screen 会话。(顺便说一句,可以同时运行多个 Screen 会话,每个会话有一组同时运行的窗口。图 6 显示这种情况。每个 Screen 实例跟踪它自己的当前窗口。稍后会提供一些关于 Screen 的高级用法的提示)。编号为21020 的会话已经断开连接并相应地加上了标志。因为只有一个 Screen 会话,所以可以直接用screen -r 重新连接它。由于运行了 Screen,top 会一直运行。

图 6. Screen 提供多个会话,每个会话有多个窗口

为了进入 图 4 所示的状态,重新连接当前会话,然后按 Ctrl-a,然后按 c(小写的字母 C,代表 “create”)创建一个新窗口。接下来,按Ctrl-a,然后再次按c。现在,Screen 会话管理三个窗口。

按 Ctrl-a,然后在当前窗口中按双引号键("),就可以看到会话中可用窗口的列表:

Num  Name           Flags

 0   bash           $
1 bash $
2 bash $

在默认情况下,窗口的名称取自它启动的第一个命令(通常是一个 shell)。因此,在上面的列表中有三个 bash 窗口。可以用箭头键在窗口列表中上下移动;只需按回车即可选择窗口。

终止当前窗口的方法是,在窗口的 shell 提示上输入 exit,或者按键盘快捷键 Ctrl-a,然后按k(小写的字母 K,代表 “kill”)。如果使用后一种方法,那么在窗口底部会出现一个警告,要求您确认要杀死此窗口。按y(小写的字母 Y,代表 “yes”)确认,或按n(小写的字母 N,代表 “no”)拒绝。如果杀死一个 Screen 会话中运行的所有窗口,屏幕命令就会输出一个消息并终止:

Remote $ screen
... Create and manipulate windows ...
... Exit from all windows...
[screen is terminating]
Remote $ screen -list
No Sockets found in /tmp/uscreens/S-supergiantrobot.

如果杀死了所有打开的窗口,那么 screen -list 命令输出 No sockets...,表示没有 Screen 会话可用。

更智能化的屏幕

到目前为止,已经看到了如何在一个 Screen 会话中创建多个窗口。只需这么做,就足以确保命令行工作不会丢失。

但是坦率地说,由于同时运行多个看起来相同的窗口,管理时可能引起混乱。最好能够轻松地区分窗口,而不需要逐一打开每个窗口。如果在断开连接和重新连接之间间隔的时间比较长的话,这种特性尤其有意义。

实际上,Screen 提供了许多选项和工具来帮助定制您的工作环境。可以给每个窗口指定名称,还可以在每个窗口的底部显示一个状态栏以帮助区分窗口。

指定窗口名称的方法是,激活窗口,按 Ctrl-a A(大写的字母 A,代表 “Annotate”),根据需要按 Backspace 删除现有的名称,然后在提示上输入一个有意义的名称:

Num  Name            Flags

 0   Window A       $
1 Window B $
2 Window C $

在下如 中,窗口的标题被设置为 Window A。窗口的昵称不必是惟一的。

图 7. 可以给每个窗口指定描述性的名称

可以使用状态栏在视觉上进一步区分各个窗口。启动您喜欢的文本编辑器,在主目录中创建包含以下代码的 .screenrc 文件:

hardstatus on
hardstatus alwayslastline
hardstatus string "%{.bW}%-w%{.rW}%n %t%{-}%+w %=%{..G} %H %{..Y} %m/%d %C%a "

创建这样的 .screenrc 配置文件之后,每个新窗口就会显示状态栏,其中包含窗口的名称。图 8 显示一个包含状态栏的窗口。

图 8. 使用状态栏帮助识别每个窗口

有帮助的 Screen 提示

Screen 的特性非常多,无法在这里一一介绍。下面给出一些提示并介绍几个比较有用的选项,帮助您更顺畅地使用 Screen:

  • 在任何窗口中输入 screen,不带任何参数,就会打开一个新窗口。按 Ctrl-a,然后按c 与输入screen 的作用相同,差异只是后一种方式通过提供命令行选项立即配置新会话。
  • 可以使用 screen -t name 命令在创建窗口时指定窗口名称。例如,要想创建一个新窗口并把它命名为debugger,只需进入 Screen 管理的一个窗口,然后输入screen -t debugger。如果打开窗口列表,其中一个窗口的标签应该是debugger
  • 如果已经断开了与 Screen 会话的连接,可以用 screen -p ID 命令重新连接特定的窗口,其中的ID 是一个数字或名称。我们来试一下:
    Local $ ssh remote.example.com
    Remote $ screen -t ghost
    Ghost $ screen -t new
    New $
    ... Press Control-a d to detach...
    Remote $ screen -r -p ghost
    Ghost $
  • 可以用 screen -L 命令把每个窗口的输出记录在日志中。每个窗口有自己的日志文件,文件名通常是~/screenlog.n,其中的n 是窗口列表中显示的窗口编号。这个特性对于记录复杂的步骤(比如重新配置系统)非常有帮助。
  • 在 Screen 文档中记录了所有快捷键。最有用的组合键包括:按 Ctrl-a,然后按0(数字零)到9 立即切换到特定的窗口;按Ctrl-a,然后按C(大写的字母 C,代表 “Clear”)清除一个窗口的内容;按Ctrl-a,然后按H 启用或禁用日志记录;按 Ctrl-a,然后按Ctrl-a 在当前窗口和前一个窗口之间来回切换;按Ctrl-a,然后按Ctrl-\(反斜杠)杀死所有窗口并终止当前的 Screen 会话。

Screen 的高级用法

正如前面提到的,可以创建多个同时运行的 Screen 会话,每个会话可以管理一系列窗口。每个会话有一个惟一标识符;使用 screen -list 列出可用的所有会话。与窗口一样,可以给会话指定名称以便引用它。使用screen -Slabel 给新会话分配标签。

共享是 Screen 会话的最佳用法之一。如果允许,可以连接现有的会话并在此会话的任何窗口中与其他用户协作。甚至可以独立地切换到会话中的另一个窗口。如果您与其他用户在同一窗口中,输入或显示的任何内容都会反映给所有伙伴。我们来试一下:

  1. 选择一台工作计算机并登录。
  2. 输入 screen -S sharing -t one 创建一个名为 sharing 的 Screen 会话和一个名为one 的新窗口。
  3. 用 screen -t two 创建另一个窗口。
  4. 如果愿意,检查一下目前的状态:按 Ctrl-a,然后按 d,然后输入 screen -list 和screen -r sharing,然后按Ctrl-a,然后按"。
  5. 在 one 窗口中输入 echo,在此窗口中产生一些输出。
  6. 在同一台计算机上,打开第二个登录窗口。
  7. 在此窗口中,输入 screen -x -r sharing -p one

    -x 选项指定多用户模式;-p one 直接连接到 one 窗口。应该会马上看到与另一个登录会话相同的输出,见图 9。

    图 9. 可以共享会话

在每个登录窗口中,运行 UNIX® 命令产生输出,按 Screen 快捷键在共享的会话中的窗口之间切换并查看结果。

结束语

要想进一步掌握 Screen,可以研究一下多屏幕模式,学习如何用老式的锁防止对各个窗口的访问。

Screen 是一个很实用的工具,它对于在命令行上执行的任何工作都很有价值。实际上,一旦掌握了它,您就会觉得离不开它了。

二、使用tmux管理会话

介绍

tmux是一个优秀的终端复用软件,即使非正常掉线,也能保证当前的任务运行,这一点对于远程SSH访问特别有用,网络不好的情况下仍然能保证工作现场不丢失!此外,tmux完全使用键盘控制窗口,实现窗口的切换功能。

简单地说,tmux对于我主要有两个功能(这应该也是tmux的主要功能):

  1. split窗口。可以在一个terminal下打开多个终端,也可以对当前屏幕进行各种split,即可以 同时打开多个显示范围更小的终端。
  2. 在使用SSH的环境下,避免网络不稳定,导致工作现场的丢失。想象以下场景, 你在执行一条命令的过程中,由于网络不稳定,SSH连接断开了。这个时候,你就不知道之前 的那条命令是否执行成功。如果此时你打开了很多文件,进入了较深层次的目录,由于网络 不稳定,SSH连接断开。重新连接以后,你又不得不重新打开那些文件,进入那个深层次的 目录。如果使用了tmux,重新连接以后,就可以直接回到原来的工作环境,不但提高了工作 效率,还降低了风险,增加了安全性。

安装

sudo apt-get install tmux

安装完成后输入命令tmux即可打开软件,界面十分简单,类似一个下方带有状态栏的终端控制台;不出意外,这时候你会跟我第一次一样,觉得tmux没什么牛逼的。

会话,窗口,面板

根据tmux的定义,在开启了tmux服务器后,会首先创建一个会话,而这个会话则会首先创建一个窗口,其中仅包含一个面板;也就是说,这里看到的所谓终端控制台应该称作tmux的一个面板,虽然其使用方法与终端控制台完全相同。

tmux使用C/S模型构建,主要包括以下单元模块:

  • server服务器。输入tmux命令时就开启了一个服务器。
  • session会话。一个服务器可以包含多个会话
  • window窗口。一个会话可以包含多个窗口。
  • pane面板。一个窗口可以包含多个面板。

初体验

我们先来看一张效果图,再来学习tmux的配置和使用我一般都是这么用,因为我的笔记本只有13寸:-)

当然,做为一个准IT男,我还有一个很大的屏幕,所以我偶尔也这么用:

你所看到的只是X个会话中的一个会话,且是该会话下面的Y个窗口中的一个窗口。是的,你在一个窗口里就可以拥有这么多个终端,这就是tmux的主要功能。好了,下面是tmux的常用按键,你先自己玩一下再往下看吧。

常用按键

这里需要说明一点的是,tmux的任何指令,都包含一个前缀,也就是说,你按了前缀(一组按键,默认是Ctrl+b)以后,系统才知道你接下来的指令是发送给tmux的。

  • C-b ? 显示快捷键帮助
  • C-b C-o 调换窗口位置,类似与vim 里的C-w
  • C-b 空格键 采用下一个内置布局
  • C-b ! 把当前窗口变为新窗口
  • C-b " 模向分隔窗口
  • C-b % 纵向分隔窗口
  • C-b q 显示分隔窗口的编号
  • C-b o 跳到下一个分隔窗口
  • C-b 上下键 上一个及下一个分隔窗口
  • C-b C-方向键 调整分隔窗口大小
  • C-b c 创建新窗口
  • C-b 0~9 选择几号窗口
  • C-b c 创建新窗口
  • C-b n 选择下一个窗口
  • C-b l 切换到最后使用的窗口
  • C-b p 选择前一个窗口
  • C-b w 以菜单方式显示及选择窗口
  • C-b t 显示时钟
  • C-b ; 切换到最后一个使用的面板
  • C-b x 关闭面板
  • C-b & 关闭窗口
  • C-b s 以菜单方式显示和选择会话
  • C-b d 退出tumx,并保存当前会话,这时,tmux仍在后台运行,可以通过tmux attach进入 到指定的会话

配置

我们先来看一下几个配置,这些配置才是我离不开tmux的原因:-)。tmux的配置文件是~/.tmux.conf,这个文件可能不存在,你可以自己新建。下面开始配置,首先,有没有觉得tmux的前缀按起来太不方便了,ctrl与b键隔得太远,很多人把它映射成C+a,也就是在配置文件(~/.tmux.conf)中加入下面这条语句:

  1.  
    #设置前缀为Ctrl + a
  2.  
    set -g prefix C-a

与此同时,取消默认的前缀按键:

  1.  
    #解除Ctrl+b 与前缀的对应关系
  2.  
    unbind C-b

配置完以后,重启tmux起效,或者先按C+b,然后输入,进入命令行模式,在命令行模式下输入:

source-file ~/.tmux.conf

你也可以跟我一样,在配置文件中加入下面这句话,以后改了只需要按前缀+r了。

  1.  
    #将r 设置为加载配置文件,并显示"reloaded!"信息
  2.  
    bind r source-file ~/.tmux.conf \; display "Reloaded!"

关于前缀,很多人都喜欢改成Ctrl+a,不过我个人更喜欢Ctrl+x,如果你是vim用户,你一定懂的。还有就是面板的切换很不方便,需要先按前缀,再按方向键,还记得vim里面怎么切换各个面板的吗?tmux也可以,因为它支持映射。把前缀映射改成Ctrl+x,再加入如下几条语句,现在切换窗口就和vim一摸一样了,顿时觉得亲切了很多。

  1.  
    #up
  2.  
    bind-key k select-pane -U
  3.  
    #down
  4.  
    bind-key j select-pane -D
  5.  
    #left
  6.  
    bind-key h select-pane -L
  7.  
    #right
  8.  
    bind-key l select-pane -R

上面的最后一条语句会更改C-x l的功能,我挺喜欢这个功能的,因为我们很时候都是在两个窗口或这两个面板中切换,所以我又加入如下语句

  1.  
    #select last window
  2.  
    bind-key C-l select-window -l

现在我的l键可不能随便按了,Ctrl+x l是切换面板,Ctrl+x Ctrl+l切换窗口,Ctrl+l清屏。

复制模式copy-mode

  • 前缀 [ 进入复制模式
  • 按 space 开始复制,移动光标选择复制区域
  • 按 Enter 复制并退出copy-mode。
  • 将光标移动到指定位置,按 PREIFX ] 粘贴

如果把tmux比作vim的话,那么我们大部分时间都是处于编辑模式,我们复制的时候可不可以像vim一样移动呢?只需要在配置文件(~/.tmux.conf)中加入如下行即可。

  1.  
    #copy-mode 将快捷键设置为vi 模式
  2.  
    setw -g mode-keys vi

会话

  • C-x s 以菜单的方式查看并选择会话
  • C-x :new-session 新建一个会话
  • C-x d 退出并保存会话
  • 终端运行 tmux attach 返回会话

命名会话

  1.  
    tmux new -s session
  2.  
    tmux new -s session -d #在后台建立会话
  3.  
    tmux ls #列出会话
  4.  
    tmux attach -t session #进入某个会话

使当前pane 最大化

从我用vim开始,就相信这世界上有些人比你自己还了解你自己想要什么,所以乔老爷子才能做出让世人尖叫的产品,所以我经常浏览高手的.vimrc文件,我用了tmux不到3天就发现,它怎么不能最大化当前pane?就像vim里的ZommWinPlugin.vim插件一样,你按下某键,当前窗口就最大化了,获得最大可视界面。当目前为止,就还没有发现我有需求而别人没有的,同样,已有前人找到的解决办法,方法如下:

  1.  
    # zoom pane <-> window
  2.  
    #http://tmux.svn.sourceforge.net/viewvc/tmux/trunk/examples/tmux-zoom.sh
  3.  
    bind ^z run "tmux-zoom"
  4.  
    ##

滚屏

滚屏要进入copy-mode,即前缀+[,然后就可以用上下键来滚动屏幕,配置了vi快捷键模式,就可以像操作vi一样来滚动屏幕,非常的方便。退出直接按‘q’键即可。

其他配置

下面是从别人那里摘录过来的配置,反正我是用不着,留着以后参考吧,或许屏幕前的你有需要呢。

  1.  
    #
  2.  
    # author : Xu Xiaodong <xxdlhy@gmail.com>
  3.  
    # modified : 2012 Jul 22
  4.  
    #
  5.  
     
  6.  
    #-- base settings --#
  7.  
    set -g default-terminal "screen-256color"
  8.  
    set -g display-time 3000
  9.  
    set -g escape-time 0
  10.  
    set -g history-limit 65535
  11.  
    set -g base-index 1
  12.  
    set -g pane-base-index 1
  13.  
     
  14.  
    #-- bindkeys --#
  15.  
    # prefix key (Ctrl+a)
  16.  
    set -g prefix ^a
  17.  
    unbind ^b
  18.  
    bind a send-prefix
  19.  
     
  20.  
    # split window
  21.  
    unbind '"'
  22.  
    # vertical split (prefix -)
  23.  
    bind - splitw -v
  24.  
    unbind %
  25.  
    bind | splitw -h # horizontal split (prefix |)
  26.  
     
  27.  
    # select pane
  28.  
    bind k selectp -U # above (prefix k)
  29.  
    bind j selectp -D # below (prefix j)
  30.  
    bind h selectp -L # left (prefix h)
  31.  
    bind l selectp -R # right (prefix l)
  32.  
     
  33.  
    # resize pane
  34.  
    bind -r ^k resizep -U 10 # upward (prefix Ctrl+k)
  35.  
    bind -r ^j resizep -D 10 # downward (prefix Ctrl+j)
  36.  
    bind -r ^h resizep -L 10 # to the left (prefix Ctrl+h)
  37.  
    bind -r ^l resizep -R 10 # to the right (prefix Ctrl+l)
  38.  
     
  39.  
    # swap pane
  40.  
    # swap with the previous pane (prefix Ctrl+u)
  41.  
    bind ^u swapp -U
  42.  
    # swap with the next pane (prefix Ctrl+d)
  43.  
    bind ^d swapp -D
  44.  
     
  45.  
    # misc
  46.  
    # select the last pane (prefix e)
  47.  
    bind e lastp
  48.  
    # select the last window (prefix Ctrl+e)
  49.  
    bind ^e last
  50.  
    # kill pane (prefix q)
  51.  
    bind q killp
  52.  
    # kill window (prefix Ctrl+q)
  53.  
    bind ^q killw
  54.  
     
  55.  
    # copy mode
  56.  
    # enter copy mode (prefix Escape)
  57.  
    bind Escape copy-mode
  58.  
    # paste buffer (prefix Ctrl+p)
  59.  
    bind ^p pasteb
  60.  
    # select (v)
  61.  
    bind -t vi-copy v begin-selection
  62.  
    # copy (y)
  63.  
    bind -t vi-copy y copy-selection
  64.  
     
  65.  
    # zoom pane <-> window
  66.  
    #http://tmux.svn.sourceforge.net/viewvc/tmux/trunk/examples/tmux-zoom.sh
  67.  
    bind ^z run "tmux-zoom"
  68.  
     
  69.  
    # app
  70.  
    # htop (prefix !)
  71.  
    bind ! splitw htop
  72.  
    # man (prefix m)
  73.  
    bind m command-prompt "splitw 'exec man %%'"
  74.  
    # perl func (prefix @)
  75.  
    bind @ command-prompt "splitw 'exec perldoc -t -f %%'"
  76.  
    # perl var (prefix *)
  77.  
    bind * command-prompt "splitw 'exec perldoc -t -v %%'"
  78.  
    # perl doc (prefix %)
  79.  
    bind % command-prompt "splitw 'exec perldoc -t %%'"
  80.  
    # ruby doc (prefix /)
  81.  
    bind / command-prompt "splitw 'exec ri %%'"
  82.  
     
  83.  
    # reload config (prefix r)
  84.  
    bind r source ~/.tmux.conf \; display "Configuration reloaded!"
  85.  
     
  86.  
    #-- statusbar --#
  87.  
    set -g status-utf8 on
  88.  
    set -g status-interval 1
  89.  
    set -g status-keys vi
  90.  
     
  91.  
    setw -g mode-keys vi
  92.  
    setw -g automatic-rename off
  93.  
     
  94.  
    #-- colorscheme --#
  95.  
    #https://github.com/daethorian/conf-tmux/blob/master/colors/zenburn.conf
  96.  
     
  97.  
    # modes
  98.  
    setw -g clock-mode-colour colour223
  99.  
    setw -g mode-attr bold
  100.  
    setw -g mode-fg colour223
  101.  
    setw -g mode-bg colour235
  102.  
     
  103.  
    # panes
  104.  
    set -g pane-border-bg colour234
  105.  
    set -g pane-border-fg colour234
  106.  
    set -g pane-active-border-bg colour232
  107.  
    set -g pane-active-border-fg colour232
  108.  
     
  109.  
    # statusbar
  110.  
    set -g status-justify centre
  111.  
    set -g status-bg colour235
  112.  
    set -g status-fg colour248
  113.  
    set -g status-attr dim
  114.  
    #[default]» #[fg=colour187]#S #[default]• #[fg=colour187]w#I.p#P#[default]"
  115.  
    set -g status-left "
  116.  
    set -g status-left-attr bright
  117.  
    set -g status-left-length 20
  118.  
    #[fg=colour174]#(/home/xiaodong/bin/uptime) #[default]• #[fg=colour174]#(cut -d ' ' -f 1-3 /proc/loadavg)"
  119.  
    set -g status-right "
  120.  
    set -g status-right-attr bright
  121.  
    set -g status-right-length 80
  122.  
     
  123.  
    setw -g window-status-current-fg colour223
  124.  
    setw -g window-status-current-bg colour237
  125.  
    setw -g window-status-current-attr bold
  126.  
    setw -g window-status-current-format "#I:#W#F"
  127.  
     
  128.  
    #setw -g window-status-alert-attr bold
  129.  
    #setw -g window-status-alert-fg colour255
  130.  
    #setw -g window-status-alert-bg colour160
  131.  
     
  132.  
    # messages
  133.  
    set -g message-attr bold
  134.  
    set -g message-fg colour223
  135.  
    set -g message-bg colour235

set -g visual-activity on

快速启动tmux

如果觉得每次都要打开tmux,然后在打开几个窗口和面板很麻烦,那么下面这个脚本你一定会喜欢。参考这里

  1.  
    #!/bin/sh
  2.  
    #
  3.  
    # name : tmuxen, tmux environment made easy
  4.  
    # author : Xu Xiaodong xxdlhy@gmail.com
  5.  
    # license : GPL
  6.  
    # created : 2012 Jul 01
  7.  
    # modified : 2012 Jul 02
  8.  
    #
  9.  
     
  10.  
    cmd=$(which tmux) # tmux path
  11.  
    session=codefun # session name
  12.  
     
  13.  
    if [ -z $cmd ]; then
  14.  
    echo "You need to install tmux."
  15.  
    exit 1
  16.  
    fi
  17.  
     
  18.  
    $cmd has -t $session
  19.  
     
  20.  
    if [ $? != 0 ]; then
  21.  
    $cmd new -d -n vim -s $session "vim"
  22.  
    $cmd splitw -v -p 20 -t $session "pry"
  23.  
    $cmd neww -n mutt -t $session "mutt"
  24.  
    $cmd neww -n irssi -t $session "irssi"
  25.  
    $cmd neww -n cmus -t $session "cmus"
  26.  
    $cmd neww -n zsh -t $session "zsh"
  27.  
    $cmd splitw -h -p 50 -t $session "zsh"
  28.  
    $cmd selectw -t $session:5
  29.  
    fi
  30.  
     
  31.  
    $cmd att -t $session
  32.  
     
  33.  
    exit 0

如果还有其他需要,可以去这里看看,当然了,最全的参考文档,就是man tmux。happy tmux!

个性化折腾

生命不息,折腾不止.自己定制的才是最适合自己的,如此强大的工具要慢慢挖掘1. 改prefix键, ctrl+b没手感,改为ctrl+h修改~/.tmux.conf(如果没有则新建一个),新增如下内容:
set -g prefix C-hunbind-key C-b

  1. 启动shell时自动进入tmux, 如果没有会话则新建一个,有则直接attach在.zshrc(bash用户可能是.bashrc)的最后加入tmux就直接启动了,但要做些逻辑判断最后的脚本如下:
    test -z "$TMUX" && (tmux attach || tmux new-session)

  2. 定制状态栏, 想在状态栏上加点自己随时感兴趣的东西因为是动态IP,平常时不时会要ifconfig一下,于是将IP固定显示在状态栏左边
    set -g status-left-ength 21set -g status-left "#[bg=green,fg=white,bold]#(ifconfig | grep -A1 eth0 | tail -1 | awk '{print $2}' | awk -F: '{print $2}')"开发的机器经常高load,可以将load放到状态栏右边,成天对着黑白terminal,怕忘记时间再在状态栏加上时间显示(一分钟refresh一次)
    set -g status-right "#[bg=green,fg=white,bold]#(cut -d ' ' -f 1-3 /proc/loadavg) ● #[bg=green,fg=white,bold]#(date +%H:%M)"set -g status-interval 60(其实在tmux中, 按下prefix键后 加t 会有个全屏的时钟出来)

  3. 启动时初始化窗口想骚包吗?想假装高手吗,想打开tmux就自动就分N个窗口吗?在shell启动脚本中加入这些(替换之前的自启动脚本)

使用以上脚本会开两个window,并把第2个window分割成3份,最上面跑着htop,左边有个vim,右边一个dstat,效果如下图 
 
具体需要启动什么,启动几个窗口,分割分几个pane, 都可以修改脚本定制

  1. 多pane同步连了好几台服务器,想同时执行相同的命令,同时观察结果吗?在按下prefix键后按冒号进入command模式输入 
    setw synchronize-panes 
    你输入的命令将在所有pane中出现执行 

把以下脚本内容加入到~/.bashrc,即可每次登录进入到tmux

  1.  
    tmux_init()
  2.  
    {
  3.  
    tmux new-session -s "kumu" -d -n "local" # 开启一个会话
  4.  
    tmux new-window -n "other" # 开启一个窗口
  5.  
    tmux split-window -h # 开启一个竖屏
  6.  
    tmux split-window -v "top" # 开启一个横屏,并执行top命令
  7.  
    tmux -2 attach-session -d # tmux -2强制启用256color,连接已开启的tmux
  8.  
    }
  9.  
    # 判断是否已有开启的tmux会话,没有则开启
  10.  
    if which tmux 2>&1 >/dev/null; then
  11.  
    test -z "$TMUX" && (tmux attach || tmux_init)
  12.  
    fi

三、配置文件

~/.screenrc

  1.  
    hardstatus alwayslastline
  2.  
    hardstatus string "%{= B}:%{= b}: %{= r}[ %{G}%H%{= r} ] %= %{=b b}%-w%{=rb db}%>%n %t%{-}%+w %=%{= r}[ %{G}%c %{M}%D %m-%d %{r}] %{= b}:%{B}:"
  3.  
    terminfo xterm*|rxvt ti@:te@
  4.  
    terminfo rxvt-unicode 'Co#256:AB=\E[48;5;%dm:AF=\E[38;5;%dm'
  5.  
    terminfo xterm* 'XT:hs:ts=\E]2;:fs=\007:ds=\E]2;screen\007'
  6.  
    autodetach on # default: on
  7.  
    altscreen on
  8.  
    defscrollback 1000
  9.  
    msgwait 5
  10.  
    msgminwait 2
  11.  
    pow_detach_msg "Screen session of \$LOGNAME \$:cr:\$:nl:ended."
  12.  
    startup_message off # default: on
  13.  
    vbell off
  14.  
    vbell_msg " Wuff ---- Wuff!! "
  15.  
    nethack on
  16.  
    defutf8 on
  17.  
    shell /bin/zsh
  18.  
    bindkey -k F1 prev
  19.  
    bindkey -k F2 next
  20.  
    screen
  21.  
    screen

~/.tmux.conf

  1.  
    set-option -g prefix C-a
  2.  
    unbind-key C-b
  3.  
    bind-key C-a send-prefix
  4.  
    bind-key -n F11 previous-window
  5.  
    bind-key -n F12 next-window
  6.  
    bind-key C-c new-window
  7.  
    setw -g mode-keys vi
  8.  
    setw -g xterm-keys on
  9.  
    unbind %
  10.  
    bind | split-window -h
  11.  
    bind h split-window -h
  12.  
    unbind '"'
  13.  
    bind - split-window -v
  14.  
    bind v split-window -v
  15.  
    set-option -g visual-activity on
  16.  
    setw -g monitor-activity on
  17.  
    setw -g automatic-rename off
  18.  
    setw -g utf8 on
  19.  
    set -g base-index 1
  20.  
    set -g terminal-overrides "*88col*:colors=88,*256col*:colors=256,xterm*:colors=256"
  21.  
    set -g default-terminal "screen-256color"
  22.  
    set -g status-utf8 on
  23.  
    set -g status-justify centre
  24.  
    set -g status-bg default
  25.  
    set -g status-left "#[fg=cyan]:#[fg=blue]: #[fg=red][ #[fg=green]#H #[fg=red]]#[default]"
  26.  
    set -g status-left-length 20
  27.  
    set -g status-right-length 25
  28.  
    set -g status-right "#[fg=red][ #[fg=green]%H:%M #[fg=magenta]%a %m-%d #[fg=red]] #[fg=blue]:#[fg=cyan]:#[default]"
  29.  
    setw -g window-status-format '#[fg=blue,bold]#I #T#[default] '
  30.  
    setw -g window-status-current-format '#[fg=blue,bold,reverse]#I #T#[default] '
  31.  
    #setw -g window-status-alert-fg red
  1.  
    # author: XuTao <butbueatiful@gmail.com>
  2.  
    # time: Sun Jul 15 21:57:17 CST 2012
  3.  
    # Usage: mv tmux_conf.txt ~/.tmux.conf
  4.  
    #------------------------------------------
  5.  
     
  6.  
    #-- base --#
  7.  
    set -g default-terminal "screen"
  8.  
    set -g display-time 3000
  9.  
    set -g history-limit 65535
  10.  
    #----------------------------------------------
  11.  
     
  12.  
    #将默认按键前缀改为与C-i避免与终端快捷键冲突
  13.  
     
  14.  
    set-option -g prefix C-i
  15.  
    unbind-key C-b
  16.  
    bind-key C-i send-prefix
  17.  
    #----------------------------------------------
  18.  
     
  19.  
    #按键绑定
  20.  
     
  21.  
     
  22.  
    #水平或垂直分割窗口 (C+A+ :split-window + v/h)
  23.  
    unbind '"'
  24.  
    bind - splitw -v #分割成上下两个窗口
  25.  
    unbind %
  26.  
    bind | splitw -h #分割成左右两个窗口
  27.  
    #----------------------------------------------
  28.  
     
  29.  
    #选择分割的窗格
  30.  
    bind k selectp -U #选择上窗格
  31.  
    bind j selectp -D #选择下窗格
  32.  
    bind h selectp -L #选择左窗格
  33.  
    bind l selectp -R #选择右窗格
  34.  
    #----------------------------------------------
  35.  
     
  36.  
    #重新调整窗格的大小
  37.  
    bind ^k resizep -U 10
  38.  
    bind ^j resizep -D 10
  39.  
    bind ^h resizep -L 10
  40.  
    bind ^l resizep -R 10
  41.  
    #----------------------------------------------
  42.  
     
  43.  
    #交换两个窗格
  44.  
    bind ^u swapp -U
  45.  
    bind ^d swapp -D
  46.  
     
  47.  
    bind ^a last
  48.  
    bind q killp
  49.  
    #----------------------------------------------
  50.  
     
  51.  
    bind '~' splitw htop
  52.  
    bind ! splitw ncmpcpp
  53.  
    bind m command-prompt "splitw -h 'exec man %%'"
  54.  
     
  55.  
    unbind s
  56.  
    #----------------------------------------------
  57.  
     
  58.  
    #定制状态行
  59.  
     
  60.  
    set -g status-left "#[fg=white,bg=blue] > #I < #[default] |" # 0:bash
  61.  
    #set -g status-left "#[fg=white,bg=blue] > #I < #[default] |" # session-name
  62.  
    set -g status-right "#[fg=yellow,bright][ #[fg=cyan]#W #[fg=yellow]]#[default] #[fg=yellow,bright]- %Y.%m.%d #[fg=green]%H:%M #[default]"
  63.  
    set -g status-right-attr bright
  64.  
     
  65.  
    set -g status-bg black
  66.  
    set -g status-fg white
  67.  
    set -g set-clipboard on
  68.  
     
  69.  
    setw -g window-status-current-attr bright
  70.  
    #setw -g window-status-current-bg red
  71.  
    setw -g window-status-current-bg green
  72.  
    setw -g window-status-current-fg white
  73.  
     
  74.  
    set -g status-utf8 on
  75.  
    set -g status-interval 1
  76.  
     
  77.  
    #set -g visual-activity on
  78.  
    #setw -g monitor-activity on
  79.  
     
  80.  
    set -g status-keys vi
  81.  
    #----------------------------------------------
  82.  
     
  83.  
    setw -g mode-keys vi
  84.  
    setw -g mode-mouse on
  85.  
     
  86.  
    #setw -g mouse-resize-pane on
  87.  
    #setw -g mouse-select-pane on
  88.  
    #setw -g mouse-select-window on
  89.  
     
  90.  
    # move x clipboard into tmux paste buffer
  91.  
    bind C-p run "tmux set-buffer \"$(xclip -o -sel clipbaord)\"; tmux paste-buffer"
  92.  
    # move tmux copy buffer into x clipboard
  93.  
    bind C-y run "tmux show-buffer | xclip -i -sel clipbaord"
  94.  
     
  95.  
    #默认启动应用
  96.  
     
  97.  
    #new -s work # 新建名为 work 的会话,并启动 mutt
  98.  
    #neww rtorrent # 启动 rtorrent
  99.  
    #neww vim # 启动 vim
  100.  
    #neww zsh
  101.  
    #selectw -t 3 # 默认选择标号为 3 的窗口

参考:

http://kumu-linux.github.io/blog/2013/08/06/tmux/

http://www.lovelin.info/blog/2012/10/25/tmuxshi-yong-xin-de-xiao-ji/

http://kumu-linux.github.io/blog/2013/08/06/tmux/

GNU Screen Usage的更多相关文章

  1. 从Tmux 转到GNU Screen

    网上很多地方都说Tmux比GNU Screen要好用,不过无意间看到这篇Switching from tmux to GNU Screen之后,我发现GNU Screen的窗口/区域概念更好,至少是更 ...

  2. GNU Screen使用入门

    前些天开始学习使用GNU Screen程序,发现这个工具在管理服务器时候确实挺方便的,于是写一篇文章总结一下,顺便介绍Screen的基本使用方法. 简介 GNU Screen是 一个基于文本的全屏窗口 ...

  3. GNU Screen使用

    基本使用 SSH时可以方便地resume工作 # open new screen session screen # restore screen -r  Steps Using GNU Screen ...

  4. gnu screen的用法

    在使用ssh或者telnet登录远程主机后执行一些耗时的命令, 如果此时ssh或者telnet中断, 那么远程主机上正在执行的程序或者说命令也会被迫终止. screen能够很好地解决这个问题, scr ...

  5. linux 技巧:使用 screen 管理你的远程会话

    你是不是经常需要 SSH 或者 telent 远程登录到 Linux 服务器?你是不是经常为一些长时间运行的任务而头疼,比如系统备份.ftp 传输等等.通常情况下我们都是为每一个这样的任务开一个远程终 ...

  6. linux screen 命令详解

    一.背景 系统管理员经常需要SSH 或者telent 远程登录到Linux 服务器,经常运行一些需要很长时间才能完成的任务,比如系统备份.ftp 传输等等.通常情况下我们都是为每一个这样的任务开一个远 ...

  7. 源码编译安装screen

    OS:Amazon Linux AMI 2015.09.2 (HVM) #sudo su #wget http://ftp.gnu.org/gnu/screen/screen-4.3.1.tar.gz ...

  8. linux screen 命令详解[转]

    一.背景 系统管理员经常需要SSH 或者telent 远程登录到Linux 服务器,经常运行一些需要很长时间才能完成的任务,比如系统备份.ftp 传输等等.通常情况下我们都是为每一个这样的任务开一个远 ...

  9. 使用 screen 管理你的远程会话

    文章转载自:https://www.ibm.com/developerworks/cn/linux/l-cn-screen/ 在此只作为笔记使用,不做他用 你是不是经常需要 SSH 或者 telent ...

随机推荐

  1. ZJOI 2019 划水记

    作为一个极其蒟蒻的OIer,虽然没有省选资格但还是去见见世面. ZJOI2019一试是在浙江省镇海中学.听名字就很霸气. 学习OI的最后一年,记录下一些事情,即使最终走到最后也一无所获,也是一段美好的 ...

  2. H5左侧滑删除简单实现

    简单的左滑删除 实现功能 在一个列表的一条中,往左滑动时,右边出现删除按钮,点击可删除这一条 实现办法 列表中一项为父div,其中包含内容div和删除按钮span 父div相对定位,设置宽度.内容di ...

  3. Lisp经典算法

    求平方根 SUCCESSIVE AVERAGING DUE TO HERON OF ALEXANDRIA ** TO FIND AN APPROXIMATION TO SQRT(X) ** MAKR ...

  4. [FWT] UOJ #310. 【UNR #2】黎明前的巧克力

    [uoj#310][UNR #2]黎明前的巧克力 FWT - GXZlegend - 博客园 f[i][xor],考虑优化暴力,暴力就是FWT xor一个多项式 整体处理 (以下FWT代表第一步) F ...

  5. Let's Encrypt:初次使用免费的ssl证书,并生成java用的 jks(keystore) 文件

    现在都流行 https,今天晚上花了二个小时,学习了一下,这里做个学习总结: 因为刚开始接触,就使用免费的:Let's Encrypt Let's Encrypt证书特点: 1. 现在主流的浏览器(c ...

  6. JavaScript(JS)基本语法(一)

    https://www.cnblogs.com/haiyan123/p/7577598.html 一.JavaScript的历史 1992年Nombas开发出C-minus-minus(C--)的嵌入 ...

  7. react-native中的图片

    静态图片资源 React Native 提供了一个统一的方式来管理 iOS 和 Android 应用中的图片.要往 App 中添加一个静态图片, 只需把图片文件放在代码文件夹中某处,然后像下面这样去引 ...

  8. strut2 的数据验证

    数据验证 用户的输入验证,必须做,且工作量巨大. 1.验证的方式 客户端验证:javascript 服务端验证:逻辑验证(我们的代码) 注意:如果客户端和服务端二选一的话,服务器端的不能省. 实际开发 ...

  9. 开发问题及解决--java.lang.IllegalStateException: Circular dependencies cannot exist in RelativeLayout

    <?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android=" ...

  10. dos下编译java

    dos下运行java程序,不借助其他的IDE,即可编译运行java程序. 工具/原料   电脑 方法/步骤     打开开始,运行cmd,进入dos界面.   分别运行java,和javac,检测jd ...