Retomar o terminal Zsh (OS X Lion)

17

OS X Lion tem recurso "Continuar", i. e. Quando você reabre um aplicativo, ele restaura todas as janelas e seus conteúdos. Isso funciona para o Terminal também. Mas se você usar o Zsh em vez do Bash, ele não restaurará o diretório aberto. Como posso consertar isso?

    
por Simon Perepelitsa 22.07.2011 / 11:21

2 respostas

18

UPDATE : isso não é totalmente correto, por motivos mencionados nos comentários. Use a resposta abaixo . Obrigado @ChrisPage por ir a milha extra:)

A resposta pode ser encontrada pela engenharia reversa de como o bash faz isso em /etc/bashrc . Eu tentei muitas abordagens de toda a rede, mas o caminho da Apple parece funcionar melhor (vai figura).

No seu .zshrc , adicione o seguinte

# 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
}

Feliz retomada.

For clarify, this answer pertains to the mysterious message in OS X Lion's Terminal.app preferences:

**Programs notify Terminal of the current working directory using escape sequences. You may need to configure your shell or other programs to enable this behavior.*

This answer works when you're using zsh as your shell. Terminal Resume for bash has already been implemented by Apple.

    
por 26.07.2011 / 01:29
27

Aqui está minha adaptação de / etc / bashrc para zsh. Eu incluí a codificação percentual de todos os caracteres de URL que a requerem, o que é importante se você quiser que isso funcione com todos os nomes de arquivos e diretórios válidos.

Além disso, esta versão registra um gancho chpwd em vez de definir o chpwd diretamente. Isso permite que mais de uma função seja registrada em outros scripts e arquivos de configuração.

# 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.
            local i ch hexch LC_CTYPE=C
            for ((i = 1; i <= ${#PWD}; ++i)); do
                ch="$PWD[i]"
                if [[ "$ch" =~ [/._~A-Za-z0-9-] ]]; then
                    URL_PATH+="$ch"
                else
                    hexch=$(printf "%02X" "'$ch")
                    URL_PATH+="%$hexch"
                fi
            done
        }

        local PWD_URL="file://$HOST$URL_PATH"
        #echo "$PWD_URL"        # testing
        printf '\e]7;%s\a' "$PWD_URL"
    }

    # Register the function so it is called whenever the working
    # directory changes.
    autoload add-zsh-hook
    add-zsh-hook chpwd update_terminal_cwd

    # Tell the terminal about the initial directory.
    update_terminal_cwd
fi
    
por 26.08.2011 / 02:47