优雅地使用命令行:Tmux 终端复用

转自:http://harttle.com/2015/11/06/tmux-startup.html

你是否曾经开过一大堆的Terminal?有没有把它们都保存下来的冲动?Tmux 的Session就是做这件事情的!你可以随时退出或者进入任何一个Session。每个Session有若干个Window,每个Window又可以分成多个窗格(Pane)。

即使iTerm/Terminal/Konsole意外关闭也没关系。Session可以完全恢复!但是关机就不可以了,不过你可以写脚本来恢复!

Tmux是一个终端复用软件,BSD协议发布。一般用于在一个命令行窗口中访问多个命令行会话,或者在一个命令行终端中同时使用多个程序。Tmux用起来是怎样的呢?看图:

Tmux 最经典的使用场景便是用 Tmux+Vim 来做一个IDE,其中Vim部分的配置过程记录在了这里,本文介绍Tmux的配置和使用。

iTerm的窗格和Tmux有什么区别?

iTerm是一个GUI软件,它的窗格只是窗格而已!而Tmux是终端复用,在一个命令行窗口中不仅可以显示多个Shell的内容,而且可以保持多个会话。 最重要的是:Tmux和Vim一样,属于字符终端软件,不需要任何GUI的支持,在远程登录时尤其有用。

Tmux和screen有什么区别?

这两个都是做终端复用的,我在阿里云ECS上搭建Node.js API服务器时用过screen,它是GNU软件,而Tmux是BSD的协议。 它们最主要的区别是Tmux支持Vi/Emacs风格的键盘映射,更好的接口和文档,以及更好的脚本控制。所以建议使用Tmux!

安装Tmux

OSX

brew install tmux

Linux

pacman -S tmux          # archlinux
apt-get install tmux    # Ubuntu
yum install tmux        # Centos

基本使用

安装好后就可以启用一个Tmux Session了:(通过 tmux new -s myname 可以指定Session名)

tmux

在Tmux Session中,通过<prefix>$可以重命名当前Session。其中<prefix>指的是tmux的前缀键,所有tmux快捷键都需要先按前缀键。它的默认值是Ctrl+b

<prefix>c可以创建新的窗口(Window),<prefix>%水平分割窗口(形成两个Pane),<prefix>"垂直分割窗口。退出当前Session的快捷键是<prefix>d。然后在Bash中可以查看当前的tmux服务中有哪些Session:

tmux ls

然后根据Session的名字可以再回去:

tmux a -t myname  (or at, or attach)

基本配置

默认的<prefix>Ctrl+b,如果你觉得不好按可以调整为Ctrl+a,只需要在配置文件~/.tmux.conf中加入:

unbind ^b
set -g prefix ‘C-a‘

为了能让Tmux动态载入配置而不是重启,我们设一个快捷键<prefix>r来重新载入配置:

bind r source-file ~/.tmux.conf \; display-message "Config reloaded"

注意,通过<prefix>r重新载入配置并不等同于重启,只是增量地执行了配置文件中的所有命令而已。如果配置未生效,可以通过tmux kill-server来强行关闭Tmux。

窗格切换

可以把hjkl设置为切换窗格的快捷键:

bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R

再给调整窗格大小设置快捷键:

bind L resize-pane -L 10  # 向左扩展
bind R resize-pane -R 10  # 向右扩展
bind K resize-pane -U 5   # 向上扩展
bind J resize-pane -D 5   # 向下扩展

我们发现当打开新窗格时Shell仍然在Home目录,可以设置为当前目录:

bind ‘"‘ split-window -c ‘#{pane_current_path}‘
bind ‘%‘ split-window -h -c ‘#{pane_current_path}‘

拷贝

在Tmux中通过[进入拷贝模式,按下<space>开始拷贝。然后用Vim/Emacs快捷键选择文本,按下<Enter>拷贝所选内容。然后通过]进行粘贴。

上述所有快捷键中,只有[]需要先按下<prefix>

我们可以让上述拷贝快捷键符合Vi风格:

bind Escape copy-mode
bind -t vi-copy v begin-selection
bind -t vi-copy y copy-selection
unbind p
bind p pasteb
setw -g mode-keys vi      # Vi风格选择文本

这样,按下<Escape>进入拷贝模式,v进行选择,y拷贝所选内容,p进行粘贴。

鼠标切换窗格

Tmux和Vim风格非常像,也可以设置鼠标模式。下面的设置开启了所有鼠标功能: 通过点击选择窗格,通过拖动更改窗格大小,通过鼠标选择窗口,还可以通过鼠标选择复制区域。

setw -g mode-mouse on
set -g mouse-select-pane on
set -g mouse-resize-pane on
set -g mouse-select-window on

恢复用户空间

Tmux有一个Bug,其中Shell的用户空间不是当前用户,结果就是mac下的open, sudo等命令都会失效。错误如下:

The window server could not be contacted. open must be run with a user logged in at the console, either as that user or as root.

解决办法如下:

更新reattach-to-user-namespace

brew update
brew upgrade reattach-to-user-namespace

.tmux.conf中添加:

set -g default-command "reattach-to-user-namespace -l /usr/local/bin/zsh"

这里的/usr/local/bin/zsh要对应于你的默认Shell,如果你没做过手脚的话,应该在/usr/bin/bash

快捷键

Sessions

:new<CR>  new session
s  list sessions
$  name session

:new -s <session-name>可以指定新Session的名字。

Windows (tabs)

c  create window
w  list windows
n  next window
p  previous window
f  find window
,  name window
&  kill window

