(Observe que, título pelo contrário, esta pergunta não é a mesma que Como iniciar no modo daemon e suprimir diálogos interativos?, Pois essa pergunta foi "respondida" pelo remetente, eliminando o que estava causando o aparecimento de um prompt específico.)
Gostaria de saber se existe uma maneira geral de impedir que você fique emacs --daemon
sempre esperando uma resposta para um prompt exibido em um minibuffer que ainda não existe.
É impossível conectar-se a um emacsclient para responder a essas solicitações, porque o servidor não inicia até o Emacs concluir a sequência de inicialização. (Isso significa que, se você tiver ALTERNATE_EDITOR definido como uma string vazia, o que faz com emacsclient
que um servidor que não consegue encontrar um servidor inicie um novo daemon, você pode acabar com vários daemons do Emacs todos presos e aguardando.) Tenho que killall emacs
resolver o problema antes de continuar.
Eu posso jogar whack-a-mole com cada coisa causando um prompt na inicialização quando eu o identifico (iniciando o Emacs no modo não daemon e vendo o que ele está pedindo), mas não é uma solução porque não pode parar o próximo daemon pendurado na inicialização por um novo motivo.
Para dar um exemplo: um motivo comum para travar foi após uma reinicialização do sistema ou uma falha no Emacs, quando o primeiro Emacs pós-reinicialização quis saber se era bom roubar arquivos de bloqueio do Emacs desativado. Eu poderia consertar isso criando conselhos para que esse prompt sempre respondesse "sim" sem interação. Porém, um dos arquivos que foram abertos na sessão anterior foi salvo, um arquivo TRAMP que requer uma senha sudo ou SSH; portanto, o daemon fica parado aguardando um prompt de senha. Portanto, corrijo isso editando manualmente o arquivo da sessão (com vi
ou emacs -q
!) Para remover os arquivos incorretos - mas isso não impede que isso aconteça na próxima vez.
Portanto, posso parar de carregar minha sessão automaticamente na inicialização e alterá-la para um comando que devo executar manualmente no meu primeiro emacsclient. Mas se ela não estiver carregando minha sessão em segundo plano, estará pronta quando eu estiver pronta para usá-la, todo o objetivo do daemon será perdido!
Então, o que eu gostaria é:
- (Melhor) Alguma maneira de adiar os prompts do minibuffer até eu abrir um emacsclient, enquanto ainda concluo o restante da inicialização.
- (OK) Alguma maneira de fazer todos os prompts do minibuffer que eu ainda não
no
avisei, como descrito acima, retornará, a menos que um emacsclient esteja em execução. Eu posso viver com meus buffers TRAMP em erro desde que funcione principalmente.
Existe alguma maneira de alcançar um desses objetivos?
fonte
(read-desktop)
, antes de executaremacs --daemon
, crie um arquivo de bloqueio falso colocando um número inteiro em .emacs.desktop.lock (onde colocar esse arquivo, infelizmente, depende da sua configuração , mas provavelmente seja seu diretório de usuário ou ~ / .emacs.d / .Respostas:
Nossa discussão esclareceu que você não possui um servidor X executando isso, tornando minha primeira solução inútil para você.
A seguir, apresento uma segunda solução que funciona com quadros de terminais de texto.
Quando sua inicialização requer a entrada do usuário por meio de uma, as funções recomendadas pelo
avoid-initial-terminal
Emacs aguardam até você abrir um quadro de terminal de texto. O prompt aparece no minibuffer desse quadro e você pode dar sua resposta interativa.As informações relacionadas ao código são fornecidas como comentários no código. Existem
TODO
marcadores com descrições que mostram onde inserir sua própria configuração. Atualmente, existem formulários de teste que validam o código.Teste: versão Emacs: 26.1
1º) Executar
emacs --daemon
em um console.2) Execute
emacsclient --tty
em outro console. Você é solicitado a fornecer uma senha e uma string. Posteriormente, você também precisará responder a uma consulta y-ou-np.fonte
Não é exatamente o que você está pedindo, mas talvez uma solução para o seu problema original:
Se o daemon fornecer um quadro gráfico para responder a perguntas que surjam na fase de inicialização, você não ficará mais preso.
O código abaixo define um conselho geral
my-with-initial-frame
que abre um quadro no primeiro visor disponível (por exemplo,:0.0
).Esse conselho pode ser facilmente adicionado à consulta de comandos como
y-or-n-p
ouread-passwd
, conforme demonstrado abaixo.Apenas a abertura de um quadro oferece uma possibilidade bastante grossa de responder às consultas na interface do usuário. Pode-se também usar uma caixa de diálogo para,
y-or-n-p
mas isso exigiria soluções especiais para comandos de consulta específicos. Eu queria evitar isso.Se você tentar esse código no seu arquivo init, verifique se é a primeira coisa que existe.
Teste:
Premissas:
Tenha um xserver em execução ao qual os programas possam se conectar por
DISPLAY
meio da variável de ambiente.Entrada no xterm:
emacs --daemon
emacsclient --eval '(y-or-n-p "A")'
Abre um quadro com o
y-or-n-p
prompt de consultaA (y or n)
. Responda a essa consulta e tente novamente:emacsclient --eval '(y-or-n-p "B")'
Nova consulta com prompt
B (y or n)
no mesmo quadro. Feche esse quadro, por exemplo, com C-x 5 0e tente novamente:emacsclient --eval '(y-or-n-p "C")'
Um novo quadro é aberto com o prompt de consulta
C (y or n)
.O mesmo funciona para a entrada de senha.
fonte
xterm
. Além disso, não acho que essa solução funcione para aqueles que o fazem - se você tiver o daemon configurado para ser executado na inicialização, ele tentará abrir um quadro na parte superior da tela de login, o que não é permitido; trava.server-start
no final da inicialização em vez disso, se você tiver uma inicialização limpa, não precisará esperar. Mas ... você terá que esperar, porque, a menos que eu entenda errado, você não pode colocar a tarefa para iniciar o daemon Emacs no script de login do sistema, pois uma GUI não estará disponível. (E em um caso como o meu, nunca será mais tarde, também.)Acho que adiar as solicitações será difícil em geral, mas deve ser bastante fácil alterar o Emacs para que essas solicitações sinalizem imediatamente um erro.
Não apenas isso, mas se você não pode responder a essas solicitações sem muita ginástica, acho que se qualifica como um bug, por isso recomendo que você envie um relatório de bug para isso.
fonte
Warning: desktop file appears to be in use by PID xxx. Using it may cause conflicts. Use it anyway? (y or n)
prompt para um erro, sem se referir especificamente a "área de trabalho" de alguma forma (porque dessa maneira, por não ser geral, fica uma porcaria)?*Messages*
é provavelmente um alerta insuficiente na conexão do primeiro cliente, para que algo possa estar seriamente errado e precise de atenção imediata antes que o usuário tente executar operações com estado.emacs --daemon
ou iniciandoemacsclient
com aALTERNATE_EDITOR
variável de ambiente definida como uma sequência vazia, você verá a saída que normalmente vai*Messages*
ecoar no terminal até o daemon completar a inicialização e Emacs está pronto Mas muitos têm Emacs iniciar o daemon na inicialização do sistema ou tempo de login, e a saída seja registrado ou jogado fora..desktop
mas nay-or-n-p
função (ou ainda mais baixa). Temos algum mecanismo para atrasar a exibição dos erros que ocorreram durante a inicialização, portanto, podemos usá-lo para exibi-los quando o primeiro emacsclient se conectar ao daemon.*Messages*
- e enquanto o*Warnings*
sistema pouco usado abre uma janela para o buffer se houver um quadro ativo quando o aviso for gerado, nesse caso, não existe nenhum quadro e não parece fácil adiar o pop-up até o primeiro emacsclient após o problema do aviso. Se isso pudesse ser feito, sua sugestão de fazer umyes-or-no-p
aviso antes do cliente seria bastante ideal. (Duvido usuários pente*Messages*
no arranque!)