恢复 Zsh 终端 (OS X Lion)

Sim*_*tsa 17 zsh terminal.app osx-lion

OS X Lion 具有“恢复”功能,即当您重新打开应用程序时,它会恢复所有窗口及其内容。这也适用于终端。但是如果你使用 Zsh 而不是 Bash,它不会恢复打开的目录。我怎样才能解决这个问题?

Chr*_*age 28

这是我为 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
Run Code Online (Sandbox Code Playgroud)

  • 还需要注意的是,这个解决方案已经在[oh-my-zsh](https://github.com/robbyrussell/oh-my-zsh)中,只需激活`terminalapp`插件即可。 (4认同)
  • 为了清楚起见,@Simon 表示这是 *now* 在 oh-my-zsh 中,自从编写此答案以来添加。 (2认同)

小智 18

更新:由于评论中提到的原因,这并不完全正确。使用下面的答案。感谢@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
}
Run Code Online (Sandbox Code Playgroud)

复工愉快。

为了澄清起见,此答案与 OS X Lion 的 Terminal.app 首选项中的神秘消息有关:

**程序使用转义序列通知终端当前工作目录。您可能需要配置您的 shell 或其他程序以启用此行为。*

当您使用 zsh 作为 shell 时,此答案有效。Apple 已经实现了 bash 的终端恢复。

  • 另请注意,此代码仅对空格进行百分比编码。对于奖励积分,请对所有非法 URL 字符进行百分比编码(看看是否可以在不调用任何程序的情况下进行)。如果您希望它与所有有效路径名一起使用,这很重要。此外,某些字符甚至不被视为转义序列的一部分,因此需要进行百分比编码才能将它们传送到终端。我能够为 bash 执行此操作,但我还没有尝试使用 zsh 对其进行测试。 (2认同)