1{
2 lib,
3 fetchFromGitHub,
4 pkgs,
5 stdenv,
6 config,
7}:
8
9let
10 rtpPath = "share/tmux-plugins";
11
12 addRtp =
13 path: rtpFilePath: attrs: derivation:
14 derivation
15 // {
16 rtp = "${derivation}/${path}/${rtpFilePath}";
17 }
18 // {
19 overrideAttrs = f: mkTmuxPlugin (attrs // (if lib.isFunction f then f attrs else f));
20 };
21
22 mkTmuxPlugin =
23 a@{
24 pluginName,
25 rtpFilePath ? (builtins.replaceStrings [ "-" ] [ "_" ] pluginName) + ".tmux",
26 namePrefix ? "tmuxplugin-",
27 src,
28 unpackPhase ? "",
29 configurePhase ? ":",
30 buildPhase ? ":",
31 addonInfo ? null,
32 preInstall ? "",
33 postInstall ? "",
34 path ? lib.getName pluginName,
35 ...
36 }:
37 if lib.hasAttr "dependencies" a then
38 throw "dependencies attribute is obselete. see NixOS/nixpkgs#118034" # added 2021-04-01
39 else
40 addRtp "${rtpPath}/${path}" rtpFilePath a (
41 stdenv.mkDerivation (
42 a
43 // {
44 pname = namePrefix + pluginName;
45
46 inherit
47 pluginName
48 unpackPhase
49 configurePhase
50 buildPhase
51 addonInfo
52 preInstall
53 postInstall
54 ;
55
56 installPhase = ''
57 runHook preInstall
58
59 target=$out/${rtpPath}/${path}
60 mkdir -p $out/${rtpPath}
61 cp -r . $target
62 if [ -n "$addonInfo" ]; then
63 echo "$addonInfo" > $target/addon-info.json
64 fi
65
66 runHook postInstall
67 '';
68 }
69 )
70 );
71
72in
73{
74 inherit mkTmuxPlugin;
75
76 battery = mkTmuxPlugin {
77 pluginName = "battery";
78 version = "unstable-2019-07-04";
79 src = fetchFromGitHub {
80 owner = "tmux-plugins";
81 repo = "tmux-battery";
82 rev = "f8b8e8451990365e0c98c38c184962e4f83b793b";
83 hash = "sha256-NfKaM4dPt7YaxG7kHMNxf95Mz0hIEhxqlVi2Obr+Da4=";
84 };
85 };
86
87 better-mouse-mode = mkTmuxPlugin {
88 pluginName = "better-mouse-mode";
89 version = "unstable-2021-08-02";
90 src = fetchFromGitHub {
91 owner = "NHDaly";
92 repo = "tmux-better-mouse-mode";
93 rev = "aa59077c635ab21b251bd8cb4dc24c415e64a58e";
94 hash = "sha256-nPNa3JvDgptGvy2vpo0WSZytyu7kFSEn/Jp/OGA0ZBg=";
95 };
96 rtpFilePath = "scroll_copy_mode.tmux";
97 meta = {
98 homepage = "https://github.com/NHDaly/tmux-better-mouse-mode";
99 description = "Better mouse support for tmux";
100 longDescription = ''
101 Features:
102
103 * Emulate mouse-support for full-screen programs like less that don't provide built in mouse support.
104 * Exit copy-mode and return to your prompt by scrolling back all the way down to the bottom.
105 * Adjust your scrolling speed.
106 '';
107 license = lib.licenses.mit;
108 platforms = lib.platforms.unix;
109 maintainers = with lib.maintainers; [ chrispickard ];
110 };
111 };
112
113 catppuccin = mkTmuxPlugin rec {
114 pluginName = "catppuccin";
115 version = "2.1.3";
116 src = fetchFromGitHub {
117 owner = "catppuccin";
118 repo = "tmux";
119 rev = "v${version}";
120 hash = "sha256-Is0CQ1ZJMXIwpDjrI5MDNHJtq+R3jlNcd9NXQESUe2w=";
121 };
122 postInstall = ''
123 sed -i -e 's|''${PLUGIN_DIR}/catppuccin-selected-theme.tmuxtheme|''${TMUX_TMPDIR}/catppuccin-selected-theme.tmuxtheme|g' $target/catppuccin.tmux
124 '';
125 meta = with lib; {
126 homepage = "https://github.com/catppuccin/tmux";
127 description = "Soothing pastel theme for Tmux";
128 license = licenses.mit;
129 platforms = platforms.unix;
130 maintainers = with maintainers; [ jnsgruk ];
131 };
132 };
133
134 continuum = mkTmuxPlugin {
135 pluginName = "continuum";
136 version = "unstable-2022-01-25";
137 src = fetchFromGitHub {
138 owner = "tmux-plugins";
139 repo = "tmux-continuum";
140 rev = "fc2f31d79537a5b349f55b74c8ca69abaac1ddbb";
141 hash = "sha256-S1YuZHX4SnSVlMZKv/a87/qj0seRdaWyOXz5ONCVIRo=";
142 };
143 meta = {
144 homepage = "https://github.com/tmux-plugins/tmux-continuum";
145 description = "Continuous saving of tmux environment";
146 longDescription = ''
147 Features:
148 * continuous saving of tmux environment
149 * automatic tmux start when computer/server is turned on
150 * automatic restore when tmux is started
151
152 Together, these features enable uninterrupted tmux usage. No matter the
153 computer or server restarts, if the machine is on, tmux will be there how
154 you left it off the last time it was used.
155 '';
156 license = lib.licenses.mit;
157 platforms = lib.platforms.unix;
158 maintainers = with lib.maintainers; [ ronanmacf ];
159 };
160 };
161
162 copy-toolkit = mkTmuxPlugin {
163 pluginName = "copy-toolkit";
164 rtpFilePath = "copytk.tmux";
165 version = "2021-12-20";
166 src = fetchFromGitHub {
167 owner = "CrispyConductor";
168 repo = "tmux-copy-toolkit";
169 rev = "c80c2c068059fe04f840ea9f125c21b83cb6f81f";
170 hash = "sha256-cLeOoJ+4MF8lSpwy5lkcPakvB3cpgey0RfLbVTwERNk=";
171 };
172 postInstall = ''
173 sed -i -e 's|python3 |${pkgs.python3}/bin/python3 |g' $target/copytk.tmux
174 sed -i -e 's|python3|${pkgs.python3}/bin/python3|g;s|/bin/bash|${pkgs.bash}/bin/bash|g;s|/bin/cat|${pkgs.coreutils}/bin/cat|g' $target/copytk.py
175 '';
176 meta = {
177 homepage = "https://github.com/CrispyConductor/tmux-copy-toolkit";
178 description = "Various copy-mode tools";
179 license = lib.licenses.mit;
180 platforms = lib.platforms.unix;
181 maintainers = with lib.maintainers; [
182 deejayem
183 sedlund
184 ];
185 };
186 };
187
188 copycat = mkTmuxPlugin {
189 pluginName = "copycat";
190 version = "unstable-2020-01-09";
191 src = fetchFromGitHub {
192 owner = "tmux-plugins";
193 repo = "tmux-copycat";
194 rev = "77ca3aab2aed8ede3e2b941079b1c92dd221cf5f";
195 hash = "sha256-ugVk1zpKeUjOlDWi3LEkJPFsCqyZEivGzGWiqODnkK0=";
196 };
197 };
198
199 cpu = mkTmuxPlugin {
200 pluginName = "cpu";
201 version = "unstable-2023-01-06";
202 src = fetchFromGitHub {
203 owner = "tmux-plugins";
204 repo = "tmux-cpu";
205 rev = "98d787191bc3e8f19c3de54b96ba1caf61385861";
206 hash = "sha256-ymmCI6VYvf94Ot7h2GAboTRBXPIREP+EB33+px5aaJk=";
207 };
208 };
209
210 ctrlw = mkTmuxPlugin rec {
211 pluginName = "ctrlw";
212 version = "0.1.1";
213 src = fetchFromGitHub {
214 owner = "eraserhd";
215 repo = "tmux-ctrlw";
216 rev = "v${version}";
217 hash = "sha256-YYbPkGQmukIDD1fcYleioETFai/SOJni+aZ9Jh2+Zc8=";
218 };
219 };
220
221 dracula = mkTmuxPlugin rec {
222 pluginName = "dracula";
223 version = "3.1.0";
224 src = fetchFromGitHub {
225 owner = "dracula";
226 repo = "tmux";
227 tag = "v${version}";
228 hash = "sha256-WNgCa8F618JQiHDM1YxHj7oR7w+7U6SU89K90RYIUh8=";
229 };
230 meta = {
231 homepage = "https://draculatheme.com/tmux";
232 downloadPage = "https://github.com/dracula/tmux";
233 description = "Feature packed Dracula theme for tmux";
234 changelog = "https://github.com/dracula/tmux/releases/tag/v${version}/CHANGELOG.md";
235 license = lib.licenses.mit;
236 platforms = lib.platforms.unix;
237 maintainers = with lib.maintainers; [ ethancedwards8 ];
238 };
239 };
240
241 dotbar = mkTmuxPlugin rec {
242 pluginName = "dotbar";
243 version = "0.3.0";
244 src = fetchFromGitHub {
245 owner = "vaaleyard";
246 repo = "tmux-dotbar";
247 tag = version;
248 hash = "sha256-n9k18pJnd5mnp9a7VsMBmEHDwo3j06K6/G6p7/DTyIY=";
249 };
250 meta = {
251 homepage = "https://github.com/vaaleyard/tmux-dotbar";
252 downloadPage = "https://github.com/vaaleyard/tmux-dotbar";
253 description = "Simple and minimalist status bar for tmux";
254 changelog = "https://github.com/vaaleyard/tmux-dotbar/releases/tag/${version}";
255 license = lib.licenses.mit;
256 platforms = lib.platforms.unix;
257 maintainers = with lib.maintainers; [ FKouhai ];
258 };
259 };
260
261 extrakto = mkTmuxPlugin {
262 pluginName = "extrakto";
263 version = "0-unstable-2024-08-25";
264 src = fetchFromGitHub {
265 owner = "laktak";
266 repo = "extrakto";
267 rev = "bf9e666f2a6a8172ebe99fff61b574ba740cffc2";
268 hash = "sha256-kIhJKgo1BDTeFyAPa//f/TrhPfV9Rfk9y4qMhIpCydk=";
269 };
270 nativeBuildInputs = [ pkgs.makeWrapper ];
271 buildInputs = [ pkgs.python3 ];
272 postInstall = ''
273 patchShebangs extrakto.py extrakto_plugin.py
274
275 wrapProgram $target/scripts/open.sh \
276 --prefix PATH : ${
277 with pkgs;
278 lib.makeBinPath [
279 fzf
280 xclip
281 wl-clipboard
282 ]
283 }
284 '';
285 meta = {
286 homepage = "https://github.com/laktak/extrakto";
287 description = "Fuzzy find your text with fzf instead of selecting it by hand ";
288 license = lib.licenses.mit;
289 platforms = lib.platforms.unix;
290 maintainers = with lib.maintainers; [
291 kidd
292 fnune
293 ];
294 };
295 };
296
297 fingers = pkgs.callPackage ./tmux-fingers {
298 inherit mkTmuxPlugin;
299 };
300
301 fpp = mkTmuxPlugin {
302 pluginName = "fpp";
303 version = "unstable-2016-03-08";
304 src = fetchFromGitHub {
305 owner = "tmux-plugins";
306 repo = "tmux-fpp";
307 rev = "ca125d5a9c80bb156ac114ac3f3d5951a795c80e";
308 hash = "sha256-mhf1PPlo7AaAx7haRDgS+LYW7eFCOB6LPtHF76rRCa0=";
309 };
310 postInstall = ''
311 sed -i -e 's|fpp |${pkgs.fpp}/bin/fpp |g' $target/fpp.tmux
312 '';
313 };
314
315 fuzzback = mkTmuxPlugin {
316 pluginName = "fuzzback";
317 version = "unstable-2022-11-21";
318 src = fetchFromGitHub {
319 owner = "roosta";
320 repo = "tmux-fuzzback";
321 rev = "bfd9cf0ef1c35488f0080f0c5ca4fddfdd7e18ec";
322 hash = "sha256-w788xDBkfiLdUVv1oJi0YikFPqVk6LiN6PDfHu8on5E=";
323 };
324 nativeBuildInputs = [ pkgs.makeWrapper ];
325 postInstall = ''
326 for f in fuzzback.sh preview.sh supported.sh; do
327 chmod +x $target/scripts/$f
328 wrapProgram $target/scripts/$f \
329 --prefix PATH : ${
330 with pkgs;
331 lib.makeBinPath [
332 coreutils
333 fzf
334 gawk
335 gnused
336 ]
337 }
338 done
339 '';
340 meta = {
341 homepage = "https://github.com/roosta/tmux-fuzzback";
342 description = "Fuzzy search for terminal scrollback";
343 license = lib.licenses.mit;
344 platforms = lib.platforms.unix;
345 maintainers = with lib.maintainers; [ deejayem ];
346 };
347 };
348
349 fzf-tmux-url = mkTmuxPlugin {
350 pluginName = "fzf-tmux-url";
351 rtpFilePath = "fzf-url.tmux";
352 version = "unstable-2024-04-14";
353 src = fetchFromGitHub {
354 owner = "wfxr";
355 repo = "tmux-fzf-url";
356 rev = "28ed7ce3c73a328d8463d4f4aaa6ccb851e520fa";
357 hash = "sha256-tl0SjG/CeolrN7OIHj6MgkB9lFmFgEuJevsSuwVs+78=";
358 };
359 meta = with lib; {
360 homepage = "https://github.com/wfxr/tmux-fzf-url";
361 description = "Quickly open urls on your terminal screen";
362 license = licenses.mit;
363 platforms = platforms.unix;
364 };
365 };
366
367 gruvbox = mkTmuxPlugin {
368 pluginName = "gruvbox";
369 rtpFilePath = "gruvbox-tpm.tmux";
370 version = "unstable-2022-04-19";
371 src = fetchFromGitHub {
372 owner = "egel";
373 repo = "tmux-gruvbox";
374 rev = "3f9e38d7243179730b419b5bfafb4e22b0a969ad";
375 hash = "sha256-jvGCrV94vJroembKZLmvGO8NknV1Hbgz2IuNmc/BE9A=";
376 };
377 };
378
379 harpoon = mkTmuxPlugin {
380 pluginName = "harpoon";
381 rtpFilePath = "harpoon.tmux";
382 version = "0.4.0";
383 src = fetchFromGitHub {
384 owner = "chaitanyabsprip";
385 repo = "tmux-harpoon";
386 rev = "v0.4.0";
387 hash = "sha256-+IakWkPoQFhIQ4m/98NVYWe5tFKmtfKBnPXZcfU9iOk=";
388 };
389 meta = {
390 homepage = "https://github.com/Chaitanyabsprip/tmux-harpoon";
391 downloadPage = "https://github.com/Chaitanyabsprip/tmux-harpoon";
392 description = "Tool to bookmark session supporting auto create for sessions";
393 license = lib.licenses.mit;
394 platforms = lib.platforms.unix;
395 maintainers = with lib.maintainers; [ FKouhai ];
396 };
397 };
398
399 jump = mkTmuxPlugin {
400 pluginName = "jump";
401 version = "2020-06-26";
402 rtpFilePath = "tmux-jump.tmux";
403 src = fetchFromGitHub {
404 owner = "schasse";
405 repo = "tmux-jump";
406 rev = "416f613d3eaadbe1f6f9eda77c49430527ebaffb";
407 hash = "sha256-XxdQtJPkTTCbaGUw4ebtzPQq+QuJOOSAjQKrp6Fvf/U=";
408 };
409 postInstall = ''
410 sed -i -e 's|ruby|${pkgs.ruby}/bin/ruby|g' $target/scripts/tmux-jump.sh
411 '';
412 meta = with lib; {
413 homepage = "https://github.com/schasse/tmux-jump";
414 description = "Vimium/Easymotion like navigation for tmux";
415 license = licenses.gpl3;
416 platforms = platforms.unix;
417 maintainers = with maintainers; [ arnarg ];
418 };
419 };
420
421 kanagawa = mkTmuxPlugin rec {
422 pluginName = "kanagawa";
423 version = "0-unstable-2025-02-10";
424 src = fetchFromGitHub {
425 owner = "Nybkox";
426 repo = "tmux-kanagawa";
427 rev = "5440b9476627bf5f7f3526156a17ae0e3fd232dd";
428 hash = "sha256-sFL9/PMdPJxN7tgpc4YbUHW4PkCXlKmY7a7gi7PLcn8=";
429 };
430 meta = {
431 homepage = "https://github.com/Nybkox/tmux-kanagawa";
432 downloadPage = "https://github.com/Nybkox/tmux-kanagawa";
433 description = "Feature packed kanagawa theme for tmux";
434 license = lib.licenses.mit;
435 platforms = lib.platforms.unix;
436 maintainers = with lib.maintainers; [ FKouhai ];
437 };
438 };
439
440 logging = mkTmuxPlugin {
441 pluginName = "logging";
442 version = "unstable-2019-04-19";
443 src = fetchFromGitHub {
444 owner = "tmux-plugins";
445 repo = "tmux-logging";
446 rev = "b085ad423b5d59a2c8b8d71772352e7028b8e1d0";
447 hash = "sha256-Wp4xY2nxv4jl/G7bjNokYk3TcbS9waLERBFSpT1XGlw=";
448 };
449 };
450
451 mode-indicator = mkTmuxPlugin rec {
452 pluginName = "mode-indicator";
453 version = "unstable-2021-10-01";
454 src = fetchFromGitHub {
455 owner = "MunifTanjim";
456 repo = "tmux-mode-indicator";
457 rev = "11520829210a34dc9c7e5be9dead152eaf3a4423";
458 hash = "sha256-hlhBKC6UzkpUrCanJehs2FxK5SoYBoiGiioXdx6trC4=";
459 };
460 meta = with lib; {
461 homepage = "https://github.com/MunifTanjim/tmux-mode-indicator";
462 description = "Plugin that displays prompt indicating currently active Tmux mode";
463 license = licenses.mit;
464 platforms = platforms.unix;
465 maintainers = with maintainers; [ aacebedo ];
466 };
467 };
468
469 net-speed = mkTmuxPlugin {
470 pluginName = "net-speed";
471 version = "unstable-2018-12-02";
472 src = fetchFromGitHub {
473 owner = "tmux-plugins";
474 repo = "tmux-net-speed";
475 rev = "58abb615971cb617821e2e7e41c660334f55a92d";
476 hash = "sha256-LFPcPDBiSvsOhOhlAScajr/Y/Uw2CPdl87qzD9szQKo=";
477 };
478 };
479
480 nord = mkTmuxPlugin {
481 pluginName = "nord";
482 version = "0.3.0-unstable-2023-03-03";
483 src = pkgs.fetchFromGitHub {
484 owner = "nordtheme";
485 repo = "tmux";
486 rev = "f7b6da07ab55fe32ee5f7d62da56d8e5ac691a92";
487 hash = "sha256-mcmVYNWOUoQLiu4eM/EUudRg67Gcou13xuC6zv9aMKA=";
488 };
489 meta = {
490 homepage = "https://www.nordtheme.com/ports/tmux";
491 description = "Nord Tmux theme with plugin support";
492 longDescription = ''
493 > An arctic, north-bluish clean and elegant tmux theme.
494 > Designed for a fluent and clear workflow with support for third-party plugins.
495
496 This plugin requires that tmux be used with a Nord terminal emulator
497 theme in order to work properly.
498 '';
499 license = lib.licenses.mit;
500 maintainers = [ lib.maintainers.sigmasquadron ];
501 };
502 };
503
504 maildir-counter = mkTmuxPlugin {
505 pluginName = "maildir-counter";
506 version = "unstable-2016-11-25";
507 src = fetchFromGitHub {
508 owner = "tmux-plugins";
509 repo = "tmux-maildir-counter";
510 rev = "9415f0207e71e37cbd870c9443426dbea6da78b9";
511 hash = "sha256-RFdnF/ScOPoeVgGXWhQs28tS7CmsRA0DyFyutCPEmzc=";
512 };
513 };
514
515 online-status = mkTmuxPlugin {
516 pluginName = "online-status";
517 version = "unstable-2018-11-30";
518 src = fetchFromGitHub {
519 owner = "tmux-plugins";
520 repo = "tmux-online-status";
521 rev = "ea86704ced8a20f4a431116aa43f57edcf5a6312";
522 hash = "sha256-OQW2WcNDVBMgX5IIlykn7f1wI8miXuqLQTlqsdHbw8M=";
523 };
524 };
525
526 open = mkTmuxPlugin {
527 pluginName = "open";
528 version = "unstable-2019-12-02";
529 src = fetchFromGitHub {
530 owner = "tmux-plugins";
531 repo = "tmux-open";
532 rev = "cedb4584908bd8458fadc8d3e64101d3cbb48d46";
533 hash = "sha256-sFl+wkvQ498irwKWXXAT6/XBrziYLT+CvLCBV2HrQIM=";
534 };
535 };
536
537 onedark-theme = mkTmuxPlugin {
538 pluginName = "onedark-theme";
539 rtpFilePath = "tmux-onedark-theme.tmux";
540 version = "unstable-2020-06-07";
541 src = fetchFromGitHub {
542 owner = "odedlaz";
543 repo = "tmux-onedark-theme";
544 rev = "3607ef889a47dd3b4b31f66cda7f36da6f81b85c";
545 hash = "sha256-pQooiDEeB8NvBOQ1IKUgPSSQDK+hMTLMGuiKy6GWVKY=";
546 };
547 };
548
549 pain-control = mkTmuxPlugin {
550 pluginName = "pain-control";
551 version = "unstable-2020-02-18";
552 src = fetchFromGitHub {
553 owner = "tmux-plugins";
554 repo = "tmux-pain-control";
555 rev = "2db63de3b08fc64831d833240749133cecb67d92";
556 hash = "sha256-84NJtxoz4KTVv+i3cde235WcHhRSBIkZjtobZIk16nA=";
557 };
558 };
559
560 pass = mkTmuxPlugin {
561 pluginName = "pass";
562 version = "0-unstable-2025-02-20";
563 rtpFilePath = "plugin.tmux";
564 src = fetchFromGitHub {
565 owner = "rafi";
566 repo = "tmux-pass";
567 rev = "c853c8b5e31dea93d17551ef3e18be16c063e28e";
568 hash = "sha256-fDAqQcr0SC9WrKbGgt7z03ex2ORZ7ChOzDGl6HFXMaA";
569 };
570
571 nativeBuildInputs = [ pkgs.makeWrapper ];
572 postInstall = ''
573 rm $target/README.md
574 rm -r $target/test
575
576 wrapProgram $target/scripts/main.sh \
577 --prefix PATH : ${
578 with pkgs;
579 lib.makeBinPath ([
580 findutils
581 fzf
582 gnugrep
583 gnused
584 ncurses
585 pkgs.pass
586 tmux
587 ])
588 }
589 '';
590
591 meta = {
592 description = "Password-store browser using fzf in tmux";
593 homepage = "https://github.com/rafi/tmux-pass";
594 license = lib.licenses.gpl3Only;
595 maintainers = [ lib.maintainers.ethancedwards8 ];
596 };
597 };
598
599 plumb = mkTmuxPlugin rec {
600 pluginName = "plumb";
601 version = "0.1.1";
602 src = fetchFromGitHub {
603 owner = "eraserhd";
604 repo = "tmux-plumb";
605 rev = "v${version}";
606 hash = "sha256-WcTyAeuGAF+Xsqeb3MtRtHDSXiUmTJNDQOkrQJsj07A=";
607 };
608 postInstall = ''
609 sed -i -e 's,9 plumb,${pkgs.plan9port}/bin/9 plumb,' $target/scripts/plumb
610 '';
611 };
612
613 power-theme = mkTmuxPlugin {
614 pluginName = "power";
615 rtpFilePath = "tmux-power.tmux";
616 version = "unstable-2024-05-12";
617 src = pkgs.fetchFromGitHub {
618 owner = "wfxr";
619 repo = "tmux-power";
620 rev = "16bbde801378a70512059541d104c5ae35be32b9";
621 hash = "sha256-IyYQyIONMnVBwhhcI3anOPxKpv2TfI2KZgJ5o5JtZ8I=";
622 };
623 meta = with lib; {
624 description = "Tmux powerline theme";
625 homepage = "https://github.com/wfxr/tmux-power";
626 license = licenses.mit;
627 platforms = platforms.unix;
628 };
629 };
630
631 prefix-highlight = mkTmuxPlugin {
632 pluginName = "prefix-highlight";
633 version = "unstable-2021-03-30";
634 src = fetchFromGitHub {
635 owner = "tmux-plugins";
636 repo = "tmux-prefix-highlight";
637 rev = "15acc6172300bc2eb13c81718dc53da6ae69de4f";
638 hash = "sha256-9LWRV0Hw8MmDwn5hWl3DrBuYUqBjLCO02K9bbx11MyM=";
639 };
640 };
641
642 resurrect = mkTmuxPlugin {
643 pluginName = "resurrect";
644 version = "unstable-2022-05-01";
645 src = fetchFromGitHub {
646 owner = "tmux-plugins";
647 repo = "tmux-resurrect";
648 rev = "ca6468e2deef11efadfe3a62832ae67742505432";
649 hash = "sha256-wl9/5XvFq+AjV8CwYgIZjPOE0/kIuEYBNQqNDidjNFo=";
650 fetchSubmodules = true;
651 };
652 meta = {
653 homepage = "https://github.com/tmux-plugins/tmux-resurrect";
654 description = "Restore tmux environment after system restart";
655 longDescription = ''
656 This plugin goes to great lengths to save and restore all the details
657 from your tmux environment. Here's what's been taken care of:
658
659 * all sessions, windows, panes and their order
660 * current working directory for each pane
661 * exact pane layouts within windows (even when zoomed)
662 * active and alternative session
663 * active and alternative window for each session
664 * windows with focus
665 * active pane for each window
666 * "grouped sessions" (useful feature when using tmux with multiple monitors)
667 * programs running within a pane! More details in the restoring programs doc.
668
669 Optional:
670 * restoring vim and neovim sessions
671 * restoring pane contents
672 '';
673 license = lib.licenses.mit;
674 platforms = lib.platforms.unix;
675 maintainers = with lib.maintainers; [ ronanmacf ];
676 };
677 };
678
679 rose-pine = mkTmuxPlugin {
680 pluginName = "rose-pine";
681 version = "unstable-2024-01-08";
682 rtpFilePath = "rose-pine.tmux";
683 src = fetchFromGitHub {
684 owner = "rose-pine";
685 repo = "tmux";
686 rev = "dd6d01338ac4afeb96542dcf24e4a7fe179b69e6";
687 hash = "sha256-Tccb4VjdotOSw7flJV4N0H4557NxRhXiCecZBPU9ICQ=";
688 };
689 meta = {
690 homepage = "https://github.com/rose-pine/tmux";
691 description = "Rosé Pine theme for tmux";
692 license = lib.licenses.mit;
693 };
694 };
695
696 sensible = mkTmuxPlugin {
697 pluginName = "sensible";
698 version = "unstable-2022-08-14";
699 src = fetchFromGitHub {
700 owner = "tmux-plugins";
701 repo = "tmux-sensible";
702 rev = "25cb91f42d020f675bb0a2ce3fbd3a5d96119efa";
703 hash = "sha256-sw9g1Yzmv2fdZFLJSGhx1tatQ+TtjDYNZI5uny0+5Hg=";
704 };
705 postInstall = lib.optionalString stdenv.hostPlatform.isDarwin ''
706 sed -e 's:reattach-to-user-namespace:${pkgs.reattach-to-user-namespace}/bin/reattach-to-user-namespace:g' -i $target/sensible.tmux
707 '';
708 };
709
710 session-wizard = mkTmuxPlugin rec {
711 pluginName = "session-wizard";
712 rtpFilePath = "session-wizard.tmux";
713 version = "1.4.0";
714 src = pkgs.fetchFromGitHub {
715 owner = "27medkamal";
716 repo = "tmux-session-wizard";
717 rev = "V${version}";
718 hash = "sha256-mLpZQSo8nildawsPxGwkcETNwlRq6O1pfy/VusMNMaw=";
719 };
720 meta = with lib; {
721 homepage = "https://github.com/27medkamal/tmux-session-wizard";
722 description = "Tmux plugin for creating and switching between sessions based on recently accessed directories";
723 longDescription = ''
724 Session Wizard is using fzf and zoxide to do all the magic. Features:
725 * Creating a new session from a list of recently accessed directories
726 * Naming a session after a folder/project
727 * Switching sessions
728 * Viewing current or creating new sessions in one popup
729 '';
730 license = licenses.mit;
731 platforms = platforms.unix;
732 maintainers = with maintainers; [ mandos ];
733 };
734 nativeBuildInputs = [ pkgs.makeWrapper ];
735 postInstall = ''
736 for f in .gitignore Dockerfile flake.* scripts tests; do
737 rm -rf $target/$f
738 done
739 substituteInPlace $target/session-wizard.tmux --replace \$CURRENT_DIR $target
740 wrapProgram $target/bin/t \
741 --prefix PATH : ${
742 with pkgs;
743 lib.makeBinPath ([
744 fzf
745 zoxide
746 coreutils
747 gnugrep
748 gnused
749 ])
750 }
751 '';
752 };
753
754 sessionist = mkTmuxPlugin {
755 pluginName = "sessionist";
756 version = "unstable-2017-12-03";
757 src = fetchFromGitHub {
758 owner = "tmux-plugins";
759 repo = "tmux-sessionist";
760 rev = "09ec86be38eae98ffc27bd0dde605ed10ae0dc89";
761 hash = "sha256-hFNrdbhmBUAyJ73RCG4RILzJ3LHIYiuNYGsqJGsVGAw=";
762 };
763 };
764
765 sidebar = mkTmuxPlugin {
766 pluginName = "sidebar";
767 version = "unstable-2018-11-30";
768 src = fetchFromGitHub {
769 owner = "tmux-plugins";
770 repo = "tmux-sidebar";
771 rev = "aacbdb45bc5ab69db448a72de4155d0b8dbac677";
772 hash = "sha256-7MCouewjpTCMGmWMaTWWQevlR0LrLTBjXGumsNcH6a4=";
773 };
774 };
775
776 sysstat = mkTmuxPlugin {
777 pluginName = "sysstat";
778 version = "unstable-2017-12-12";
779 src = fetchFromGitHub {
780 owner = "samoshkin";
781 repo = "tmux-plugin-sysstat";
782 rev = "29e150f403151f2341f3abcb2b2487a5f011dd23";
783 hash = "sha256-2EMSV6z9FZHq20dkPna0qELSVIOIAnOHpiCLbG7adQQ=";
784 };
785 };
786
787 tilish = mkTmuxPlugin {
788 pluginName = "tilish";
789 version = "unstable-2023-09-20";
790 src = fetchFromGitHub {
791 owner = "jabirali";
792 repo = "tmux-tilish";
793 rev = "22f7920837d827dc6cb31143ea916afa677c24c1";
794 hash = "sha256-wP3c+p/DM6ve7GUhi0QEzggct7NS4XUa78sVQFSKrfo=";
795 };
796
797 meta = with lib; {
798 homepage = "https://github.com/jabirali/tmux-tilish";
799 description = "Plugin which makes tmux work and feel like i3wm";
800 license = licenses.mit;
801 platforms = platforms.unix;
802 maintainers = with maintainers; [ arnarg ];
803 };
804 };
805
806 tokyo-night-tmux = mkTmuxPlugin {
807 pluginName = "tokyo-night-tmux";
808 rtpFilePath = "tokyo-night.tmux";
809 version = "1.5.3";
810 src = pkgs.fetchFromGitHub {
811 owner = "janoamaral";
812 repo = "tokyo-night-tmux";
813 rev = "d34f1487b4a644b13d8b2e9a2ee854ae62cc8d0e";
814 hash = "sha256-3rMYYzzSS2jaAMLjcQoKreE0oo4VWF9dZgDtABCUOtY=";
815 };
816 meta = with lib; {
817 homepage = "https://github.com/janoamaral/tokyo-night-tmux";
818 description = "Clean, dark Tmux theme that celebrates the lights of Downtown Tokyo at night";
819 license = licenses.mit;
820 platforms = platforms.unix;
821 maintainers = with maintainers; [ redyf ];
822 };
823 };
824
825 tmux-colors-solarized = mkTmuxPlugin {
826 pluginName = "tmuxcolors";
827 version = "unstable-2019-07-14";
828 src = fetchFromGitHub {
829 owner = "seebi";
830 repo = "tmux-colors-solarized";
831 rev = "e5e7b4f1af37f8f3fc81ca17eadee5ae5d82cd09";
832 hash = "sha256-nVA4fkmxf8he3lxG6P0sASvH6HlSt8dKGovEv5RAcdA=";
833 };
834 };
835
836 tmux-floax = mkTmuxPlugin {
837 pluginName = "tmux-floax";
838 rtpFilePath = "floax.tmux";
839 version = "0-unstable-2024-07-24";
840 src = fetchFromGitHub {
841 owner = "omerxx";
842 repo = "tmux-floax";
843 rev = "46c0a6a8c3cf79b83d1b338f547acbbd1d306301";
844 hash = "sha256-bALZfVWcoAzcTeWwkBHhi7TzUQJicOBTNdeJh3O/Bj8=";
845 };
846 meta = {
847 description = "Floating pane for Tmux";
848 homepage = "https://github.com/omerxx/tmux-floax";
849 license = lib.licenses.gpl3Only;
850 maintainers = with lib.maintainers; [ redyf ];
851 mainProgram = "tmux-floax";
852 platforms = lib.platforms.all;
853 };
854 };
855
856 tmux-fzf = mkTmuxPlugin {
857 pluginName = "tmux-fzf";
858 rtpFilePath = "main.tmux";
859 version = "unstable-2023-10-24";
860 src = fetchFromGitHub {
861 owner = "sainnhe";
862 repo = "tmux-fzf";
863 rev = "d62b6865c0e7c956ad1f0396823a6f34cf7452a7";
864 hash = "sha256-hVkSQYvBXrkXbKc98V9hwwvFp6z7/mX1K4N3N9j4NN4=";
865 };
866 postInstall = ''
867 find $target -type f -print0 | xargs -0 sed -i -e 's|fzf |${pkgs.fzf}/bin/fzf |g'
868 find $target -type f -print0 | xargs -0 sed -i -e 's|sed |${pkgs.gnused}/bin/sed |g'
869 find $target -type f -print0 | xargs -0 sed -i -e 's|tput |${pkgs.ncurses}/bin/tput |g'
870 '';
871 meta = {
872 homepage = "https://github.com/sainnhe/tmux-fzf";
873 description = "Use fzf to manage your tmux work environment! ";
874 longDescription = ''
875 Features:
876 * Manage sessions (attach, detach*, rename, kill*).
877 * Manage windows (switch, link, move, swap, rename, kill*).
878 * Manage panes (switch, break, join*, swap, layout, kill*, resize).
879 * Multiple selection (support for actions marked by *).
880 * Search commands and append to command prompt.
881 * Search key bindings and execute.
882 * User menu.
883 * Popup window support.
884 '';
885 license = lib.licenses.mit;
886 platforms = lib.platforms.unix;
887 maintainers = with lib.maintainers; [ kyleondy ];
888 };
889 };
890
891 tmux-powerline = mkTmuxPlugin {
892 pluginName = "powerline";
893 version = "3.0.0";
894 src = fetchFromGitHub {
895 owner = "erikw";
896 repo = "tmux-powerline";
897 rev = "2480e5531e0027e49a90eaf540f973e624443937";
898 hash = "sha256-25uG7OI8OHkdZ3GrTxG1ETNeDtW1K+sHu2DfJtVHVbk=";
899 };
900 rtpFilePath = "main.tmux";
901 meta = {
902 homepage = "https://github.com/erikw/tmux-powerline";
903 description = "Empowering your tmux (status bar) experience";
904 longDescription = "A tmux plugin giving you a hackable status bar consisting of dynamic & beautiful looking powerline segments, written purely in bash.";
905 license = lib.licenses.bsd3;
906 platforms = lib.platforms.unix;
907 maintainers = with lib.maintainers; [ thomasjm ];
908 };
909 };
910
911 tmux-sessionx = mkTmuxPlugin {
912 pluginName = "sessionx";
913 version = "0-unstable-2024-09-22";
914 src = fetchFromGitHub {
915 owner = "omerxx";
916 repo = "tmux-sessionx";
917 rev = "508359b8a6e2e242a9270292160624406be3bbca";
918 hash = "sha256-nbzn3qxMGRzxFnLBVrjqGl09++9YOK4QrLoYiHUS9jY=";
919 };
920 nativeBuildInputs = [ pkgs.makeWrapper ];
921 postPatch = ''
922 substituteInPlace sessionx.tmux \
923 --replace-fail "\$CURRENT_DIR/scripts/sessionx.sh" "$out/share/tmux-plugins/sessionx/scripts/sessionx.sh"
924 substituteInPlace scripts/sessionx.sh \
925 --replace-fail "/tmux-sessionx/scripts/preview.sh" "$out/share/tmux-plugins/sessionx/scripts/preview.sh"
926 substituteInPlace scripts/sessionx.sh \
927 --replace-fail "/tmux-sessionx/scripts/reload_sessions.sh" "$out/share/tmux-plugins/sessionx/scripts/reload_sessions.sh"
928 '';
929 postInstall = ''
930 chmod +x $target/scripts/sessionx.sh
931 wrapProgram $target/scripts/sessionx.sh \
932 --prefix PATH : ${
933 with pkgs;
934 lib.makeBinPath [
935 zoxide
936 fzf
937 gnugrep
938 gnused
939 coreutils
940 ]
941 }
942 chmod +x $target/scripts/preview.sh
943 wrapProgram $target/scripts/preview.sh \
944 --prefix PATH : ${
945 with pkgs;
946 lib.makeBinPath [
947 coreutils
948 gnugrep
949 gnused
950 ]
951 }
952 chmod +x $target/scripts/reload_sessions.sh
953 wrapProgram $target/scripts/reload_sessions.sh \
954 --prefix PATH : ${
955 with pkgs;
956 lib.makeBinPath [
957 coreutils
958 gnugrep
959 gnused
960 ]
961 }
962 '';
963 meta = {
964 description = "Tmux session manager, with preview, fuzzy finding, and MORE";
965 homepage = "https://github.com/omerxx/tmux-sessionx";
966 license = lib.licenses.gpl3Only;
967 maintainers = with lib.maintainers; [ okwilkins ];
968 platforms = lib.platforms.all;
969 };
970 };
971
972 tmux-thumbs = pkgs.callPackage ./tmux-thumbs {
973 inherit mkTmuxPlugin;
974 };
975
976 t-smart-tmux-session-manager = mkTmuxPlugin rec {
977 pluginName = "t-smart-tmux-session-manager";
978 version = "2.8.0";
979 rtpFilePath = "t-smart-tmux-session-manager.tmux";
980 src = pkgs.fetchFromGitHub {
981 owner = "joshmedeski";
982 repo = "t-smart-tmux-session-manager";
983 rev = "v${version}";
984 hash = "sha256-EMDEEIWJ+XFOk0WsQPAwj9BFBVDNwFUCyd1ScceqKpc=";
985 };
986 nativeBuildInputs = [ pkgs.makeWrapper ];
987 postInstall = ''
988 wrapProgram $out/share/tmux-plugins/t-smart-tmux-session-manager/bin/t \
989 --prefix PATH : ${
990 with pkgs;
991 lib.makeBinPath ([
992 pkgs.fzf
993 pkgs.zoxide
994 ])
995 }
996
997 find $target -type f -print0 | xargs -0 sed -i -e 's|fzf |${pkgs.fzf}/bin/fzf |g'
998 find $target -type f -print0 | xargs -0 sed -i -e 's|zoxide |${pkgs.zoxide}/bin/zoxide |g'
999 '';
1000 };
1001
1002 urlview = mkTmuxPlugin {
1003 pluginName = "urlview";
1004 version = "unstable-2016-01-06";
1005 src = fetchFromGitHub {
1006 owner = "tmux-plugins";
1007 repo = "tmux-urlview";
1008 rev = "b84c876cffdd22990b4ab51247e795cbd7813d53";
1009 hash = "sha256-1oEJDgHPIM6AEVlGcavRqP2YjPdmkxHHMiFYdgqW5Mo=";
1010 };
1011 postInstall = ''
1012 sed -i -e '14,20{s|extract_url|${pkgs.extract_url}/bin/extract_url|g}' $target/urlview.tmux
1013 '';
1014 };
1015
1016 vim-tmux-focus-events = mkTmuxPlugin {
1017 pluginName = "vim-tmux-focus-events";
1018 version = "unstable-2020-10-05";
1019 src = fetchFromGitHub {
1020 owner = "tmux-plugins";
1021 repo = "vim-tmux-focus-events";
1022 rev = "a568192ca0de4ca0bd7b3cd0249aad491625c941";
1023 hash = "sha256-ITZMu2q80deOf0zqgYJDDgWQHWhJEzZlK6lVFPY4FIw=";
1024 };
1025
1026 meta = with lib; {
1027 homepage = "https://github.com/tmux-plugins/vim-tmux-focus-events";
1028 description = "Makes FocusGained and FocusLost autocommand events work in vim when using tmux";
1029 license = licenses.mit;
1030 platforms = platforms.unix;
1031 maintainers = with maintainers; [ ronanmacf ];
1032 };
1033 };
1034
1035 vim-tmux-navigator = mkTmuxPlugin {
1036 pluginName = "vim-tmux-navigator";
1037 rtpFilePath = "vim-tmux-navigator.tmux";
1038 version = "unstable-2025-04-25";
1039 src = fetchFromGitHub {
1040 owner = "christoomey";
1041 repo = "vim-tmux-navigator";
1042 rev = "33afa80db65113561dc53fa732b7f5e53d5ecfd0";
1043 hash = "sha256-h3c5ki8N4kiNzbgjxHwLh625un6GqbLZv/4dPVW3vCI=";
1044 };
1045 };
1046
1047 weather = mkTmuxPlugin {
1048 pluginName = "weather";
1049 rtpFilePath = "tmux-weather.tmux";
1050 version = "unstable-2020-02-08";
1051 src = fetchFromGitHub {
1052 owner = "xamut";
1053 repo = "tmux-weather";
1054 rev = "28a5fbe75bb25a408193d454304e28ddd75e9338";
1055 hash = "sha256-of9E/npEsF1JVc9ttwrbC5WkIAwCNBJAgTfExfj79i4=";
1056 };
1057
1058 meta = with lib; {
1059 homepage = "https://github.com/xamut/tmux-weather";
1060 description = "Shows weather in the status line";
1061 license = licenses.mit;
1062 platforms = platforms.unix;
1063 maintainers = with maintainers; [ jfvillablanca ];
1064 };
1065 };
1066
1067 tmux-which-key = pkgs.callPackage ./tmux-which-key {
1068 inherit mkTmuxPlugin;
1069 };
1070
1071 yank = mkTmuxPlugin {
1072 pluginName = "yank";
1073 version = "unstable-2023-07-19";
1074 src = fetchFromGitHub {
1075 owner = "tmux-plugins";
1076 repo = "tmux-yank";
1077 rev = "acfd36e4fcba99f8310a7dfb432111c242fe7392";
1078 hash = "sha256-/5HPaoOx2U2d8lZZJo5dKmemu6hKgHJYq23hxkddXpA=";
1079 };
1080 };
1081
1082 tmux-nova = mkTmuxPlugin rec {
1083 pluginName = "tmux-nova";
1084 rtpFilePath = "nova.tmux";
1085 version = "1.2.0";
1086 src = fetchFromGitHub {
1087 owner = "o0th";
1088 repo = "tmux-nova";
1089 rev = "v${version}";
1090 hash = "sha256-0LIql8as2+OendEHVqR0F3pmQTxC1oqapwhxT+34lJo=";
1091 };
1092 meta = with lib; {
1093 homepage = "https://github.com/o0th/tmux-nova";
1094 description = "Tmux-nova theme";
1095 license = licenses.mit;
1096 platforms = platforms.unix;
1097 maintainers = with maintainers; [ o0th ];
1098 };
1099 };
1100
1101 tmux-toggle-popup = mkTmuxPlugin rec {
1102 pluginName = "tmux-toggle-popup";
1103 rtpFilePath = "toggle-popup.tmux";
1104 version = "0.4.2";
1105 src = fetchFromGitHub {
1106 owner = "loichyan";
1107 repo = "tmux-toggle-popup";
1108 tag = "v${version}";
1109 hash = "sha256-dlCUK+yrBkY0DnKoj/s9dJ6yITBMfWMgw3wnwzuxim4=";
1110 };
1111 meta = with lib; {
1112 homepage = "https://github.com/loichyan/tmux-toggle-popup";
1113 description = "Handy plugin to create toggleable popups";
1114 license = licenses.mit;
1115 platforms = platforms.unix;
1116 maintainers = with maintainers; [ szaffarano ];
1117 };
1118 };
1119}
1120// lib.optionalAttrs config.allowAliases {
1121 mkDerivation = throw "tmuxPlugins.mkDerivation is deprecated, use tmuxPlugins.mkTmuxPlugin instead"; # added 2021-03-14
1122}