bug-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

bug#65277: 29.1.50; emacsclient Dired: frame is closed/killed when openi


From: Eli Zaretskii
Subject: bug#65277: 29.1.50; emacsclient Dired: frame is closed/killed when opening another dir
Date: Mon, 14 Aug 2023 16:37:10 +0300

> From: Maxim Kim <habamax@gmail.com>
> Date: Mon, 14 Aug 2023 09:53:39 +1000
> 
> 
> 1. Create one line ~/.emacs file with
> 
>    (setq dired-kill-when-opening-new-dired-buffer t)
> 
> 2. Run `emacsclient -t -a "" .` to see a dired buffer for a current
> working directory.
> 
> 3. Navigate to a directory and press RET to open it.
> 
> Emacs frame is closed. Not sure if this is known/expected behavior.

There's a more general problem here: any call to find-alternate-file
in the client frame will delete the frame:

  emacs -Q
  M-x server-start

>From the shell:

  emacsclient -c SOME-FILE

In the newly-created frame:

  C-x C-v SOME-OTHER-FILE RET

Boom! the frame is deleted.

The patch below should fix that by preventing the frame from being
deleted, but it still deletes the client, so emacsclient exits, and
the client frame no longer has a server.

Does anyone see a problem with the behavior after the patch below is
installed, i.e. with the fact that emacsclient exits?

diff --git a/lisp/files.el b/lisp/files.el
index 03675a3..001a195 100644
--- a/lisp/files.el
+++ b/lisp/files.el
@@ -1998,6 +1998,8 @@ kill-buffer-hook
 Note: Be careful with let-binding this hook considering it is
 frequently used for cleanup.")
 
+(defvar find-alternate-file-dont-kill-client nil
+  "If non-nil, `server-buffer-done' should not delete the client frame.")
 (defun find-alternate-file (filename &optional wildcards)
   "Find file FILENAME, select its buffer, kill previous buffer.
 If the current buffer now contains an empty file that you just visited
@@ -2044,7 +2046,8 @@ find-alternate-file
     ;; save a modified buffer visiting a file.  Rather, `kill-buffer'
     ;; asks that itself.  Thus, there's no need to temporarily do
     ;; `(set-buffer-modified-p nil)' before running this hook.
-    (run-hooks 'kill-buffer-hook)
+    (let ((find-alternate-file-dont-kill-client t))
+      (run-hooks 'kill-buffer-hook))
     ;; Okay, now we can end-of-life the old buffer.
     (if (get-buffer " **lose**")
        (kill-buffer " **lose**"))
diff --git a/lisp/server.el b/lisp/server.el
index ba7e02d..c678924 100644
--- a/lisp/server.el
+++ b/lisp/server.el
@@ -1590,7 +1590,8 @@ server-buffer-done
                ;; frames, which might change the current buffer.  We
                ;; don't want that (bug#640).
                (save-current-buffer
-                 (server-delete-client proc))
+                 (server-delete-client proc
+                                        find-alternate-file-dont-kill-client))
              (server-delete-client proc))))))
     (when (and (bufferp buffer) (buffer-name buffer))
       ;; We may or may not kill this buffer;





reply via email to

[Prev in Thread] Current Thread [Next in Thread]