From 5cfbb60b8399481f6959c5b16d000f51e445a8c3 Mon Sep 17 00:00:00 2001 From: Dmitry Voronin Date: Tue, 26 Nov 2024 19:01:08 +0300 Subject: [PATCH] Tmux: Add overlay for color customization. --- overlay/Tmux.nix | 22 ++++++ patch/tmux/SelectionStyle.patch | 124 ++++++++++++++++++++++++++++++++ 2 files changed, 146 insertions(+) create mode 100644 overlay/Tmux.nix create mode 100644 patch/tmux/SelectionStyle.patch diff --git a/overlay/Tmux.nix b/overlay/Tmux.nix new file mode 100644 index 00000000..3ff2659f --- /dev/null +++ b/overlay/Tmux.nix @@ -0,0 +1,22 @@ +{ + __findFile, + config, + pkgs, + ... +} @args: { + # SEE: https://github.com/tmux/tmux/issues/4264 + # FIXME: Later. + nixpkgs.overlays = [(final: prev: { + tmux = prev.tmux.overrideAttrs (old: { + src = prev.fetchFromGitHub { + hash = "sha256-EuTEN+B+rE76nLQRIljy2PL2gp+rVGk+ygEhQA2nZww="; + owner = "tmux"; + repo = "tmux"; + rev = "db978db27161f57b01f22407d2dda2bce203c2cf"; + }; + patches = (old.patches or [ ]) ++ [ + + ]; + }); + })]; +} diff --git a/patch/tmux/SelectionStyle.patch b/patch/tmux/SelectionStyle.patch new file mode 100644 index 00000000..cc1c80f2 --- /dev/null +++ b/patch/tmux/SelectionStyle.patch @@ -0,0 +1,124 @@ +diff --git a/options-table.c b/options-table.c +index 515714f..92b127e 100644 +--- a/options-table.c ++++ b/options-table.c +@@ -1025,6 +1025,24 @@ const struct options_table_entry options_table[] = { + .text = "Format of the position indicator in copy mode." + }, + ++ { .name = "copy-mode-position-style", ++ .type = OPTIONS_TABLE_STRING, ++ .scope = OPTIONS_TABLE_WINDOW, ++ .default_str = "#{mode-style}", ++ .flags = OPTIONS_TABLE_IS_STYLE, ++ .separator = ",", ++ .text = "Style of position indicator in copy mode." ++ }, ++ ++ { .name = "copy-mode-selection-style", ++ .type = OPTIONS_TABLE_STRING, ++ .scope = OPTIONS_TABLE_WINDOW, ++ .default_str = "#{mode-style}", ++ .flags = OPTIONS_TABLE_IS_STYLE, ++ .separator = ",", ++ .text = "Style of selection in copy mode." ++ }, ++ + { .name = "fill-character", + .type = OPTIONS_TABLE_STRING, + .scope = OPTIONS_TABLE_WINDOW, +diff --git a/tmux.1 b/tmux.1 +index 98cf871..38552cf 100644 +--- a/tmux.1 ++++ b/tmux.1 +@@ -4890,6 +4890,22 @@ or + contains + .Ql vi . + .Pp ++.It Ic copy-mode-position-style Ar style ++Set the style of the position indicator in copy mode. ++For how to specify ++.Ar style , ++see the ++.Sx STYLES ++section. ++.Pp ++.It Ic copy-mode-selection-style Ar style ++Set the style of the selection in copy mode. ++For how to specify ++.Ar style , ++see the ++.Sx STYLES ++section. ++.Pp + .It Ic mode-style Ar style + Set window modes style. + For how to specify +diff --git a/window-copy.c b/window-copy.c +index 36b9f89..1cda6d3 100644 +--- a/window-copy.c ++++ b/window-copy.c +@@ -4391,13 +4391,15 @@ window_copy_write_line(struct window_mode_entry *wme, + char *expanded; + struct format_tree *ft; + +- style_apply(&gc, oo, "mode-style", NULL); ++ ft = format_create_defaults(NULL, NULL, NULL, NULL, wp); ++ ++ style_apply(&gc, oo, "copy-mode-position-style", ft); + gc.flags |= GRID_FLAG_NOPALETTE; +- style_apply(&mgc, oo, "copy-mode-match-style", NULL); ++ style_apply(&mgc, oo, "copy-mode-match-style", ft); + mgc.flags |= GRID_FLAG_NOPALETTE; +- style_apply(&cgc, oo, "copy-mode-current-match-style", NULL); ++ style_apply(&cgc, oo, "copy-mode-current-match-style", ft); + cgc.flags |= GRID_FLAG_NOPALETTE; +- style_apply(&mkgc, oo, "copy-mode-mark-style", NULL); ++ style_apply(&mkgc, oo, "copy-mode-mark-style", ft); + mkgc.flags |= GRID_FLAG_NOPALETTE; + + window_copy_write_one(wme, ctx, py, hsize - data->oy + py, +@@ -4406,14 +4408,12 @@ window_copy_write_line(struct window_mode_entry *wme, + if (py == 0 && s->rupper < s->rlower && !data->hide_position) { + value = options_get_string(oo, "copy-mode-position-format"); + if (*value != '\0') { +- ft = format_create_defaults(NULL, NULL, NULL, NULL, wp); + expanded = format_expand(ft, value); + if (*expanded != '\0') { + screen_write_cursormove(ctx, 0, 0, 0); + format_draw(ctx, &gc, sx, expanded, NULL, 0); + } + free(expanded); +- format_free(ft); + } + } + +@@ -4421,6 +4421,8 @@ window_copy_write_line(struct window_mode_entry *wme, + screen_write_cursormove(ctx, screen_size_x(s) - 1, py, 0); + screen_write_putc(ctx, &grid_default_cell, '$'); + } ++ ++ format_free(ft); + } + + static void +@@ -4668,6 +4670,7 @@ window_copy_set_selection(struct window_mode_entry *wme, int may_redraw, + struct grid_cell gc; + u_int sx, sy, cy, endsx, endsy; + int startrelpos, endrelpos; ++ struct format_tree *ft; + + window_copy_synchronize_cursor(wme, no_reset); + +@@ -4689,8 +4692,10 @@ window_copy_set_selection(struct window_mode_entry *wme, int may_redraw, + } + + /* Set colours and selection. */ +- style_apply(&gc, oo, "mode-style", NULL); ++ ft = format_create_defaults(NULL, NULL, NULL, NULL, wp); ++ style_apply(&gc, oo, "copy-mode-selection-style", ft); + gc.flags |= GRID_FLAG_NOPALETTE; ++ format_free(ft); + screen_set_selection(s, sx, sy, endsx, endsy, data->rectflag, + data->modekeys, &gc); +