Skip to content

Commit 6c0edf4

Browse files
committed
new file: _posts/2017-11-24-tmux-workspace-plugin.md
1 parent f12c81f commit 6c0edf4

File tree

4 files changed

+175
-110
lines changed

4 files changed

+175
-110
lines changed

_posts/2015-08-10-cookie-session.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ Cookie提供了一种手段使得HTTP请求可以附加当前状态,
8080
1. 在服务器中配置一个不为人知的字符串(我们叫它Secret),比如:`x$sfz32`
8181
2. 当服务器需要设置Cookie时(比如`authed=false`),不仅设置`authed`的值为`false`
8282
在值的后面进一步设置一个签名,最终设置的Cookie是`authed=false|6hTiBl7lVpd1P`
83-
3. 签名`6hTiBl7lVpd1P`是这样生成的:`Hash('x$sfz32'+'true')`
83+
3. 签名`6hTiBl7lVpd1P`是这样生成的:`Hash('x$sfz32'+'false')`
8484
要设置的值与Secret相加再取哈希。
8585
4. 用户收到HTTP响应并发现头字段`Set-Cookie: authed=false|6hTiBl7lVpd1P`
8686
5. 用户在发送HTTP请求时,篡改了`authed`值,设置头字段`Cookie: authed=true|???`

_posts/2015-11-06-tmux-startup.md

Lines changed: 87 additions & 102 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,24 @@ title: 优雅地使用命令行:Tmux 终端复用
33
tags: Bash GNU Linux Node.js Session Tmux Vim 快捷键
44
---
55

6-
你是否曾经开过一大堆的Terminal?有没有把它们都保存下来的冲动?Tmux 的Session就是做这件事情的!你可以随时退出或者进入任何一个Session。每个Session有若干个Window,每个Window又可以分成多个窗格(Pane)。
6+
你是否曾经开过一大堆的 Terminal?有没有把它们都保存下来的冲动?[Tmux][tmux] 的Session就是做这件事情的!
7+
你可以随时退出或者进入任何一个 Session。每个 Session 有若干个 Window,每个 Window 又可以分成多个窗格(Pane)。
8+
极大地满足 Terminal 用户的需求。
79

8-
> 即使iTerm/Terminal/Konsole意外关闭也没关系。Session可以完全恢复!但是关机就不可以了,不过你可以写脚本来恢复!
9-
10-
Tmux是一个终端复用软件,BSD协议发布。一般用于在一个命令行窗口中访问多个命令行会话,或者在一个命令行终端中同时使用多个程序。Tmux用起来是怎样的呢?看图:
10+
此外即使 iTerm/Terminal/Konsole 意外关闭也没关系,因为 Session 完全保存在 Tmux Server 中。
11+
再次打开 Terminal 时只需 `tmux attach` 便可回到你的工作区,就像从未退出过一样。
12+
如果希望重启电脑后仍然生效,你可能需要 [动手写脚本](/2016/09/23/tmux-workspace-setup.html) 或者 [使用插件](/2017/11/24/tmux-workspace-plugin.html)
1113

1214
<!--more-->
1315

16+
# 什么是 Tmux
17+
18+
[Tmux][tmux] 是一个 BSD 协议发布的终端复用软件,用来在服务器端托管同时运行的 Shell。那么 Tmux 用起来是怎样的呢?看图:
19+
1420
![tmux screen shot][tmux-shot]
1521

16-
> Tmux 最经典的使用场景便是用 Tmux+Vim 来做一个IDE,其中Vim部分的配置过程记录在了[这里][vim-ide],本文介绍Tmux的配置和使用。
22+
Tmux 最经典的使用场景便是用 Tmux+Vim 来做一个IDE,其中Vim部分的配置过程记录在了[这里][vim-ide]
23+
本文介绍Tmux的安装配置,以及常见问题的解决方式。
1724

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

@@ -28,24 +35,17 @@ iTerm是一个GUI软件,它的窗格只是窗格而已!而Tmux是终端复
2835
这两个都是做终端复用的,我在阿里云 ECS 上 [搭建Node.js API服务器][node-web] 时用过 `screen`,它是 GNU 软件,而 Tmux 是 BSD 的协议。
2936
它们最主要的区别是 Tmux 支持 Vi/Emacs 风格的键盘映射,更好的接口和文档,以及更好的脚本控制。所以建议使用 Tmux!
3037

