TMUX 自定义配置

QQ20160703-0
TMUX 号称是文本处理的“三大神器”之一,不是没有理由的。最近工作上好多事情都要在服务器上处理,所以用 TMUX 特别频繁。

最近花了点时间自己配置了一下 TMUX,这里权当记录一下吧。

1. 自动加载配置文件

在使用 TMUX 的时候,如果要重新加载配置文件,需要 Ctrl + b 触发,然后输入 : + source-file + ~/.tmux.conf

因为在调试配置的时候需要反复尝试,所以把这个配置做成了快捷键 Ctrl + b + R

bind R source-file ~/.tmux.conf

2. 采用 Vi 模式的快捷键

开启之后在复制模式(copy-mode,Ctrl + b + ?)中可以使用 Vi 模式下的快捷键。

setw -g mode-keys vi

3. 鼠标支持

对于鼠标的支持表现在通过鼠标的点击切换 window、pane 以及通过拖曳更改 pane 的大小。

注意的是 TMUX 版本的不同设置方式也不同。我的 MacBook Pro 使用的是 2.1,而我经常登录的服务器上使用的是 1.6。查看 TMUX 版本的命令是:

tmux -V

如果是 2.1 的话,设置为:

set -g mouse on

如果是 1.6 的话则设置为:

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

4. 切换 pane 的快捷键

默认的设置中,pane 的切换的快捷键是 Ctrl + b + 方向键,为了更便捷地进行切换,定义了新的快捷键 Alt + 方向键

# 切换为使用 Alt-方向键 切换同一 Window 中的pane
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

5. 自定义状态栏

TMUX 可以自定义状态栏的颜色和展示信息。首先给出我暂时使用的配置:

# 自动重新编号 window
set -g renumber-windows on

# 设置自动刷新的时间间隔
set -g status-interval 1
# 状态栏左对齐
set -g status-justify left
# 状态栏左侧宽度
set -g status-left-length 20
# 状态栏右侧宽度
set -g status-right-length 50

# 状态栏背景颜色
set -g status-bg '#333333'
# 状态栏前景颜色
set -g status-fg '#ffffff'
# 状态栏左侧显示 session 的名字
set -g status-left '#[bg=#00bb00] [#S] #[default] '
# 状态栏右侧显示时间
#set -g status-right '#[fg=white,bg=#55bb00] [#h] #[fg=white,bg=#009c00] %Y-%m-%d #[fg=white,bg=#007700] %H:%M:%S '
set -g status-right '#[fg=white,bg=#444444] [#h] #[fg=white,bg=#666666] %Y-%m-%d #[fg=white,bg=#888888] %H:%M:%S '

# 当前激活窗口在状态栏的展位格式
setw -g window-status-current-format '#[bg=#ff0000, fg=#ffffff, bold]*[#I] #W*'
# 未激活每个窗口占位的格式
setw -g window-status-format '#[bg=#0000ff, fg=#ffffff] [#I] #W '

有几个配置需要进行说明一下:

5.1 关于时间的配置

上文配置中,我采用了几个时间参数显示在了状态栏的右侧:

参数形式 参数含义
%Y 年:2016
%m 月:07
%d 日:03
%H 小时:02
%M 分钟:19
%S 秒:04

需要注意的是其实这个时间的刷新是有间隔的,我们可以通过设置参数:

set -g status-interval 1

使得状态栏的时间好像每一秒都在变化。

5.2 颜色配置

TMUX 的状态栏中可以按照 #[bg=colourxx,fg=#ffffff] 的形式定义颜色的前景和背景。颜色的类型指定如:blackredgreenyellowbluemagentacyanwhite 。也可以是 colour0 到 colour255。或者形如 #ffffff 的 RGB 格式。同时还可以针对字体进行设置:bright (or bold), dimunderscoreblinkreverse,hidden, or italics

#[default] 可以重置修改后的样式。

5.3 其他配置参数

参数名称 参数含义
#H 完整主机名
#h 不含域名的主机名
#F 窗口的标记
#S session 的名字
#I window 的序号
#W 窗口的名字

此外,我们还可以通过 #(shell_cmd) 的形式运行 shell 命令来增强显示。我们还可以通过 #{VARIABLE} 的形式使用 TMUX 中的各种变量。

  1. 条件变量,例如:#{?session_attached,attached,not attached}。如果 ? 后面的变量存在并且非 0 则返回第一个变量,否则返回第二个。
  2. 变量字符串截取 #{=N:VARIABLE} 的形式获取变量的前 N 个字符, #{=-N:VARIABLE} 获取变量的后 N 个字符。
  3. 如果变量是时间戳类型的,#{t:VARIABLE} 会把时间戳转换为时间字符串。
  4. #{d:VARIABLE} 返回变量的 dirname#{d:VARIABLE} 返回 basename

更多相关配置可见于:FORMATS

6. 我的配置

以下是我的配置,部分配置还是以 2.1 为准。

# 绑定 R 重载配置文件
bind R source-file ~/.tmux.conf

# 采用 vi 模式
setw -g mode-keys vi

# 基本设置
set -g default-terminal "screen-256color"

# 设置序号从1开始
set -g base-index 1
set -g pane-base-index 1

# 关闭状态栏窗口占位的自动命名
setw -g automatic-rename off
set-option -g allow-rename off
setw -g utf8 on
set -g status-utf8 on

# 设定状态栏的位置
set -g status-position bottom

