Unter MacOSX 10.7 fügt Apple /etc/bashrc
eine Funktion ein: update_terminal_cwd
die 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_COMMAND
sieht 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_cwd
wird einfach durch Anhängen $PROMPT_COMMAND
an 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 shell
ist 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 shell
kö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_bash
oder einfügen.~/.emacs.d/init_bash.sh
exec
Wenn dadurch zu viel von der Umgebung entfernt wird, können Sie stattdessen vielleicht einfach $PROMPT_COMMAND
im 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).