iTerm2:macOS强大的终端模拟器

2018-04-23|Categories: macOS|

macOS自带了一个终端模拟器Terminal.app,用于管理macOS系统本身是足够了,而对于那些绝大部分时间是通过终端在远程主机上工作的用户而言,功能偏弱。iTerm2主要就是为这部分用户设计的,不仅开源免费,而且提供了非常多、非常强大的功能

iTerm2 is a replacement for Terminal and the successor to iTerm. It works on Macs with macOS 10.10 or newer. iTerm2 brings the terminal into the modern age with features you never knew you always wanted.

https://www.iterm2.com/index.html

在使用iTerm2一段时间之后,我的工作和学习已经离不开它,即使和收费的商业产品SecureCRT for macOS相比,除了没有「Clone Session」这个功能让我感觉遗憾,其它功能——尤其是使用的便利性——iTerm2远远胜过SecureCRT。

颜色主题

iTerm2支持用户自定义颜色主题,而热爱iTerm2的用户也分享了大量精心设计的主题。下载和安装详见《iTerm2颜色主题》

启用rz和sz命令

rzsz两个命令可以利用本地机器的GUI界面,方便的向远程主机上传下载文件。安装和配置详见《iTerm2启用rz和sz命令》

在终端查看图片

通常,终端只能显示文本,不能显示图片,但某些时候确实需要在终端查看图片,如果远程主机安装了桌面环境,例如GNOME,可以从终端调用桌面环境的图片查看工具,但系统管理员经常打交道的服务器很少安装桌面环境,此时查看图片就比较麻烦,借助iTerm2可以轻松解决这个麻烦,详见《用iTerm2附带的imgcat命令在终端查看图片》

给终端窗口加上徽标

系统管理员经常需要同时打开多个终端窗口,连接到多个不同的主机,执行不同的任务,此时很容易混淆不同的终端窗口,最终导致在错误的主机上执行了难以挽回的操作。

iTerm2可以给每个终端窗口加上徽标(Badge),也就是上图右上角的红色大号字体,内容是当前会话的相关信息,例如登录用户、主机名称等等,还支持用户自定义的信息。

具体的显示内容需要在「Preferences → Profiles → General → Badge」设置,我的设置是:

\(session.username)@\(session.hostname)

括号内的两个变量是iTerm2内置的,必须从macOS菜单栏点击「iTerm2 → Install Shell Integration」,安装完毕之后才能够生效,然后退出Shell重新登录就可以看到徽标显示当前会话的用户名和主机名。其它变量详见官方文档

每一台需要添加徽标的远程主机都需要安装一次Shell Integration!

如果主机名显示系统默认的localhost,可以重新设置主机名,同样需要退出Shell重新登录:

# CentOS 6

# `hostname`设置主机名,系统重启后失效
hostname your_hostname

# 修改配置文件,重启后仍然有效
vim /etc/sysconfig/network
HOSTNAME=your_hostname
# 读取配置文件
source /etc/sysconfig/network
# CentOS 7
hostnamectl set-hostname your_hostname
hostnamectl status

如果需要改变徽标的外观,需要到「Preferences → Advanced → Badge」里面设置:

Shell Integration带来的问题

在多个虚拟机安装Shell Integration之后,我发现两个明显的问题:

  • SSH连接首次登录时间显著增长:安装之前,输入ssh user@host只要1-2秒就可以登录,安装之后差不多需要1分钟才可以登录!

  • VMWare虚拟机控制台(Console)不支持Shell Integration自定义的转义代码序列,每次执行命令都会输出一长串错误信息:

无奈之下,我只能禁用Shell Integration:

vim .bash_profile

# 把下面这一行注释掉(像本行一样,在行首加一个#号),
# 或者直接删除
test -e "${HOME}/.iterm2_shell_integration.bash" && source "${HOME}/.iterm2_shell_integration.bash"

禁用Shell Integration之后,之前为徽标设置的用户自定义变量也将失效。

自动更改终端模拟器窗口名称

禁用Shell Integration之后,问题又回到了起点:如何快速区分多个终端窗口?Google一番之后,居然找到了一种更通用的解决方案:

把下面的代码添加到/etc/profile.bashrc文件:

export PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME%%.*}\007"'

PROMPT_COMMANDBash的内建变量,每次Bash打印命令提示符就会执行这个变量的值。在这里就是打印一个转义序列字符串去设置终端模拟器的标题。

根据维基百科《ANSI转义序列》词条的解释:

前面的转义序列意义如下:

  • \033:ASCII控制字符ESC的八进制编码
  • \033]:OSC(操作系统命令)转义序列
  • \033]0;:执行一个给终端设置标题的OSC转义序列
  • ${USER}@${HOSTNAME%%.*}:Bash内建的$USER变量和$HOSTNAME变量,主机名如果包含圆点.,只保留第一个圆点前的字符串
  • \007:ASCII控制字符BEL的八进制编码,终止整个OSC序列的执行

经过测试,这种方法对iTerm2和macOS自带的Terminal都有效:

遗憾的是,VMWare虚拟机控制台(Console)还是会报错:

但考虑到绝大多数时候都不需要在控制台工作,比起这个设置带来的便利,些许瑕疵就不计较了。

让Hotkey Window始终位于其它窗口上方 2018-05-09

先放一张截图,这样更方便说明我的意思:

iTerm2's hotkey window always on top

上图中,上半部分是iTerm2的「Hotkey Window」,可以用快捷键在任何一个桌面空间(Space)打开;下半部分是MWeb,是macOS上一款非常好用的Markdown编辑器。

如图所示,我正在MWeb里编辑一个表格,表格的内容比较多,需要逐个从上面的iTerm2窗口里复制过来,而iTerm2的默认设置是,Hotkey Window一旦失去输入焦点就会自动隐藏(比如鼠标点击了iTerm2窗口以外的任何地方),此时就造成了很大的不便,因此我需要让Hotkey Window始终停留在MWeb窗口上方,直到我主动将其隐藏。

幸运的是,iTerm2可以满足我这个需求,只要勾选一个选项就行了:Preferences → Profiles → Hotkey Window → Keys → Configure Hotkey Window → Floating window,详见下图中红色方框标示的位置。另外,这个对话框中还可以设置触发Hotkey Window的快捷键。

Floating window选项下方的小字还说,该功能要求把Hotkey Window的Space设置为「All Spaces」,设置路径是:Preferences → Profiles → Hotkey Window → Window → Space: All Spaces,详见下图中红色方框标示的位置。另外,这个对话框中还可以设置Hotkey Window的外观,例如透明度、打开的位置、窗口的宽度和高度等等。

设置完成后必须重新启动iTerm2

此时就可以在任意桌面空间按快捷键Command + Option + I打开Hotkey Window,再次按下相同的快捷键之前,Hotkey Window会一直显示。

Leave A Comment