Zsh 터미널 재개 (OS X Lion)


17

OS X Lion에는 "다시 시작"기능이 있습니다. 즉, 앱을 다시 열면 모든 창과 내용이 복원됩니다. 터미널에서도 작동합니다. 그러나 Bash 대신 Zsh를 사용하면 열린 디렉토리가 복원되지 않습니다. 이 문제를 어떻게 해결할 수 있습니까?


디렉토리의 인식 terminal.app을 만드는 것은 또한 현재와 같은 디렉토리에 새로운 터미널을 여는 데 유용합니다 : 아래의 답변 관련
nhooyr

답변:


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
}

행복한 재개.

명확히하기 위해이 답변은 OS X Lion의 Terminal.app 환경 설정의 신비한 메시지와 관련이 있습니다.

** 프로그램은 이스케이프 시퀀스를 사용하여 터미널에 현재 작업 디렉토리를 알립니다. 이 동작을 사용하려면 셸 또는 다른 프로그램을 구성해야 할 수도 있습니다. *

이 답변은 zsh를 쉘로 사용할 때 작동합니다. bash 용 터미널 이력서는 이미 Apple에서 구현했습니다.


1
아마도 실제로 큰 것은 아니지만 / etc / bashrc 주식 에는 큰 따옴표와 chpwd마찬가지로 마지막 줄이 printf '\e]7;%s\a' "$PWD_URL"있습니다. 팁 고마워.
Ryan McCuaig

이제 oh-my-zsh로 전환되고 있습니다 ( github.com/robbyrussell/oh-my-zsh/pull/522 참조 ). zshrc에서 osx 플러그인을 설정했는지 확인해야합니다.
Ryan McCuaig

2
또한이 코드는 공백 만 퍼센트 인코딩합니다. 보너스 포인트의 경우, 모든 불법 URL 문자를 퍼센트 인코딩하고 프로그램을 호출하지 않고 수행 할 수 있는지 확인하십시오. 모든 유효한 경로 이름으로 작업하려면 중요합니다. 또한 일부 문자는 이스케이프 시퀀스의 일부로 간주되지 않으므로 터미널로 가져 오기 위해서는 퍼센트 인코딩이 필요합니다. 나는 bash를 위해 이것을 할 수 있었지만 zsh로 테스트하지 않았다.
Chris 페이지

1
"$ PWD_URL"따옴표는 경로 이름이 녹지 않도록해야합니다. 편집 : 이것은 bash에 필요하지만 zsh에서는 선택 사항입니다. 따옴표를 일관되게 사용하여 이식성이 좋습니다.
Chris Page

고마워 라이언, 크리스 일관성을 위해 큰 따옴표를 사용하도록 스크립트를 업데이트했습니다.
captainpete

27

다음은 zsh에 대한 / etc / bashrc의 적응입니다. 필요한 모든 URL 문자의 퍼센트 인코딩을 포함 시켰습니다. 유효한 모든 파일 및 디렉토리 이름으로 작동하려면 중요합니다.

이것은 precmd하나 이상의 기능을 다른 스크립트 및 구성 파일에 등록 할 수 있는 후크를 등록합니다.

2019 년 3 월 업데이트 : LC_ALL재정의하지 않도록 빈으로 설정하십시오 LC_CTYPE. precmd명령 프롬프트 chpwd가 변경 될 때마다 업데이트하는 데 사용 하는 대신 각 프롬프트에서 작업 디렉토리를 업데이트하는 데 사용하십시오 . 또한 이전 명령 동안 변경된 경우 각 프롬프트가 터미널 상태를 업데이트하도록하는 것이 도움이 될 수 있습니다. printf -v서브 쉘 구문을 사용하는 대신 변수에 명시 적으로 쓰는 데 사용하십시오 .

# 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

감사합니다. 허용 된 솔루션이 저에게 효과가 없었지만 이것은 효과가 있습니다.
eelco

이것도 나를 위해 일하고 있습니다.
시카 추

4
이 솔루션은 이미 oh-my-zsh 에 있으므로 terminalapp플러그인을 활성화하면 됩니다.
Simon

1
그냥 @ 사이먼은이 의미, 명확하게하기 위해 지금 이 답변이 작성된 이후에 추가, 오 - 내 - zsh을에.
Chris Page

@ChrisPage가 맞습니다. 모호한 문구에 대해 사과드립니다 (영어는 모국어가 아닙니다). 내가 말 .zprofile하고자하는 것은 실제로 사용할 수 있다는 것을 깨닫기 전에 내가했던 것처럼 당신 이나 다른 것에 이것을 붙여 넣을 필요가 없다는 것입니다 oh-my-zsh. 그것은 똑같은 해결책이며 모든 크레딧을받을 자격이 있습니다.
Simon
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.