作者:赤乐君
链接:https://www.jianshu.com/p/fd3bbdba9dc9
来源:简书
https://www.cnblogs.com/piperck/p/4992159.html
这个教程的目的是为了更好地使用tmux,作为一个小白,看了网上众多的资料后,感觉资料太多,质量也良莠不齐。在youtube上找了一个很好地系列教程,实际跟着做了一遍后tmux最有用的部分都学会了。有什么不懂得直接查查速查表即可。
本次教程的环境是MAC OS 10.11. 关于如何安装tmux可以参考这两篇文章。
http://www.pianshen.com/article/5034333199/ 了解session,window,pane的区别
这两篇是我个人觉得比较好的文章,可以看完这两篇文章后再来看我的教程。做一个梳理和总结。
这个教程是我跟着视频做完的笔记,视频里有些内容因为时间问题不能用,我也做了相应的改进。建议最好还是把视频跟一遍,然后拿我的笔记用做复习。
本教程参考的视频:https://www.youtube.com/watch?v=FEfuXRTqINg
快捷键速查表:https://tmuxcheatsheet.com
1 Introduction
为什么使用tmux?
因为如果我们用terminal连接remote server。发生一些不可抗力,terminal关了的话,your work is GONE!
但是tmux不一样,即使你关闭了tmux。下次重新attch的时候,你会发现之前的东西都还在。这是因为即使你关闭了tmux,它也还在服务器的后台运行。
- prefix默认指的是ctrl键位和b键位,两个一起press,然后再按其他键位来实现不同的命令。在第4部分,我们会更改这个默认设置为ctrl+a,方便输入。在此之前默认都是ctrl+b
举个栗子:
prefix + % :水平分割pane
上面这句话里的+
号和:
号可以无视。:
号之后的内容是我写的注释。
prefix是顺序按下ctrl和b, 然后再按%
键,这个%
键就是shift+5。shif和5是同时按下。
2 Panes
分割pane
- prefix + % :水平分割pane(注意是shift+5)
- prefix + " : 竖直分割pane(注意是sift+双引号,就是问号?上面那个)
退出
- exit : 退出一个pane,也就是关闭这个pane,直接在shell里输入即可。或者是prefix+x(顺序按下ctrl b x这三个键)
放大一个pane
- prefix + z : 把当前一个pane放大(zoom in)。比如在用ls查看output的时候,因为一个pane可能空间太小,所以把这个pane放大,再执行一次后恢复。
在pane之间switch
- prefix + 上下左右的箭头 :这个说实话还是不方便,因为方向感要求高,左右箭头只能切换正左右,上下箭头只能切换正上下之后会有设置的方法来用鼠标选择pane。
- 如果只是在当前窗口切换少量pane,可以用prefix+o来切换,因为是切换所有的,因为是循环所有。
resize the pane
- prefix + (ctrl)+上下左右箭头 : 与上面命令不同的是,ctrl + b按完之后,不要松开ctrl,一直按着,然后再按箭头来调整。不过因为在mac下ctrl+箭头是切换屏幕,所以还得在偏好设置->键盘->快捷键->Mission Control里把对应的快捷键取消掉。
3 Windows
创建window
- prefix + c : 创建一个新的window。最下面会多出window的编号。有*号所在的window就是当前正在操作的window。
在不同的window间移动
- prefix + 数字1,2,3 : 因为能看到不同window的数字编号,所以直接输入想去的window的数字编号即可
关闭window
- prefix + & : 关闭当前window,会进行y/n提示的(ctl b shift+7)
重命名window:因为创建新的window后,下面除了数字编号不同外window名称都是一样的。所以为了知道每一个window是什么,最好重命名一下。
- prefix + , (逗号):更改window名称。但是这里遇到一个问题。更名后,我随便使用ls或cd命令后,window名称会随着目录的不同而变化。google后发现这个是zsh下oh-my-zsh的特性。于是打开~/.zshrc, 讲DISABLE_AUTO_TITLE="true"这一行反注释掉。source ~/.zshrc后,测试更改的名称,发现一切正常。
- Prefix+p (p for previous):切换到上一个window。
- Prefix+n (n for next): 切换到下一个window。
- Prefix+w (w for windows): 列出当前session所有window,通过上、下键可以选择切换到指定window。
4 Configuration
如果没有配置文件的话先创建: touch ~/.tmux.conf
视频中的文件配置
# Send prefix
set-option -g prefix C-a
unbind-key C-a
bind-key C-a send-prefix
# Use Alt-arrow keys to switch panes
bind -n M-Left select-pane -L
bind -n M-Right select-pane -R
bind -n M-Up select-pane -U
bind -n M-Down select-pane -D
# Shift arrow to switch windows
bind -n S-Left previous-window
bind -n S-Right next-window
# Mouse mode
set -g mode-mouse on
set -g mouse-resize-pane on
set -g mouse-select-pane on
set -g mouse-select-window on
# Set easier window split keys
bind-key v split-window -h
bind-key h split-window -v
# Easy config reload
bind-key r source-file ~/.tmux.conf \; display-message "tmux.conf reloaded"
首先,在更改了.tmux.conf后,在tmux里的快捷键没有变化。查找后发现是tmux只有在新建session的时候,才会去找tmux.conf文件。所以说,我之前创建的那些session都没有参考tmux.conf. 所以我就用tmux ls tmux kill-session -a
只保留当前session。再删除当前session tmux kill-session -t py27
。这下删除了所有创建好的session。
然后再次用tmux new -s py27
创建一个新的名为py27
的session。有提示了,但是错误提示显示没有mode-mouse命令。google之发现在2.1之后的tmux版本里,已经废除了这个命令。想要开启mouse mode的话,只需要一个句命令即可set -g mouse on
。
注意:乌班图14下默认安装时1.8版本,所以还是上面的配置。确认好自己的版本之后再确认配置文件。
更新后如下
# Send prefix
set-option -g prefix C-a
unbind-key C-a
bind-key C-a send-prefix
# Use Alt-arrow keys to switch panes
bind -n M-Left select-pane -L
bind -n M-Right select-pane -R
bind -n M-Up select-pane -U
bind -n M-Down select-pane -D
# Shift arrow to switch windows
bind -n S-Left previous-window
bind -n S-Right next-window
# Mouse mode
set -g mouse on
# Set easier window split keys
bind-key v split-window -h
bind-key h split-window -v
# Easy config reload
bind-key r source-file ~/.tmux.conf \; display-message "tmux.conf reloaded
Send prefix
把prefix的ctrl+b变为了ctrl+a,因为这样按起来方便些。基本上用tmux的都改了这个。
Use Alt-arrow keys to switch panes
不用按prefix,直接用alt+箭头在pane之间switch。实际用过之后才发现真是太方便了!
Shift arrow to switch windows
不用按prefix,直接用shift+箭头在window之间switch。太方便了!
Mouse mode
开启鼠标模式。用鼠标就能切换window,pane,还能调整pane的大小,方便!
Set easier window split keys
这一部分是用来更方便切分pane的。prefix + v 代表竖着切,prefix + h 代表横着切。比起默认的切割方法不仅直观而且方便。
Easy config reload
下一次如果修改了.tmux.conf的设置的话,不用关掉tmux。直接用prefix+r,就能重新加载设置。
5 Session
查看所有的session
- tmux ls : 这个命令是在terminal里输入的。当前正常运作中的tmux server会显示(attached)。没有的话就是已关闭,tmux server在后台运行。
- 切换session的快捷方式是 Prefix+s (s for session),然后上下键切换
重新连接某一个session with name(在terminal输入)
- tmux a -t py35 : 重新连接py35 session。这里的a是attach的意思
注意:不能再tmux状态下,会报错。。或者Prefix+d (d for detach),暂时离开Tmux,回到终端环境。重连就输入tmux a -t 就行。不过这种方式对于切换session比较麻烦。
偷懒连接上一个session(在terminal输入)
- tmux a : 如果只有一个session的话,这个是最快的连接方法
更名session(tmux状态下输入)
- prefix + $ : 更名后好让自己知道每一个session是用来做什么的。通常一个session对应一个project
创建session的时候直接命名(在terminal输入)
- tmux new -s py35 : 新建一个名为py35的session
断开一个session(detached) (tmux状态下输入)
- prefix + d :退出session。在只有一个window的状态下,直接输入exit也能退出
删除session(在terminal输入)
- tmux kill-session -a -t py35 : 删除除了py35以外的所有sessionkill session
要真正关闭一个session,可以在终端下执行命令
- tmux kill-session -t basic ,其中-t参数表示session名称。
Tmux的很多默认配置不够友好,需要个人重新定义。
unbind C-b
set -g prefix C-a
bind C-a send-prefix
bind r source-file ~/.tmux.conf \; display "tmux.conf reload!"
bind | split-window -h
bind - split-window -v
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R
set -g base-index 1
set -g pane-base-index 1
第1-2行表示重新定义Prefix,把默认的 Ctrl+b 换成 Ctrl+a ,便于单手操作。
第4行重新定义 Ctrl+a 组合键,当 Prefix + Ctrl+a 按下后,等同于原先 Ctrl+a 功能,解决Ctrl+a被设置为Prefix后已有快捷键失效的问题,也就是说只要按下两次 Ctrl+a ,就能实现原先终端下回到行首的功能。
第6行定义新的快捷键 Prefix+r ,重新加载Tmux配置文件,避免每次要进入命令模式reload配置。
第8-9行重新定义分屏快捷键。使用 Prefix+| 代替 Prefix+% 实现垂直分屏,使用 Prefix+- 代替 Prefix+" 实现水平分屏。|和-的符号本身就可以表示分屏线形状,非常直观。
第11-14行重新定义上下左右方向键,遵循vi习惯。定义以后,任何需要上下左右方向键的场景都可以用hjkl替代。
第16行表示将window的起始下标设为1。因为标准键盘的0在9后面, Prefix + 0/1/2 ...切换不便。
第17行表示将pane的起始下标设为1。理由同上。
二. 鼠标支持
set-window-option -g mode-mouse on
set -g mouse-select-pane on
set -g mouse-resize-pane on
set -g mouse-select-window on
第1行表示启用鼠标。虽然Tmux推荐用键盘完成所有操作,但是对现代开发人员来说,纯键盘操作的习惯并非那么容易养成,因此启用鼠标配置成为标配。
第2行表示支持鼠标选择pane。
第3行表示支持鼠标调整pane大小,选择线条拖动就行
第4行表示支持鼠标选择window,点击选项卡就行
三. UI样式调整
setw -g window-status-current-fg white
setw -g window-status-current-bg red
setw -g window-status-current-attr bright
set -g status-justify left
setw -g monitor-activity on
第1-3行表示状态栏中window标签的高亮样式,默认是绿底黑字,设置后当前window红底白字显示。
第5行表示状态栏中window列表左对齐排列。
第7行表示非当前window有内容更新时显示在状态栏。
四. 复制粘贴
默认情况下,按 Prefix+[ 进入复制模式,按回车(Enter)退出复制模式。可以通过配置在复制模式中使用vi习惯操作:
setw -g mode-keys vi
在复制模式下,按空格键(Space)开始复制,按回车(Enter)完成复制,并退出模式,按 Prefix+] 粘贴。这些快捷键也可以通过以下配置进行修改,使操作更加靠近vi。
unbind [
bind Escape copy-mode
unbind p
bind p paste-buffer
bind -t vi-copy 'v' begin-selection
bind -t vi-copy 'y' copy-selection
第1-2行表示重新绑定Escape键, Prefix+Escape 为进入复制模式。
第3-4行表示重新绑定p键, Prefix+p 为粘贴。
第5行表示重新绑定v键, Prefix+v 为开始复制。
第6行表示重新绑定y键, Prefix+y 为完成复制。
要查看当前复制的内容,可以在 Prefix+: 后出现的命令行中输入 show-buffer ,输入 list-buffers 可以列出所有的复制历史内容。
关于复制粘贴,更深入的话题是Tmux和系统剪贴板之间的交互,Linux可以使用xclip,Mac可以使用tmux-MacOSX-pasteboard,不过我没有试验成功,暂时可以通过ALT + 鼠标复制内容到系统剪贴板。
作者:赤乐君
链接:https://www.jianshu.com/p/fd3bbdba9dc9
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。