iterm2配置与使用

[TOC]

iterm2快捷键

Mac按键符号

: shift : control : option/alt : command : return : enter

快捷键

窗口(window)

⌘N : 新建窗口

⌘⇧w : 关闭当前窗口

⌘↩/自定义⌘⌃F : 切换全屏, 自定义动作名为 Toggle Full Screen

标签页(tab)

⌘t : 新建标签页

⌘⌥w : 关闭当标签页

⌘⌥e:全屏展示所有窗口的所有 tab,可在所有tab中搜索

⌘⇧[/] / 自定义 ⌘⇧←/→ : 按方向切换标签页 (⌘←/→被光标移动到行首/未用了) , 自定义动作名为 Previous/Next Tab

自定义 ⌘Fn←/→ :, 按方向移动标签页 (⌘⇧←/→被 按方向切换标签页 用了) , 自定义动作名为 Move Tab Left/Right

+ <数字>: 切换标签页

分屏(panel)

⌘(⇧)d: 垂直(水平)分屏

⌘w : 关闭当前分屏

⌘⇧↩: 最大化当前分屏/解除此最大化

⌘[/]: 跳转到(按使用历史)前/后一个分屏

⌘⌥←/→/↑/↓: (按位置)跳转分屏

⌘⌃←/→/↑/↓: (按位置)平移分屏界

鼠标操作:

  • 拖动分屏眉换位置
  • 拖动分屏界

分屏内

⌘k: 清空屏幕,之后仍无法上翻到屏幕历史

⌘r =linux快捷键⌃l =shell命令 clear:(reflash之意)下翻屏幕至全空,之后仍可上翻屏幕

⌘f: 查找,支持正则

⌘/: 高亮当前鼠标的位置

⌘Fn ↑/↓: 上翻/下翻一页

⌘Fn ←/→/ 自定义 ⌘⇧FN↑/↓: 上翻/下翻到顶, 自定义动作名为 Scroll To Top/End

补全

⌘;: 自动补全历史命令

⌘⇧h: 显示所有历史命令及其时间,非补全

⌘⌥/: 显示所有补全历史用过的路径,按使用频率显示,非补全

在命令行快速移动

+←/→:左/右移一词 +Del/FnDel: 左/右删一词

+←/→,或Fn+←/→:左/右移动到行尽头 +Del/FnDel: 左/右删到行尽头

上述快捷键,与linux快捷键的映射关系

