emacs が自動ジャンプで `update_terminal_cwd` をロードしないようにするにはどうすればよいですか?

emacs が自動ジャンプで `update_terminal_cwd` をロードしないようにするにはどうすればよいですか?

/etc/bashrcMacOSX 10.7 では、Apple は関数 に次のコードを追加します。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

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;

自動ジャンプを含めない場合は、 の null 文字列が返されます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 が呼び出されたときにすでに存在するシェル環境に何らかの形で結び付けられます。そのため、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 にアップグレードする)。

関連情報