Sorry, I forgot - you can try this (attached) against master. Apply with
"patch <x.diff".
Then you can check if a window is after the active one with, for
example:
#{==:#{e/-:#{window_index},1},#{active_window_index}}
Or before it:
#{==:#{e/+:#{window_index},1},#{active_window_index}}
This will only work if you have renumber-windows turned on (so there are
no gaps in the indexes), but I assume you do or your original idea
wouldn't work either.
I'll take a look see if your #() way will work in a bit.
On Thu, Feb 25, 2021 at 02:18:34PM -0500, Haodong Du wrote:
> Hi Nicholas,
> Could you take a look at this issue? It would be nice to do it without
> digging into the code.
> For the format.c, is this what I need? Sorry, I didn't really read the
> code. so could be wrong.
>
> format_cb_window_active_idx(struct format_tree *ft)
> {
> if (ft->wl != NULL) {
> return (xstrdup(ft->wl->session->curw->idx))
>
> }
> return (NULL);
> }
>
> Best regards,
> Haodong Du
> On Sat, Feb 20, 2021 at 3:26 PM, Nicholas Marriott
> <[email protected]> wrote:
>
> #() will not work with display -p because it stops before the command
> finishes (it does not wait). In the status line it should work, I don't
> know why It doesn't. It would be easy to add an additional format
> variable though and it would be generally useful.
>
> On Sat, 20 Feb 2021, 20:20 Haodong Du, <[email protected]> wrote:
>
> Thank you Nocholas!
> I haven't digged into customizing tmux code myself, but would try
> later.
> Regarding the #(). I find it's not executing, and found this post that
> might be related:
>
> https://stackoverflow.com/questions/30264679/tmux-titles-string-not-executing-shell-command
> I'm running HEAD-742e670 (built yesterday) on macos 11.2.1
> ```bash
> $ tmux display -pv -F "#{==:#(tmux lsw -f '#{?window_active,1,}' -F
> '#I'),#I}"
> # expanding format: #{==:#(tmux lsw -f '#{?window_active,1,}' -F
> '#I'),#I}
> # found #{}: ==:#(tmux lsw -f '#{?window_active,1,}' -F '#I'),#I
> # modifier 0 is ==
> # expanding format: #(tmux lsw -f '#{?window_active,1,}' -F '#I')
> # found #(): tmux lsw -f '#{?window_active,1,}' -F '#I'
> # expanding format: tmux lsw -f '#{?window_active,1,}' -F '#I'
> # found #{}: ?window_active,1,
> # condition is: window_active
> # condition 'window_active' found
> # condition 'window_active' is true
> # expanding format: 1
> # result is: 1
> # replaced '?window_active,1,' with '1'
> # found #I: window_index
> # format 'window_index' found: 4
> # replaced 'window_index' with '4'
> # result is: tmux lsw -f '1' -F '4'
> # expanding format: <'tmux lsw -f '#{?window_active,1,}' -F '#I'' not
> ready>
> # found #{}: ?window_active,1,
> # condition is: window_active
> # condition 'window_active' found
> # condition 'window_active' is true
> # expanding format: 1
> # result is: 1
> # replaced '?window_active,1,' with '1'
> # found #I: window_index
> # format 'window_index' found: 4
> # replaced 'window_index' with '4'
> # result is: <'tmux lsw -f '1' -F '4'' not ready>
> # #() result: <'tmux lsw -f '1' -F '4'' not ready>
> # result is: <'tmux lsw -f '1' -F '4'' not ready>
> # expanding format: #I
> # found #I: window_index
> # format 'window_index' found: 4
> # replaced 'window_index' with '4'
> # result is: 4
> # compare == left is: <'tmux lsw -f '1' -F '4'' not ready>
> # compare == right is: 4
> # replaced '==:#(tmux lsw -f '#{?window_active,1,}' -F '#I'),#I' with
> '0'
> # result is: 0
> ```
> within #(), I don't need replacing. So I tried escaping with #. This
> exited with error. Then I wrapped with echo ``. Looks better now.
> Still not working.
> ```bash
> $ tmux display -pv -F "#{==:#(echo `tmux lsw -f '#{?window_active,1,}'
> -F '#I'`),2}"
> # expanding format: #{==:#(echo 4),2}
> # found #{}: ==:#(echo 4),2
> # modifier 0 is ==
> # expanding format: #(echo 4)
> # found #(): echo 4
> # expanding format: echo 4
> # result is: echo 4
> # expanding format: <'echo 4' not ready>
> # result is: <'echo 4' not ready>
> # #() result: <'echo 4' not ready>
> # result is: <'echo 4' not ready>
> # expanding format: 2
> # result is: 2
> # compare == left is: <'echo 4' not ready>
> # compare == right is: 2
> # replaced '==:#(echo 4),2' with '0'
> # result is: 0
> ```
> Best regards,
> Haodong Du
> On Sat, Feb 20, 2021 at 2:28 PM, Nicholas Marriott
> <[email protected]> wrote:
>
> I can't try it til next week but if it was me I'd add an
> active-window-index format in format_defaults_session in format.c
> and use that instead of the #().
> Then you could also debug the format using display -pv.
> On Sat, 20 Feb 2021, 18:42 Haodong Du, <[email protected]> wrote:
>
> Hello tmux users,
> I'm setting up my tmux status line. I want to achieve something
> like the figure below with powerline triangles. But there are gaps
> between two window tabs and also with the status left. I want to
> get rid of gaps completely. So I set all the divider to none. But
> I still need to set fg and bg properly. Namely, make the triangle
> bg match the bg of the next tab. In order to do that, I need to
> know whether the next tab is active or not and whether it's the
> last tab.
> ```
> #{?window_end_flag,#[fg=colour239#,bg=colour237],#{?#{==:#(tmux
> lsw -f '#{?window_active,1,}' -F
>
> '#I'),#{e|+|:#I,1}},#[fg=colour239#,bg=colour214],#[fg=colour239#,bg=colour239]}}i*DEG"
> ```
> This is what I came up with. I want to compare the index of active
> window and this window index plus 1. But this does not seem to
> work. It always uses the color setting for the false condition.
> 687474703a2f2f692e696d6775722e636f6d2f694f6a637a2e706e67.png
> Full config for status line if you want to give it a try:
> ```
> set-window-option -g window-status-current-format "\
>
> #{?window_start_flag,#[fg=colour195#,bg=colour214],#[fg=colour214#,bg=colour214]}i*DEG\
> #[fg=colour239, bg=colour214] #I* i*+-\
> #[fg=colour239, bg=colour214, bold] #W \
>
> #{?window_end_flag,#[fg=colour214#,bg=colour237],#[fg=colour214#,bg=colour239]}i*DEG"
> set-window-option -g window-status-format "\
>
> #{?window_start_flag,#[fg=colour195#,bg=colour239],#[fg=colour239#,bg=colour239]}i*DEG\
> #[fg=colour223,bg=colour239] #I i*+-\
> #[fg=colour223, bg=colour239] #W \
> #{?window_end_flag,#[fg=colour239#,bg=colour237],#{?#{==:#(tmux
> lsw -f '#{?window_active,1,}' -F
>
> '#I'),#{e|+|:#I,1}},#[fg=colour239#,bg=colour214],#[fg=colour239#,bg=colour239]}}i*DEG"
> ```
> Regards,
> Haodong Du
>
> --
> 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 view this discussion on the web, visit
>
> https://groups.google.com/d/msgid/tmux-users/3d8a56b9-f36b-4a24-bd52-29a5efdd166an%40googlegroups.com.
--
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 view this discussion on the web, visit
https://groups.google.com/d/msgid/tmux-users/20210225194229.62qm6stewbdnq6qb%40yelena.
Index: format.c
===================================================================
RCS file: /cvs/src/usr.bin/tmux/format.c,v
retrieving revision 1.277
diff -u -p -r1.277 format.c
--- format.c 24 Feb 2021 09:22:15 -0000 1.277
+++ format.c 25 Feb 2021 19:40:53 -0000
@@ -2099,6 +2099,28 @@ format_cb_version(__unused struct format
return (xstrdup(getversion()));
}
+/* Callback for active_window_index. */
+static void *
+format_cb_active_window_index(struct format_tree *ft)
+{
+ if (ft->s != NULL)
+ return (format_printf("%u", ft->s->curw->idx));
+ return (NULL);
+}
+
+/* Callback for last_window_index. */
+static void *
+format_cb_last_window_index(struct format_tree *ft)
+{
+ struct winlink *wl;
+
+ if (ft->s != NULL) {
+ wl = RB_MAX(winlinks, &ft->s->windows);
+ return (format_printf("%u", wl->idx));
+ }
+ return (NULL);
+}
+
/* Callback for window_active. */
static void *
format_cb_window_active(struct format_tree *ft)
@@ -2496,6 +2518,9 @@ struct format_table_entry {
* Only variables which are added by the caller go into the tree.
*/
static const struct format_table_entry format_table[] = {
+ { "active_window_index", FORMAT_TABLE_STRING,
+ format_cb_active_window_index
+ },
{ "alternate_on", FORMAT_TABLE_STRING,
format_cb_alternate_on
},
@@ -2630,6 +2655,9 @@ static const struct format_table_entry f
},
{ "keypad_flag", FORMAT_TABLE_STRING,
format_cb_keypad_flag
+ },
+ { "last_window_index", FORMAT_TABLE_STRING,
+ format_cb_last_window_index
},
{ "mouse_all_flag", FORMAT_TABLE_STRING,
format_cb_mouse_all_flag
Index: tmux.1
===================================================================
RCS file: /cvs/src/usr.bin/tmux/tmux.1,v
retrieving revision 1.823
diff -u -p -r1.823 tmux.1
--- tmux.1 22 Feb 2021 08:18:13 -0000 1.823
+++ tmux.1 25 Feb 2021 19:40:54 -0000
@@ -4756,6 +4756,7 @@ will be replaced by
The following variables are available, where appropriate:
.Bl -column "XXXXXXXXXXXXXXXXXXX" "XXXXX"
.It Sy "Variable name" Ta Sy "Alias" Ta Sy "Replaced with"
+.It Li "active_window_index" Ta "" Ta "Index of active window in session"
.It Li "alternate_on" Ta "" Ta "1 if pane is in alternate screen"
.It Li "alternate_saved_x" Ta "" Ta "Saved cursor X in alternate screen"
.It Li "alternate_saved_y" Ta "" Ta "Saved cursor Y in alternate screen"
@@ -4763,7 +4764,6 @@ The following variables are available, w
.It Li "buffer_name" Ta "" Ta "Name of buffer"
.It Li "buffer_sample" Ta "" Ta "Sample of start of buffer"
.It Li "buffer_size" Ta "" Ta "Size of the specified buffer in bytes"
-.It Li "config_files" Ta "" Ta "List of configuration files loaded"
.It Li "client_activity" Ta "" Ta "Time client last had activity"
.It Li "client_cell_height" Ta "" Ta "Height of each client cell in pixels"
.It Li "client_cell_width" Ta "" Ta "Width of each client cell in pixels"
@@ -4790,6 +4790,7 @@ The following variables are available, w
.It Li "command_list_alias" Ta "" Ta "Command alias if listing commands"
.It Li "command_list_name" Ta "" Ta "Command name if listing commands"
.It Li "command_list_usage" Ta "" Ta "Command usage if listing commands"
+.It Li "config_files" Ta "" Ta "List of configuration files loaded"
.It Li "copy_cursor_line" Ta "" Ta "Line the cursor is on in copy mode"
.It Li "copy_cursor_word" Ta "" Ta "Word under cursor in copy mode"
.It Li "copy_cursor_x" Ta "" Ta "Cursor X position in copy mode"
@@ -4812,6 +4813,7 @@ The following variables are available, w
.It Li "insert_flag" Ta "" Ta "Pane insert flag"
.It Li "keypad_cursor_flag" Ta "" Ta "Pane keypad cursor flag"
.It Li "keypad_flag" Ta "" Ta "Pane keypad flag"
+.It Li "last_window_index" Ta "" Ta "Index of last window in session"
.It Li "line" Ta "" Ta "Line number in the list"
.It Li "mouse_all_flag" Ta "" Ta "Pane mouse all flag"
.It Li "mouse_any_flag" Ta "" Ta "Pane mouse any flag"
@@ -4867,8 +4869,8 @@ The following variables are available, w
.It Li "scroll_position" Ta "" Ta "Scroll position in copy mode"
.It Li "scroll_region_lower" Ta "" Ta "Bottom of scroll region in pane"
.It Li "scroll_region_upper" Ta "" Ta "Top of scroll region in pane"
-.It Li "search_present" Ta "" Ta "1 if search started in copy mode"
.It Li "search_match" Ta "" Ta "Search match if any"
+.It Li "search_present" Ta "" Ta "1 if search started in copy mode"
.It Li "selection_active" Ta "" Ta "1 if selection started and changes with
the cursor in copy mode"
.It Li "selection_end_x" Ta "" Ta "X position of the end of the selection"
.It Li "selection_end_y" Ta "" Ta "Y position of the end of the selection"