如何防止 emacs 使用 autojump 載入 `update_terminal_cwd`?

如何防止 emacs 使用 autojump 載入 `update_terminal_cwd`?

在 MacOSX 10.7 上,Apple 放入了/etc/bashrc一個函數:update_terminal_cwd檢查 Apple Terminal 是否正在運行以及我們是否不在 emacs 中(下面貼上了片段)。不幸的是,透過將 autojump 包含到我的 bashrc 設定檔中,呼叫較差的 shell(即M-x shell)會導致 update_terminal_cwd 被呼叫。對於在下級 shell 中呼叫的任何命令,我都會得到以下輸出:

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

當我在 bashrc 中包含 autojump 時,echo $PROMPT_COMMANDemacs 內部看起來像這樣:

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

如果我不包括 autojump,我只會得到一個空字串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 沒有定義;因此出現錯誤。

autojump 人員建議我改用 iTerm2 或找出 $INSIDE_EMACS 不起作用的原因。

我懷疑是這樣的:

呼叫M-x shell以某種方式與呼叫 emacs 時已經存在的 shell 環境相關聯。這就是為什麼在 emacs 運行時更改 .bashrc 檔案不會將變更傳播到 emacs。相反,您必須建立一個新的 bash 環境,然後使用較差的 shell 呼叫 emacs,然後才能看到這些變更。

有沒有辦法告訴劣質 shell 忽略預設環境並嘗試從頭開始啟動 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

我知道這個主題很舊,但我遇到了同樣的問題,但沒有找到解決方案(此頁面是第一個谷歌結果)。這是我的修復(可能不是最好的,但有效):

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你可以透過以下方式獲得一個具有相當空環境的 shell(以與 emacs 使用的相同選項啟動):

exec -c bash --noediting -i

或者您可以將上述命令放入~/.emacs_bash~/.emacs.d/init_bash.sh

如果這會刪除太多環境,exec您可以$PROMPT_COMMAND在 .emacs_bash 啟動腳本中設定為正確的值,而不是也許。

答案3

我升級到 24.3.50.1,但沒有看到此問題。這是一個很好的解決方案(即升級到最新的 emacs)。

相關內容