31-
# 安装Tmux
38+
# 安装使用
3239

33-
## OSX
34-
35-
```bash
36-
brew install tmux
37-
```
38-
39-
## Linux
40+
首先进行安装:
4041

4142
```bash
43+
brew install tmux # OSX
4244
pacman -S tmux # archlinux
4345
apt-get install tmux # Ubuntu
4446
yum install tmux # Centos
4547
```
4648

47-
# 基本使用
48-
4949
安装好后就可以启用一个Tmux Session了:(通过 `tmux new -s myname` 可以指定Session名)
5050

5151
tmux
@@ -67,41 +67,24 @@ yum install tmux # Centos
6767
unbind ^b
6868
set -g prefix 'C-a'
6969

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

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

7476
> 注意,通过`<prefix>r`重新载入配置并不等同于重启,只是增量地执行了配置文件中的所有命令而已。如果配置未生效,可以通过`tmux kill-server`来强行关闭Tmux。
7577
78+
## 导出配置
79+
7680
如果你想知道当前tmux的设置,可通过`tmux show -g`来查看(该命令需要tmux正在运行)。
7781
你可能会需要把这些设置导出为文件:
7882

7983
```bash
8084
tmux show -g >> current.tmux.conf
8185
```
8286

83-
# 窗格切换
84-
85-
可以把`hjkl`设置为切换窗格的快捷键:
86-
87-
bind h select-pane -L
88-
bind j select-pane -D
89-
bind k select-pane -U
90-
bind l select-pane -R
91-
92-
再给调整窗格大小设置快捷键:
93-
94-
bind L resize-pane -L 10 # 向左扩展
95-
bind R resize-pane -R 10 # 向右扩展
96-
bind K resize-pane -U 5 # 向上扩展
97-
bind J resize-pane -D 5 # 向下扩展
98-
99-
我们发现当打开新窗格时Shell仍然在Home目录,可以设置为当前目录:
100-
101-
bind '"' split-window -c '#{pane_current_path}'
102-
bind '%' split-window -h -c '#{pane_current_path}'
103-
104-
# 拷贝
87+
# 拷贝粘贴
10588

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

@@ -121,6 +104,53 @@ tmux show -g >> current.tmux.conf
121104

122105
> 旧版本中开始选择和复制选中快捷键绑定方式不同,请参考 <https://github.com/tmux/tmux/issues/592>
123106
107+
# 快捷键
108+
109+
下面列出了在 Tmux 中经常使用的快捷键,在下面给出的按键之前需要先按下 `<prefix>`
110+
如果你没有设置过它,默认是 `Ctrl+b`
111+
112+
```
113+
:new<CR> # 创建新的 Session,其中 : 是进入 Tmux 命令行的快捷键
114+
s # 列出所有 Session,可通过 j, k, 回车切换
115+
$ # 为当前 Session 命名
116+
c # 创建 Window
117+
<n> # 切换到第 n 个 Window
118+
, # 为当前 Window 命名
119+
% # 垂直切分 Pane
120+
" # 水平切分 Pane
121+
<space> # 切换 Pane 布局
122+
d # detach,退出 Tmux Session,回到父级 Shell
123+
t # 显示一个时钟,:)
124+
? # 快捷键帮助列表
125+
```
126+
127+
在 Pane 之间切换,或者改变 Pane 大小,建议自己配置快捷键。比如把它配置成 Vim 风格:
128+
129+
```
130+
bind h select-pane -L # 切换到左边的 Pane
131+
bind j select-pane -D # 切换到下边的 Pane
132+
bind k select-pane -U # 切换到上边的 Pane
133+
bind l select-pane -R # 切换到右边的 Pane
134+
bind L resize-pane -L 10 # 向左扩展
135+
bind R resize-pane -R 10 # 向右扩展
136+
bind K resize-pane -U 5 # 向上扩展
137+
bind J resize-pane -D 5 # 向下扩展
138+
```
139+
140+
> 完整的快捷键列表可以参考: <https://gist.github.com/MohamedAlaa/2961058>
141+
142+
# Unicode 显示问题
143+
144+
Tmux 通过 `LC_ALL`, `LC_CTYPE`, `LANG` 环境变量来判断是否终端支持 UTF-8。
145+
这样的判断有时是不准确的,导致 Tmux 中无法显示 Unicode。解决思路有两个:
146+
147+
* 在启动 `tmux``tmux attach` 所在的 Shell 中添加 `LC_ALL` 环境变量。
148+
* 启动 Tmux 时增加 `-u` 参数可以显式地通知 tmux 终端支持 UTF-8(`man tmux`)。
149+
150+
```bash
151+
tmux -u
152+
```
153+
124154
# 启用鼠标
125155

