From a1e89e383539db9c4f89d711ac5b80e6ecdb3562 Mon Sep 17 00:00:00 2001 From: Eric Abrahamsen Date: Fri, 10 May 2024 12:38:57 -0700 Subject: [PATCH] Update gnus-draft-check-draft-articles to use find-buffer-visiting * lisp/gnus/gnus-draft.el (gnus-draft-check-draft-articles): Don't loop through all the buffers; this removes the need for the `file-remote-p' check. Also give the user some nicer feedback about what's going on. (cherry picked from commit 41bfca00051b590c24fca9e8614b67724fab272d) --- lisp/gnus/gnus-draft.el | 43 ++++++++++++++++++----------------------- 1 file changed, 19 insertions(+), 24 deletions(-) diff --git a/lisp/gnus/gnus-draft.el b/lisp/gnus/gnus-draft.el index 7c52e8750e4..c4266a7060e 100644 --- a/lisp/gnus/gnus-draft.el +++ b/lisp/gnus/gnus-draft.el @@ -289,30 +289,25 @@ If DONT-POP is nil, display the buffer after setting it up." (defun gnus-draft-check-draft-articles (articles) "Check whether the draft articles ARTICLES are under edit." (when (equal gnus-newsgroup-name "nndraft:drafts") - (let ((buffers (buffer-list)) - file buffs buff) - (save-current-buffer - (while (and articles - (not buff)) - (setq file (nndraft-article-filename (pop articles)) - buffs buffers) - (while buffs - (set-buffer (setq buff (pop buffs))) - (if (and buffer-file-name - (equal (file-remote-p file) - (file-remote-p buffer-file-name)) - (string-equal (file-truename buffer-file-name) - (file-truename file)) - (buffer-modified-p)) - (setq buffs nil) - (setq buff nil))))) - (when buff - (let* ((window (get-buffer-window buff t)) - (frame (and window (window-frame window)))) - (if frame - (select-frame-set-input-focus frame) - (pop-to-buffer buff t))) - (error "The draft %s is under edit" file))))) + (let* ((files (mapcar #'nndraft-article-filename articles)) + (buffs (delq nil (mapcar (lambda (f) + (find-buffer-visiting + f (lambda (b) (buffer-modified-p b)))) + files)))) + (when buffs + (if (= 1 (length buffs)) + ;; We might have arrived here via `gnus-draft-edit-message'; + ;; either way show the user the draft with unsaved changes. + (let* ((window (get-buffer-window (car buffs) t)) + (frame (and window (window-frame window)))) + (if frame + (select-frame-set-input-focus frame) + (pop-to-buffer (car buffs) t)) + (error "Draft is already under edit")) + ;; Otherwise we got here from `gnus-draft-send-message', and + ;; the main thing is to interrupt the sending. + (display-buffer (list-buffers-noselect t buffs)) + (error "Some drafts have unsaved changes: %S" buffs)))))) (defun gnus-draft-clear-marks () (setq gnus-newsgroup-reads nil -- 2.39.5