Wie verhindere ich, dass Emacs „update_terminal_cwd“ mit Autojump lädt?

Wie verhindere ich, dass Emacs „update_terminal_cwd“ mit Autojump lädt?

Unter MacOSX 10.7 fügt Apple /etc/bashrceine Funktion ein: update_terminal_cwddie prüft, ob Apple Terminal läuft UND ob wir uns nicht in Emacs befinden (Ausschnitt unten eingefügt). Leider führt das Einfügen von Autojump in meine bashrc-Konfigurationsdatei dazu, dass beim Aufrufen einer untergeordneten Shell (z. B. M-x shell) update_terminal_cwd aufgerufen wird. Ich erhalte diese Ausgabe für jeden Befehl, der in der untergeordneten Shell aufgerufen wird:

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

Wenn ich Autojump in meine Bashrc einbinde, echo $PROMPT_COMMANDsieht es in Emacs folgendermaßen aus:

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

Wenn ich Autojump nicht einbeziehe, erhalte ich einfach eine Nullzeichenfolge für echo $PROMPT_COMMAND.

Im Autojump-Code wird der erste Teil eingefügt:

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

Es update_terminal_cwdwird einfach durch Anhängen $PROMPT_COMMANDan das Ende der obigen Zeichenfolge hinzugefügt.

Aus irgendeinem Grund wird Autojump in einer Umgebung instanziiert, in der:

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

ist wahr. Aber weil es in Emacs ausgeführt wird, ist update_terminal_cwd nicht definiert; daher der Fehler.

Die Leute von Autojump haben mir vorgeschlagen, stattdessen iTerm2 zu verwenden oder herauszufinden, warum $INSIDE_EMACS nicht funktioniert.

Ich vermute, es ist so etwas wie das Folgende:

Der Aufruf M-x shellist irgendwie an die Shell-Umgebung gebunden, die bereits existiert, wenn Emacs aufgerufen wird. Aus diesem Grund werden die Änderungen, die Sie an der .bashrc-Datei vornehmen, während Emacs ausgeführt wird, nicht an Emacs weitergegeben. Stattdessen müssen Sie eine neue Bash-Umgebung erstellen und dann Emacs mit einer untergeordneten Shell aufrufen, bevor Sie diese Änderungen sehen.

Gibt es eine Möglichkeit, einer untergeordneten Shell mitzuteilen, dass sie die Standardumgebung ignorieren und versuchen soll, Bash von Grund auf neu zu starten?

Apple /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

Antwort1

Ich weiß, dass dieses Thema alt ist, aber ich hatte das gleiche Problem und habe keine Lösung gefunden (und diese Seite ist das erste Google-Ergebnis). Hier ist meine Lösung (vielleicht nicht die beste, aber funktioniert):

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

Grüße,

Antwort2

Anschließend M-x shellkönnen Sie eine Shell mit einer relativ leeren Umgebung (gestartet mit den gleichen Optionen, die Emacs verwendet) wie folgt erhalten:

exec -c bash --noediting -i

oder Sie können den obigen Befehl in ~/.emacs_bashoder einfügen.~/.emacs.d/init_bash.sh

execWenn dadurch zu viel von der Umgebung entfernt wird, können Sie stattdessen vielleicht einfach $PROMPT_COMMANDim Startskript .emacs_bash einen korrekten Wert festlegen.

Antwort3

Ich habe auf 24.3.50.1 aktualisiert und dieses Problem tritt nicht auf. Das ist eine gute Lösung (d. h. ein Upgrade auf den neuesten Emacs).

verwandte Informationen