자동 점프로 emacs가 `update_terminal_cwd`를 로드하는 것을 어떻게 방지합니까?

자동 점프로 emacs가 `update_terminal_cwd`를 로드하는 것을 어떻게 방지합니까?

MacOSX 10.7에서 Apple은 Apple 터미널이 실행 중인지, 그리고 Emacs에 없는지 확인하는 /etc/bashrc기능을 추가했습니다 (아래에 붙여넣은 스니펫). update_terminal_cwd불행하게도 bashrc 구성 파일에 자동 점프를 포함시켜 열등한 쉘(예: M-x shell)을 호출하면 update_terminal_cwd가 호출됩니다. 하위 셸에서 호출된 모든 명령에 대해 다음 출력이 표시됩니다.

bash: update_terminal_cwd: command not found
achan[10:29 AM]~ > echo $PROMPT_COMMAND

bashrc에 자동 점프를 포함하면 echo $PROMPT_COMMANDemacs 내부는 다음과 같습니다.

{ [[ "$AUTOJUMP_HOME" == "$HOME" ]] && (autojump -a "$(pwd -P)"&)>/dev/null 2>>"${AUTOJUMP_DATA_DIR}/.autojump_errors";} 2>/dev/null ; update_terminal_cwd;

자동 점프를 포함하지 않으면 echo $PROMPT_COMMAND.

자동 점프 코드에서는 첫 번째 부분을 삽입합니다.

{ [[ "$AUTOJUMP_HOME" == "$HOME" ]] && (autojump -a "$(pwd -P)"&)>/dev/null 2>>"${AUTOJUMP_DATA_DIR}/.autojump_errors";} 2>/dev/null ;

위 문자열의 끝에 추가하면 가 추가 update_terminal_cwd됩니다 .$PROMPT_COMMAND

어떻게 든 자동 점프는 다음과 같은 환경에서 인스턴스화됩니다.

[ "$TERM_PROGRAM" == "Apple_Terminal" ] && [ -z "$INSIDE_EMACS" ]

사실이다. 그러나 emacs에서 실행되기 때문에 update_terminal_cwd는 정의되지 않습니다. 따라서 오류가 발생합니다.

자동 점프 사람들은 대신 iTerm2를 사용하거나 $INSIDE_EMACS가 작동하지 않는 이유를 알아내라고 제안했습니다.

나는 그것이 다음과 같은 것이라고 생각합니다.

호출은 M-x shellemacs가 호출될 때 이미 존재하는 쉘 환경과 어떻게든 연결되어 있습니다. 이것이 emacs가 실행되는 동안 .bashrc 파일을 변경해도 변경 사항이 emacs에 전파되지 않는 이유입니다. 대신, 새로운 bash 환경을 생성한 다음 해당 변경 사항을 확인하기 전에 열등한 쉘로 emacs를 호출해야 합니다.

기본 환경을 무시하고 처음부터 bash를 시작하도록 열등한 쉘에 지시하는 방법이 있습니까?

애플 /etc/bashrc

# System-wide .bashrc file for interactive bash(1) shells.
if [ -z "$PS1" ]; then
   return
fi

PS1='\h:\W \u\$ '
# Make bash check its window size after a process completes
shopt -s checkwinsize
# Tell the terminal about the working directory at each prompt.
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 connections. Percent-escape spaces.
    local SEARCH=' '
    local REPLACE='%20'
    local PWD_URL="file://$HOSTNAME${PWD//$SEARCH/$REPLACE}"
    printf '\e]7;%s\a' "$PWD_URL"
    }
    PROMPT_COMMAND="update_terminal_cwd; $PROMPT_COMMAND"
fi

답변1

이 주제가 오래되었다는 것을 알고 있지만 동일한 문제가 있었고 해결책을 찾지 못했습니다(이 페이지는 첫 번째 Google 검색결과입니다). 내 수정 사항은 다음과 같습니다. 최고는 아니지만 작동합니다.

if [ `(type update_terminal_cwd | grep -q 'shell function' | wc -l) 2> /dev/null` -eq 0 ]; then
    update_terminal_cwd() {
        return
    }
fi

[[ -s `brew --prefix`/etc/autojump.sh ]] && . `brew --prefix`/etc/autojump.sh

문안 인사,

답변2

M-x shell상당히 빈 환경의 쉘(emacs가 사용하는 것과 동일한 옵션으로 시작됨)을 얻을 수 있는 후 다음 을 수행하십시오.

exec -c bash --noediting -i

또는 위 명령을 ~/.emacs_bash또는~/.emacs.d/init_bash.sh

환경이 너무 많이 제거되면 대신 .emacs_bash 시작 스크립트 내에서 올바른 값으로 exec설정할 수 있습니다 .$PROMPT_COMMAND

답변3

24.3.50.1로 업그레이드했는데 이 문제가 발생하지 않습니다. 그것은 좋은 해결책입니다(즉, 최신 emacs로 업그레이드).

관련 정보