Just a quick poke has add-hook support been merged into git master?

--Phil

On 21 November 2012 18:01, Nicholas Marriott
<nicholas.marri...@gmail.com> wrote:
> Hi
>
> This seems a reasonable idea to me but I think it should go in cmd_ctx -
> it is context for THIS invocation of the command, not for all
> invocations. I'd just add it as members in there personally.
>
> Also I'd maybe call the function prepare() or parse() not context()?
>
> Also of course exec() can assume that the function has already been
> called.
>
> Cheers
>
>
> On Mon, Nov 19, 2012 at 01:45:06PM +0000, Thomas Adam wrote:
>> On Mon, Nov 19, 2012 at 10:32:00AM +0000, Nicholas Marriott wrote:
>> > Hi
>> >
>> > Not sure I follow, can you show me your code?
>>
>> See "hook-context.diff" attached.  Please ignore any whitespace errors, as
>> well as any logging since I'm still in the throws of messing with things.
>>
>> You should look (in that diff) at the changes to:
>>
>> tmux.h
>> cmd.c
>> cmd-new-window.c
>> cmd-split-window.c
>>
>> The changes to cmd-{new,split}-window.c just show the intent of what setting
>> a context may mean.
>>
>> > I think check() was meant for parse time so that eg bind-key could
>> > reject stuff when a key was bound rather when it was pressed, but since
>> > it is hardly used I'm fine with removing it. Note that bind/unbind use
>> > it as well as new-session.
>>
>> It just means that if we went with this idea of having a context to bind
>> to, that we can just reuse the original check() field in the struct, without
>> having to define a new one.
>>
>> So before I go ahead and clean check() up, I'll wait for a decision on this
>> first.
>>
>> I am still thinking that augmenting struct cmd_ctx might be a little easier
>> rather than having a separate struct for this.
>>
>> Hope it's clear enough.
>>
>> Kindly,
>>
>> -- Thomas Adam
>
>> diff --git a/autogen.sh b/autogen.sh
>> index a3cc937..7d39f07 100755
>> --- a/autogen.sh
>> +++ b/autogen.sh
>> @@ -1,8 +1,8 @@
>>  #!/bin/sh
>>  # $Id$
>>
>> -[ -z "$AUTOMAKE_VERSION" ] && export AUTOMAKE_VERSION=1.10
>> -[ -z "$AUTOCONF_VERSION" ] && export AUTOCONF_VERSION=2.65
>> +#[ -z "$AUTOMAKE_VERSION" ] && export AUTOMAKE_VERSION=1.10
>> +#[ -z "$AUTOCONF_VERSION" ] && export AUTOCONF_VERSION=2.65
>>
>>  die()
>>  {
>> diff --git a/cmd-attach-session.c b/cmd-attach-session.c
>> index 18a2024..b4e64cb 100644
>> --- a/cmd-attach-session.c
>> +++ b/cmd-attach-session.c
>> @@ -35,7 +35,8 @@
>>       CMD_CANTNEST|CMD_STARTSERVER|CMD_SENDENVIRON,
>>       NULL,
>>       NULL,
>> -     cmd_attach_session_exec
>> +     cmd_attach_session_exec,
>> +              NULL
>>  };
>>
>>  enum cmd_retval
>> diff --git a/cmd-bind-key.c b/cmd-bind-key.c
>> index 28e94e2..55042d6 100644
>> --- a/cmd-bind-key.c
>> +++ b/cmd-bind-key.c
>> @@ -39,7 +39,8 @@
>>       0,
>>       NULL,
>>       cmd_bind_key_check,
>> -     cmd_bind_key_exec
>> +     cmd_bind_key_exec,
>> +              NULL
>>  };
>>
>>  enum cmd_retval
>> diff --git a/cmd-break-pane.c b/cmd-break-pane.c
>> index 637105a..9377e03 100644
>> --- a/cmd-break-pane.c
>> +++ b/cmd-break-pane.c
>> @@ -35,7 +35,8 @@
>>       0,
>>       NULL,
>>       NULL,
>> -     cmd_break_pane_exec
>> +     cmd_break_pane_exec,
>> +              NULL
>>  };
>>
>>  enum cmd_retval
>> diff --git a/cmd-capture-pane.c b/cmd-capture-pane.c
>> index a94c717..6f4e642 100644
>> --- a/cmd-capture-pane.c
>> +++ b/cmd-capture-pane.c
>> @@ -36,7 +36,8 @@
>>       0,
>>       NULL,
>>       NULL,
>> -     cmd_capture_pane_exec
>> +     cmd_capture_pane_exec,
>> +              NULL
>>  };
>>
>>  enum cmd_retval
>> diff --git a/cmd-choose-buffer.c b/cmd-choose-buffer.c
>> index 50505ea..e071c78 100644
>> --- a/cmd-choose-buffer.c
>> +++ b/cmd-choose-buffer.c
>> @@ -39,7 +39,8 @@
>>       0,
>>       NULL,
>>       NULL,
>> -     cmd_choose_buffer_exec
>> +     cmd_choose_buffer_exec,
>> +              NULL
>>  };
>>
>>  enum cmd_retval
>> diff --git a/cmd-choose-client.c b/cmd-choose-client.c
>> index 7c3b926..a15eda9 100644
>> --- a/cmd-choose-client.c
>> +++ b/cmd-choose-client.c
>> @@ -39,7 +39,8 @@
>>       0,
>>       NULL,
>>       NULL,
>> -     cmd_choose_client_exec
>> +     cmd_choose_client_exec,
>> +              NULL
>>  };
>>
>>  struct cmd_choose_client_data {
>> diff --git a/cmd-choose-list.c b/cmd-choose-list.c
>> index 4c32e69..6cc2e4c 100644
>> --- a/cmd-choose-list.c
>> +++ b/cmd-choose-list.c
>> @@ -43,7 +43,8 @@
>>       0,
>>       NULL,
>>       NULL,
>> -     cmd_choose_list_exec
>> +     cmd_choose_list_exec,
>> +              NULL
>>  };
>>
>>  enum cmd_retval
>> diff --git a/cmd-choose-tree.c b/cmd-choose-tree.c
>> index e8da7a4..5b25da8 100644
>> --- a/cmd-choose-tree.c
>> +++ b/cmd-choose-tree.c
>> @@ -45,7 +45,8 @@
>>       0,
>>       NULL,
>>       NULL,
>> -     cmd_choose_tree_exec
>> +     cmd_choose_tree_exec,
>> +              NULL
>>  };
>>
>>  const struct cmd_entry cmd_choose_session_entry = {
>> @@ -55,7 +56,8 @@
>>       0,
>>       NULL,
>>       NULL,
>> -     cmd_choose_tree_exec
>> +     cmd_choose_tree_exec,
>> +              NULL
>>  };
>>
>>  const struct cmd_entry cmd_choose_window_entry = {
>> @@ -65,7 +67,8 @@
>>       0,
>>       NULL,
>>       NULL,
>> -     cmd_choose_tree_exec
>> +     cmd_choose_tree_exec,
>> +              NULL
>>  };
>>
>>  enum cmd_retval
>> diff --git a/cmd-clear-history.c b/cmd-clear-history.c
>> index 27f73db..9f06b73 100644
>> --- a/cmd-clear-history.c
>> +++ b/cmd-clear-history.c
>> @@ -33,7 +33,8 @@
>>       0,
>>       NULL,
>>       NULL,
>> -     cmd_clear_history_exec
>> +     cmd_clear_history_exec,
>> +              NULL
>>  };
>>
>>  enum cmd_retval
>> diff --git a/cmd-clock-mode.c b/cmd-clock-mode.c
>> index 139e715..c9e2091 100644
>> --- a/cmd-clock-mode.c
>> +++ b/cmd-clock-mode.c
>> @@ -33,7 +33,8 @@
>>       0,
>>       NULL,
>>       NULL,
>> -     cmd_clock_mode_exec
>> +     cmd_clock_mode_exec,
>> +              NULL
>>  };
>>
>>  enum cmd_retval
>> diff --git a/cmd-command-prompt.c b/cmd-command-prompt.c
>> index ea38035..3352f64 100644
>> --- a/cmd-command-prompt.c
>> +++ b/cmd-command-prompt.c
>> @@ -43,7 +43,8 @@
>>       0,
>>       cmd_command_prompt_key_binding,
>>       NULL,
>> -     cmd_command_prompt_exec
>> +     cmd_command_prompt_exec,
>> +              NULL
>>  };
>>
>>  struct cmd_command_prompt_cdata {
>> diff --git a/cmd-confirm-before.c b/cmd-confirm-before.c
>> index 329027c..146b1c0 100644
>> --- a/cmd-confirm-before.c
>> +++ b/cmd-confirm-before.c
>> @@ -39,7 +39,8 @@
>>       0,
>>       cmd_confirm_before_key_binding,
>>       NULL,
>> -     cmd_confirm_before_exec
>> +     cmd_confirm_before_exec,
>> +              NULL
>>  };
>>
>>  struct cmd_confirm_before_data {
>> diff --git a/cmd-copy-mode.c b/cmd-copy-mode.c
>> index 8a5b5fc..470d678 100644
>> --- a/cmd-copy-mode.c
>> +++ b/cmd-copy-mode.c
>> @@ -34,7 +34,8 @@
>>       0,
>>       cmd_copy_mode_key_binding,
>>       NULL,
>> -     cmd_copy_mode_exec
>> +     cmd_copy_mode_exec,
>> +              NULL
>>  };
>>
>>  void
>> diff --git a/cmd-delete-buffer.c b/cmd-delete-buffer.c
>> index f9d2587..4ebcde9 100644
>> --- a/cmd-delete-buffer.c
>> +++ b/cmd-delete-buffer.c
>> @@ -35,7 +35,8 @@
>>       0,
>>       NULL,
>>       NULL,
>> -     cmd_delete_buffer_exec
>> +     cmd_delete_buffer_exec,
>> +              NULL
>>  };
>>
>>  enum cmd_retval
>> diff --git a/cmd-detach-client.c b/cmd-detach-client.c
>> index f75b37a..fe3bc67 100644
>> --- a/cmd-detach-client.c
>> +++ b/cmd-detach-client.c
>> @@ -33,7 +33,8 @@
>>       CMD_READONLY,
>>       NULL,
>>       NULL,
>> -     cmd_detach_client_exec
>> +     cmd_detach_client_exec,
>> +              NULL
>>  };
>>
>>  enum cmd_retval
>> diff --git a/cmd-display-message.c b/cmd-display-message.c
>> index e31c110..56a7990 100644
>> --- a/cmd-display-message.c
>> +++ b/cmd-display-message.c
>> @@ -36,7 +36,8 @@
>>       0,
>>       NULL,
>>       NULL,
>> -     cmd_display_message_exec
>> +     cmd_display_message_exec,
>> +              NULL
>>  };
>>
>>  enum cmd_retval
>> diff --git a/cmd-display-panes.c b/cmd-display-panes.c
>> index 2745ac5..beab873 100644
>> --- a/cmd-display-panes.c
>> +++ b/cmd-display-panes.c
>> @@ -33,7 +33,8 @@
>>       0,
>>       NULL,
>>       NULL,
>> -     cmd_display_panes_exec
>> +     cmd_display_panes_exec,
>> +              NULL
>>  };
>>
>>  enum cmd_retval
>> diff --git a/cmd-find-window.c b/cmd-find-window.c
>> index 9a0a8a4..509f9da 100644
>> --- a/cmd-find-window.c
>> +++ b/cmd-find-window.c
>> @@ -50,7 +50,8 @@
>>       0,
>>       NULL,
>>       NULL,
>> -     cmd_find_window_exec
>> +     cmd_find_window_exec,
>> +              NULL
>>  };
>>
>>  struct cmd_find_window_data {
>> diff --git a/cmd-has-session.c b/cmd-has-session.c
>> index 9f19c4d..651c2c1 100644
>> --- a/cmd-has-session.c
>> +++ b/cmd-has-session.c
>> @@ -33,7 +33,8 @@
>>       0,
>>       NULL,
>>       NULL,
>> -     cmd_has_session_exec
>> +     cmd_has_session_exec,
>> +              NULL
>>  };
>>
>>  enum cmd_retval
>> diff --git a/cmd-if-shell.c b/cmd-if-shell.c
>> index 636cf80..20998b3 100644
>> --- a/cmd-if-shell.c
>> +++ b/cmd-if-shell.c
>> @@ -41,7 +41,8 @@
>>       0,
>>       NULL,
>>       NULL,
>> -     cmd_if_shell_exec
>> +     cmd_if_shell_exec,
>> +              NULL
>>  };
>>
>>  struct cmd_if_shell_data {
>> diff --git a/cmd-join-pane.c b/cmd-join-pane.c
>> index a2e7a2d..c9d93d2 100644
>> --- a/cmd-join-pane.c
>> +++ b/cmd-join-pane.c
>> @@ -40,7 +40,8 @@
>>       0,
>>       cmd_join_pane_key_binding,
>>       NULL,
>> -     cmd_join_pane_exec
>> +     cmd_join_pane_exec,
>> +              NULL
>>  };
>>
>>  const struct cmd_entry cmd_move_pane_entry = {
>> @@ -50,7 +51,8 @@
>>       0,
>>       NULL,
>>       NULL,
>> -     cmd_join_pane_exec
>> +     cmd_join_pane_exec,
>> +              NULL
>>  };
>>
>>  void
>> diff --git a/cmd-kill-pane.c b/cmd-kill-pane.c
>> index 4f7af2e..86179e7 100644
>> --- a/cmd-kill-pane.c
>> +++ b/cmd-kill-pane.c
>> @@ -35,7 +35,8 @@
>>       0,
>>       NULL,
>>       NULL,
>> -     cmd_kill_pane_exec
>> +     cmd_kill_pane_exec,
>> +              NULL
>>  };
>>
>>  enum cmd_retval
>> diff --git a/cmd-kill-server.c b/cmd-kill-server.c
>> index 6eb39c4..79bab23 100644
>> --- a/cmd-kill-server.c
>> +++ b/cmd-kill-server.c
>> @@ -36,7 +36,8 @@
>>       0,
>>       NULL,
>>       NULL,
>> -     cmd_kill_server_exec
>> +     cmd_kill_server_exec,
>> +              NULL
>>  };
>>
>>  /* ARGSUSED */
>> diff --git a/cmd-kill-session.c b/cmd-kill-session.c
>> index 145f77e..1a280b3 100644
>> --- a/cmd-kill-session.c
>> +++ b/cmd-kill-session.c
>> @@ -36,7 +36,8 @@
>>       0,
>>       NULL,
>>       NULL,
>> -     cmd_kill_session_exec
>> +     cmd_kill_session_exec,
>> +              NULL
>>  };
>>
>>  enum cmd_retval
>> diff --git a/cmd-kill-window.c b/cmd-kill-window.c
>> index 88f8dd5..72cf6a4 100644
>> --- a/cmd-kill-window.c
>> +++ b/cmd-kill-window.c
>> @@ -33,7 +33,8 @@
>>       0,
>>       NULL,
>>       NULL,
>> -     cmd_kill_window_exec
>> +     cmd_kill_window_exec,
>> +              NULL
>>  };
>>
>>  enum cmd_retval
>> diff --git a/cmd-link-window.c b/cmd-link-window.c
>> index 0e9c55e..611c510 100644
>> --- a/cmd-link-window.c
>> +++ b/cmd-link-window.c
>> @@ -35,7 +35,8 @@
>>       0,
>>       NULL,
>>       NULL,
>> -     cmd_link_window_exec
>> +     cmd_link_window_exec,
>> +              NULL
>>  };
>>
>>  enum cmd_retval
>> diff --git a/cmd-list-buffers.c b/cmd-list-buffers.c
>> index f0d1787..b787249 100644
>> --- a/cmd-list-buffers.c
>> +++ b/cmd-list-buffers.c
>> @@ -36,7 +36,8 @@
>>       0,
>>       NULL,
>>       NULL,
>> -     cmd_list_buffers_exec
>> +     cmd_list_buffers_exec,
>> +              NULL
>>  };
>>
>>  /* ARGSUSED */
>> diff --git a/cmd-list-clients.c b/cmd-list-clients.c
>> index 19976cf..45b8fe0 100644
>> --- a/cmd-list-clients.c
>> +++ b/cmd-list-clients.c
>> @@ -37,7 +37,8 @@
>>       CMD_READONLY,
>>       NULL,
>>       NULL,
>> -     cmd_list_clients_exec
>> +     cmd_list_clients_exec,
>> +              NULL
>>  };
>>
>>  /* ARGSUSED */
>> diff --git a/cmd-list-commands.c b/cmd-list-commands.c
>> index 68e0e80..62c4fcb 100644
>> --- a/cmd-list-commands.c
>> +++ b/cmd-list-commands.c
>> @@ -33,7 +33,8 @@
>>       0,
>>       NULL,
>>       NULL,
>> -     cmd_list_commands_exec
>> +     cmd_list_commands_exec,
>> +              NULL
>>  };
>>
>>  /* ARGSUSED */
>> diff --git a/cmd-list-keys.c b/cmd-list-keys.c
>> index 51eeb67..6ee5224 100644
>> --- a/cmd-list-keys.c
>> +++ b/cmd-list-keys.c
>> @@ -36,7 +36,8 @@
>>       0,
>>       NULL,
>>       NULL,
>> -     cmd_list_keys_exec
>> +     cmd_list_keys_exec,
>> +              NULL
>>  };
>>
>>  enum cmd_retval
>> diff --git a/cmd-list-panes.c b/cmd-list-panes.c
>> index 0934645..4002124 100644
>> --- a/cmd-list-panes.c
>> +++ b/cmd-list-panes.c
>> @@ -42,7 +42,8 @@ void        cmd_list_panes_window(struct cmd *,
>>       0,
>>       NULL,
>>       NULL,
>> -     cmd_list_panes_exec
>> +     cmd_list_panes_exec,
>> +              NULL
>>  };
>>
>>  enum cmd_retval
>> diff --git a/cmd-list-sessions.c b/cmd-list-sessions.c
>> index e8db83e..76b4077 100644
>> --- a/cmd-list-sessions.c
>> +++ b/cmd-list-sessions.c
>> @@ -37,7 +37,8 @@
>>       0,
>>       NULL,
>>       NULL,
>> -     cmd_list_sessions_exec
>> +     cmd_list_sessions_exec,
>> +              NULL
>>  };
>>
>>  enum cmd_retval
>> diff --git a/cmd-list-windows.c b/cmd-list-windows.c
>> index b36b5ee..76e37ba 100644
>> --- a/cmd-list-windows.c
>> +++ b/cmd-list-windows.c
>> @@ -40,7 +40,8 @@ void        cmd_list_windows_session(
>>       0,
>>       NULL,
>>       NULL,
>> -     cmd_list_windows_exec
>> +     cmd_list_windows_exec,
>> +              NULL
>>  };
>>
>>  enum cmd_retval
>> diff --git a/cmd-load-buffer.c b/cmd-load-buffer.c
>> index aaf23d9..bf50833 100644
>> --- a/cmd-load-buffer.c
>> +++ b/cmd-load-buffer.c
>> @@ -40,7 +40,8 @@
>>       0,
>>       NULL,
>>       NULL,
>> -     cmd_load_buffer_exec
>> +     cmd_load_buffer_exec,
>> +              NULL
>>  };
>>
>>  enum cmd_retval
>> diff --git a/cmd-lock-server.c b/cmd-lock-server.c
>> index 9d65027..75c625d 100644
>> --- a/cmd-lock-server.c
>> +++ b/cmd-lock-server.c
>> @@ -37,7 +37,8 @@
>>       0,
>>       NULL,
>>       NULL,
>> -     cmd_lock_server_exec
>> +     cmd_lock_server_exec,
>> +              NULL
>>  };
>>
>>  const struct cmd_entry cmd_lock_session_entry = {
>> @@ -47,7 +48,8 @@
>>       0,
>>       NULL,
>>       NULL,
>> -     cmd_lock_server_exec
>> +     cmd_lock_server_exec,
>> +              NULL
>>  };
>>
>>  const struct cmd_entry cmd_lock_client_entry = {
>> @@ -57,7 +59,8 @@
>>       0,
>>       NULL,
>>       NULL,
>> -     cmd_lock_server_exec
>> +     cmd_lock_server_exec,
>> +              NULL
>>  };
>>
>>  /* ARGSUSED */
>> diff --git a/cmd-move-window.c b/cmd-move-window.c
>> index 8bd9ffe..5a0daa7 100644
>> --- a/cmd-move-window.c
>> +++ b/cmd-move-window.c
>> @@ -35,7 +35,8 @@
>>       0,
>>       NULL,
>>       NULL,
>> -     cmd_move_window_exec
>> +     cmd_move_window_exec,
>> +              NULL
>>  };
>>
>>  enum cmd_retval
>> diff --git a/cmd-new-session.c b/cmd-new-session.c
>> index 8477d9b..cf9f2df 100644
>> --- a/cmd-new-session.c
>> +++ b/cmd-new-session.c
>> @@ -41,7 +41,8 @@
>>       CMD_STARTSERVER|CMD_CANTNEST|CMD_SENDENVIRON,
>>       NULL,
>>       cmd_new_session_check,
>> -     cmd_new_session_exec
>> +     cmd_new_session_exec,
>> +              NULL
>>  };
>>
>>  enum cmd_retval
>> diff --git a/cmd-new-window.c b/cmd-new-window.c
>> index f8a7612..780238d 100644
>> --- a/cmd-new-window.c
>> +++ b/cmd-new-window.c
>> @@ -27,6 +27,7 @@
>>   */
>>
>>  enum cmd_retval      cmd_new_window_exec(struct cmd *, struct cmd_ctx *);
>> +void cmd_new_window_context(struct cmd *, struct cmd_ctx *);
>>
>>  const struct cmd_entry cmd_new_window_entry = {
>>       "new-window", "neww",
>> @@ -36,9 +37,29 @@
>>       0,
>>       NULL,
>>       NULL,
>> -     cmd_new_window_exec
>> +     cmd_new_window_exec,
>> +     cmd_new_window_context
>>  };
>>
>> +void
>> +cmd_new_window_context(struct cmd *self, struct cmd_ctx *ctx)
>> +{
>> +     struct args     *args = self->args;
>> +     struct session  *s;
>> +     struct winlink  *wl;
>> +     int              idx;
>> +
>> +     if (args_has(args, 'a')) {
>> +             wl = cmd_find_window(ctx, args_get(args, 't'), &s);
>> +
>> +             self->context->ctx_session = s;
>> +             self->context->ctx_wl = wl;
>> +     } else {
>> +             cmd_find_index(ctx, args_get(args, 't'), &s);
>> +             self->context->ctx_session = s;
>> +     }
>> +}
>> +
>>  enum cmd_retval
>>  cmd_new_window_exec(struct cmd *self, struct cmd_ctx *ctx)
>>  {
>> diff --git a/cmd-paste-buffer.c b/cmd-paste-buffer.c
>> index ff92783..b93b409 100644
>> --- a/cmd-paste-buffer.c
>> +++ b/cmd-paste-buffer.c
>> @@ -39,7 +39,8 @@ void        cmd_paste_buffer_filter(struct window_pane *,
>>       0,
>>       NULL,
>>       NULL,
>> -     cmd_paste_buffer_exec
>> +     cmd_paste_buffer_exec,
>> +              NULL
>>  };
>>
>>  enum cmd_retval
>> diff --git a/cmd-pipe-pane.c b/cmd-pipe-pane.c
>> index d2d8500..65c13a6 100644
>> --- a/cmd-pipe-pane.c
>> +++ b/cmd-pipe-pane.c
>> @@ -42,7 +42,8 @@
>>       0,
>>       NULL,
>>       NULL,
>> -     cmd_pipe_pane_exec
>> +     cmd_pipe_pane_exec,
>> +              NULL
>>  };
>>
>>  enum cmd_retval
>> diff --git a/cmd-refresh-client.c b/cmd-refresh-client.c
>> index 5251812..6cae57d 100644
>> --- a/cmd-refresh-client.c
>> +++ b/cmd-refresh-client.c
>> @@ -33,7 +33,8 @@
>>       0,
>>       NULL,
>>       NULL,
>> -     cmd_refresh_client_exec
>> +     cmd_refresh_client_exec,
>> +              NULL
>>  };
>>
>>  enum cmd_retval
>> diff --git a/cmd-rename-session.c b/cmd-rename-session.c
>> index 74443bc..c4bca9b 100644
>> --- a/cmd-rename-session.c
>> +++ b/cmd-rename-session.c
>> @@ -35,7 +35,8 @@
>>       0,
>>       NULL,
>>       NULL,
>> -     cmd_rename_session_exec
>> +     cmd_rename_session_exec,
>> +              NULL
>>  };
>>
>>  enum cmd_retval
>> diff --git a/cmd-rename-window.c b/cmd-rename-window.c
>> index e42dd52..a001aaa 100644
>> --- a/cmd-rename-window.c
>> +++ b/cmd-rename-window.c
>> @@ -35,7 +35,8 @@
>>       0,
>>       NULL,
>>       NULL,
>> -     cmd_rename_window_exec
>> +     cmd_rename_window_exec,
>> +              NULL
>>  };
>>
>>  enum cmd_retval
>> diff --git a/cmd-resize-pane.c b/cmd-resize-pane.c
>> index 19ff0e9..dd3a00b 100644
>> --- a/cmd-resize-pane.c
>> +++ b/cmd-resize-pane.c
>> @@ -36,7 +36,8 @@
>>       0,
>>       cmd_resize_pane_key_binding,
>>       NULL,
>> -     cmd_resize_pane_exec
>> +     cmd_resize_pane_exec,
>> +              NULL
>>  };
>>
>>  void
>> diff --git a/cmd-respawn-pane.c b/cmd-respawn-pane.c
>> index cf3d930..42e95cf 100644
>> --- a/cmd-respawn-pane.c
>> +++ b/cmd-respawn-pane.c
>> @@ -37,7 +37,8 @@
>>       0,
>>       NULL,
>>       NULL,
>> -     cmd_respawn_pane_exec
>> +     cmd_respawn_pane_exec,
>> +              NULL
>>  };
>>
>>  enum cmd_retval
>> diff --git a/cmd-respawn-window.c b/cmd-respawn-window.c
>> index 46d6b0d..482ba46 100644
>> --- a/cmd-respawn-window.c
>> +++ b/cmd-respawn-window.c
>> @@ -36,7 +36,8 @@
>>       0,
>>       NULL,
>>       NULL,
>> -     cmd_respawn_window_exec
>> +     cmd_respawn_window_exec,
>> +              NULL
>>  };
>>
>>  enum cmd_retval
>> diff --git a/cmd-rotate-window.c b/cmd-rotate-window.c
>> index 74f4c06..a963405 100644
>> --- a/cmd-rotate-window.c
>> +++ b/cmd-rotate-window.c
>> @@ -34,7 +34,8 @@
>>       0,
>>       cmd_rotate_window_key_binding,
>>       NULL,
>> -     cmd_rotate_window_exec
>> +     cmd_rotate_window_exec,
>> +              NULL
>>  };
>>
>>  void
>> diff --git a/cmd-run-shell.c b/cmd-run-shell.c
>> index 130a541..cd29f4b 100644
>> --- a/cmd-run-shell.c
>> +++ b/cmd-run-shell.c
>> @@ -40,7 +40,8 @@
>>       0,
>>       NULL,
>>       NULL,
>> -     cmd_run_shell_exec
>> +     cmd_run_shell_exec,
>> +              NULL
>>  };
>>
>>  struct cmd_run_shell_data {
>> diff --git a/cmd-save-buffer.c b/cmd-save-buffer.c
>> index 638c574..2c07997 100644
>> --- a/cmd-save-buffer.c
>> +++ b/cmd-save-buffer.c
>> @@ -38,7 +38,8 @@
>>       0,
>>       NULL,
>>       NULL,
>> -     cmd_save_buffer_exec
>> +     cmd_save_buffer_exec,
>> +              NULL
>>  };
>>
>>  enum cmd_retval
>> diff --git a/cmd-select-layout.c b/cmd-select-layout.c
>> index 5b234ab..bfbfe44 100644
>> --- a/cmd-select-layout.c
>> +++ b/cmd-select-layout.c
>> @@ -34,7 +34,8 @@
>>       0,
>>       cmd_select_layout_key_binding,
>>       NULL,
>> -     cmd_select_layout_exec
>> +     cmd_select_layout_exec,
>> +              NULL
>>  };
>>
>>  const struct cmd_entry cmd_next_layout_entry = {
>> @@ -44,7 +45,8 @@
>>       0,
>>       NULL,
>>       NULL,
>> -     cmd_select_layout_exec
>> +     cmd_select_layout_exec,
>> +              NULL
>>  };
>>
>>  const struct cmd_entry cmd_previous_layout_entry = {
>> @@ -54,7 +56,8 @@
>>       0,
>>       NULL,
>>       NULL,
>> -     cmd_select_layout_exec
>> +     cmd_select_layout_exec,
>> +              NULL
>>  };
>>
>>  void
>> diff --git a/cmd-select-pane.c b/cmd-select-pane.c
>> index 8ebae5f..42e91b6 100644
>> --- a/cmd-select-pane.c
>> +++ b/cmd-select-pane.c
>> @@ -34,7 +34,8 @@
>>       0,
>>       cmd_select_pane_key_binding,
>>       NULL,
>> -     cmd_select_pane_exec
>> +     cmd_select_pane_exec,
>> +              NULL
>>  };
>>
>>  const struct cmd_entry cmd_last_pane_entry = {
>> @@ -44,7 +45,8 @@
>>       0,
>>       NULL,
>>       NULL,
>> -     cmd_select_pane_exec
>> +     cmd_select_pane_exec,
>> +              NULL
>>  };
>>
>>  void
>> diff --git a/cmd-select-window.c b/cmd-select-window.c
>> index 5d87e59..8f601b2 100644
>> --- a/cmd-select-window.c
>> +++ b/cmd-select-window.c
>> @@ -36,7 +36,8 @@
>>       0,
>>       cmd_select_window_key_binding,
>>       NULL,
>> -     cmd_select_window_exec
>> +     cmd_select_window_exec,
>> +              NULL
>>  };
>>
>>  const struct cmd_entry cmd_next_window_entry = {
>> @@ -46,7 +47,8 @@
>>       0,
>>       cmd_select_window_key_binding,
>>       NULL,
>> -     cmd_select_window_exec
>> +     cmd_select_window_exec,
>> +              NULL
>>  };
>>
>>  const struct cmd_entry cmd_previous_window_entry = {
>> @@ -56,7 +58,8 @@
>>       0,
>>       cmd_select_window_key_binding,
>>       NULL,
>> -     cmd_select_window_exec
>> +     cmd_select_window_exec,
>> +              NULL
>>  };
>>
>>  const struct cmd_entry cmd_last_window_entry = {
>> @@ -66,7 +69,8 @@
>>       0,
>>       NULL,
>>       NULL,
>> -     cmd_select_window_exec
>> +     cmd_select_window_exec,
>> +              NULL
>>  };
>>
>>  void
>> diff --git a/cmd-send-keys.c b/cmd-send-keys.c
>> index ec1007b..1335080 100644
>> --- a/cmd-send-keys.c
>> +++ b/cmd-send-keys.c
>> @@ -36,7 +36,8 @@
>>       0,
>>       NULL,
>>       NULL,
>> -     cmd_send_keys_exec
>> +     cmd_send_keys_exec,
>> +              NULL
>>  };
>>
>>  enum cmd_retval
>> diff --git a/cmd-send-prefix.c b/cmd-send-prefix.c
>> index 5dded95..0d19922 100644
>> --- a/cmd-send-prefix.c
>> +++ b/cmd-send-prefix.c
>> @@ -33,7 +33,8 @@
>>       0,
>>       NULL,
>>       NULL,
>> -     cmd_send_prefix_exec
>> +     cmd_send_prefix_exec,
>> +              NULL
>>  };
>>
>>  enum cmd_retval
>> diff --git a/cmd-server-info.c b/cmd-server-info.c
>> index e2e3364..9950a0f 100644
>> --- a/cmd-server-info.c
>> +++ b/cmd-server-info.c
>> @@ -39,7 +39,8 @@
>>       0,
>>       NULL,
>>       NULL,
>> -     cmd_server_info_exec
>> +     cmd_server_info_exec,
>> +              NULL
>>  };
>>
>>  /* ARGSUSED */
>> diff --git a/cmd-set-buffer.c b/cmd-set-buffer.c
>> index 1eeaead..a32799f 100644
>> --- a/cmd-set-buffer.c
>> +++ b/cmd-set-buffer.c
>> @@ -36,7 +36,8 @@
>>       0,
>>       NULL,
>>       NULL,
>> -     cmd_set_buffer_exec
>> +     cmd_set_buffer_exec,
>> +              NULL
>>  };
>>
>>  enum cmd_retval
>> diff --git a/cmd-set-environment.c b/cmd-set-environment.c
>> index 9533626..7906436 100644
>> --- a/cmd-set-environment.c
>> +++ b/cmd-set-environment.c
>> @@ -36,7 +36,8 @@
>>       0,
>>       NULL,
>>       NULL,
>> -     cmd_set_environment_exec
>> +     cmd_set_environment_exec,
>> +              NULL
>>  };
>>
>>  enum cmd_retval
>> diff --git a/cmd-set-hook.c b/cmd-set-hook.c
>> index d42ead7..9f27c64 100644
>> --- a/cmd-set-hook.c
>> +++ b/cmd-set-hook.c
>> @@ -34,7 +34,8 @@
>>       0,
>>       NULL,
>>       NULL,
>> -     cmd_set_hook_exec
>> +     cmd_set_hook_exec,
>> +              NULL
>>  };
>>
>>  enum cmd_retval
>> diff --git a/cmd-set-option.c b/cmd-set-option.c
>> index ca99a97..5501b77 100644
>> --- a/cmd-set-option.c
>> +++ b/cmd-set-option.c
>> @@ -65,7 +65,8 @@ struct options_entry *cmd_set_option_choice(struct cmd *, 
>> struct cmd_ctx *,
>>       0,
>>       NULL,
>>       NULL,
>> -     cmd_set_option_exec
>> +     cmd_set_option_exec,
>> +              NULL
>>  };
>>
>>  const struct cmd_entry cmd_set_window_option_entry = {
>> @@ -75,7 +76,8 @@ struct options_entry *cmd_set_option_choice(struct cmd *, 
>> struct cmd_ctx *,
>>       0,
>>       NULL,
>>       NULL,
>> -     cmd_set_option_exec
>> +     cmd_set_option_exec,
>> +              NULL
>>  };
>>
>>  enum cmd_retval
>> diff --git a/cmd-show-buffer.c b/cmd-show-buffer.c
>> index b345ebc..aad29a6 100644
>> --- a/cmd-show-buffer.c
>> +++ b/cmd-show-buffer.c
>> @@ -35,7 +35,8 @@
>>       0,
>>       NULL,
>>       NULL,
>> -     cmd_show_buffer_exec
>> +     cmd_show_buffer_exec,
>> +              NULL
>>  };
>>
>>  enum cmd_retval
>> diff --git a/cmd-show-environment.c b/cmd-show-environment.c
>> index 679d5d4..2cdd2bf 100644
>> --- a/cmd-show-environment.c
>> +++ b/cmd-show-environment.c
>> @@ -36,7 +36,8 @@
>>       0,
>>       NULL,
>>       NULL,
>> -     cmd_show_environment_exec
>> +     cmd_show_environment_exec,
>> +              NULL
>>  };
>>
>>  enum cmd_retval
>> diff --git a/cmd-show-hooks.c b/cmd-show-hooks.c
>> index 08e646e..ea17fa3 100644
>> --- a/cmd-show-hooks.c
>> +++ b/cmd-show-hooks.c
>> @@ -34,7 +34,8 @@
>>       0,
>>       NULL,
>>       NULL,
>> -     cmd_show_hooks_exec
>> +     cmd_show_hooks_exec,
>> +              NULL
>>  };
>>
>>  enum cmd_retval
>> diff --git a/cmd-show-messages.c b/cmd-show-messages.c
>> index d8c1851..8815878 100644
>> --- a/cmd-show-messages.c
>> +++ b/cmd-show-messages.c
>> @@ -36,7 +36,8 @@
>>       0,
>>       NULL,
>>       NULL,
>> -     cmd_show_messages_exec
>> +     cmd_show_messages_exec,
>> +              NULL
>>  };
>>
>>  enum cmd_retval
>> diff --git a/cmd-show-options.c b/cmd-show-options.c
>> index d37b791..a063096 100644
>> --- a/cmd-show-options.c
>> +++ b/cmd-show-options.c
>> @@ -36,7 +36,8 @@
>>       0,
>>       NULL,
>>       NULL,
>> -     cmd_show_options_exec
>> +     cmd_show_options_exec,
>> +              NULL
>>  };
>>
>>  const struct cmd_entry cmd_show_window_options_entry = {
>> @@ -46,7 +47,8 @@
>>       0,
>>       NULL,
>>       NULL,
>> -     cmd_show_options_exec
>> +     cmd_show_options_exec,
>> +              NULL
>>  };
>>
>>  enum cmd_retval
>> diff --git a/cmd-source-file.c b/cmd-source-file.c
>> index 12ed3de..bc6ae7d 100644
>> --- a/cmd-source-file.c
>> +++ b/cmd-source-file.c
>> @@ -35,7 +35,8 @@
>>       0,
>>       NULL,
>>       NULL,
>> -     cmd_source_file_exec
>> +     cmd_source_file_exec,
>> +              NULL
>>  };
>>
>>  enum cmd_retval
>> diff --git a/cmd-split-window.c b/cmd-split-window.c
>> index b40b574..d466015 100644
>> --- a/cmd-split-window.c
>> +++ b/cmd-split-window.c
>> @@ -27,8 +27,9 @@
>>   * Split a window (add a new pane).
>>   */
>>
>> -void          cmd_split_window_key_binding(struct cmd *, int);
>> -enum cmd_retval       cmd_split_window_exec(struct cmd *, struct cmd_ctx *);
>> +void         cmd_split_window_key_binding(struct cmd *, int);
>> +void         cmd_split_window_context(struct cmd *, struct cmd_ctx *);
>> +enum cmd_retval      cmd_split_window_exec(struct cmd *, struct cmd_ctx *);
>>
>>  const struct cmd_entry cmd_split_window_entry = {
>>       "split-window", "splitw",
>> @@ -38,10 +39,26 @@
>>       0,
>>       cmd_split_window_key_binding,
>>       NULL,
>> -     cmd_split_window_exec
>> +     cmd_split_window_exec,
>> +     cmd_split_window_context
>>  };
>>
>>  void
>> +cmd_split_window_context(struct cmd *self, struct cmd_ctx *ctx)
>> +{
>> +     struct session          *s;
>> +     struct window_pane      *wp;
>> +     struct winlink          *wl;
>> +     struct args             *args = self->args;
>> +
>> +     wl = cmd_find_pane(ctx, args_get(args, 't'), &s, &wp);
>> +     log_debug("I GOT HERE");
>> +     self->context->ctx_session = s;
>> +     self->context->ctx_window_pane = wp;
>> +     self->context->ctx_wl = wl;
>> +}
>> +
>> +void
>>  cmd_split_window_key_binding(struct cmd *self, int key)
>>  {
>>       self->args = args_create(0);
>> diff --git a/cmd-start-server.c b/cmd-start-server.c
>> index 7da1337..39767d6 100644
>> --- a/cmd-start-server.c
>> +++ b/cmd-start-server.c
>> @@ -33,7 +33,8 @@
>>       CMD_STARTSERVER,
>>       NULL,
>>       NULL,
>> -     cmd_start_server_exec
>> +     cmd_start_server_exec,
>> +              NULL
>>  };
>>
>>  /* ARGSUSED */
>> diff --git a/cmd-suspend-client.c b/cmd-suspend-client.c
>> index 95278f9..82f91e9 100644
>> --- a/cmd-suspend-client.c
>> +++ b/cmd-suspend-client.c
>> @@ -36,7 +36,8 @@
>>       0,
>>       NULL,
>>       NULL,
>> -     cmd_suspend_client_exec
>> +     cmd_suspend_client_exec,
>> +              NULL
>>  };
>>
>>  enum cmd_retval
>> diff --git a/cmd-swap-pane.c b/cmd-swap-pane.c
>> index 42fe2fc..971db52 100644
>> --- a/cmd-swap-pane.c
>> +++ b/cmd-swap-pane.c
>> @@ -36,7 +36,8 @@
>>       0,
>>       cmd_swap_pane_key_binding,
>>       NULL,
>> -     cmd_swap_pane_exec
>> +     cmd_swap_pane_exec,
>> +              NULL
>>  };
>>
>>  void
>> diff --git a/cmd-swap-window.c b/cmd-swap-window.c
>> index f0c9ffe..61509c5 100644
>> --- a/cmd-swap-window.c
>> +++ b/cmd-swap-window.c
>> @@ -35,7 +35,8 @@
>>       0,
>>       NULL,
>>       NULL,
>> -     cmd_swap_window_exec
>> +     cmd_swap_window_exec,
>> +              NULL
>>  };
>>
>>  enum cmd_retval
>> diff --git a/cmd-switch-client.c b/cmd-switch-client.c
>> index 1ca0c41..3f44e12 100644
>> --- a/cmd-switch-client.c
>> +++ b/cmd-switch-client.c
>> @@ -37,7 +37,8 @@
>>       CMD_READONLY,
>>       cmd_switch_client_key_binding,
>>       NULL,
>> -     cmd_switch_client_exec
>> +     cmd_switch_client_exec,
>> +              NULL
>>  };
>>
>>  void
>> diff --git a/cmd-unbind-key.c b/cmd-unbind-key.c
>> index 261ded4..8b6c9d2 100644
>> --- a/cmd-unbind-key.c
>> +++ b/cmd-unbind-key.c
>> @@ -37,7 +37,8 @@
>>       0,
>>       NULL,
>>       cmd_unbind_key_check,
>> -     cmd_unbind_key_exec
>> +     cmd_unbind_key_exec,
>> +              NULL
>>  };
>>
>>  enum cmd_retval
>> diff --git a/cmd-unlink-window.c b/cmd-unlink-window.c
>> index 19731ba..f95f454 100644
>> --- a/cmd-unlink-window.c
>> +++ b/cmd-unlink-window.c
>> @@ -33,7 +33,8 @@
>>       0,
>>       NULL,
>>       NULL,
>> -     cmd_unlink_window_exec
>> +     cmd_unlink_window_exec,
>> +              NULL
>>  };
>>
>>  enum cmd_retval
>> diff --git a/cmd.c b/cmd.c
>> index f88c071..b872c97 100644
>> --- a/cmd.c
>> +++ b/cmd.c
>> @@ -209,6 +209,22 @@ enum cmd_retval   run_hook_after(struct hooks *, struct 
>> cmd *,
>>       free(argv);
>>  }
>>
>> +struct cmd_context *
>> +cmd_context_create(struct cmd_ctx *ctx)
>> +{
>> +     struct cmd_context      *cmd_context;
>> +
>> +     cmd_context = xmalloc(sizeof *cmd_context);
>> +     cmd_context->ctx_client = (ctx->curclient != NULL) ?
>> +                     ctx->curclient : NULL;
>> +     cmd_context->ctx_session = (ctx->curclient != NULL) ?
>> +                     ctx->curclient->session : NULL;
>> +     cmd_context->ctx_window = NULL;
>> +     cmd_context->ctx_window_pane = NULL;
>> +
>> +     return (cmd_context);
>> +}
>> +
>>  struct cmd *
>>  cmd_parse(int argc, char **argv, char **cause)
>>  {
>> @@ -263,6 +279,7 @@ struct cmd *
>>       cmd = xmalloc(sizeof *cmd);
>>       cmd->entry = entry;
>>       cmd->args = args;
>> +
>>       return (cmd);
>>
>>  ambiguous:
>> @@ -295,6 +312,10 @@ enum cmd_retval
>>
>>       memcpy(&hook_ctx, ctx, sizeof hook_ctx);
>>       hook_ctx.cmdclient = NULL;
>> +     if (hooks != &global_hooks && cmd->context != NULL && 
>> cmd->context->ctx_client != NULL) {
>> +             log_debug("SETTING CLIENT");
>> +             hook_ctx.curclient = cmd->context->ctx_client;
>> +     }
>>       xasprintf(&hook_name, "before-%s", cmd->entry->name);
>>
>>       retval = hooks_call(hooks, hook_name, &hook_ctx);
>> @@ -314,6 +335,8 @@ enum cmd_retval
>>
>>       memcpy(&hook_ctx, ctx, sizeof hook_ctx);
>>       hook_ctx.cmdclient = NULL;
>> +     if (hooks != &global_hooks && cmd->context != NULL && 
>> cmd->context->ctx_client != NULL)
>> +             hook_ctx.curclient = cmd->context->ctx_client;
>>       xasprintf(&hook_name, "after-%s", cmd->entry->name);
>>
>>       retval = hooks_call(hooks, hook_name, &hook_ctx);
>> @@ -331,10 +354,28 @@ enum cmd_retval
>>       struct hooks    *hooks;
>>       enum cmd_retval  retval, hooks_retval;
>>
>> -     if (ctx->curclient != NULL)
>> -             s = ctx->curclient->session;
>> +     hooks = &global_hooks;
>> +     cmd->context = cmd_context_create(ctx);
>> +     if (cmd->entry->context != NULL) {
>> +             log_debug("Setting CONTEXT hooks");
>> +             cmd->entry->context(cmd, ctx);
>> +
>> +             /*
>> +              * Set the hooks to be the session the hooks will run
>> +              * in, which is derived from parsing the command
>> +              * flags, and setting the context.
>> +              */
>> +             if (cmd->context != NULL && cmd->context->ctx_session != NULL) 
>> {
>> +                     log_debug("HOOKS:  SETTING TO SESSION <<%s>>",
>> +                                     cmd->context->ctx_session->name);
>> +                     hooks = &cmd->context->ctx_session->hooks;
>> +             }
>> +     }
>> +     if (hooks == &global_hooks)
>> +             log_debug("HOOKS:  USING GLOBAL HOOKS");
>> +     else if (cmd->context != NULL && hooks == 
>> &cmd->context->ctx_session->hooks)
>> +             log_debug("HOOKS:  USING SESSION HOOK");
>>
>> -     hooks = (s == NULL) ? &global_hooks : &s->hooks;
>>
>>       /* Call any hooks set to run before the intended command. */
>>       hooks_retval = run_hook_before(hooks, cmd, ctx);
>> diff --git a/tmux.h b/tmux.h
>> index 34f9616..f48c129 100644
>> --- a/tmux.h
>> +++ b/tmux.h
>> @@ -1400,6 +1400,7 @@ struct cmd_ctx {
>>  struct cmd {
>>       const struct cmd_entry  *entry;
>>       struct args             *args;
>> +     struct cmd_context      *context;
>>
>>       TAILQ_ENTRY(cmd)         qentry;
>>  };
>> @@ -1415,25 +1416,34 @@ enum cmd_retval {
>>       CMD_RETURN_ATTACH
>>  };
>>
>> +struct cmd_context {
>> +     struct client           *ctx_client;
>> +     struct session          *ctx_session;
>> +     struct window           *ctx_window;
>> +     struct winlink          *ctx_wl;
>> +     struct window_pane      *ctx_window_pane;
>> +};
>> +
>>  struct cmd_entry {
>> -     const char      *name;
>> -     const char      *alias;
>> +     const char              *name;
>> +     const char              *alias;
>>
>> -     const char      *args_template;
>> -     int              args_lower;
>> -     int              args_upper;
>> +     const char              *args_template;
>> +     int                     args_lower;
>> +     int                     args_upper;
>>
>> -     const char      *usage;
>> +     const char              *usage;
>>
>>  #define CMD_STARTSERVER 0x1
>>  #define CMD_CANTNEST 0x2
>>  #define CMD_SENDENVIRON 0x4
>>  #define CMD_READONLY 0x8
>> -     int              flags;
>> +     int                     flags;
>>
>> -     void             (*key_binding)(struct cmd *, int);
>> -     int              (*check)(struct args *);
>> -     enum cmd_retval  (*exec)(struct cmd *, struct cmd_ctx *);
>> +     void                    (*key_binding)(struct cmd *, int);
>> +     int                     (*check)(struct args *);
>> +     enum cmd_retval         (*exec)(struct cmd *, struct cmd_ctx *);
>> +     void                    (*context)(struct cmd *, struct cmd_ctx *);
>>  };
>>
>>  /* Key binding. */
>> @@ -1739,6 +1749,7 @@ long long        args_strtonum(
>>  int           cmd_unpack_argv(char *, size_t, int, char ***);
>>  char        **cmd_copy_argv(int, char *const *);
>>  void          cmd_free_argv(int, char **);
>> +struct cmd_context *cmd_context_create(struct cmd_ctx *);
>>  struct cmd   *cmd_parse(int, char **, char **);
>>  enum cmd_retval       cmd_exec(struct cmd *, struct cmd_ctx *);
>>  void          cmd_free(struct cmd *);
>
>
> ------------------------------------------------------------------------------
> Monitor your physical, virtual and cloud infrastructure from a single
> web console. Get in-depth insight into apps, servers, databases, vmware,
> SAP, cloud infrastructure, etc. Download 30-day Free Trial.
> Pricing starts from $795 for 25 servers or applications!
> http://p.sf.net/sfu/zoho_dev2dev_nov
> _______________________________________________
> tmux-users mailing list
> tmux-users@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/tmux-users

------------------------------------------------------------------------------
Monitor your physical, virtual and cloud infrastructure from a single
web console. Get in-depth insight into apps, servers, databases, vmware,
SAP, cloud infrastructure, etc. Download 30-day Free Trial.
Pricing starts from $795 for 25 servers or applications!
http://p.sf.net/sfu/zoho_dev2dev_nov
_______________________________________________
tmux-users mailing list
tmux-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/tmux-users

Reply via email to