我的tmux基础教程果然坑爹了

嗯,就是这样,这篇文章会讨论讨论tmux—-这玩意我最近才知道,并在使用过程中深深折服于其魅力—-说起来我对大多数linux下的常用软件貌似都没有涉及过……内容的话,我是根据那本《pragmatic tmux》来的,算是翻译节选归纳性质,然后如果对这本书有兴趣同时不惮于阅读英文的话,可以下载下来慢慢阅读。我能保证的是,这本书读起来一点都不困难。地址: pragmatic tmux。由于我对tmux理解尚未透彻,如果您找到了错误,那一定是我弄错了,和书无关。如果您能在评论区里指出我的错误,那再好不过。

标题neta了 やはり俺の青春ラブコメはまちがっている,最近刚补完,质量很高,听说动画坑了,我没追真是太好了。

嘛,介绍背景什么的挺麻烦,我也就坑了,总之您需要知道的,是tmux是一个很棒的分屏软件—-狭义上来说。当然不止分屏,还能建立新窗口。虽然在图形界面使用konsole之类终端或许您感觉不到,毕竟如果希望同时编辑处理多个任务大不了多开几个终端。但是当使用的界面是文字界面的时候,如果希望一边开vim编辑,一边在命令行调试的话 ,tmux之类的软件就是必不可少的。基本就是这样。

需要提及一点,tmux历史挺长的,出于那个时代的多种考虑以及妥协,所使用的键位相当怪异,不利于记忆和使用,幸好,tmux允许我们改变键位。所以通常而言,都需要对其重新配置以符合使用习惯。当然这并不是必须的。

tmux的命令,需要通过特定的键位进行激活,正如ssh之于~键。这个用来激活的键位,通常叫做prefix,默认的是 ctrl + b。键入之后,再输入c就会新建一个窗口。后面我会简写这个组合命令为 prefix-c。

可以试着在终端输入tmux来体验一下tmux环境。一般没问题的话,您会看到一个暗淡无光的界面……嗯,就是这个。这玩意就是tmux的session,用起来的话,和普通终端的session倒是差不多的。随便折腾一下吧,终端里面能执行的命令统统一样招呼着。玩腻了的话,使用exit来退出tmux的session。请注意,如果只是随便玩玩,上面的这种进入tmux方式倒是足够的。但是这并不是使用tmux的最好方式,因为这种方式下,tmux的session并没有命名,session没有名称这个标识的话,很多操作都会更麻烦一点,所以以后建立tmux的session,还是使用下面的方法:

tmux new-session -s basic

或者简写为:

tmux new -s basic

这样来建立命名的session,这总是推荐的。

下面本来应该讲讲tmux的命令,不过我决定不这样做,毕竟很多命令都会换键位—-键位总是需要更换的,正如前文所述,tmux由于历史的原因,键位相当不友好和怪异。

先给出一般通用的一些键位绑定配置,后面我会做出说明。

对了,下面的配置文件需要您在您的主目录内建立一个叫做 .tmux.conf的文件,然后进行写入。

unbind C-b
set -g prefix C-a
bind C-a send-prefix
bind r source-file ~/.tmux.conf\; display "Reloaded!"
set -g default-terminal "screen-256color"
set-option -g visual-bell on

set -g base-index 1
setw -g pane-base-index 1
bind | split-window -h
bind - split-window -v

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

bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R
bind H resize-pane -L 5
bind J resize-pane -D 5
bind K resize-pane -U 5
bind L resize-pane -R 5

挺长的一段配置文件。但是大致可以分为上面用空行分割的四个部分。

第一部分是总体的一些配置。首先解除了原来的prefix C-b,然后再对C-a进行了绑定。为了可以在tmux中而不是重新启动tmux这样的方式去重新载入配置文件(挺绕的),绑定了r用来重新载入配置文件。也就是说,当您修改了.tmux.conf,可以通过prefix-r来直接重载配置文件,而不用重启tmux。set -g default-terminal "screen-256color"用来使tmux界面不再那么寒碜。理论上,加了256color这一行会让tmux的界面变得和终端界面一样,但是也可能有例外情况—-比如死活没颜色之类的,这时候您可以试试 tmux -2是否有用,有用的话,您可以在您的bashrc里面加一行alias。最后那一行开启了终端铃—-tmux里面没有真正的铃声……

第二部分是对基本窗口的重设。首先是让panel的序号从1开始,而不是默认的0。虽然对coding monkey来说,从0开始似乎更加自然。遗憾的是,在真正键盘上,0和1的距离到底还是太远了,远不如1和2来的方便。或许这也算一种妥协?后两句改变了分屏的快捷键—-|和-这两个键,对分屏这个操作而言,相当容易记忆。

第三部分启用了鼠标,可以用鼠标来操作了。pragmatic tmux书里建议不要开启鼠标,毕竟键盘用熟了比鼠标来得会更快,但是我认为,初学的话,鼠标的使用还是很自然的。

