From 2bcc2160c9f7f16c5e9cd815b8074de27f30896d Mon Sep 17 00:00:00 2001 From: Gregory Heytings Date: Fri, 5 Nov 2021 00:14:30 +0100 Subject: [PATCH] New emacsclient option to either create or reuse an existing frame. * doc/emacs/misc.texi (emacsclient Options): Document the new option. * doc/man/emacsclient.1: Mention the new option (bug#51374). * etc/NEWS: Mention the new option. * lib-src/emacsclient.c (reuse_frame): New variable. (longopts): New option. (decode_options): Decode the new option. (print_help_and_exit): Document the new option. (main): Use the new option. --- doc/emacs/misc.texi | 5 +++++ doc/man/emacsclient.1 | 3 +++ etc/NEWS | 8 ++++++++ lib-src/emacsclient.c | 13 ++++++++++++- 4 files changed, 28 insertions(+), 1 deletion(-) diff --git a/doc/emacs/misc.texi b/doc/emacs/misc.texi index f66b69cdd73..4be47990d1f 100644 --- a/doc/emacs/misc.texi +++ b/doc/emacs/misc.texi @@ -1992,6 +1992,11 @@ the new frame displays the @file{*scratch*} buffer by default. You can customize this behavior with the variable @code{initial-buffer-choice} (@pxref{Entering Emacs}). +@item -r +@itemx --reuse-frame +Create a new graphical @dfn{client frame} if none exists, otherwise +use an existing Emacs frame. + @item -F @var{alist} @itemx --frame-parameters=@var{alist} Set the parameters for a newly-created graphical frame diff --git a/doc/man/emacsclient.1 b/doc/man/emacsclient.1 index ba64efa282c..cc58f106e69 100644 --- a/doc/man/emacsclient.1 +++ b/doc/man/emacsclient.1 @@ -69,6 +69,9 @@ start Emacs in daemon mode, and try to connect to it. .B -c, \-\-create-frame Create a new frame instead of trying to use the current Emacs frame. .TP +.B -r \-\-reuse-frame +Reuse an existing frame if one exists, otherwise create a new frame. +.TP .B \-F, \-\-frame-parameters=ALIST Set the parameters of a newly-created frame. .TP diff --git a/etc/NEWS b/etc/NEWS index 1b3f4c0524f..899f3567e6e 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -102,6 +102,14 @@ highlights segments of buffer text whose reordering for display is suspicious and could be malicious. + +** Emacs server and client changes + ++++ +*** New command-line option '-r' for emacsclient. +With this command-line option, Emacs reuses an existing graphical client +frame if one exists; otherwise a new frame is created. + * Editing Changes in Emacs 29.1 --- diff --git a/lib-src/emacsclient.c b/lib-src/emacsclient.c index cff3cec2a79..0e800dd7e89 100644 --- a/lib-src/emacsclient.c +++ b/lib-src/emacsclient.c @@ -116,6 +116,9 @@ static bool eval; /* True means open a new frame. --create-frame etc. */ static bool create_frame; +/* True means reuse a frame if it already exists. */ +static bool reuse_frame; + /* The display on which Emacs should work. --display. */ static char const *display; @@ -165,6 +168,7 @@ static struct option const longopts[] = { "tty", no_argument, NULL, 't' }, { "nw", no_argument, NULL, 't' }, { "create-frame", no_argument, NULL, 'c' }, + { "reuse-frame", no_argument, NULL, 'r' }, { "alternate-editor", required_argument, NULL, 'a' }, { "frame-parameters", required_argument, NULL, 'F' }, #ifdef SOCKETS_IN_FILE_SYSTEM @@ -551,6 +555,11 @@ decode_options (int argc, char **argv) create_frame = true; break; + case 'r': + create_frame = true; + reuse_frame = true; + break; + case 'p': parent_id = optarg; create_frame = true; @@ -647,6 +656,8 @@ The following OPTIONS are accepted:\n\ -nw, -t, --tty Open a new Emacs frame on the current terminal\n\ -c, --create-frame Create a new frame instead of trying to\n\ use the current Emacs frame\n\ +-r, --reuse-frame Create a new frame if none exists, otherwise\n\ + use the current Emacs frame\n\ ", "\ -F ALIST, --frame-parameters=ALIST\n\ Set the parameters of a new frame\n\ @@ -1941,7 +1952,7 @@ main (int argc, char **argv) if (nowait) send_to_emacs (emacs_socket, "-nowait "); - if (!create_frame) + if (!create_frame || reuse_frame) send_to_emacs (emacs_socket, "-current-frame "); if (display) -- 2.39.2