优雅地使用命令行: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
优雅地使用命令行:Tmux 终端复用的更多相关文章
- [Linux] tmux 终端复用命令行工具
tmux 终端复用命令行工具 tmux 是一款终端复用命令行工具,通常用于 Terminal 的窗口管理.可以在终端软件重启后通过命令行恢复上次的 session. 安装运行 macOS 上使用 Ho ...
- Linux切换用户时报错/.bash_profile: Permission denied,命令行(终端提示符)出现-bash-4.2$
Linux切换用户时报错/.bash_profile: Permission denied,命令行(终端提示符)出现-bash-4.2$ 利用su - 切换用户时,发现有一个用户切时出现如下情况 [r ...
- Linux 桌面玩家指南:06. 优雅地使用命令行及 Bash 脚本编程语言中的美学与哲学
特别说明:要在我的随笔后写评论的小伙伴们请注意了,我的博客开启了 MathJax 数学公式支持,MathJax 使用$标记数学公式的开始和结束.如果某条评论中出现了两个$,MathJax 会将两个$之 ...
- tmux终端复用/tmate终端共享
目录 tmux tmate tmux 一种终端复用工具,是终端中的窗口管理器.常见的一种用途是在关闭父shell时保持程序运行(常用于ssh访问断开连接后保持运行).linux上可通过包管理器进行安装 ...
- [linux] tmux终端复用神器 [转载]
转载https://www.cnblogs.com/kevingrace/p/6496899.html Tmux是一个优秀的终端复用软件,类似GNU Screen,但来自于OpenBSD,采用BSD授 ...
- Tmux终端复用神器使用心得
tmux在连接远程服务器做实验时很有帮助,可以为每一个项目设置一个Session,在Session中设置不同的Window同时跑多个实验,Window本身还可以分割为多个Pane,在一个视野内利用多个 ...
- 六个优雅的 Linux 命令行技巧
一些非常有用的命令能让命令行的生活更满足,使用 Linux 命令工作可以获得许多乐趣,但是如果您使用一些命令,它们可以减少您的工作或以有趣的方式显示信息时,您将获得更多的乐趣.在今天的文章中,我们将介 ...
- go get 无反应方法 Win/Linux 命令行、终端和 Git 代理设置
go get -u -v 无反应方法 CMD要用管理员权限运行,否则设置无效 netsh winhttp set proxy proxy-server="https=127.0.0.1:10 ...
- kotlin命令行交互式终端
之前在http://www.cnblogs.com/webor2006/p/7532982.htmlKotlin的环境搭建篇提到过在开发Kotlin可以用最原始的挖掘机式的命令行去编译运行,这里学习一 ...
随机推荐
- Java并发编程之队列
Deque(双端队列) 子接口BlockingDeque,实现类如下: ArrayDeque:大下可变的数组双端队列,不允许插入null LinkedList:大小可变的链表双端队列,允许插入null ...
- 《逆向工程核心原理》——DLL注入与卸载
利用CreateRemoteThread #include <iostream> #include <tchar.h> #include <Windows.h> # ...
- Android studio 简易登录界面
•参考资料 [1]:视频资源 [2]:Android TextView设置图标,调整图标大小 •效果展示图 •前置知识 TextView EditText Button 以及按压效果,点击事件 •出现 ...
- 第15 章 : 深入解析 Linux 容器
深入解析 Linux 容器 今天的内容主要分成以下三个部分 资源隔离和限制: 容器镜像的构成: 容器引擎的构成: 前两个部分就是资源隔离和限制还有容器镜像的构成,第三部分会以一个业界比较成熟的容器引擎 ...
- centos 7升级gcc到10.2.0
安装gcc 由于 Linux 操作系统的自由.开源,在其基础上衍生出了很多不同的 Linux 操作系统,如 CentOS.Ubuntu.Debian 等.这些 Linux 发行版中,大多数都默认装有 ...
- MySQL数据库高级一:架构介绍
两天半就可以 严禁使用 精通 在简历上 了解的越多,越比他人有优势 linux的mysql需要使用中文字符集那么就要修改配置文件 1.mysql的linux版 安装和卸载不说了 2.逻辑架构 总体概况 ...
- IDEA创建XML文件没有Spring Config选项
我在resources目录下导入3个配置文件时,applicationContext-common.xml文件中有4处http地址红色报错,下图为修正后的图片 了解到可能是由于父工程的pom文件中没有 ...
- Apache配置虚拟目录+Zend Studio访问
1 概述 Apache配置虚拟目录,然后可以通过Zend Studio的工程去访问,只需要修改Apache的httpd.conf文件. 2 修改httpd.conf 找到Apache安装目录下的htt ...
- 【Azure Developer】调用SDK的runPowerShellScript方法,在Azure VM中执行PowerShell脚本示例
当需要通过代码的方式执行PowerShell脚本时,可以参考以下的示例. Azure SDK中提供了两个方法来执行PowerShell脚本 (SDK Source Code: https://gith ...
- Kubernetes 降本增效标准指南 | 基于K8s 扩展机制构建云上成本控制系统
作者 王玉君,腾讯云后台高级开发工程师,负责腾讯云原生系统开发及建设. 晏子怡,腾讯云容器产品经理,在K8s弹性伸缩.资源管理领域有丰富的实战经验. 导语 Kubernetes 作为 IaaS 和 P ...