终端特定别名

终端特定别名

有没有办法拥有终端特定的别名?

例如:我想使用“vim”和“nvim”来引用terminal.app上的vanilla vim,但我希望“vim”和“nvim”来引用Iterm2上的NeoVim。

答案1

一种方法是检查环境,看看是否存在合适的变量来区分两者;这里是终端品牌X

% env | grep -i -E 'terminal|iterm'
ITERM_PROFILE=small-white
ITERM_SESSION_ID=w3t0p0:BF718B9E-F185-44FF-9BC4-4F071F378015

然后是品牌 Y

% env | grep -i -E 'terminal|iterm'
TERM_PROGRAM=Apple_Terminal

然而,如果一个环境变量最终出现在另一个环境变量中,这并不完全可靠;如果在 iTerm 中运行 Terminal.app 则未运行:

% print $ITERM_SESSION_ID
w3t0p0:BF718B9E-F185-44FF-9BC4-4F071F378015
% open -a Terminal.app

然后在刚刚启动的 Terminal.app 中,人们可能会看到:

% env | grep -i -E 'terminal|iterm'
ITERM_SESSION_ID=w3t0p0:BF718B9E-F185-44FF-9BC4-4F071F378015
ITERM_PROFILE=small-white
TERM_PROGRAM=Apple_Terminal

因为 Terminal.app 通过调用继承了 iTerm.app 环境变量open。如果您从不这样做,这可能不会成为问题。

无论如何,如果您相信环境变量是正确的,那么

if [[ $TERM_PROGRAM == "Apple_Terminal" ]]; then
   print "I'm a terminal!"
else
   print "I'm not a PC"
fi

应该区分两者,假设任何不是 Apple 终端的东西都是 iterm。对于远程 SSH 连接或其他终端程序(例如 Alacritty),这可能会失败,在这种情况下,您需要使用更多逻辑来调整代码。

另一种方法

另一种方法是更改​​一个或两个终端程序的启动程序以运行一个小包装脚本,该脚本设置一些(希望)自定义环境变量,然后执行真正的 shell:

#!/bin/sh
THIS_IS_TERMINAL_DOT_APP=1 ; export THIS_IS_TERMINAL_DOT_APP
exec /bin/zsh

...但这也可以从其他地方继承环境变量。

需要更多研究

$PPID可以遍历进程树(从 开始)来查找父进程。然而,这可能会检测到tmux哪些需要额外的代码来确定特定的终端应用程序tmux正在运行(如果有的话)。

相关内容