¿Cómo evito que emacs cargue `update_terminal_cwd` con autojump?

¿Cómo evito que emacs cargue `update_terminal_cwd` con autojump?

En MacOSX 10.7, Apple implementa /etc/bashrcuna función update_terminal_cwdque 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_COMMANDel 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_cwdagrega simplemente agregándolo $PROMPT_COMMANDal 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 shellestá 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 shellpuede 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_basho~/.emacs.d/init_bash.sh

Si eso elimina demasiado del entorno, en lugar de eso exec, tal vez puedas establecer $PROMPT_COMMANDun 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).

información relacionada