第四部分更改了panel跳转的键位和更改panel大小的键位—-这个键位对vimer应该是很熟的?当开启了很多panel的时候,使用prefix+hjkl来跳转panel,而大写的hjkl会更改panel大小,每次5个单位。

如果对配置键位的命令有兴趣,敬请阅读专业书籍……嗯哼。

为了后面的叙述更方便,这里先给出一些有用的命令,我保证,只会给出一点点,并且都很常用。

prefix-d —– 这个命令会挂起(detach)当前的session,回退到您的终端,以后如果还希望进入这个session,可以在终端输入 tmux attach -t xxxx

prefix-x —– 这个命令会关闭当前的panel,如果只剩window了的话,也会关闭当前的window

prefix-& —- 这个命令会退出当前的session

prefix-c—– 这个命令会新建一个window

prefix-n —– 这个命令跳转到下一个window

prefix-w —- 显示当前的所有window

prefix-p —- 显示panel的index,当然我们设定了从1开始。

prefix-number —- 跳转到对应index的panel

上面提到了一些配置命令,然后也涉及到了一些概念,比如 session,window,panel,下面会解释这三个概念。

session:因为tmux实质上来说,是一个服务器客户端的架构,每当建立一个新session,您可以认为是建立了一个tmux的服务器。一个session对应一个tmux服务器。顺便一说,在终端执行 tmux ls 会列出当前所有的session

window:就是一个屏幕(或者终端)大小的窗口,tmux允许我们建立多个window。

panel,如果您对window进行了分屏操作,那么,每一个屏幕(?)都是一个panel。

说明一点,推荐给初始化的那个窗口命名 ,具体是 tmux new -s shell -n window,也就是说,通过-n选项给windows命名。这里其实tmux有一个小问题,在命令行使用-n这个选项并没有用,也并不会对window命名,解决办法是需要在您的bashrc里面填上一句:DISABLE_AUTO_TITLE=true。这个错误的原因是tmux的自动命名。

于是上面部分说明就到此为止。

下面是装饰的配置……会让您的tmux界面更好看一些。

set -g status-fg white
set -g status-bg black
setw -g window-status-fg cyan
setw -g window-status-bg default
setw -g window-status-attr dim
setw -g window-status-current-fg white
setw -g window-status-current-bg red
setw -g window-status-current-attr bright

set -g pane-border-fg green
set -g pane-border-bg black
set -g pane-active-border-fg white
set -g pane-active-border-bg yellow

set -g message-fg white
set -g message-bg black
set -g message-attr bright

set -g status-utf8 on
set -g status-interval 60

set -g status-left-length 40
set -g status-left "#[fg=green]Session: #S #[fg=yellow]#I #[fg=cyan]#P"
set -g status-right "#[fg=cyan]%d %b %R"
set -g status-justify centre

如果您添加了上面的配置,然后运行prefix-r,您会马上看到效果……于是,好看些了么?关键是,现在能对current panel进行提示了,还是不错的吧?

最后讨论的问题是复制粘贴的问题,这也是很麻烦的……

setw -g mode-keys 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
bind C-c run "tmux save-buffer - | xclip -i -sel clipboard"
bind C-v run "tmux set-buffer \"$(xclip -o -sel clipboard)\";tmux paste-buffer"

如何在tmux的多个windows或者pannel中相互复制粘贴?和vim很类似,您可以把待复制内容扔到缓冲区,然后在另一个panel中把内容从缓冲区中提出来。当然了,tmux支持多个缓冲区……也和vim很类似。

为了更符合vimer的使用习惯,使用上面的配置重新指定了键位。

简单说,在通常模式下按下esc来进入复制模式,然后使用v进行选中,y来复制—–当然和vim中各种方便的复制命令不太一样,但是应该使用起来不会陌生才对。

如果您希望选择特定的缓冲区中的内容,就比较麻烦一点。在tmux键入prefix-: 进入命令模式,然后choose-buffer,这样才行。

tmux的一些好玩的操作

既然tmux的session可以看做一个服务器,那么当然支持多人的同时attach,事实上也确实是这样,您可以通过attach一个特定的session来进入。这样的话,您可以看别人的操作,也可以干涉别人的操作,不过还请注意,建立session的那个用户才是主用户,比如说,您的终端大小的变化不会让他的终端大小也变大,反之可以。

这样其实不好玩,您可能更希望和别人共用一个session,但是有希望能自个儿在自个儿的window,互不干扰,这也是可以的。您可以在本地建立一个session,然后copy别人的session过来,具体命令的话:

tmux new -t othersession -s yoursession

这样进去,看起来和直接attach差不多,但是您可以新建一个窗口,然后在新建的窗口工作,互不干扰。很好玩不是么。当然您可以活用panel,在tmux聊天神马的……

tmux还支持一些操作,socket share什么的,个人没太大需求,pragmatic tmux那本书讲得会更好一些,有兴趣可以参照。

于是具体的内容就这样,看到这里的您,辛苦了。

最后附上我的tmux模样,图片有点小,请不要介意。

tmux

以上。