Hi,

Unless I've missed something, isn't this what 'synchronize-panes' does
already?

Thomas

On Mon, 10 Jul 2017 at 22:12 Rytis Karpuska <[email protected]>
wrote:

> Hey,
>
> I often need to do some work in a cluster of linux servers, therefore
> it would be very convenient if tmux could duplicate input to all panes
> of current window. This patch adds this functionality togglable with
> command. Hopefully it will be helpful for other people also :).
>
> Rytis.
>
> ---
>  Makefile.am                  |  1 +
>  cmd-toggle-duplicate-stdin.c | 50
> ++++++++++++++++++++++++++++++++++++++++++++
>  cmd.c                        |  3 +++
>  server-client.c              | 10 ++++++++-
>  tmux.1                       |  2 ++
>  tmux.h                       |  1 +
>  6 files changed, 66 insertions(+), 1 deletion(-)
>  create mode 100644 cmd-toggle-duplicate-stdin.c
>
> diff --git a/Makefile.am b/Makefile.am
> index bdc752c..bf5e02a 100644
> --- a/Makefile.am
> +++ b/Makefile.am
> @@ -124,6 +124,7 @@ dist_tmux_SOURCES = \
>         cmd-switch-client.c \
>         cmd-unbind-key.c \
>         cmd-wait-for.c \
> +       cmd-toggle-duplicate-stdin.c \
>         cmd.c \
>         colour.c \
>         compat.h \
> diff --git a/cmd-toggle-duplicate-stdin.c b/cmd-toggle-duplicate-stdin.c
> new file mode 100644
> index 0000000..e5fd402
> --- /dev/null
> +++ b/cmd-toggle-duplicate-stdin.c
> @@ -0,0 +1,50 @@
> +/* $OpenBSD$ */
> +
> +/*
> + * Copyright (c) 2017 Rytis Karpuska <[email protected]>
> + *
> + * Permission to use, copy, modify, and distribute this software for any
> + * purpose with or without fee is hereby granted, provided that the above
> + * copyright notice and this permission notice appear in all copies.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
> WARRANTIES
> + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
> + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
> + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
> + * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
> + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
> + * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
> + */
> +
> +#include <sys/types.h>
> +
> +#include "tmux.h"
> +
> +/*
> + * Toggle stdin duplication to all panes of current window.
> + */
> +
> +static enum cmd_retval cmd_toggle_duplicate_stdin_exec(struct cmd *,
> struct cmdq_item *);
> +
> +const struct cmd_entry cmd_toggle_duplicate_stdin_entry = {
> +       .name = "toggle-duplicate-stdin",
> +       .alias = NULL,
> +
> +       .args = { "", 0, 0},
> +       .usage = "",
> +
> +       .target = { 't', CMD_FIND_WINDOW, 0 },
> +
> +       .flags = 0,
> +       .exec = cmd_toggle_duplicate_stdin_exec
> +};
> +
> +static enum cmd_retval
> +cmd_toggle_duplicate_stdin_exec(struct cmd *self __unused, struct
> cmdq_item *item)
> +{
> +       struct window           *w = item->target.w;
> +       w->flags = w->flags ^ WINDOW_DUPLICATE_STDIN;
> +
> +       return (CMD_RETURN_NORMAL);
> +}
> +
> diff --git a/cmd.c b/cmd.c
> index 45f83c2..26a0636 100644
> --- a/cmd.c
> +++ b/cmd.c
> @@ -112,6 +112,8 @@ extern const struct cmd_entry cmd_unbind_key_entry;
>  extern const struct cmd_entry cmd_unlink_window_entry;
>  extern const struct cmd_entry cmd_up_pane_entry;
>  extern const struct cmd_entry cmd_wait_for_entry;
> +extern const struct cmd_entry cmd_toggle_duplicate_stdin_entry;
> +
>
>  const struct cmd_entry *cmd_table[] = {
>         &cmd_attach_session_entry,
> @@ -197,6 +199,7 @@ const struct cmd_entry *cmd_table[] = {
>         &cmd_unbind_key_entry,
>         &cmd_unlink_window_entry,
>         &cmd_wait_for_entry,
> +       &cmd_toggle_duplicate_stdin_entry,
>         NULL
>  };
>
> diff --git a/server-client.c b/server-client.c
> index 1fd6eb6..4fa9c34 100644
> --- a/server-client.c
> +++ b/server-client.c
> @@ -1000,8 +1000,16 @@ retry:
>  forward:
>         if (c->flags & CLIENT_READONLY)
>                 return;
> -       if (wp != NULL)
> +       if (w->flags & WINDOW_DUPLICATE_STDIN)
> +       {
> +               TAILQ_FOREACH(wp, &w->panes, entry) {
> +                       window_pane_key(wp, c, s, key, m);
> +               }
> +       }
> +       else if (wp != NULL)
> +       {
>                 window_pane_key(wp, c, s, key, m);
> +       }
>  }
>
>  /* Client functions that need to happen every loop. */
> diff --git a/tmux.1 b/tmux.1
> index da97dd7..c6c782c 100644
> --- a/tmux.1
> +++ b/tmux.1
> @@ -2076,6 +2076,8 @@ if
>  .Fl k
>  is specified and the window is linked to only one session, it is unlinked
> and
>  destroyed.
> +.It Ic toggle-duplicate-stdin
> +Toggle duplication of input to all panes of current window. Useful for
> interactively executing identical commands in several terminal sessions.
>  .El
>  .Sh KEY BINDINGS
>  .Nm
> diff --git a/tmux.h b/tmux.h
> index 7b79544..e5437bc 100644
> --- a/tmux.h
> +++ b/tmux.h
> @@ -857,6 +857,7 @@ struct window {
>  #define WINDOW_FORCEHEIGHT 0x4000
>  #define WINDOW_STYLECHANGED 0x8000
>  #define WINDOW_ALERTFLAGS (WINDOW_BELL|WINDOW_ACTIVITY|WINDOW_SILENCE)
> +#define WINDOW_DUPLICATE_STDIN 0x10000
>
>         int              alerts_queued;
>         TAILQ_ENTRY(window) alerts_entry;
> --
> 2.7.4
>
> --
> You received this message because you are subscribed to the Google Groups
> "tmux-users" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> To post to this group, send an email to [email protected].
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google Groups 
"tmux-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send an email to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to