Answers:
取决于您的外壳。
此文章显示多种方法。
我个人使用zsh,它具有方便的precmd()函数,该函数在每个提示之前运行。
precmd () { print -Pn "\e]2;%n@%M | %~\a" } # title bar prompt
尽管其他问题列出了bash方法,但它们为cd作别名。Bash提供了一种固有的方法,可以将提示链接掉。
重击
bash提供了一个变量PROMPT_COMMAND,其中包含在提示符之前执行的命令。此示例(插入〜/ .bashrc中)将标题设置为“ username @ hostname:directory”:
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标题“ username @ hostname:directory” ...
case $TERM in
xterm*)
PS1="\[\033]0;\u@\h: \w\007\]bash\$ "
;;
*)
PS1="bash\$ "
;;
esac
请注意[...]的使用,它告诉bash在计算提示宽度时忽略非打印控制字符。否则,放置光标时,行编辑命令会变得混乱。
~/.profile
远程计算机上的(或等效文件)中即可。
从Mac OS X Lion 10.7开始,终端机具有用于设置工作目录的显式转义序列,终端机使用标准的窗口“代理”图标显示该转义序列。这使您可以按住Command并单击以查看路径,在Finder中显示或像其他任何文件夹一样将其拖动。此外,终端可以使用它在同一目录中创建另一个终端,并在退出/重新启动终端(启用了恢复)时恢复工作目录。它还可以为窗口组还原目录。
与窗口和选项卡标题的操作系统命令(OSC)转义序列相同,但第一个参数设置为7。该值应为“ file:” URL,该URL允许对特殊字符进行百分比编码,以便可以处理所有有效的路径名。您还应该包括主机名,以便Terminal可以确定它是否是本地目录。如果终端来自其他主机,终端将避免将其用作当前工作目录。
在相关说明中,终端同样支持使用OSC转义序列(参数为6)设置“代表文件”。如果设置,则代理图标将显示该文件而不是工作目录。例如,我配置了emacs并较少配置以在代理图标中反映当前显示的文件/缓冲区。这使这些基于tty的程序可以与周围的OS更加集成。
默认情况下,bash(Mac OS X上的默认外壳程序)启用了工作目录行为。有关相关代码,请参见/ etc / bashrc。
还可能值得一提的是Lion Terminal现在支持使用OSC转义序列独立于窗口标题设置标签标题。
update_terminal_cwd
功能会将代理图标设置为当前工作目录。默认$PROMPT_COMMAND
为update_terminal_cwd
。
除了推荐您使用苹果终端特定的操作系统命令转义序列:ESC ] Ps ; Pt BEL
这里Ps
是7
和Pt
一个file:
URL; 值得补充的是,在Mac OS X 10.11(可能自10.7起)中,有一个文件/etc/bashrc_Apple_Terminal
(在10.11下不可编辑)将便利定义update_terminal_cwd()
为(无注释):
update_terminal_cwd ()
{
local url_path='';
{
local i ch hexch LC_CTYPE=C LC_ALL=;
for ((i = 0; i < ${#PWD}; ++i))
do
ch="${PWD:i:1}";
if [[ "$ch" =~ [/._~A-Za-z0-9-] ]]; then
url_path+="$ch";
else
printf -v hexch "%02X" "'$ch";
url_path+="%${hexch: -2:2}";
fi;
done
};
printf '\e]7;%s\a' "file://$HOSTNAME$url_path"
}
如果您正在考虑这样做,也可以在远程工具箱上使用它,以防万一,然后在bash中正确编码文件URL。
而且,如果PROMPT_COMMAND
您自己进行更改,.bash_profile
或者.bashrc
您可能会忘记称呼它。在同一文件中,它们显示了一个使用以下方法更好地链接它的示例:
PROMPT_COMMAND="update_terminal_cwd${PROMPT_COMMAND:+; $PROMPT_COMMAND}"
我个人.bash_profile
想添加git提示符,所以我这样做了:
local git_path=/Applications/Xcode.app/Contents/Developer/usr/share/git-core
for f in $git_path/git-completion.bash $git_path/git-prompt.sh
do
if [[ -f "$f" ]]; then
. "$f"
fi
done
get_sha() {
git rev-parse --short HEAD 2>/dev/null
}
if [ "function" = $(type -t __git_ps1) ]; then
export GIT_PS1_SHOWDIRTYSTATE=1
GIT_PS1_SHOWSTASHSTATE=1
GIT_PS1_SHOWUNTRACKEDFILES=1
GIT_PS1_SHOWCOLORHINTS=1
GIT_PS1_DESCRIBE_STYLE="branch"
GIT_PS1_SHOWUPSTREAM="auto git"
export PROMPT_COMMAND="$PROMPT_COMMAND${PROMPT_COMMAND:+; }"'__git_ps1 "\[\e[0;32m\]\u\[\e[1;32m\]@\h\[\e[0m\]:\[\e[0;34m\]\w\[\e[0m\]" "\$ " "\n{%s $(get_sha)}"'
fi
如果目录中包含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表示的拉丁语重音效果很好(该重音将消失,但基本的拉丁字符将保留)。
不幸的是,对于像中国这样的事情,它将完全失败。
将其输入您的〜/ .profile或等效文件中:
function settitle() { echo -n "]0;$@"; }
function cd() { command cd "$@"; settitle `pwd -P`; }
export PS1='\W \$ '
settitle `pwd`
第一行包含两个不能复制/粘贴的特殊字符,但是您可以从此处下载文本:http : //blog.nottoobadsoftware.com/files/setterminaltitle.sh。
echo
use printf
,它使您可以使用转义序列来表示这些字符(ESC和BEL / Control-G):printf '\e]0;$@\a"