Como evito que o emacs carregue o `update_terminal_cwd` com o autojump?

6

No MacOSX 10.7, a Apple coloca em /etc/bashrc uma função: update_terminal_cwd que verifica se o Terminal da Apple está em execução E se não estamos no emacs (fragmento colado abaixo). Infelizmente, incluindo o autojump no meu arquivo de configuração bashrc, invocando um shell inferior (ou seja, M-x shell ) resulta em update_terminal_cwd sendo chamado. Eu recebo essa saída para qualquer comando invocado no shell inferior:

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

Quando incluo o autojump no meu bashrc, echo $PROMPT_COMMAND dentro do emacs se parece com isso:

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

Se eu não incluir o autojump, acabei de receber uma string nula para echo $PROMPT_COMMAND.

No código do autojump, está inserindo a primeira parte:

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

o update_terminal_cwd está sendo adicionado apenas acrescentando $PROMPT_COMMAND até o final da string acima.

De alguma forma, o autojump está sendo instanciado em um ambiente onde:

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

é verdade. Mas, como está sendo executado no emacs, update_terminal_cwd não está definido; daí o erro.

O pessoal do autojump sugeriu que eu usasse o iTerm2 ou descobrisse porque o $ INSIDE_EMACS não está funcionando.

Eu suspeito que seja algo como o seguinte:

Invocando M-x shell está de alguma forma ligado ao ambiente de shell que já existe quando o emacs é invocado. É por isso que alterar o arquivo .bashrc enquanto o emacs está sendo executado não propaga as alterações para o emacs. Em vez disso, você precisa criar um novo ambiente bash e depois invocar o emacs com um shell inferior antes de ver essas mudanças.

Existe uma maneira de dizer a um shell inferior para desconsiderar o ambiente padrão e tentar iniciar o bash a partir do zero?

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
Avery Chan
fonte

Respostas:

1

Eu sei que este tópico é antigo, mas eu tive o mesmo problema e não encontrei nenhuma solução (e esta página é o primeiro resultado do google). Aqui está minha correção (pode não ser a melhor, mas 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

Saudações,

termux
fonte
0

Depois de M-x shell você pode obter um shell com um ambiente bastante vazio (iniciado com as mesmas opções que o emacs usa) por:

exec -c bash --noediting -i

ou você pode colocar o comando acima em ~/.emacs_bash ou ~/.emacs.d/init_bash.sh

Se isso remover muito do ambiente, em vez do exec talvez você possa apenas definir $PROMPT_COMMAND para um valor correto dentro do script de inicialização .emacs_bash.

Brian Swift
fonte
Eu editei ambos ~/.emacs_bash e / ou ~/.emacs.d/init_bash.sh como por sua sugestão. Ambos os arquivos Faz ser tocado quando o shell é iniciado, mas ainda não resolve o problema. Na verdade, recebo uma reclamação da cerveja que $HOME não está definido (embora isso só aconteça uma vez após a execução de um comando).
Avery Chan
0

Eu atualizei para 24.3.50.1 e não estou vendo esse problema. Essa é uma boa solução (por exemplo, atualizar para o emacs mais recente).

Avery Chan
fonte