OS X Lion 具有“恢复”功能,即当您重新打开应用程序时,它会恢复所有窗口及其内容。这也适用于终端。但如果您使用 Zsh 而不是 Bash,它不会恢复打开的目录。我该如何解决这个问题?
答案1
更新:这并不完全正确,原因已在评论中提到。使用下面的答案。感谢@ChrisPage 的额外努力 :)
可以通过逆向工程了解 bash 是如何做到这一点的/etc/bashrc
。我尝试了网上的许多方法,但 Apple 的方法似乎效果最好(去看看)。
在您.zshrc
添加以下内容
# Set Apple Terminal.app resume directory
if [[ $TERM_PROGRAM == "Apple_Terminal" ]] && [[ -z "$INSIDE_EMACS" ]] {
function chpwd {
local SEARCH=' '
local REPLACE='%20'
local PWD_URL="file://$HOSTNAME${PWD//$SEARCH/$REPLACE}"
printf '\e]7;%s\a' "$PWD_URL"
}
chpwd
}
祝您恢复愉快。
为了澄清起见,这个答案与 OS X Lion 的 Terminal.app 偏好设置中的神秘消息有关:
**程序使用转义序列通知终端当前工作目录。您可能需要配置 shell 或其他程序以启用此行为。*
当您使用 zsh 作为 shell 时,此答案有效。Apple 已经实现了 bash 的终端恢复。
答案2
这是我为 zsh 改编的 /etc/bashrc。我已包含所有需要它的 URL 字符的百分比编码,如果您希望它适用于所有有效的文件和目录名称,这一点很重要。
这将注册一个precmd
钩子,允许在其他脚本和配置文件中注册多个函数。
2019 年 3 月更新:设置LC_ALL
为空,这样它就不会覆盖LC_CTYPE
。使用precmd
在每个提示符下更新工作目录,而不是使用chpwd
每次更改时更新它——命令管道可能会暂时更改它,终端不应该显示这些。此外,如果在上一个命令期间更改了终端状态,让每个提示符更新终端状态也会很有帮助。使用printf -v
明确写入变量,而不是使用子 shell 语法。
# Tell the terminal about the working directory whenever it changes.
if [[ "$TERM_PROGRAM" == "Apple_Terminal" ]] && [[ -z "$INSIDE_EMACS" ]]; then
update_terminal_cwd() {
# Identify the directory using a "file:" scheme URL, including
# the host name to disambiguate local vs. remote paths.
# Percent-encode the pathname.
local url_path=''
{
# Use LC_CTYPE=C to process text byte-by-byte. Ensure that
# LC_ALL isn't set, so it doesn't interfere.
local i ch hexch LC_CTYPE=C LC_ALL=
for ((i = 1; i <= ${#PWD}; ++i)); do
ch="$PWD[i]"
if [[ "$ch" =~ [/._~A-Za-z0-9-] ]]; then
url_path+="$ch"
else
printf -v hexch "%02X" "'$ch"
url_path+="%$hexch"
fi
done
}
printf '\e]7;%s\a' "file://$HOST$url_path"
}
# Register the function so it is called at each prompt.
autoload add-zsh-hook
add-zsh-hook precmd update_terminal_cwd
fi