En MacOSX 10.7, Apple implementa /etc/bashrc
una función update_terminal_cwd
que verifica si Apple Terminal se está ejecutando Y si no estamos en emacs (fragmento pegado a continuación). Desafortunadamente, al incluir autojump en mi archivo de configuración bashrc, invocar un shell inferior (es decir, M-x shell
) da como resultado que se invoque update_terminal_cwd. Obtengo este resultado para cualquier comando invocado en el shell inferior:
bash: update_terminal_cwd: command not found
achan[10:29 AM]~ > echo $PROMPT_COMMAND
Cuando incluyo autojump en mi bashrc, echo $PROMPT_COMMAND
el interior de emacs se ve así:
{ [[ "$AUTOJUMP_HOME" == "$HOME" ]] && (autojump -a "$(pwd -P)"&)>/dev/null 2>>"${AUTOJUMP_DATA_DIR}/.autojump_errors";} 2>/dev/null ; update_terminal_cwd;
Si no incluyo el salto automático, solo obtengo una cadena nula para echo $PROMPT_COMMAND
.
En el código de autojump, se inserta la primera parte:
{ [[ "$AUTOJUMP_HOME" == "$HOME" ]] && (autojump -a "$(pwd -P)"&)>/dev/null 2>>"${AUTOJUMP_DATA_DIR}/.autojump_errors";} 2>/dev/null ;
Se update_terminal_cwd
agrega simplemente agregándolo $PROMPT_COMMAND
al final de la cadena anterior.
De alguna manera, se está creando una instancia de autojump en un entorno donde:
[ "$TERM_PROGRAM" == "Apple_Terminal" ] && [ -z "$INSIDE_EMACS" ]
es verdad. Pero, debido a que se ejecuta en emacs, update_terminal_cwd no está definido; de ahí el error.
La gente de autojump me ha sugerido que use iTerm2 en su lugar o averigüe por qué $INSIDE_EMACS no funciona.
Sospecho que es algo como lo siguiente:
La invocación M-x shell
está de alguna manera ligada al entorno de shell que ya existe cuando se invoca emacs. Es por eso que cambiar el archivo .bashrc mientras se ejecuta emacs no propaga los cambios a emacs. En cambio, deberá crear un nuevo entorno bash y luego invocar emacs con un shell inferior antes de ver esos cambios.
¿Hay alguna manera de decirle a un shell inferior que ignore el entorno predeterminado e intente iniciar bash desde cero?
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
Respuesta1
Sé que este tema es antiguo, pero tuve el mismo problema y no encontré solución (y esta página es el primer resultado de Google). Aquí está mi solución (puede que no sea la mejor, pero funciona):
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
Saludos,
Respuesta2
Luego M-x shell
puede obtener un shell con un entorno bastante vacío (iniciado con las mismas opciones que usa emacs) mediante:
exec -c bash --noediting -i
o puede colocar el comando anterior en ~/.emacs_bash
o~/.emacs.d/init_bash.sh
Si eso elimina demasiado del entorno, en lugar de eso exec
, tal vez puedas establecer $PROMPT_COMMAND
un valor correcto dentro del script de inicio .emacs_bash.
Respuesta3
Actualicé a 24.3.50.1 y no veo este problema. Esa es una buena solución (es decir, actualizar a la última versión de emacs).