(Notez que, au contraire, cette question n'est pas la même que Comment démarrer en mode démon et supprimer les dialogues interactifs?, Car cette question a été "répondue" par le demandeur en éliminant ce qui provoquait l'apparition d'une invite particulière.)
Je voudrais savoir s'il existe un moyen général d'éviter emacs --daemon
de suspendre indéfiniment une réponse à une invite affichée dans un mini-tampon qui n'existe pas encore.
Il est impossible de se connecter avec un emacsclient pour répondre à ces invites, car le serveur ne démarre pas tant qu'Emacs n'a pas terminé la séquence de démarrage. (Cela signifie que si ALTERNATE_EDITOR est défini sur la chaîne vide, ce qui fait emacsclient
qu'un serveur introuvable ne démarre pas un nouveau démon, vous pouvez vous retrouver avec plusieurs démons Emacs tous bloqués et en attente.) Je dois killall emacs
résoudre le problème et le résoudre avant de continuer.
Je peux jouer whack-a-mole avec chaque chose provoquant une invite au démarrage lorsque je l'identifie (en démarrant Emacs en mode non démon et en voyant ce qu'il demande), mais ce n'est pas une solution car il ne peut pas arrêter le prochain démon de se bloquer au démarrage pour une nouvelle raison.
Pour donner un exemple: une raison courante pour laquelle il se bloque était après un redémarrage du système ou un crash Emacs, lorsque le premier Emacs après le redémarrage voulait savoir s'il était correct de voler des fichiers de verrouillage des Emacs disparus. Je pourrais résoudre ce problème en créant des conseils pour que cette invite réponde toujours «oui» sans interaction. Mais ensuite, l'un des fichiers ouverts lors de la sauvegarde de la session précédente était un fichier TRAMP nécessitant un mot de passe sudo ou SSH, donc le démon est coincé en attente d'une invite de mot de passe. Je corrige donc cela en modifiant manuellement le fichier de session (avec vi
ou emacs -q
!) Pour supprimer les fichiers incriminés, mais cela ne l'empêche pas de se produire la prochaine fois.
Ainsi, je peux arrêter de charger ma session automatiquement au démarrage et la changer en une commande que je dois exécuter manuellement à partir de mon premier emacsclient. Mais s'il ne charge pas ma session en arrière-plan, il est donc prêt au moment où je suis prêt à l'utiliser, tout le but du démon est perdu!
Donc ce que j'aimerais, c'est:
- (Meilleur) Un moyen de différer les invites du mini-tampon jusqu'à ce que j'ouvre un emacsclient, tout en terminant le reste de l'initialisation.
- (OK) Un moyen de faire toutes les invites du
no
mini-tampon que je n'ai pas déjà conseillé autrement, comme décrit ci-dessus, revenez à moins qu'un emacsclient ne soit en cours d'exécution. Je peux vivre avec mes tampons TRAMP en erreur tant que cela fonctionne principalement.
Existe-t-il un moyen d'atteindre l'un de ces objectifs?
(read-desktop)
, puis, avant d'exécuteremacs --daemon
, de créer un faux fichier de verrouillage en mettant un entier dans .emacs.desktop.lock (où placer ce fichier, malheureusement, dépend de votre configuration , mais probablement votre homedir ou ~ / .emacs.d / .Réponses:
Notre discussion a révélé que vous n'avez pas de serveur X en cours d'exécution, cela rend ma première solution inutile pour vous.
Dans ce qui suit, je présente une deuxième solution qui fonctionne avec les cadres de terminaux de texte.
Lorsque votre initialisation nécessite une entrée utilisateur via l'une des fonctions recommandées avec
avoid-initial-terminal
Emacs, attendez que vous ouvriez un cadre de terminal texte. L'invite apparaît dans le mini-tampon de ce cadre et vous pouvez donner votre réponse interactive.Les informations relatives au code sont fournies sous forme de commentaires dans le code. Il existe des
TODO
marqueurs avec des descriptions qui vous indiquent où insérer votre propre configuration. Actuellement, il y a des formulaires de test qui valident le code.Test: version Emacs: 26.1
1er) Exécuter
emacs --daemon
sur une console.2ème) Exécuter
emacsclient --tty
sur une autre console. On vous y demande un mot de passe et une chaîne. Ensuite, vous devez également répondre à une requête y ou np.la source
Pas exactement ce que vous demandez, mais peut-être une solution à votre problème d'origine:
Si le démon vous donne un cadre graphique pour répondre aux questions qui se posent dans sa phase de démarrage, vous ne restez plus coincé.
Le code ci-dessous définit un conseil général
my-with-initial-frame
qui ouvre un cadre sur le premier écran disponible (par exemple,:0.0
).Ces conseils peuvent être ajoutés facilement aux requêtes de commandes comme
y-or-n-p
ouread-passwd
, comme cela est démontré ci-dessous.Le simple fait d'ouvrir un cadre vous donne une possibilité assez grossière de répondre aux requêtes sur l'interface utilisateur. On pourrait également utiliser une boîte de dialogue pour
y-or-n-p
mais cela nécessiterait des solutions spéciales pour des commandes d'interrogation spécifiques. Je voulais éviter ça.Si vous essayez ce code dans votre fichier init, assurez-vous que c'est la première chose.
Tester:
Hypothèses:
Avoir un xserver en cours d'exécution auquel les programmes peuvent se connecter via la
DISPLAY
variable d'environnement.Entrée à xterm:
emacs --daemon
emacsclient --eval '(y-or-n-p "A")'
Il ouvre un cadre avec l'
y-or-n-p
invite de requêteA (y or n)
. Répondez à cette requête et réessayez:emacsclient --eval '(y-or-n-p "B")'
Nouvelle requête avec invite
B (y or n)
dans le même cadre. Fermez ce cadre, par exemple avec C-x 5 0et réessayez:emacsclient --eval '(y-or-n-p "C")'
Un nouveau cadre s'ouvre avec l'invite de requête
C (y or n)
.La même chose fonctionne pour la saisie de mot de passe.
la source
xterm
. De plus, je ne pense pas que cette solution puisse fonctionner pour ceux qui le font - si vous avez le démon configuré pour s'exécuter au démarrage, il essaiera d'ouvrir un cadre en haut de l'écran de connexion, ce qui n'est pas autorisé, donc il plante.server-start
à la fin du démarrage au lieu de cela, si vous avez un démarrage propre, vous n'aurez pas à attendre. Mais ... vous devrez attendre, car à moins que je ne comprenne mal, vous ne pouvez pas mettre la tâche pour démarrer le démon Emacs dans votre script de connexion système car une interface graphique ne sera pas disponible à ce moment-là. (Et dans un cas comme le mien, ce ne sera jamais plus tard non plus.)Je pense que reporter les invites va être difficile en général, mais il devrait être assez facile de changer Emacs pour que ces invites signalent immédiatement une erreur.
Non seulement cela, mais si vous ne pouvez pas répondre à ces invites sans beaucoup de gymnastique, je pense que cela peut être considéré comme un bug, donc je vous recommande de soumettre un rapport de bug pour cela.
la source
Warning: desktop file appears to be in use by PID xxx. Using it may cause conflicts. Use it anyway? (y or n)
invite en erreur, sans se référer spécifiquement au "bureau" d'une manière ou d'une autre (parce que de cette façon, n'étant pas générique, se trouve un coup fou)?*Messages*
est probablement un avertissement insuffisant lors de la première connexion client, car quelque chose peut sérieusement mal tourner et nécessiter une attention immédiate avant que l'utilisateur ne tente une opération avec état.emacs --daemon
ou en commençantemacsclient
par laALTERNATE_EDITOR
variable d'environnement définie sur la chaîne vide, vous verrez la sortie qui va normalement en*Messages*
écho dans le terminal jusqu'au démon termine l'initialisation et Emacs est prêt. Mais beaucoup ont Emacs démarrer le démon au démarrage du système ou au moment de la connexion, et la sortie est soit enregistrée, soit jetée.desktop
mais dans lay-or-n-p
fonction (ou plus bas encore). Nous avons un mécanisme pour retarder l'affichage des erreurs qui se sont produites au démarrage, nous pourrions donc l'utiliser pour les afficher lorsque le premier emacsclient se connecte au démon.*Messages*
- et tandis que le système peu utilisé*Warnings*
ouvre une fenêtre vers le tampon si une trame active existe lorsque l'avertissement est généré, dans ce cas, aucune trame n'existe et elle ne fonctionne pas. ne semble pas facile de différer la fenêtre contextuelle jusqu'au premier emacsclient suivant le problème de l'avertissement. Si cela pouvait être fait, votre suggestion de faire unyes-or-no-p
avertissement pré-client serait plutôt idéale. (Je doute que les utilisateurs se peignent*Messages*
au démarrage!)