Hello,

On Tue, Dec 11, 2012 at 12:33 AM, Ben Boeckel <maths...@gmail.com> wrote:
> On Mon, Dec 10, 2012 at 05:13:43 GMT, Patricio Palladino wrote:
> I use the following setup:
>
> In .tmux.conf (ignoring colors):
>
>     setw -g window-status-format '#I.#P#F:#T-#W'
>
> At shell startup:
>
>     tmux_title () {
>         if [ -z "$TMUX" ]; then
>             return 1
>         fi
>
>         if [ "$#" -eq 0 ]; then
>             tmux display-message -p -t "$TMUX_PANE" -F "#{pane_title}"
>         else
>             local title
>
>             title="$1"
>             shift
>
>             printf "\033]2;$title\033\\"
>         fi
>     }
>
>     # Initialize to nothing iff it isn't already set.
>     if [ "$( tmux_title )" = "$HOSTNAME" ]; then
>         tmux_title ""
>     fi
>
> I then have a command "cdb" which uses "bookmarks" to change to a
> project's directory, clear the directory stack, and to use the
> tmux_title function to set the title on the pane.
>
> By default windows in the status bar look like:
>
>     1.0-:-irssi
>
> and after using cdb it is:
>
>     3.0-:uzbl-zsh

Nice setup. But I find difficult to remember to alwas use a diffent
command to "cd".

I implementented the automatic-rename-format feature (with a default
format acting exactly the same as before this patch). I addded the
pane_default_command (1 or 0) and pane_current_program format
variables.

diff --git a/format.c b/format.c
index 19f322a..da260f4 100644
--- a/format.c
+++ b/format.c
@@ -365,6 +365,7 @@ format_window_pane(struct format_tree *ft, struct
window_pane *wp)
        unsigned long long       size;
        u_int                    i;
        u_int                    idx;
+       char                    *command_name;

        size = 0;
        for (i = 0; i < gd->hsize; i++) {
@@ -392,8 +393,14 @@ format_window_pane(struct format_tree *ft, struct
window_pane *wp)
        if (wp->cwd != NULL)
                format_add(ft, "pane_start_path", "%s", wp->cwd);
        format_add(ft, "pane_current_path", "%s", osdep_get_cwd(wp->fd));
+       command_name = pane_command_name(wp->window->active);
+       format_add(ft, "pane_current_program", "%s", command_name);
+       format_add(ft, "pane_default_command", "%d",
+               wp->cmd != NULL && *wp->cmd == '\0');
        format_add(ft, "pane_pid", "%ld", (long) wp->pid);
        format_add(ft, "pane_tty", "%s", wp->tty);
+
+       free(command_name);
 }

 void
diff --git a/names.c b/names.c
index 72f1ad1..2426610 100644
--- a/names.c
+++ b/names.c
@@ -47,8 +47,12 @@ queue_window_name(struct window *w)
 void
 window_name_callback(unused int fd, unused short events, void *data)
 {
-       struct window   *w = data;
-       char            *name, *wname;
+       struct window           *w = data;
+       struct winlink          *wl;
+       struct format_tree      *ft;
+       struct session          *s, *s2;
+       char                    *name, *wname;
+       const char              *name_template;

        if (w->active == NULL)
                return;
@@ -60,25 +64,25 @@ window_name_callback(unused int fd, unused short
events, void *data)
        }
        queue_window_name(w);

+       ft = format_create();
+       RB_FOREACH(s2, sessions, &sessions) {
+               if ((wl = winlink_find_by_window(&s2->windows, w)) == NULL)
+                       continue;
+               s = s2;
+       }
+
+       if (wl != NULL && s != NULL)
+               format_winlink(ft, s, wl);
+
+       format_window_pane(ft, w->active);
+
+       name_template = options_get_string(&w->options,
+               "automatic-rename-format");
+
        if (w->active->screen != &w->active->base)
-               name = NULL;
-       else
-               name = osdep_get_name(w->active->fd, w->active->tty);
-       if (name == NULL)
                wname = default_window_name(w);
-       else {
-               /*
-                * If tmux is using the default command, it will be a login
-                * shell and argv[0] may have a - prefix. Remove this if it is
-                * present. Ick.
-                */
-               if (w->active->cmd != NULL && *w->active->cmd == '\0' &&
-                   name != NULL && name[0] == '-' && name[1] != '\0')
-                       wname = parse_window_name(name + 1);
-               else
-                       wname = parse_window_name(name);
-               free(name);
-       }
+       else
+               wname = format_expand(ft, name_template);

        if (w->active->fd == -1) {
                xasprintf(&name, "%s[dead]", wname);
@@ -91,6 +95,7 @@ window_name_callback(unused int fd, unused short
events, void *data)
                server_status_window(w);
        }
        free(wname);
+       format_free(ft);
 }

 char *
@@ -129,3 +134,24 @@ parse_window_name(const char *in)
        free(copy);
        return (name);
 }
+
+char *
+pane_command_name(struct window_pane *pane) {
+       char *name, *pname;
+
+       name = osdep_get_name(pane->fd, pane->tty);
+
+       /*
+        * If tmux is using the default command, it will be a login
+        * shell and argv[0] may have a - prefix. Remove this if it is
+        * present. Ick.
+        */
+       if (pane->cmd != NULL && *pane->cmd == '\0' &&
+           name != NULL && name[0] == '-' && name[1] != '\0')
+               pname = parse_window_name(name + 1);
+       else
+               pname = parse_window_name(name);
+       free(name);
+
+       return (pname);
+}
diff --git a/options-table.c b/options-table.c
index 4d1edbd..fa6d052 100644
--- a/options-table.c
+++ b/options-table.c
@@ -469,6 +469,10 @@ const struct options_table_entry window_options_table[] = {
          .default_num = 1
        },

+       { .name = "automatic-rename-format",
+         .type = OPTIONS_TABLE_STRING,
+         .default_str = "#{pane_current_program}"
+       },

        { .name = "c0-change-trigger",
          .type = OPTIONS_TABLE_NUMBER,
diff --git a/tmux.h b/tmux.h
index 7de43a8..0f959de 100644
--- a/tmux.h
+++ b/tmux.h
@@ -2243,6 +2243,7 @@ struct
window_choose_data      *window_choose_add_item(struct window_pane *,
 /* names.c */
 void            queue_window_name(struct window *);
 char           *default_window_name(struct window *);
+char           *pane_command_name(struct window_pane *);

 /* signal.c */
 void   set_signals(void(*)(int, short, void *));


But I still can't have automatic renaming work as I wanted because
conditional formatting is doesn't allow variables and I would like
something like this:
"#{?pane_default_command,#pane_current_path,#pane_current_program}"

If you agree, I can implement that feature too. I wouldn't make it
completely recursive, just let the user put variables as the possible
values (not more conditionals).

Patricio

------------------------------------------------------------------------------
LogMeIn Rescue: Anywhere, Anytime Remote support for IT. Free Trial
Remotely access PCs and mobile devices and provide instant support
Improve your efficiency, and focus on delivering more value-add services
Discover what IT Professionals Know. Rescue delivers
http://p.sf.net/sfu/logmein_12329d2d
_______________________________________________
tmux-users mailing list
tmux-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/tmux-users

Reply via email to