OVH Cloud OVH Cloud

Confirmation à la fermeture d'un buffer

10 réponses
Avatar
SL
Bonjour,

J'aime beaucoup "kill-buffer-and-window", mais cette fonction demande une
confirmation ("Kill buffer `.emacs'? (yes or no)"), que je n'arrive pas à
supprimer.

Auriez vous une idée ?

Sylvain

10 réponses

Avatar
drkm
"SL" writes:

J'aime beaucoup "kill-buffer-and-window", mais cette fonction demande une
confirmation ("Kill buffer `.emacs'? (yes or no)"), que je n'arrive pas à
supprimer.



Je n'ai pas de telle demande chez moi. Je pense qu'il s'agit d'une
modification dans le CVS depuis la 21.3. Tu peux donc installer un
21.3.50. Ou essayer d'utiliser le code de cette fonction dans le CVS
sur ta version (il se trouve dans <FILE:window.el>).

Ou un peu plus gore (quoique) :

(global-set-key "C-x40"
(lambda ()
(fset 'yes-or-no-p (prog1 (symbol-function 'yes-or-no-p)
(fset 'yes-or-no-p (lambda ()))
(kill-buffer-and-window)))))

Code non testé.

--drkm
Avatar
Matthieu Moy
drkm writes:

Je n'ai pas de telle demande chez moi. Je pense qu'il s'agit d'une
modification dans le CVS depuis la 21.3. Tu peux donc installer un
21.3.50. Ou essayer d'utiliser le code de cette fonction dans le CVS
sur ta version (il se trouve dans <FILE:window.el>).



Em même temps, vu le code de la fonction `kill-buffer-and-window' :

(defun kill-buffer-and-window ()
"Kill the current buffer and delete the selected window."
(interactive)
(if (yes-or-no-p (format "Kill buffer `%s'? " (buffer-name)))
(let ((buffer (current-buffer)))
(delete-window (selected-window))
(kill-buffer buffer))
(error "Aborted")))

Je crois avoir ma petite idée sur la façon de supprimer le
test ... ;-)

Allez, hop

(defun moy-kill-buffer-and-window ()
"Kill the current buffer and delete the selected window."
(interactive)
(let ((buffer (current-buffer)))
(delete-window (selected-window))
(kill-buffer buffer)))

Et un "global-set-key" plus loin, ça roule !

Ou un peu plus gore (quoique) :

(global-set-key "C-x40"
(lambda ()
(fset 'yes-or-no-p (prog1 (symbol-function 'yes-or-no-p)
(fset 'yes-or-no-p (lambda ()))
(kill-buffer-and-window)))))



Un (flet ((yes-or-no-p (lambda (x) t))) ... ) l'aurait fait aussi, je
pense.

--
Matthieu
Avatar
SL
Il s'agit d'un emacs 21.3 pour MS Windows. Dans window.el je trouve
effectivement :

(defun kill-buffer-and-window ()
"Kill the current buffer and delete the selected window."
(interactive)
(if (yes-or-no-p (format "Kill buffer `%s'? " (buffer-name)))
(let ((buffer (current-buffer)))
(delete-window (selected-window))
(kill-buffer buffer))
(error "Aborted")))

J'ai bien espéré d'ajouter ceci, .dans emacs :

(defun kill-buffer-and-window ()
"Kill the current buffer and delete the selected window."
(let ((buffer (current-buffer)))
(delete-window (selected-window))
(kill-buffer buffer))

Mais c'est un échec sans appel.

Sylvain
Avatar
SL
Parfait ! Merci. Si j'en crois mes yeux il y a plus de parenthèses fermantes
que d'ouvrantes, mais emacs lui est content, et c'est bien là l'essentiel.

Sylvain

"Matthieu Moy" a écrit dans le message
de news:
drkm writes:

> Je n'ai pas de telle demande chez moi. Je pense qu'il s'agit d'une
> modification dans le CVS depuis la 21.3. Tu peux donc installer un
> 21.3.50. Ou essayer d'utiliser le code de cette fonction dans le CVS
> sur ta version (il se trouve dans <FILE:window.el>).

Em même temps, vu le code de la fonction `kill-buffer-and-window' :

(defun kill-buffer-and-window ()
"Kill the current buffer and delete the selected window."
(interactive)
(if (yes-or-no-p (format "Kill buffer `%s'? " (buffer-name)))
(let ((buffer (current-buffer)))
(delete-window (selected-window))
(kill-buffer buffer))
(error "Aborted")))

Je crois avoir ma petite idée sur la façon de supprimer le
test ... ;-)

Allez, hop

(defun moy-kill-buffer-and-window ()
"Kill the current buffer and delete the selected window."
(interactive)
(let ((buffer (current-buffer)))
(delete-window (selected-window))
(kill-buffer buffer)))

Et un "global-set-key" plus loin, ça roule !

> Ou un peu plus gore (quoique) :
>
> (global-set-key "C-x40"
> (lambda ()
> (fset 'yes-or-no-p (prog1 (symbol-function 'yes-or-no-p)
> (fset 'yes-or-no-p (lambda ()))
> (kill-buffer-and-window)))))

