No MacOSX 10.7, a Apple coloca /etc/bashrc
uma função: update_terminal_cwd
que verifica se o Apple Terminal está rodando E se não estamos no emacs (snippet colado abaixo). Infelizmente, ao incluir o autojump em meu arquivo de configuração bashrc, invocar um shell inferior (ou seja M-x shell
) resulta na invocação de update_terminal_cwd. Recebo esta 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 fica assim:
{ [[ "$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 salto automático, recebo apenas 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 anexando $PROMPT_COMMAND
ao final da string acima.
De alguma forma, o salto automático 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 por que $INSIDE_EMACS não está funcionando.
Suspeito que seja algo como o seguinte:
A invocação M-x shell
está de alguma forma ligada ao ambiente shell que já existe quando o emacs é invocado. É por isso que alterar o arquivo .bashrc enquanto o emacs está em execução não propaga as alterações para o emacs. Em vez disso, você terá que criar um novo ambiente bash e então invocar o emacs com um shell inferior antes de ver essas alterações.
Existe uma maneira de dizer a um shell inferior para desconsiderar o ambiente padrão e tentar iniciar o bash 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
Responder1
Sei que este tópico é antigo, mas tive o mesmo problema e não encontrei solução (e esta página é o primeiro resultado do Google). Aqui está minha soluçã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
Cumprimentos,
Responder2
Depois M-x shell
você pode obter um shell com um ambiente bastante vazio (iniciado com as mesmas opções que o emacs usa):
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 de exec
talvez você possa simplesmente definir $PROMPT_COMMAND
um valor correto dentro do script de inicialização .emacs_bash.
Responder3
Atualizei para 24.3.50.1 e não estou vendo esse problema. Essa é uma boa solução (ou seja, atualizar para o emacs mais recente).