前/首 后/尾
光标移一词 Esc+b (NE ⌥←=escape seq b) Esc+f (NE ⌥→=escape seq f)
移到行之 ⌃a (自设⌘←=hex 0x01)或 Home=Fn←=escape seq [1~ ⌃e(自设⌘→=hex 0x05)或 End=Fn→=escape seq [4~
删一词 ⌃w(自设 ⌥Del=hex 0x17) =⌃[松手+Del(Del即Backspace) (NE⌥Del= hex 0x1b 0x7f) Esc+d(NE ⌥FnDel=escape seq d)
删光标前/后的全部 ⌃u ( 自设⌘Del=hex 0x15, 再去掉NE的 ⌘Del=hex 0x15) ⌃k(自设⌘FnDel=hex 0x0b)
删除整行 ⌃e⌃u (^e移到行尾,^u删除光标到行首) (自设⇧Del=hex 0x05 0x15)
  • 表格含义:linux下的快捷键(预设/自设 iterm2快捷键=自设快捷键的指令
  • NE(快捷键预设):nutral editing,选择预设方法详见下文之 自设快捷键
  • 自设:用户自己添加的快捷键,法详见下文之 自设快捷键

自设快捷键

(本文参考自定义快捷键

在iterm2软件中,iterm2/preferences(即⌘,),然后依次

  • 选择预设快捷键,见下图2.5

  • 添加自定义快捷键,方法例如下

  • 自设快捷键的指令的写法

    快捷键 action action下一栏 又记作
    Esc+一些按键(要按的足够快) send escape sequence 一些按键 ^[一些按键
    ⌃键 send hex code 0x十六进制数(参见 按键的十六进制码 例如\x09\x9f
  • 然后删掉预设natural editing自带的 →Del=Send hex Codes: 0x4(即ctrl+d,linux命令行自带的删除右侧一个字符)

  • 然后加上Home=escape seq [1~, End=escape seq [4~,这是因为tmux下,不接受预设快捷键默认Home,End的键值(keycode),但接受^[[1~, ^[[4~

集成tmux

参考

tmux自动开启的设置方法

iTerm2可与本机或ssh远程的tmux关联,用iterm操作tmux

  • tmux的session映射iterm2的window
  • tmux的window映射iterm2的tab
  • tmux的panel映射iTerm2的panel

适用版本:tmux版本>=1.8, iterm2>=2.9

启动tmux client

启动tmux client,以使iterm2关联tmux : tmux -CC

  • tmux -CC new -s 新session名 : 新iterm2窗口新建tmux session (推荐
  • tmux -CC attach -t session名 : 新iterm2窗口连指定tmux session (推荐
  • tmux -CC attach : 新窗口连接最近的在tmux dashboard里的tmux session(推荐

连接后:tmux的一切快捷键前缀会被覆盖掉

开闭

新建

  • ⌘⇧⌃t:新建 tmux session 为 标签页(推荐
  • ⌘⇧⌃n:新建 tmux session 为 窗口

关闭窗口

导致tmux session将关闭,然后弹出对话框点

  • hide : 隐藏当前所有tmux window
  • detach:detach当前tmux session
  • kill:kill当前tmux session

关闭tmux client,并detach 当前 tmux session

  • 在tmux session的页面 ⌘⇧⌃d推荐

  • 在在运行tmux client的页面 esc推荐

关闭标签页

导致tmux window将关闭,然后弹出对话框点

  • hide : 隐藏当前tmux window
  • kill:kill当前tmux window

tmux dashboard (仪表盘)

需要有tmux -CC开启的session处在attach时,dashboard才能启动

⌘⇧⌃↩:打开dashboard。进入dashboard后,(推荐

  • 选中tmux session/window,再点击其名字,即可更名(推荐

  • 选中一或多个tmux window,点hide ,则该标签页藏起来

  • 选中多个tmux window,点Open in Tabs, 同一个窗口打开为多个标签页

  • attach/detach tmux session

  • 选中tmux session/window,点-kill之(推荐

  • +,新建tmux session/window,打开为现有窗口的新标签页,其设置方法如下

  • ⌘w=点红叉叉,退出dashboard(推荐

标签页标题

  • [ ↣ xxx xxx] :在运行tmux client
  • ↣ xxx:tmux的windows
  • xxx:非tmux的页标题

将tmux profile设为默认profile

初次使用tmux -CC时,会将默认profile自动复制一份成tmux的profile。在tmux -CC时,只加载名为”tmux“的profile。为方便统一在tmux内外的快捷键和配色等设置,需:

  • tmuxprofile 为默认,被视为默认的profile前会标★

  • 删除Defaultprofile

则之后,不论戳iterm2图标,或tmux -CC,开的页面皆使用tmux profile

shell integration:远程tmux映射成本地GUI窗口

安装shell integration 的 utility

在本地分别运行

curl -L https://iterm2.com/shell_integration/install_shell_integration_and_utilities.sh | bash

即安装完成

单文件上传与下载

shell integration仅支持单文件的上传与下载, 多文件(如文件夹)则不支持.

配置

仅支持下载: 仅在本地运行如下命令

支持下载与上传: 在本地与远程都运行如下命令

curl -L https://iterm2.com/shell_integration/install_shell_integration_and_utilities.sh | bash

而后会出现 ~/.iterm2_shell_integration.zsh 文件, 而~/.zshrc里会自动添加如下一行

test -e "${HOME}/.iterm2_shell_integration.zsh" && source "${HOME}/.iterm2_shell_integration.zsh"
用法

ssh登录远程主机, 然后

  • 下载单文件: +左键单击文件
  • 上传单文件: 从finder里拖拽文件到iterm中, 按着 松开鼠标

从融合的远程tmux中闪退

ssh连接到远程服务器,并执行tmux -CC,进入融合tmux。有时会从融合的远程tmux窗口中闪退,并报错

** tmux mode started **

Command Menu
----------------------------
esc    Detach cleanly.
  X    Force-quit tmux mode.
  L    Toggle logging.
  C    Run tmux command.
Unrecognized command from tmux. Did your ssh session die? The command was:
channel 9: open failed: connect failed: Connection refused
Detached
channel 9: open failed: connect failed: Connection refused
channel 9: open failed: connect failed: Connection refused
channel 9: open failed: connect failed: Connection refused
%exit
** tmux mode started **

Command Menu
----------------------------
esc    Detach cleanly.
  X    Force-quit tmux mode.
  L    Toggle logging.
  C    Run tmux command.
tmux failed with error: “duplicate session: pytorch_template”
Detached

原因分析:

  • 本地ssh连接远程时加了-L参数,然而远程映射端口上没开网络服务器进程,此时本地若访问本地映射端口,则本地ssh进程会报ERROR曰

    channel 数字: open failed: connect failed: Connection refused

    没开tmux时,此报错会直接输出在屏幕上;用tmux不加-CC进入tmux,此报错会直接输出在tmux中你当前所在的分屏上。这两者情况都不会闪退。

  • 然而若用tmux -CC进入tmux,shell integration以为这是tmux发出的,且是未见命令,故退出集成tmux窗口并报错

    Unrecognized command from tmux. Did your ssh session die? The command was:
    channel 9: open failed: connect failed: Connection refused
    Detached

解决办法:

  • 法一:让ssh不要输出报ERRORchannel 数字: open failed: connect failed: Connection refused

    • ​ 在本地~/.ssh/config中加上
    Host <服务器名>
        LogLevel QUIET

    这样ERROR就不会输出到屏幕了。

    • 或使用ssh -q 其余参数连接服务器

    缺点:ssh连接异常时不利于debug

  • 法二:设置iTerm2,让它收到tmux发出的未见命令时不要退出集成tmux窗口

    iTerm2中,Preferences-Advanced-搜索框输入"tolerate"-"tolerate unrecognized commands from tmux"选off

    缺点:这样就无法检测到死掉的tmux session并自动detach

报错This instance of iTerm2 is already attached to this session

当使用iterm2,ssh到远程主机,用tmux -CC开启远程的tmux session(如名为<current-session-name>),映射为本地iterm2的窗口。若此时本地电脑断网,再次联网,则映射窗口会卡死。

在卡死的窗口中,按cmd+wcmd+ctrl+shitf+d均不会有反应。

  • 此时若想恢复连接,正确的操作应该是:

    cmd+n开启一个新iterm2窗口,ssh连接远程主机,tmux -CC attach -t <current-session-name>,弹出

    Could not attach to session

    This instance of iTerm2 is already attached to this session

    Reveal Ok

    Reveal,则之前卡死的窗口会恢复连接,现在可以在其中操作了。

  • 此时若如下误操作则会出现bug:按窗口左上角的红x,则会弹出对话框

    Close Window #1?

    This window will be closed.

    cancel ok

    OK,然后又弹出对话框,

    Warning

    Kill window and its jobs, hide window from view, or detach from tmux session?

    Hidden windows may be restored from the tmux dashboard.

    Kill Detach tmux session Hide

    一般不想Kill,故选Detach tmux session或者Hide,而后在cmd+n开启另一个iterm2窗口,重新ssh远程主机,然后tmux -CC attach -t <current-session-name>,则会弹出对话框报错如下

    Could not attach to session

This instance of iTerm2 is already attached to this session

Reveal Ok

不论点那个都无法打开`<current-session-name>`窗口

点`Reveal`会开启tmux Dashboard,在其中仍无法detach或开启 `<current-session-name>`;点Ok会直接输出

> ** tmux mode started **
>
> Command Menu
> /----------------------------
> esc    Detach cleanly.
>   X    Force-quit tmux mode.
>   L    Toggle logging.
>   C    Run tmux command.
> Detached
> %output %34 \015\015\033[0m\033[27m\033[24m\033[J\033[39m\033[0m\033[49m\033[42m\033[30m haoyu@jungpu3 \033[44m\033[32m\033[30m /home/haoyu/mfs/project/pytorch_learn/my_template/code \033[43m\033[34m\033[30m  dev ● \033[49m\033[33m\033[39m \033[K
> %begin 1571724889 24 1
> %end 1571724889 24 1
> %exit

但是

* `tmux attach  -t <current-session-name>`则可打开,没有映射成本地窗口
* `tmux attach  -t <other-session-name>`也可打开,且能映射成本地窗口

解决方法:`cmd+Q`退出iterm2.app,然后重启iterm.app,再ssh远程服务器,`tmux -CC attach  -t <current-session-name>`,则可打开并映射成本地窗口。

如何让iterm2 在任何界面呼入呼出?

教程