为什么程序员需要使用界面简陋的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