Как запретить emacs загружать `update_terminal_cwd` с помощью autojump?

Как запретить emacs загружать `update_terminal_cwd` с помощью autojump?

В MacOSX 10.7 Apple добавляет /etc/bashrcфункцию: , update_terminal_cwdкоторая проверяет, запущен ли Apple Terminal И не находимся ли мы в emacs (фрагмент вставлен ниже). К сожалению, при включении autojump в мой файл конфигурации bashrc вызов подчиненной оболочки (т. е. M-x shell) приводит к вызову update_terminal_cwd. Я получаю такой вывод для любой команды, вызванной в подчиненной оболочке:

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

Когда я включаю autojump в свой bashrc, то echo $PROMPT_COMMANDвнутри emacs выглядит так:

{ [[ "$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в конец указанной выше строки.

Каким-то образом autojump реализуется в среде, где:

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

верно. Но поскольку он запущен в emacs, update_terminal_cwd не определен; отсюда и ошибка.

Ребята из Autojump предложили мне использовать iTerm2 или выяснить, почему не работает $INSIDE_EMACS.

Я подозреваю, что это что-то вроде следующего:

Вызов M-x shellкаким-то образом привязан к среде оболочки, которая уже существует при вызове emacs. Вот почему изменение файла .bashrc во время работы emacs не распространяет изменения на 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

Если это удаляет слишком много среды, вместо этого, execвозможно, вы можете просто установить $PROMPT_COMMANDправильное значение внутри скрипта запуска .emacs_bash.

решение3

Я обновился до 24.3.50.1 и не вижу этой проблемы. Это хорошее решение (т.е. обновиться до последней версии emacs).

Связанный контент