将终端窗口的标题设置为当前目录

将终端窗口的标题设置为当前目录

如何让 OS X 中的 Terminal.app 在其窗口或选项卡标题中显示当前目录?

我正在使用 bash shell。

答案1

取决于你的外壳。

文章显示多种方法。

我个人使用 zsh,它有一个方便的 precmd() 函数,该函数在每次提示之前运行。

    precmd () { print -Pn "\e]2;%n@%M | %~\a" } # title bar prompt

尽管其他问题列出了 bash 方法,但它们都是别名 cd。Bash 提供了一种固有方法,该方法仅链接提示。

狂欢

bash 提供了一个变量 PROMPT_COMMAND,其中包含在提示符前执行的命令。此示例(插入到 ~/.bashrc 中)将标题设置为“用户名@主机名:目录”:

 PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME}: ${PWD}\007"'

其中 \033 是 ESC 的字符代码,\007 是 BEL 的字符代码。请注意,此处的引号很重要:变量在“...”中展开,而在“...”中不展开。因此 PROMPT_COMMAND 设置为未展开的值,但使用 PROMPT_COMMAND 时,“...”内的变量会展开。

但是,PWD 会生成完整的目录路径。如果我们想使用 '~' 简写,我们需要在提示符中嵌入转义字符串,这使我们能够利用 shell 提供的以下提示符扩展:

\u          expands to $USERNAME
\h          expands to hostname up to first '.'
\w          expands to directory, replacing $HOME with '~'
\[...\]     embeds a sequence of non-printing characters

因此,以下内容产生提示符“bash$”,以及 xterm 标题“用户名@主机名:目录”...

 case $TERM in
     xterm*)
        PS1="\[\033]0;\u@\h: \w\007\]bash\$ "
        ;;
     *)
        PS1="bash\$ "
        ;;
 esac

注意 [...] 的使用,它告诉 bash 在计算提示符的宽度时忽略非打印控制字符。否则,在放置光标时,行编辑命令会变得混乱。

答案2

复制并粘贴到文件 ~/.profile 中:
PROMPT_COMMAND="echo -ne \"\033]0;${PWD##*/}\007\"; $PROMPT_COMMAND"

这会将当前终端选项卡的标题设置为您所在文件夹的名称(而不是整个路径)。
所以...
Developer/Applications/Utilities/Bluetooth/变成 =>Bluetooth

答案3

从 Mac OS X Lion 10.7 开始,终端具有用于设置工作目录的显式转义序列,终端使用标准窗口“代理”图标显示该目录。这样,您可以按住 Command 键并单击它来查看路径、在 Finder 中显示或像拖动任何其他文件夹一样拖动它。此外,终端可以使用它在同一个目录中创建另一个终端,并在退出/重新启动终端时恢复工作目录(启用恢复时)。它还可以恢复窗口组的目录。

它与窗口和选项卡标题的操作系统命令 (OSC) 转义序列相同,但第一个参数设置为 7。该值应为“file:”URL,它启用百分比编码特殊字符,以便它可以处理所有有效路径名。您还应该包含主机名,以便终端可以确定它是否是本地目录;如果它来自其他主机,终端将避免将其用作当前工作目录。

与此相关的是,Terminal 同样支持使用 OSC 转义序列设置“表示文件”,参数为 6。如果设置,代理图标将显示此文件而不是工作目录。例如,我已将 emacs 和 less 配置为在代理图标中反映当前显示的文件/缓冲区。这使得这些基于 tty 的程序能够与周围的操作系统更好地集成。

默认情况下,bash(Mac OS X 上的默认 shell)启用了工作目录行为。相关代码请参阅 /etc/bashrc。

也许还值得一提的是,Lion Terminal 现在支持使用 OSC 转义序列独立于窗口标题设置选项卡标题。

答案4

如果目录中有 Unicode 字符(至少在 Snow Leopard 上),涉及 PS1 和 PROMPT_COMMAND 的 Bash 解决方案都会失败。我能想到的最佳解决方案是执行以下等效操作

PS1="\[\033]0;\`pwd | tr -dC '[\000-\177]'\`\007\]\$ "

不幸的是,这不能直接起作用,因此我定义了一个 shell 函数来执行调用tr

termtitlefilter () { tr -dC '[\000-\177]'; }
PS1="\[\033]0;\`pwd | termtitlefilter\`\007\]\$ "

这对于拉丁重音符号非常有效,它将以 Unicode NFD 形式出现(重音符号将消失,但底层拉丁字符将保留)。

不幸的是,对于诸如中文之类的东西它将彻底失败。

相关内容