126156
Tmux 和 Vim 风格非常像,也可以设置鼠标模式。下面的设置开启了所有鼠标功能:
@@ -132,31 +162,30 @@ Tmux 和 Vim 风格非常像,也可以设置鼠标模式。下面的设置开
132162
> 等4 个选项来开启所有鼠标功能,现在只需要设置 `mouse` 选项了。
133163
> 使用 `tmux -V` 可以查看当前安装的 tmux 版本,版本更新日志见 [Tmux Changelog][changelog]。
134164

135-
# 恢复用户空间
165+
# Attach 到用户空间
136166

137-
Tmux 中的 Shell 没有运行在 Mac 的 GUI Session 中,因此需要访问 GUI Session 内容时就会出错。
138-
139-
例如 `open`, `sudo` 等命令会有错误如下:
167+
有写童鞋会发现在 Tmux 中执行 `open`, `sudo` 等命令会有错误如下:
140168

141169
```
142170
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.
143171
```
144172
145-
Vim [匿名寄存器][vim-registers] 访问不到系统剪切板,粘贴时有错误如下
173+
或者 Vim [匿名寄存器][vim-registers] 也访问不到系统剪切板,比如粘贴时报错
146174
147175
```
148176
Nothing in register *
149177
```
150178
151-
为了解决这些问题,可以使用 ChrisJohnsen 提供的 [`reattach-to-user-namespace`][reattach] 工具,
152-
在 Tmux 中启动 Shell 时立即挂载到 GUI Session 中。首先安装这一工具:
179+
这是因为 Tmux 中的 Shell 没有运行在 Mac 的 GUI Session 中,
180+
可以使用 [`reattach-to-user-namespace`][reattach] 工具来进行 Attach。
181+
首先安装这一工具:
153182
154183
```bash
155184
brew update
156-
brew upgrade reattach-to-user-namespace
185+
brew install reattach-to-user-namespace
157186
```
158187

159-
然后在`.tmux.conf`中添加启动命令
188+
然后在 `.tmux.conf` 中配置默认命令
160189

