Shell的使用

Tmux

Posted by Jingming on November 18, 2020

为什么程序员需要使用界面简陋的Shell?或者说:为什么使用键盘操作计算机比使用鼠标要显得高大上?

原因如下:

计算机程序的本质就是提供命令为用户服务。其中的交互设计包括两种:

  • 图形操作:用户首先找到图标,然后点击它运行;

  • 键盘操作:用户用键盘键入自己的命令。

仔细思考下,用户点击图标的时候,其实是需要首先找到图标的坐标的,点击之后触发了类似键盘的操作,也就是说,

图标坐标信息其实是”无意义”的(例如不是打游戏的话),因为图标可能出现在屏幕界面的几乎任何地方,用户去找坐标这一步其实是无用功。

编程如果使用shell终端命令行来操作计算机,那么显然效率会大增。

程序员有时会使用自己的快捷键来替换掉系统的快捷键,这样的好处是 在不同程序中,可以使用相类似的操作,这样一旦熟练后,可以大大提高效率。

键盘操作计算机要求程序员对命令、计算机概念有着更多的、更深刻的了解。

一、Mac下的iTerm2

iTerm2与Mac自带的terminal相比:

(1)颜值比较高,默认界面,可塑性都比自带terminal强。

(2)iTerm2自带配置好的tmux。

配置参考:https://blog.biezhi.me/2018/11/build-a-beautiful-mac-terminal-environment.html

cmd + n : 新建窗口

cmd + t : 新建TAB

cmd + d : 垂直新建TAB

cmd + shift + d : 水平新建TAB

二、Tmux

http://kuanghy.github.io/2016/09/29/tmux

tmux是终端选择器multiplexer,可以让我们快速的在一个terminal里面切换程序,并做detach操作(程序仍然可以后台运行)、reattach操作。

基本概念

  • 输入tmux命令后,就进入了一个Server,里面默认有一个会话(Session)和一个窗口(Window)。

  • 一个Session对应一个需要做的任务,例如执行一个命令。传统方式的session和窗口是绑定的,窗口UI关闭,session会停止,而tmux可以解绑。

  • 一个Session里面可以有多个窗口Window,一个Window里面可以有多个Panel。Panel的理解就是window的基础上更小的划分。

基本命令

  • 会话(session)管理
    • 创建会话

    tmux new -s 会话名 -n 窗口名

    • 离开当前会话

    tmux detach

    • 创建第二个会话

    注意,此时不可以在第一个会话中使用tmux new -s 第二个会话名;

    应该先使用tmux detach离开当前的session,然后执行tmux new -s 第二个会话名。

    理解:在一个session里面使用tmux命令,并不能创建session平行的session,而是在session中创建,因此有一种嵌套的、无限递归的负面味道,tmux直接不支持。

    • 查看所有session

    tmux ls

    • 重启detach的会话

    tmux attach -t 会话名

    • 切换会话

    tmux switch -t 会话名

    • 关闭会话

    tmux kill-session -t 0 删除0号会话

    tmux kill-server 关闭所有会话

  • 窗口(window)管理
    • 创建窗口 在session中,使用tmux new-window。注意创建窗口并不会有分屏效果。
    • 重命名当前window tmux rename-window 重命名
    • 查看窗口 tmux list-windows
    • 切换窗口 tmux select-window -t 窗口id(0-9)
  • 窗格(pane)管理
    • 窗口分割为两个水平窗格 在当前窗口下,输入tmux split-window
    • 窗口分割为两个垂直窗格 在当前窗口下,tmux split-window -h
    • 切换窗口 tmux swap-pane -[UDLR] 切到当前控制窗口的up,down,left,right窗口

    tmux select-pane -[UDLR] 在指定方向选下一个窗格

Tmux默认快捷键

使用tmux显式命令显然太浪费时间了,还好tmux自己提供了默认以Ctrl-b为开头(prefix)各种快捷键。此处记录快捷键常用配置。

  • 基本操作:
命令 说明
? 列出所有快捷键;按 q 返回
d 脱离当前会话,可暂时返回 Shell 界面
s 选择并切换会话;在同时开启了多个会话时使用
D 选择要脱离的会话;在同时开启了多个会话时使用
: 进入命令行模式;此时可输入支持的命令,例如 kill-server 关闭所有tmux会话
[ 复制模式,光标移动到复制内容位置,空格键开始,方向键选择复制,回车确认,q/Esc 退出
] 进入粘贴模式,粘贴之前复制的内容,按 q/Esc 退出
~ 列出提示信息缓存;其中包含了之前 tmux 返回的各种提示信息
t 显示当前的时间
  • 窗口操作:
命令 说明
c 创建新窗口
& 关闭当前窗口
[0-9] 数字键切换到指定窗口
p 切换至上一窗口
n 切换至下一窗口
l 前后窗口间互相切换
w 通过窗口列表切换窗口
, 重命名当前窗口,便于识别
. 修改当前窗口编号,相当于重新排序
f 在所有窗口中查找关键词,便于窗口多了切换
  • 窗格操作:
命令 说明
将当前面板上下分屏
% 将当前面板左右分屏
x 关闭当前分屏
! 将当前面板置于新窗口,即新建一个窗口,其中仅包含当前面板
q 显示面板编号
o 选择当前窗口中下一个面板
{ 向前置换当前面板
} 向后置换当前面板
z 最大化当前所在面板
方向键 移动光标选择对应面板
page up 向上滚动屏幕,q 退出
page down 向下滚动屏幕,q 退出
alt+o 逆时针旋转当前窗口的面板
ctrl+o 顺时针旋转当前窗口的面板
ctrl+方向键 以 1 个单元格为单位移动边缘以调整当前面板大小
alt+方向键 以 5 个单元格为单位移动边缘以调整当前面板大小
ctrl a + :进入命令模式 + 输入swap-window -t x 当前窗口和x号窗口进行交换
ctrl a + & 关闭当前窗口
  • 复制模式: 进入复制模式后,
命令 说明
ctrl b 翻到上一页
ctrl f 翻到下一页
/ 向前搜索
向后搜索

https://my.oschina.net/u/4331678/blog/3629261

修改Tmux Config

  • 使用Ctrl-a替换Ctrl-b以免和vim冲突

unbind C-b

set -g prefix C-a

bind C-a send-prefix

  • 使用VI

setw -g mode-keys vi

  • 设置分屏

bind v split-window -v -c “#{pane_current_path}”; 意思是将s键的功能替换成split-window -v -c “#{pane_current_path}”,也就是竖直分屏将其并命名为当前路径。 │

bind h split-window -h -c “#{pane_current_path}”

  • session管理

bind C new-session │

bind L choose-session

  • 配置生效快捷键 ubind r bind r source-file ~/.tmux.conf

修改后的tmux的快捷键:

命令 说明
ctrl-a c 创建session,之前session被attach
ctrl-a n 回到之前session
ctrl-a l 关闭session
ctrl-a v or “ 竖直分屏 (按法:-表示同时按,ctrl和a一起按等一会,然后按v)
ctrl-a h or % 水平分屏
ctrl-a shift-N 创建标签并命名;或者使用ctrl-a c 创建新标签 +
ctrl-a x 删除标签
ctrl-a 1 切换到标签1
ctrl-a d 进行detach

参考:https://github.com/skywind3000/awesome-cheatsheets/blob/master/tools/tmux.txt