Un (flet ((yes-or-no-p (lambda (x) t))) ... ) l'aurait fait aussi, je
pense.

--
Matthieu
Avatar
Matthieu Moy
"SL" writes:

J'ai bien espéré d'ajouter ceci, .dans emacs :

(defun kill-buffer-and-window ()



[...]

Mais c'est un échec sans appel.



Il faut toujours se méfier quand on a plusieurs fonctions qui portent
le même nom : la sémantique dépend de l'ordre de chargement des
fichiers qui les contiennent, et tu n'est jamais à l'abri d'un
rechargement de l'autre fichier qui écraserait ta définition ...

Ceci dit, pour changer le comportement d'une fonction existante, il y
a defadvice qui fait ça à peu près proprement.

--
Matthieu
Avatar
drkm
Matthieu Moy writes:

drkm writes:

Ou un peu plus gore (quoique) :

(global-set-key "C-x40"
(lambda ()
(fset 'yes-or-no-p (prog1 (symbol-function 'yes-or-no-p)
(fset 'yes-or-no-p (lambda ()))
(kill-buffer-and-window)))))



Un (flet ((yes-or-no-p (lambda (x) t))) ... ) l'aurait fait aussi, je
pense.



Arf ! J'y avais bien pensé en écrivant ma réponse, mais ma seule
réaction a été « fait ch$$r, Emacs, si seulement on avait le flet de
CL, ce serait plus beau » :-) Merci de m'avoir fait découvrir qu'elle
existait aussi en Emacs Lisp. Allez, juste pour le plaisir :

(global-set-key "C-x40" (lambda ()
(flet ((yes-or-no-p (prompt)))
(kill-buffer-and-window))))

(c'est quand même vrai que c'est plus joli).

Au fait, comment pourrait-on demander à Emacs de remplacer tous les
bindings qui mènent à `kill-buffer-and-window()' par cette commande ?
Sans toucher à `kill-buffer-and-window()'.

De manière à ce que, si plus tard, on fait un :

(local-set-key "..." 'kill-buffer-and-window)

par exemple, c'est bien la commande ci-dessus qui soit appelée. Un
peu pour les bindings ce qu'est `defadvice()' aux fonctions.

--drkm
Avatar
drkm
"SL" writes:

Parfait ! Merci. Si j'en crois mes yeux il y a plus de parenthèses fermantes
que d'ouvrantes, mais emacs lui est content, et c'est bien là l'essentiel.



Je ne vois pas où. Mais pour ce genre de choses, je fais plus
confiance à Emacs qu'à moi-même ;-)

PS: Pourrais-tu poster à l'endroit, s'il te plaît ?
<URL:http://www.giromini.org/usenet-fr/repondre.html>.

--drkm
Avatar
Matthieu Moy
drkm writes:

Au fait, comment pourrait-on demander à Emacs de remplacer tous les
bindings qui mènent à `kill-buffer-and-window()' par cette commande ?
Sans toucher à `kill-buffer-and-window()'.



Pour le plaisir aussi :

(defadvice kill-buffer-and-window (around dont-prompt activate)
"Don't prompt in `kill-buffer-and-window'"
(flet ((yes-or-no-p (x) t)) ad-do-it))

--
Matthieu
Avatar
SL
Arf ! J'y avais bien pensé en écrivant ma réponse, mais ma seule
réaction a été « fait ch$$r, Emacs, si seulement on avait le flet de
CL, ce serait plus beau » :-) Merci de m'avoir fait découvrir qu'elle
existait aussi en Emacs Lisp. Allez, juste pour le plaisir :

(global-set-key "C-x40" (lambda ()
(flet ((yes-or-no-p (prompt)))
(kill-buffer-and-window))))




ça me donne "Wrong type argument: commandp, (lambda nil (flet ((yes-or-no-p
(prompt))) (kill-buffer-and-window)))". Peut être une erreur de ma part !
Avatar
drkm
"SL" writes:

Arf ! J'y avais bien pensé en écrivant ma réponse, mais ma seule
réaction a été « fait ch$$r, Emacs, si seulement on avait le flet de
CL, ce serait plus beau » :-) Merci de m'avoir fait découvrir qu'elle
existait aussi en Emacs Lisp. Allez, juste pour le plaisir :

(global-set-key "C-x40" (lambda ()
(flet ((yes-or-no-p (prompt)))
(kill-buffer-and-window))))



ça me donne "Wrong type argument: commandp, (lambda nil (flet ((yes-or-no-p
(prompt))) (kill-buffer-and-window)))". Peut être une erreur de ma part !



Non, non, tu as raison. La forme `interactive()' s'est perdue je ne
sais où :

(global-set-key "C-x40" (lambda ()
(interactive)
(flet ((yes-or-no-p (prompt)))
(kill-buffer-and-window))))

C'est la manière de dire à Emacs que cette fonction n'est pas juste
une fonction utilisable en Lisp, mais une commande utilisable
directement par l'utilisateur (depuis `M-x' ou en la liant à une
séquence de caractères, ou plutôt d'événements d'entrée).

--drkm