Panes (splits)

%  vertical split
"  horizontal split

o  swap panes
q  show pane numbers
x  kill pane
+  break pane into window (e.g. to select text by mouse to copy)
-  restore pane from window
?  space - toggle between layouts
<prefix> q (Show pane numbers, when the numbers show up type the key to goto that pane)
<prefix> { (Move the current pane left)
<prefix> } (Move the current pane right)
<prefix> z toggle pane zoom

Misc

d  detach
t  big clock
?  list shortcuts
:  prompt
时间: 2024-10-06 18:22:37

优雅地使用命令行:Tmux 终端复用的相关文章

tmux: 终端复用

安装 不必多说: sudo apt-get install tmux 使用 在终端输入 tmux 回车即可打开tmux. tmux 有三个概念: session(会话), window(窗口), pane(窗格/面板). 在屏幕的最下面有一行显示tmux的状态, 最左边是 Session: x y z, 表示在第几个会话, 第几个窗口, 第几个面板. 一个tmux命令执行后启动一个tmux服务一个tmux服务可以拥有多个session,一个session可以看作是tmux管理下的伪终端的一个集合

更优雅地使用命令行

工欲善其事,必先利其器,通过武装自己的命令行工具,从而更优雅地使用命令行,可以使工作更加高效并且有趣.本文将以下几个方面来介绍命令行的使用技巧和提效工具 CLI 一键呼入呼出 iterm2 是一款完全免费,为 MacOS 打造的终端工具,特色功能是可以开启热键窗口,达到一键呼入呼出的效果 效果如下: 详细设置如下: 1.首先,进行如下设置 preferences > Keys > HotKey > Create a Dedicated Hotkey Window... 2.接着,设置热键

如何优雅地使用命令行设置windows文件关联

如何优雅地使用命令行设置windows文件关联 使用ftype查看帮助 设置关联所需命令有ftype assoc,需要管理员权限.如果忘记使用方法可通过ftype的帮助获取查看方法 C:\WINDOWS\system32>ftype /? 显示或修改用在文件扩展名关联中的文件类型 FTYPE [fileType[=[openCommandString]]] fileType 指定要检查或改变的文件类型 openCommandString 指定调用这类文件时要使用的开放式命令. 键入 FTYPE

tmux 终端复用详解

tmux是什么 我们在linux服务器上的工作一般都是通过一个远程的终端连接软件连接到远端系统进行操作,例如使用xshell或者SecureCRT工具通过ssh进行远程连接.在使用过程中,如果要做比较耗时的操作,例如有时候进行编译,或者下载大文件需要比较长的时间,一般情况下是下班之后直接运行希望第二天早上过来运行完成,这样就不用耽误工作时间.但是网络有时候不稳定,可能在半夜会出现连接断掉的情况,一旦连接断掉,我们所执行的程序也就中断,我们当然可以写一个脚本后台运行,但是还是不方便.那么有没有一种

Linux终端复用神器-Tmux使用梳理

原文参考:https://www.cnblogs.com/kevingrace/p/6496899.html Tmux是一个优秀的终端复用软件,类似GNU Screen,但来自于OpenBSD,采用BSD授权.使用它最直观的好处就是,通过一个终端登录远程主机并运行tmux后,在其中可以开启多个控制台而无需再“浪费”多余的终端来连接这台远程主机.是BSD实现的Screen替代品,相对于Screen,它更加先进:支持屏幕切分,而且具备丰富的命令行参数,使其可以灵活.动态的进行各种布局和操作.对于Tm

iOS开发入门 ? C语言(字符串、字符串数组、命令行参数)

字符串 1. 概念 用双引号引起来的就是字符串 "a string" //C语言编译器会将两个并列的字符串自动拼接成一个字符串 "a string""another a string" // \是换行连接的标记(一行不够写) "a looooooooooong \ string" 常见ASCII编码: 'A' == 65    'a' == 97    '0' == 48    '\0' == 0 int a[10]; //表

centos7更改为启动桌面或命令行模式

进入cenos7的命令行模式 终端输入“init 3”回车进入命令行模式 登录成功后 # systemctl get-default //获取当前系统启动模式 查看配置文件 # cat /etc/inittab 通过以上显示,目前系统为命令行模式 更改模式命令:systemctl set-default graphical.target由命令行模式更改为图形界面模式 systemctl set-default multi-user.target由图形界面模式更改为命令行模式 更改后验证是否正确

终端复用工具tmux的使用

tmux的作用在于终端复用. 1. 在server上启动一个bash.并在里面执行tmux 2. 通过ssh远程登录server,执行tmux attach,就会切换到server上的那个bash中,接下来的操作都是在bash中了 3. 此时能够打开很多其它的窗体,这样在远程就能够像在本地一样同一时候使用多个一样的bash 假设要发送命令.例如以下: tmux send -t checkpoint ls ENTER 注:checkpoint是你已经用tmux创建好的session的名字(tmux

终端复用工具-tmux

目录 终端复用工具--Tmux 一.为什么要用Tmux? 二.tmux是什么? 三.Tmux基本概念 四.Tmux使用规则 1.安装Tmux 2.基本使用 3.自定义配置文件 五.补充 1.tmux man手册 终端复用工具--Tmux 一.为什么要用Tmux? tmux是linux下的管理窗口的程序,那什么是管理窗口?众所周知,linux系统支持远程终端(terminal)连接,(使用终端通过ssh 命令去远程连接服务器,并执行各种命令),看看一下场景: 我们通过终端连接到远程服务器,去执行t