Quando executo M-x compile
, gera um novo subshell para executar meu comando de compilação. Assim que o comando de compilação retornar, o processo do shell será interrompido. Eu posso ver por que isso seria desejável na maioria dos casos, mas atualmente estou em uma situação em que não é útil.
Atualmente, estou trabalhando em um ambiente de compilação especializado, que exige algumas etapas iniciais para configurar a compilação antes de executar o compilador. Enquanto o ambiente persistir, só preciso executar as etapas de configuração uma vez. Mas quando eu uso, M-x compile
isso significa que tenho que executar as etapas sempre que desejar compilar ou recompilar.
Existe uma maneira de gerar um subshell que persistirá em segundo plano? Um que M-x compile
e M-x gdb
pode usar cada vez que eles precisam para executar um processo shell?
Motivação:
Eu tenho um programa (que chamaremos xcc
) que cria código C para plataformas especiais. Para criar meu código, começo primeiro xcc
pelo tcsh
prompt:
$ xcc
O programa leva mais de 10 segundos para carregar e, em seguida, posso inserir comandos no prompt interativo
xcc>> add target myprogram
xcc>> set source myprogram $PROJDIR/src/
xcc>> set includes myprogram $PROJDIR/include/
xcc>> set type myprogram primitive
xcc>> set inputs myprogram int8,int8
xcc>> set outputs myprogram fix16,fix16
xcc>> build myprogram
As etapas acima podem ser construídas em uma macro personalizada, buildmyprog.macro
para que eu possa executá-la diretamente do shell ou do emacs comM-x compile
$ xcc buildmyprog.macro
O principal problema dessa abordagem é o fato de que o xcc
programa leva 10 segundos para carregar, antes mesmo da compilação começar. Eu me cansei o suficiente de esperar os 10 segundos extras toda vez que compilei que comecei a correr xcc
em um ansi-term
buffer separado. Agora, depois de modificar e salvar o código, mudo para o ansi-term
buffer e corro
xcc>> build myprogram
Isso funciona bem, mas toda vez que eu mudo para esse buffer, penso: "Não seria ótimo se eu simplesmente pressionasse F7
e meu comando de compilação fosse enviado para a instância já em execução do xcc
?"
fonte
comint
modo derivado para o seu ambiente. Se você estiver se sentindo aventureiro, aqui está um guia para escrever um.comint-send-input
. Isso é basicamente o que você está fazendo manualmente, convertê-lo em elisp não deve ser muito difícil (especialmente se comparado à configuração do comint).Respostas:
Você pode fazer a configuração no seu shell antes de iniciar o emacs? O
compile
sub-shell deve herdar o ambiente de seus avós via emacs.fonte
M-x compile
ele não enviou seus comandos de volta ao interpretador python.Use um shell real dentro do Emacs, como
eshell
ouansi-term
. Você deve usarcompile
para compilar, embora possa ser usado para executar qualquer comando.Não acho que seja possível com o comando compile, mas talvez esteja faltando alguma coisa. Caso contrário, você poderá colocar todas as etapas de configuração em um script de shell e executá-lo com
M-x compile
.fonte
M-x compile
algum comando alternativo que compilará o arquivo atual.M-x compile
chamadas, e é isso que um shell real faz. Não acho que seja possível com o comando compile, mas talvez esteja faltando alguma coisa. Caso contrário, o OP poderia colocar todos os passos de configuração em um script shell e executar esse script comM-x compile
eshell
para itens de casca ecompile
para compilar"? Isso derrota o ponto inteiro.Uma solução possível seria ter um intérprete permanente vivendo em um buffer dedicado (mais ou menos como o
*compilation*
buffer, mas onde o processo subjacente nunca retornaria). Você pode ter umrecompile
comando -like para enviar um comando de compilação predefinido ao intérprete e exibir os resultados.Abaixo está uma implementação provisória de tal estratégia. O
persistent-compile
comando cuida da inicialização do processo (quando é chamado pela primeira vez ou com um argumento de prefixo) e da recompilação (se o processo do intérprete já estiver em execução). Os resultados da compilação são exibidos em um*persistent-compilation*
buffer,compilation-shell-minor-mode
aproveitando oscompilation-mode
recursos usuais para navegar entre os erros.Aqui está um exemplo de uso, junto com o conteúdo resultante do
*persistent-compilation*
buffer:M-x
persistent-compile
RET/bin/bash
RETFOO=bar
RETecho $FOO
RETM-x
persistent-compile
RETCuidado, o código a seguir não foi muito testado. Por exemplo, não tenho certeza do que acontece quando você tenta recompilar antes do término da compilação anterior.
fonte