2008-11-06 6 views
24

Après avoir ouvert quelque chose avec emacsclient, quand je tue ce tampon (C-x k) Je reçois une boîte de dialogue de confirmation:Comment supprimer l'invite de suppression des tampons emacsclient?

Buffer `blah' still has clients; kill it? (yes or no) 

Mais quand je tue les tampons ouverts directement à partir Emacs, je ne sais pas. Existe-t-il un moyen de ne pas les obtenir quand emacsclient les a ouverts?

+0

Notez que lorsque vous utilisez emacsclient pour modifier un fichier, Emacs vous dit d'utiliser Cx #' pour dire au serveur lorsque vous J'ai fini avec le fichier. Si vous faites cela (plutôt que «C-x k»), la question ne vous sera pas posée. – phils

Répondre

20

Cela a fonctionné pour moi:

(remove-hook 'kill-buffer-query-functions 'server-kill-buffer-query-function) 

Il y a plus d'informations sur Using Emacsclient blog entry.

+0

Je ne sais pas si c'est approprié pour moi d'upvote cette réponse, mais au meilleur de ma connaissance c'est correct, donc :-) – ShreevatsaR

+4

Cela ne fonctionnera pas si emacs a été démarré en utilisant le comportement "ALTERNATE_EDITOR" d'emacsclient ... ce cas, vous pouvez faire (defun serveur-supprimer-kill-buffer-hook() (supprimer-crochet 'kill-buffer-requête-fonctions' server-kill-buffer-query-fonction)) (ajouter-crochet ' server-visit-hook 'server-remove-kill-buffer-hook) –

+5

Qu'est-ce qui se passe avec le '*' dans cet extrait de code. – Tshepang

22

L'autre option consiste à utiliser l'option -n avec emacsclient afin qu'il n'attend pas que le fichier soit modifié avant de quitter.

Par exemple:

emacsclient -n myfile.txt 
+0

Merci! Il a l'avantage (pour moi) sur l'autre solution de ne pas fermer le cadre quand le tampon est détruit, dans le cas où emacsclient a créé un nouveau cadre avec l'option '-c'. – rafak

+3

Remarque: -n (--no-wait) n'est pas ce que vous voulez si vous avez un programme en attente d'édition du fichier. –

0

Pour une raison quelconque, je dois lancer manuellement la solution crochet remove sur emacs23, peut-être parce que certaines parties du serveur sont chargés après les .emacs est chargé. L'ajout d'une ligne factice (démarrage du serveur) à mon .emacs avant le (remove-hook ...) n'a pas aidé. J'ai donc opté pour la solution suivante, moins fondée sur des principes:

(defalias 'server-kill-buffer-query-function '(lambda() t)) 
+1

Vous devriez pouvoir utiliser '(eval-after-load" server "'(remove-hook ...))' pour gérer les problèmes d'ordre de chargement (bien que la bibliothèque du serveur n'ait pas encore été chargée, votre alias devrait être corrompu une fois qu'il se charge, alors peut-être que quelque chose d'autre était en train de jouer avec le crochet après que vous aviez ??) – phils

+0

@phils il semble ne pas utiliser, si je démarre emacs par emacsclient -t (export ALTERNATE_EDITOR =). – netawater

+0

Hmm, c'est vrai. Je vois que (certainement dans 24.5) cette fonction est seulement ajoutée pendant 'server-start', donc il n'est pas là pour enlever immédiatement après le chargement de la bibliothèque. Il semble que vous puissiez utiliser after-advice sur 'server-start', ou bien utiliser' server-visit-hook' (dans ce cas, le code s'exécutera probablement à plusieurs reprises, mais ce n'est pas un problème dans ce cas). – phils

1

Vous pouvez régler la commande du clavier C-x k pour qu'il marque tampons clients comme fait et tue tampons normaux.

Je récupéré sans vergogne cet extrait de code de l'entrée Emacs Client dans le Emacs Wiki:

(add-hook 'server-switch-hook 
     (lambda() 
     (when (current-local-map) 
      (use-local-map (copy-keymap (current-local-map)))) 
     (when server-buffer-clients 
      (local-set-key (kbd "C-x k") 'server-edit)))) 

Bien que cela ne permet pas d'autres façons de tampons tuer (tels que M-x list-buffers), il devrait être sur la en respectant le comportement du client Emacs attendu par certains scripts shell.

Voici un extrait du fichier server.el dans votre distribution Emacs qui pourrait jeter un peu de lumière sur ce que je veux dire:

;; When you finish editing a Server buffer, again call server-edit 
;; to mark that buffer as done for the client and switch to the next 
;; Server buffer. When all the buffers for a client have been edited 
;; and exited with server-edit, the client "editor" will return 
;; to the program that invoked it. 

Plus tard, il y a un avertissement explicite qu'un tampon shouldn « t tuer, mais libéré (au moins est-ce que je l'interprète):

;; Ask before killing a server buffer. 
;; It was suggested to release its client instead, 
;; but I think that is dangerous--the client would proceed 
;; using whatever is on disk in that file. -- rms. 
Questions connexes