# 状态栏配置 {
    # 自动重新编号 window
    set -g renumber-windows on

    # 设置自动刷新的时间间隔
    set -g status-interval 1
    # 状态栏左对齐
    set -g status-justify left
    # 状态栏左侧宽度
    set -g status-left-length 20
    # 状态栏右侧宽度
    set -g status-right-length 50

    # 状态栏背景颜色
    set -g status-bg '#333333'
    # 状态栏前景颜色
    set -g status-fg '#ffffff'
    # 状态栏左侧显示 session 的名字
    set -g status-left '#[bg=#00bb00] [#S] #[default] '
    # 状态栏右侧显示时间
    #set -g status-right '#[fg=white,bg=#55bb00] [#h] #[fg=white,bg=#009c00] %Y-%m-%d #[fg=white,bg=#007700] %H:%M:%S '
    set -g status-right '#[fg=white,bg=#444444] [#h] #[fg=white,bg=#666666] %Y-%m-%d #[fg=white,bg=#888888] %H:%M:%S '

    # 当前激活窗口在状态栏的展位格式
    setw -g window-status-current-format '#[bg=#ff0000, fg=#ffffff, bold]*[#I] #W*'
    # 未激活每个窗口占位的格式
    setw -g window-status-format '#[bg=#0000ff, fg=#ffffff] [#I] #W '
# }

# tmux 控制相关的配置 {
    # 允许鼠标选取 Window 、Pane 以及 Pane 的大小改变,2.1 时使用如下设置
    set -g mouse on
    # 同上,1.6 时如下设置
    #set -g mouse-select-window on
    #set -g mouse-select-pane on
    #set -g mouse-resize-pane on

    # 切换为使用 Alt-方向键 切换同一 Window 中的pane
    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
# }

每次学一个这样的高频度软件,都觉得开源世界真尼玛高深莫测,每个软件都有如此复杂的可定制性!还都是免费的!

7. 参考资料

date 命令小结

最近做的最多的就是把 Hive 查询写到 Shell 脚本中定时调度,常见的有按小时、按天、按周、按月来调度。

所以日期参数的传递就比较重要,这里做一下 date 命令的简单总结。

1. 格式

date [OPTION] [FORMAT]

2. 选项

选项一般是 --date(简写 -d)。

3. 格式

%Y   年,如:2016
%m   月, (01..12)
%d   日,两位
%u   day of week (1..7); 1 is Monday
%V   ISO week number, with Monday as first day of week (01..53)

4. 例子

# 格式化日期
date -d 20160101 +%Y-%m-%d
# 依据某一天进行加减
date -d "-1 days 20160101" +%u
# 文本化的输入
date -d "last sunday" +%Y-%m-%d

Vimtutor练习心得

A. 光标定位(482)

ctr + g 显示光标当前所在的行数
shift + g(G) 光标移动到文档末尾
gg 移动到文档首行
数字 + G 移动到指定行

B. 搜索命令(505)

? + 字符串 从当前位置向前查找
/ + 字符串 从当前位置向后查找
n 同向查找上一次的搜索内容
N 反向查找上一次的搜索内容

C. 光标跳转

ctl + o 后退,回到光标跳转之前的位置
ctl + i 前进,跳转到光标的下一个跳转位置

D. 字符串的替换(551)

:[(%|#,#)]s/oldstring/newstring[/(g|c|gc)]
参数说明:

  1. [(%|#,#)]指定替换操作有效行的范围。%表示全文所有行,#,#表示从某一行到另一行之间。不指定该参数表示有效行仅为当前行。
  2. [/(g|gc)]指定替换模式。g表示替换每个有效行内所有符合的字符串,c表示替换有效行内第一个符合的字符串并在替换时提示确认,gc是两者的复合表示替换有效行内所有符合的字符串并在替换时提示确认。不指定该参数表示仅替换每个有效行内遇到的第一个符合的字符串。

E. 文件操作(597)

: + ! + windows命令提示符 调用windows命令
: + r + 空格 + 文件名 将文件入读当前文档
: + w + 空格 + 文件名 将保存当前文件。可以先按“v”选择文本然后保存选定的文件。
: + 行数1 + , + 行数2 + 空格 + w + 空格 + 文件名 将当前文档的特定行保存至文件
: + r + 空格 + ! + windows命令提示符 执行windows命令并将输出信息输入到当前文档

F. 复制粘贴文本(782)

y + 数字 + w 复制若干个单词
y + 数字 + l 复制若干个字母
y + $ 复制到句为
p 粘贴

注(复制多行的方法):
描述:将第 i 行到第 j 行复制到第 k 行之后

(1)
: + i + , + j + 空格 + (co|copy) + k
同理将第 i 行到第 j 行移动到第 k 行之后
: + i + , + j + 空格 + (m|move) + k

(2)
光标移动到结束行,ma
光标移动到起始行,输入y’a
光标移动到需要复制的行,输入p,行前复制则输入大写P

(3)
光标移动到起始行,输入ma
光标移动到结束行,输入mb
光标移动到粘贴行,输入mc
然后输入:’a,’b, co ‘c 把co换成m就是剪切
若要删除多行,则输入:’a,’b de

G. 设置类命令的选项(806)

/字符串\c 仅在本次搜索匹配中忽略大小写
:set ic/ignorecase 搜索时忽略大小写
:set noic/noignorecase 禁用忽略大小写
:set hls/nohlsearch 高亮匹配项highlightsearch
:set nohls/nohlsearch 禁用高亮
:set is/incsearch 使 Vim 在你输入字符串的过程中就显示匹配点
:set nois/noincsearch 关闭输入时匹配