如何防止 emacs 使用自动跳转加载“update_terminal_cwd”?

如何防止 emacs 使用自动跳转加载“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;

如果我不包含自动跳转,我只会得到一个空字符串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 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)。

相关内容