161190
```
162191
set -g default-command "reattach-to-user-namespace -l /usr/local/bin/zsh"
@@ -165,68 +194,23 @@ set -g default-command "reattach-to-user-namespace -l /usr/local/bin/zsh"
165194
> 这里的 `/usr/local/bin/zsh` 要对应于你的默认 Shell 的路径,如果你没做过手脚的话,应该在`/usr/bin/bash`
166195
> 可以通过 `echo $SHELL` 查看当前 Shell 的路径。
167196
168-
# 快捷键
169-
170-
## Sessions
171-
172-
:new<CR> new session
173-
s list sessions
174-
$ name session
175-
176-
> `:new -s <session-name>`可以指定新 Session 的名字。
177-
178-
## Windows (tabs)
179-
180-
c create window
181-
w list windows
182-
n next window
183-
p previous window
184-
f find window
185-
, name window
186-
& kill window
187-
188-
## Panes (splits)
189-
190-
% vertical split
191-
" horizontal split
192-
193-
o swap panes
194-
q show pane numbers
195-
x kill pane
196-
+ break pane into window (e.g. to select text by mouse to copy)
197-
- restore pane from window
198-
⍽ space - toggle between layouts
199-
<prefix> q (Show pane numbers, when the numbers show up type the key to goto that pane)
200-
<prefix> { (Move the current pane left)
201-
<prefix> } (Move the current pane right)
202-
<prefix> z toggle pane zoom
203-
204-
## Misc
205-
206-
d detach
207-
t big clock
208-
? list shortcuts
209-
: prompt
210-
211-
# Unicode 显示问题
212-
213-
Tmux 通过 `LC_ALL`, `LC_CTYPE`, `LANG` 环境变量来判断是否终端支持 UTF-8。
214-
这样的判断有时是不准确的,导致 Tmux 中无法显示 Unicode。解决思路有两个:
215-
216-
* 在启动 `tmux``tmux attach` 所在的 Shell 中添加 `LC_ALL` 环境变量。
217-
* 启动 Tmux 时增加 `-u` 参数可以显式地通知 tmux 终端支持 UTF-8(`man tmux`)。
218-
219-
```bash
220-
tmux -u
221-
```
222-
223-
# Session 丢失问题
197+
# Session 偶尔丢失
224198

225199
Tmux 中 Session 或 Window 丢失可能的原因有很多,需要仔细排查。检查 `tmux` 日志,以及检查 [Shell 的各级配置][shell]
226200

227201
* 比如 Shell 的 `TMOUT` 环境变量会让超时后的 Shell 自动退出,最终导致 Session 关闭。
228202
* 比如临时文件夹被清空导致 socket 丢失,参考:<https://community.webfaction.com/questions/9462/tmux-session-lost-in-unknown-pts-cause-and-possible-solution>
229203

204+
## 新 Shell 的工作目录
205+
206+
我们发现当打开新窗格时 Shell 仍然在Home目录。
207+
这是 Tmux 的默认行为,可以在配置文件中设置为当前 Shell 所在目录:
208+
209+
```
210+
bind '"' split-window -c '#{pane_current_path}'
211+
bind '%' split-window -h -c '#{pane_current_path}'
212+
```
213+
230214
# 扩展阅读
231215

232216
* TMUX 与 Screen 的区别:<http://unix.stackexchange.com/questions/549/tmux-vs-gnu-screen>
@@ -244,3 +228,4 @@ Tmux 中 Session 或 Window 丢失可能的原因有很多,需要仔细排查
244228
[vim-registers]: /2016/07/25/vim-registers.html
245229
[reattach]: https://github.com/ChrisJohnsen/tmux-MacOSX-pasteboard
246230
[shell]: /2016/06/08/shell-config-files.html
231+
[tmux]: https://wiki.archlinux.org/index.php/tmux

_posts/2016-09-23-tmux-workspace-setup.md

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,18 @@
11
---
2-
title: 初始化TMUX工作区
2+
title: 恢复 TMUX 工作区
3+
subtitle: The Hard Way
34
tags: Bash Session Tmux
45
---
56

6-
不就前Harttle在[优雅地使用命令行:Tmux 终端复用][tmux-startup]一文中介绍了
7-
TMUX的常用命令以及快捷键设置。然而因为电脑重启后这些Session会全部丢失,
8-
每次开机后都需要重新建立这些Session。TMUX并没有保存Session这样的神奇功能,
9-
一切行为都在于配置文件和脚本编写。
7+
我们知道使用 TMUX 后状态会保存在 Server 端,你的 Terminal 重启不会丢失任何东西。
8+
但 Server 重启后 Session 会全部丢失,如果你像 Harttle 一样在开发 PC 本地运行 Tmux Server 的话,
9+
每次开机后都需要重新建立各种会话和窗格。
1010

11-
本文便来编写一个初始化工作区的TMUX脚本。
11+
但没有什么是不能自动化的,我们可以通过 Tmux 配置文件(即初始化脚本)来自动建立工作区。
12+
本文便来手动编写一个初始化工作区的 TMUX 脚本。
13+
14+
* 如果你还不了解 Tmux,请先从 [优雅地使用命令行:Tmux 终端复用][tmux-startup] 一文开始阅读。
15+
* 如果你更偏向插件,可以参考 [恢复 TMUX 工作区 - The Easy Way](/2017/11/24/tmux-workspace-plugin.html),虽有一些限制但配置更加方便。
1216

1317
<!--more-->
1418

@@ -37,7 +41,7 @@ bash ./init-workspace.sh
3741

3842
> 在创建了一堆会话之后,如果希望把它们一起关掉可以直接`tmux kill-server`
3943
40-
# TMUX脚本
44+
# TMUX 脚本
4145

4246
除了保存为Bash脚本,也可以将这些初始化命令放在`~/.tmux.conf`中。
4347
这样在每次启动tmux服务时,这些命令都会得到执行。

0 commit comments

Comments
 (0)