From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Eli Zaretskii Newsgroups: gmane.emacs.bugs Subject: bug#65277: 29.1.50; emacsclient Dired: frame is closed/killed when opening another dir Date: Fri, 18 Aug 2023 10:42:05 +0300 Message-ID: <83cyzk4x0y.fsf@gnu.org> References: <87350mpkho.fsf@gmail.com> <83ttsy57g0.fsf@gnu.org> <831qg15w7b.fsf@gnu.org> Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="17954"; mail-complaints-to="usenet@ciao.gmane.io" Cc: 65277@debbugs.gnu.org To: brickviking@gmail.com Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Fri Aug 18 09:43:29 2023 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1qWu8n-0004Tv-0C for geb-bug-gnu-emacs@m.gmane-mx.org; Fri, 18 Aug 2023 09:43:29 +0200 Original-Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qWu8V-00037M-7K; Fri, 18 Aug 2023 03:43:11 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qWu8M-00036z-S7 for bug-gnu-emacs@gnu.org; Fri, 18 Aug 2023 03:43:05 -0400 Original-Received: from debbugs.gnu.org ([2001:470:142:5::43]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1qWu8M-0006iS-JY for bug-gnu-emacs@gnu.org; Fri, 18 Aug 2023 03:43:02 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1qWu8M-0002e7-HN for bug-gnu-emacs@gnu.org; Fri, 18 Aug 2023 03:43:02 -0400 X-Loop: help-debbugs@gnu.org Resent-From: Eli Zaretskii Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Fri, 18 Aug 2023 07:43:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 65277 X-GNU-PR-Package: emacs Original-Received: via spool by 65277-submit@debbugs.gnu.org id=B65277.169234453110110 (code B ref 65277); Fri, 18 Aug 2023 07:43:02 +0000 Original-Received: (at 65277) by debbugs.gnu.org; 18 Aug 2023 07:42:11 +0000 Original-Received: from localhost ([127.0.0.1]:46039 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1qWu7X-0002cz-6i for submit@debbugs.gnu.org; Fri, 18 Aug 2023 03:42:11 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:46226) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1qWu7R-0002cR-NF for 65277@debbugs.gnu.org; Fri, 18 Aug 2023 03:42:09 -0400 Original-Received: from fencepost.gnu.org ([2001:470:142:3::e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qWu7L-0006UV-Ny; Fri, 18 Aug 2023 03:41:59 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org; s=fencepost-gnu-org; h=References:Subject:In-Reply-To:To:From:Date: mime-version; bh=YlMvNst/h4wd8B+nqYRPMqJwUwZuW8Kzr5Bfie8bc3k=; b=SBgnFvcCMCYa nd7MSHQkK4P1exTp+ORzdt/s6qFTCge2LjUjB8dSl70qOqCXzq6L5bx9PBUroy/UPiGsuWJLjdpMJ fXZjyUyyjBSdhwZOjq60M4hmeNL0OOc/814mP9XcRYhd/9Rstk3XTdE60XxL2qUJMOxD0wFADVFO+ 8M735U/jMx1Ylgu5UFBweeOZW4foGHudv1qQwonQQb51WPYxgnoeAMSbXJOmP6sAM35SsIjCf89q2 DU+192X0vOSFvwIwDx9FXouLaoC24CoMvwbWN/IlFriNAI2Hbgfc201h1mQDbrkHoRPvtfiSC8m35 LDlhC52BQPBZiczk8aQufg==; In-Reply-To: <831qg15w7b.fsf@gnu.org> (message from Eli Zaretskii on Thu, 17 Aug 2023 22:02:16 +0300) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Original-Sender: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Xref: news.gmane.io gmane.emacs.bugs:267736 Archived-At: > Cc: 65277@debbugs.gnu.org > Date: Thu, 17 Aug 2023 22:02:16 +0300 > From: Eli Zaretskii > > > Cc: 65277@debbugs.gnu.org > > Date: Thu, 17 Aug 2023 12:44:47 +0300 > > From: Eli Zaretskii > > > > Thanks for testing. Could you please test the improved patch below? > > Sorry, that patch had a silly mistake. Please use the one below > instead: I have now tested the last patch I sent on a GNU/Linux system with using "emacsclient -t", and found another problem. The updated patch below should solve it, so p-lease try that when you have time. With the patch below, the result of "C-x C-v" in a client terminal/frame is that the frame stays around, and also emacsclient doesn't exit. However, the buffer that visits the alternate file is not considered a "client" buffer, so "C-x #" displays an error message saying there are no client buffers left and does nothing else, and "C-x k" doesn't delete the client frame. To delete the client frame and cause emacsclient to exit, you need to type either "C-x C-c" or "C-x 5 0". This might be a bit surprising, but OTOH the semantics of the client buffer after "C-x C-v" is not well defined: should the buffer visiting the alternate file have the same client property and share the same kill-buffer-hook? I could argue either way. Here's the patch to try. If there are no objections or bugs reported against it, I will install this on master in a week or so. diff --git a/lisp/files.el b/lisp/files.el index 68c0a10..3466a53 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.") (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 'dont-kill-client)) + (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..10f1559 100644 --- a/lisp/server.el +++ b/lisp/server.el @@ -330,6 +330,9 @@ server-with-environment (defun server-delete-client (proc &optional noframe) "Delete PROC, including its buffers, terminals and frames. If NOFRAME is non-nil, let the frames live. +If NOFRAME is the symbol \\='dont-kill-client, also don't +delete PROC or its terminals, just kill its buffers: this is +for when `find-alternate-file' calls this via `kill-buffer-hook'. Updates `server-clients'." (server-log (concat "server-delete-client" (if noframe " noframe")) proc) ;; Force a new lookup of client (prevents infinite recursion). @@ -366,23 +369,28 @@ server-delete-client (set-frame-parameter frame 'client nil) (delete-frame frame)))) - (setq server-clients (delq proc server-clients)) + (or (eq noframe 'dont-kill-client) + (setq server-clients (delq proc server-clients))) ;; Delete the client's tty, except on Windows (both GUI and ;; console), where there's only one terminal and does not make ;; sense to delete it, or if we are explicitly told not. (unless (or (eq system-type 'windows-nt) + ;; 'find-alternate-file' caused the last client + ;; buffer to be killed, but we will reuse the client + ;; for another buffer. + (eq noframe 'dont-kill-client) (process-get proc 'no-delete-terminal)) (let ((terminal (process-get proc 'terminal))) ;; Only delete the terminal if it is non-nil. (when (and terminal (eq (terminal-live-p terminal) t)) (delete-terminal terminal)))) - ;; Delete the client's process. - (if (eq (process-status proc) 'open) - (delete-process proc)) - - (server-log "Deleted" proc)))) + ;; Delete the client's process (or don't). + (unless (eq noframe 'dont-kill-client) + (if (eq (process-status proc) 'open) + (delete-process proc)) + (server-log "Deleted" proc))))) (defvar server-log-time-function #'current-time-string "Function to generate timestamps for `server-buffer'.") @@ -1590,7 +1598,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;