mirror of
https://github.com/NNTmux/newznab-tmux.git
synced 2026-08-28 17:01:16 +00:00
Update tmux panes
This commit is contained in:
@@ -6,6 +6,8 @@ use App\Models\Settings;
|
||||
|
||||
/**
|
||||
* Service for building tmux window layouts based on sequential mode
|
||||
*
|
||||
* Uses Nerd Font icons for pane names to provide a modern visual experience.
|
||||
*/
|
||||
class TmuxLayoutBuilder
|
||||
{
|
||||
@@ -15,6 +17,43 @@ class TmuxLayoutBuilder
|
||||
|
||||
protected string $sessionName;
|
||||
|
||||
/**
|
||||
* Pane name icons mapping - uses Nerd Font symbols
|
||||
* Requires a Nerd Font to display properly (FiraCode NF, JetBrains Mono NF, etc.)
|
||||
*/
|
||||
protected array $paneIcons = [
|
||||
// Core processing
|
||||
'Monitor' => ' Monitor',
|
||||
'update_binaries' => ' Binaries',
|
||||
'backfill' => ' Backfill',
|
||||
'update_releases' => ' Releases',
|
||||
'sequential' => ' Sequential',
|
||||
|
||||
// Utilities
|
||||
'fixReleaseNames' => ' Fix Names',
|
||||
'removeCrapReleases' => ' Remove Crap',
|
||||
|
||||
// Postprocessing
|
||||
'postprocessing_additional' => ' Additional',
|
||||
'postprocessing_tv' => ' TV/Anime',
|
||||
'postprocessing_amazon' => ' Amazon',
|
||||
'postprocessing_movies' => ' Movies',
|
||||
'postprocessing_xxx' => ' XXX',
|
||||
|
||||
// IRC
|
||||
'scrapeIRC' => ' IRC Scraper',
|
||||
|
||||
// Monitoring tools
|
||||
'htop' => ' htop',
|
||||
'nmon' => ' nmon',
|
||||
'vnstat' => ' vnstat',
|
||||
'tcptrack' => ' tcptrack',
|
||||
'bwm-ng' => ' bwm-ng',
|
||||
'mytop' => ' mytop',
|
||||
'redis' => ' Redis',
|
||||
'bash' => ' Console',
|
||||
];
|
||||
|
||||
public function __construct(TmuxSessionManager $sessionManager)
|
||||
{
|
||||
$this->sessionManager = $sessionManager;
|
||||
@@ -22,6 +61,14 @@ class TmuxLayoutBuilder
|
||||
$this->paneManager = new TmuxPaneManager($this->sessionName);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the display name with icon for a pane
|
||||
*/
|
||||
protected function getPaneDisplayName(string $name): string
|
||||
{
|
||||
return $this->paneIcons[$name] ?? $name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Build the appropriate layout based on sequential mode
|
||||
*/
|
||||
@@ -40,43 +87,43 @@ class TmuxLayoutBuilder
|
||||
protected function buildFullLayout(): bool
|
||||
{
|
||||
// Window 0: Monitor + Binaries + Backfill + Releases
|
||||
if (! $this->sessionManager->createSession('Monitor')) {
|
||||
if (! $this->sessionManager->createSession($this->getPaneDisplayName('Monitor'))) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Select pane 0.0, then split for binaries (right side, 67%)
|
||||
$this->paneManager->selectPane('0.0');
|
||||
$this->paneManager->splitHorizontal('0', '67%', 'update_binaries');
|
||||
$this->paneManager->splitHorizontal('0', '67%', $this->getPaneDisplayName('update_binaries'));
|
||||
|
||||
// Select pane 0.1 (binaries), then split for backfill (bottom, 67%)
|
||||
$this->paneManager->selectPane('0.1');
|
||||
$this->paneManager->splitVertical('0', '67%', 'backfill');
|
||||
$this->paneManager->splitVertical('0', '67%', $this->getPaneDisplayName('backfill'));
|
||||
|
||||
// Split again for releases (bottom, 50%)
|
||||
$this->paneManager->splitVertical('0', '50%', 'update_releases');
|
||||
$this->paneManager->splitVertical('0', '50%', $this->getPaneDisplayName('update_releases'));
|
||||
|
||||
// Window 1: Fix names + Remove crap
|
||||
$this->paneManager->createWindow(1, 'utils');
|
||||
$this->paneManager->setPaneTitle('1.0', 'fixReleaseNames');
|
||||
$this->paneManager->createWindow(1, ' Utils');
|
||||
$this->paneManager->setPaneTitle('1.0', $this->getPaneDisplayName('fixReleaseNames'));
|
||||
$this->paneManager->selectPane('1.0');
|
||||
$this->paneManager->splitHorizontal('1', '50%', 'removeCrapReleases');
|
||||
$this->paneManager->splitHorizontal('1', '50%', $this->getPaneDisplayName('removeCrapReleases'));
|
||||
|
||||
// Window 2: Postprocessing (Left: Additional + TV + Amazon, Right: Movies + XXX)
|
||||
$this->paneManager->createWindow(2, 'post');
|
||||
$this->paneManager->setPaneTitle('2.0', 'postprocessing_additional');
|
||||
$this->paneManager->createWindow(2, ' Post');
|
||||
$this->paneManager->setPaneTitle('2.0', $this->getPaneDisplayName('postprocessing_additional'));
|
||||
|
||||
// Split horizontally to create left and right halves (don't set title yet)
|
||||
$this->paneManager->splitHorizontal('2', '50%', '');
|
||||
|
||||
// Left side (2.0): split vertically for TV and Amazon
|
||||
$this->paneManager->selectPane('2.0');
|
||||
$this->paneManager->splitVertical('2', '67%', 'postprocessing_tv');
|
||||
$this->paneManager->splitVertical('2', '50%', 'postprocessing_amazon');
|
||||
$this->paneManager->splitVertical('2', '67%', $this->getPaneDisplayName('postprocessing_tv'));
|
||||
$this->paneManager->splitVertical('2', '50%', $this->getPaneDisplayName('postprocessing_amazon'));
|
||||
|
||||
// Right side: After left splits, right side is now 2.3
|
||||
$this->paneManager->selectPane('2.3');
|
||||
$this->paneManager->setPaneTitle('2.3', 'postprocessing_movies');
|
||||
$this->paneManager->splitVertical('2', '50%', 'postprocessing_xxx');
|
||||
$this->paneManager->setPaneTitle('2.3', $this->getPaneDisplayName('postprocessing_movies'));
|
||||
$this->paneManager->splitVertical('2', '50%', $this->getPaneDisplayName('postprocessing_xxx'));
|
||||
|
||||
// Window 3: IRC Scraper
|
||||
$this->createIRCScraperWindow();
|
||||
@@ -93,36 +140,36 @@ class TmuxLayoutBuilder
|
||||
protected function buildBasicLayout(): bool
|
||||
{
|
||||
// Window 0: Monitor + Releases
|
||||
if (! $this->sessionManager->createSession('Monitor')) {
|
||||
if (! $this->sessionManager->createSession($this->getPaneDisplayName('Monitor'))) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Select pane 0.0, then split for releases
|
||||
$this->paneManager->selectPane('0.0');
|
||||
$this->paneManager->splitHorizontal('0', '67%', 'update_releases');
|
||||
$this->paneManager->splitHorizontal('0', '67%', $this->getPaneDisplayName('update_releases'));
|
||||
|
||||
// Window 1: Utils (Fix names + Remove crap)
|
||||
$this->paneManager->createWindow(1, 'utils');
|
||||
$this->paneManager->setPaneTitle('1.0', 'fixReleaseNames');
|
||||
$this->paneManager->createWindow(1, ' Utils');
|
||||
$this->paneManager->setPaneTitle('1.0', $this->getPaneDisplayName('fixReleaseNames'));
|
||||
$this->paneManager->selectPane('1.0');
|
||||
$this->paneManager->splitHorizontal('1', '50%', 'removeCrapReleases');
|
||||
$this->paneManager->splitHorizontal('1', '50%', $this->getPaneDisplayName('removeCrapReleases'));
|
||||
|
||||
// Window 2: Postprocessing (Left: Additional + TV + Amazon, Right: Movies + XXX)
|
||||
$this->paneManager->createWindow(2, 'post');
|
||||
$this->paneManager->setPaneTitle('2.0', 'postprocessing_additional');
|
||||
$this->paneManager->createWindow(2, ' Post');
|
||||
$this->paneManager->setPaneTitle('2.0', $this->getPaneDisplayName('postprocessing_additional'));
|
||||
|
||||
// Split horizontally to create left and right halves (don't set title yet)
|
||||
$this->paneManager->splitHorizontal('2', '50%', '');
|
||||
|
||||
// Left side (2.0): split vertically for TV and Amazon
|
||||
$this->paneManager->selectPane('2.0');
|
||||
$this->paneManager->splitVertical('2', '67%', 'postprocessing_tv');
|
||||
$this->paneManager->splitVertical('2', '50%', 'postprocessing_amazon');
|
||||
$this->paneManager->splitVertical('2', '67%', $this->getPaneDisplayName('postprocessing_tv'));
|
||||
$this->paneManager->splitVertical('2', '50%', $this->getPaneDisplayName('postprocessing_amazon'));
|
||||
|
||||
// Right side: After left splits, right side is now 2.3
|
||||
$this->paneManager->selectPane('2.3');
|
||||
$this->paneManager->setPaneTitle('2.3', 'postprocessing_movies');
|
||||
$this->paneManager->splitVertical('2', '50%', 'postprocessing_xxx');
|
||||
$this->paneManager->setPaneTitle('2.3', $this->getPaneDisplayName('postprocessing_movies'));
|
||||
$this->paneManager->splitVertical('2', '50%', $this->getPaneDisplayName('postprocessing_xxx'));
|
||||
|
||||
// Window 3: IRC Scraper
|
||||
$this->createIRCScraperWindow();
|
||||
@@ -138,19 +185,19 @@ class TmuxLayoutBuilder
|
||||
protected function buildStrippedLayout(): bool
|
||||
{
|
||||
// Window 0: Monitor + Sequential
|
||||
if (! $this->sessionManager->createSession('Monitor')) {
|
||||
if (! $this->sessionManager->createSession($this->getPaneDisplayName('Monitor'))) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Select pane 0.0, then split for sequential
|
||||
$this->paneManager->selectPane('0.0');
|
||||
$this->paneManager->splitHorizontal('0', '67%', 'sequential');
|
||||
$this->paneManager->splitHorizontal('0', '67%', $this->getPaneDisplayName('sequential'));
|
||||
|
||||
// Window 1: Amazon postprocessing
|
||||
$this->paneManager->createWindow(1, 'utils');
|
||||
$this->paneManager->setPaneTitle('1.0', 'fixReleaseNames');
|
||||
$this->paneManager->createWindow(1, ' Utils');
|
||||
$this->paneManager->setPaneTitle('1.0', $this->getPaneDisplayName('fixReleaseNames'));
|
||||
$this->paneManager->selectPane('1.0');
|
||||
$this->paneManager->splitHorizontal('1', '50%', 'postprocessing_amazon');
|
||||
$this->paneManager->splitHorizontal('1', '50%', $this->getPaneDisplayName('postprocessing_amazon'));
|
||||
|
||||
// Window 2: IRC Scraper
|
||||
$this->createIRCScraperWindow();
|
||||
@@ -165,8 +212,8 @@ class TmuxLayoutBuilder
|
||||
*/
|
||||
protected function createIRCScraperWindow(): bool
|
||||
{
|
||||
$this->paneManager->createWindow(3, 'IRCScraper');
|
||||
$this->paneManager->setPaneTitle('3.0', 'scrapeIRC');
|
||||
$this->paneManager->createWindow(3, ' IRC');
|
||||
$this->paneManager->setPaneTitle('3.0', $this->getPaneDisplayName('scrapeIRC'));
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -190,14 +237,14 @@ class TmuxLayoutBuilder
|
||||
|
||||
// htop
|
||||
if ((int) Settings::settingValue('htop') === 1 && $this->commandExists('htop')) {
|
||||
$this->paneManager->createWindow($windowIndex, 'htop');
|
||||
$this->paneManager->createWindow($windowIndex, $this->getPaneDisplayName('htop'));
|
||||
$this->paneManager->respawnPane("{$windowIndex}.0", 'htop');
|
||||
$windowIndex++;
|
||||
}
|
||||
|
||||
// nmon
|
||||
if ((int) Settings::settingValue('nmon') === 1 && $this->commandExists('nmon')) {
|
||||
$this->paneManager->createWindow($windowIndex, 'nmon');
|
||||
$this->paneManager->createWindow($windowIndex, $this->getPaneDisplayName('nmon'));
|
||||
$this->paneManager->respawnPane("{$windowIndex}.0", 'nmon -t');
|
||||
$windowIndex++;
|
||||
}
|
||||
@@ -205,7 +252,7 @@ class TmuxLayoutBuilder
|
||||
// vnstat
|
||||
if ((int) Settings::settingValue('vnstat') === 1 && $this->commandExists('vnstat')) {
|
||||
$vnstatArgs = Settings::settingValue('vnstat_args') ?? '';
|
||||
$this->paneManager->createWindow($windowIndex, 'vnstat');
|
||||
$this->paneManager->createWindow($windowIndex, $this->getPaneDisplayName('vnstat'));
|
||||
$this->paneManager->respawnPane("{$windowIndex}.0", "watch -n10 'vnstat {$vnstatArgs}'");
|
||||
$windowIndex++;
|
||||
}
|
||||
@@ -213,21 +260,21 @@ class TmuxLayoutBuilder
|
||||
// tcptrack
|
||||
if ((int) Settings::settingValue('tcptrack') === 1 && $this->commandExists('tcptrack')) {
|
||||
$tcptrackArgs = Settings::settingValue('tcptrack_args') ?? '';
|
||||
$this->paneManager->createWindow($windowIndex, 'tcptrack');
|
||||
$this->paneManager->createWindow($windowIndex, $this->getPaneDisplayName('tcptrack'));
|
||||
$this->paneManager->respawnPane("{$windowIndex}.0", "tcptrack {$tcptrackArgs}");
|
||||
$windowIndex++;
|
||||
}
|
||||
|
||||
// bwm-ng
|
||||
if ((int) Settings::settingValue('bwmng') === 1 && $this->commandExists('bwm-ng')) {
|
||||
$this->paneManager->createWindow($windowIndex, 'bwm-ng');
|
||||
$this->paneManager->createWindow($windowIndex, $this->getPaneDisplayName('bwm-ng'));
|
||||
$this->paneManager->respawnPane("{$windowIndex}.0", 'bwm-ng');
|
||||
$windowIndex++;
|
||||
}
|
||||
|
||||
// mytop
|
||||
if ((int) Settings::settingValue('mytop') === 1 && $this->commandExists('mytop')) {
|
||||
$this->paneManager->createWindow($windowIndex, 'mytop');
|
||||
$this->paneManager->createWindow($windowIndex, $this->getPaneDisplayName('mytop'));
|
||||
$this->paneManager->respawnPane("{$windowIndex}.0", 'mytop -u');
|
||||
$windowIndex++;
|
||||
}
|
||||
@@ -237,7 +284,7 @@ class TmuxLayoutBuilder
|
||||
$redisArgs = Settings::settingValue('redis_args') ?? '';
|
||||
$refreshInterval = 30;
|
||||
|
||||
$this->paneManager->createWindow($windowIndex, 'redis');
|
||||
$this->paneManager->createWindow($windowIndex, $this->getPaneDisplayName('redis'));
|
||||
|
||||
// Check if custom args provided for simple redis-cli output
|
||||
if (! empty($redisArgs) && $redisArgs !== 'NULL' && $this->commandExists('redis-cli')) {
|
||||
@@ -268,7 +315,7 @@ class TmuxLayoutBuilder
|
||||
|
||||
// bash console
|
||||
if ((int) Settings::settingValue('console') === 1) {
|
||||
$this->paneManager->createWindow($windowIndex, 'bash');
|
||||
$this->paneManager->createWindow($windowIndex, $this->getPaneDisplayName('bash'));
|
||||
$this->paneManager->respawnPane("{$windowIndex}.0", 'bash -i');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,8 +21,11 @@ class TmuxPaneManager
|
||||
*/
|
||||
public function createWindow(int $index, string $name): bool
|
||||
{
|
||||
// Escape single quotes in the name for shell
|
||||
$escapedName = str_replace("'", "'\\''", $name);
|
||||
|
||||
$result = Process::timeout(10)->run(
|
||||
"tmux new-window -t {$this->sessionName}:{$index} -n {$name} 'printf \"\\033]2;{$name}\\033\"'"
|
||||
"tmux new-window -t {$this->sessionName}:{$index} -n '{$escapedName}' 'printf \"\\033]2;{$escapedName}\\033\"'"
|
||||
);
|
||||
|
||||
return $result->successful();
|
||||
@@ -33,7 +36,9 @@ class TmuxPaneManager
|
||||
*/
|
||||
public function splitHorizontal(string $target, string $percentage, string $title = ''): bool
|
||||
{
|
||||
$titleCmd = $title ? "printf \"\\033]2;{$title}\\033\"" : '';
|
||||
// Escape single quotes in the title for shell
|
||||
$escapedTitle = str_replace("'", "'\\''", $title);
|
||||
$titleCmd = $title ? "printf \"\\033]2;{$escapedTitle}\\033\"" : '';
|
||||
|
||||
$result = Process::timeout(10)->run(
|
||||
"tmux splitw -t {$this->sessionName}:{$target} -h -l {$percentage} '{$titleCmd}'"
|
||||
@@ -47,7 +52,9 @@ class TmuxPaneManager
|
||||
*/
|
||||
public function splitVertical(string $target, string $percentage, string $title = ''): bool
|
||||
{
|
||||
$titleCmd = $title ? "printf \"\\033]2;{$title}\\033\"" : '';
|
||||
// Escape single quotes in the title for shell
|
||||
$escapedTitle = str_replace("'", "'\\''", $title);
|
||||
$titleCmd = $title ? "printf \"\\033]2;{$escapedTitle}\\033\"" : '';
|
||||
|
||||
$result = Process::timeout(10)->run(
|
||||
"tmux splitw -t {$this->sessionName}:{$target} -v -l {$percentage} '{$titleCmd}'"
|
||||
@@ -129,8 +136,11 @@ class TmuxPaneManager
|
||||
*/
|
||||
public function setPaneTitle(string $target, string $title): bool
|
||||
{
|
||||
// Escape single quotes in the title for shell
|
||||
$escapedTitle = str_replace("'", "'\\''", $title);
|
||||
|
||||
$result = Process::timeout(5)->run(
|
||||
"tmux select-pane -t {$this->sessionName}:{$target} -T '{$title}'"
|
||||
"tmux select-pane -t {$this->sessionName}:{$target} -T '{$escapedTitle}'"
|
||||
);
|
||||
|
||||
return $result->successful();
|
||||
|
||||
@@ -52,8 +52,11 @@ class TmuxSessionManager
|
||||
|
||||
$configOption = file_exists($this->configFile) ? "-f {$this->configFile}" : '';
|
||||
|
||||
// Escape single quotes in the window name for shell
|
||||
$escapedWindowName = str_replace("'", "'\\''", $windowName);
|
||||
|
||||
$result = Process::timeout(30)->run(
|
||||
"tmux {$configOption} new-session -d -s {$this->sessionName} -n {$windowName} 'printf \"\\033]2;{$windowName}\\033\"'"
|
||||
"tmux {$configOption} new-session -d -s {$this->sessionName} -n '{$escapedWindowName}' 'printf \"\\033]2;{$escapedWindowName}\\033\"'"
|
||||
);
|
||||
|
||||
return $result->successful();
|
||||
|
||||
+79
-32
@@ -1,6 +1,8 @@
|
||||
# NNTmux Tmux Configuration
|
||||
# This file is now managed in the config/ directory
|
||||
# Enhanced with modern styling and powerline fonts
|
||||
# ╭──────────────────────────────────────────────────────────────────────────────╮
|
||||
# │ NNTmux Tmux Configuration │
|
||||
# │ Modern styling with Nerd Font icons and Catppuccin-inspired colors │
|
||||
# │ Requires: Nerd Font (FiraCode, JetBrains Mono, etc.) │
|
||||
# ╰──────────────────────────────────────────────────────────────────────────────╯
|
||||
|
||||
# GNU-Screen compatible prefix
|
||||
set -g prefix2 C-a
|
||||
@@ -20,55 +22,82 @@ set -ga terminal-overrides ",xterm-256color:Tc"
|
||||
set-hook -g client-attached 'select-window -t 0; select-pane -t 0.0'
|
||||
|
||||
#==============================================================================
|
||||
# STATUS BAR - Modern Design with Powerline Symbols
|
||||
# 🎨 COLOR PALETTE - Catppuccin Mocha Inspired
|
||||
#==============================================================================
|
||||
|
||||
# Status bar colors
|
||||
set -g status-bg colour235
|
||||
set -g status-fg colour250
|
||||
# Base colors
|
||||
# bg_dark = colour234 (crust)
|
||||
# bg = colour235 (base)
|
||||
# bg_light = colour237 (surface0)
|
||||
# fg = colour255 (text)
|
||||
# fg_dim = colour250 (subtext0)
|
||||
# accent = colour75 (sapphire)
|
||||
# green = colour114 (green)
|
||||
# yellow = colour221 (yellow)
|
||||
# red = colour210 (red)
|
||||
# purple = colour141 (mauve)
|
||||
# pink = colour218 (pink)
|
||||
# peach = colour215 (peach)
|
||||
# teal = colour116 (teal)
|
||||
|
||||
#==============================================================================
|
||||
# 📊 STATUS BAR - Modern Glassmorphism Style
|
||||
#==============================================================================
|
||||
|
||||
# Status bar colors - darker base for contrast
|
||||
set -g status-bg colour234
|
||||
set -g status-fg colour255
|
||||
|
||||
# Status bar positioning and update interval
|
||||
set -g status-position bottom
|
||||
set -g status-interval 5
|
||||
set -g status-justify left
|
||||
|
||||
# Left status - Session name with powerline arrow
|
||||
set -g status-left-length 40
|
||||
set -g status-left "#[fg=colour234,bg=colour39,bold] ❐ #S #[fg=colour39,bg=colour235,nobold]"
|
||||
# Left status - Session name with rounded powerline and icon
|
||||
set -g status-left-length 50
|
||||
set -g status-left "#[fg=colour234,bg=colour75,bold] #S #[fg=colour75,bg=colour237]#[fg=colour255,bg=colour237] #{session_windows} #[fg=colour237,bg=colour234]"
|
||||
|
||||
# Right status - System info with powerline style
|
||||
set -g status-right-length 150
|
||||
set -g status-right "#[fg=colour238,bg=colour235]#[fg=colour250,bg=colour238] #(free -h | grep 'Mem' | awk '{print \" \"$3\"/\"$2}') #[fg=colour244,bg=colour238]#[fg=colour250,bg=colour244] #(uptime | cut -d',' -f 3- | sed 's/^ *//;s/ load//')#[fg=colour39,bg=colour244]#[fg=colour234,bg=colour39,bold] %H:%M %d-%b-%y "
|
||||
# Right status - System info with modern icons
|
||||
# Shows: RAM | Current Load | Avg Load (5m) | Uptime | Time | Date
|
||||
set -g status-right-length 200
|
||||
set -g status-right "#[fg=colour237,bg=colour234]#[fg=colour116,bg=colour237] #(free -h | grep 'Mem' | awk '{print $3\"/\"$2}') #[fg=colour238,bg=colour237]│#[fg=colour221,bg=colour237] #(cat /proc/loadavg | awk '{print $1}') #[fg=colour238,bg=colour237]│#[fg=colour215,bg=colour237] #(cat /proc/loadavg | awk '{print $2}') #[fg=colour238,bg=colour237]│#[fg=colour114,bg=colour237] #(uptime -p | sed 's/up //' | sed 's/,.*//') #[fg=colour75,bg=colour237]#[fg=colour234,bg=colour75,bold] %H:%M %d %b "
|
||||
|
||||
# Window status format
|
||||
setw -g window-status-format "#[fg=colour244,bg=colour235] #I:#W "
|
||||
setw -g window-status-current-format "#[fg=colour235,bg=colour39]#[fg=colour234,bg=colour39,bold] #I:#W #[fg=colour39,bg=colour235,nobold]"
|
||||
# Window status format - inactive windows
|
||||
setw -g window-status-format "#[fg=colour234,bg=colour236]#[fg=colour250,bg=colour236] #I #W #[fg=colour236,bg=colour234]"
|
||||
|
||||
# Window status format - active window with accent color
|
||||
setw -g window-status-current-format "#[fg=colour234,bg=colour75]#[fg=colour234,bg=colour75,bold] #I #W #[fg=colour75,bg=colour234]"
|
||||
|
||||
# Window status separator
|
||||
setw -g window-status-separator ""
|
||||
setw -g window-status-separator " "
|
||||
|
||||
#==============================================================================
|
||||
# PANE BORDERS - Modern rounded style
|
||||
# 🔲 PANE BORDERS - Modern Rounded Style with Icons
|
||||
#==============================================================================
|
||||
|
||||
# Pane border colors
|
||||
# Use rounded corners for pane borders (requires font with box-drawing chars)
|
||||
set -g pane-border-lines heavy
|
||||
|
||||
# Pane border colors - subtle inactive, vibrant active
|
||||
set -g pane-border-style fg=colour238
|
||||
set -g pane-active-border-style fg=colour39
|
||||
set -g pane-active-border-style fg=colour75
|
||||
|
||||
# Pane border format (requires tmux 3.2+)
|
||||
set -g pane-border-format "#{?pane_active,#[fg=colour39]#[bg=colour235],#[fg=colour238]#[bg=colour235]} #{pane_index} #{pane_title} "
|
||||
# Pane border format with status indicator and icons (requires tmux 3.2+)
|
||||
set -g pane-border-format "#{?pane_active,#[fg=colour75]#[bg=colour235] ,#[fg=colour245]#[bg=colour235] }#[bold]#{pane_index}#[nobold] │ #{pane_title} #{?pane_active,#[fg=colour114]●,#[fg=colour238]○} "
|
||||
set -g pane-border-status top
|
||||
|
||||
#==============================================================================
|
||||
# MESSAGE STYLING
|
||||
# 💬 MESSAGE STYLING
|
||||
#==============================================================================
|
||||
|
||||
# Command message styling
|
||||
set -g message-style bg=colour39,fg=colour234,bold
|
||||
set -g message-command-style bg=colour238,fg=colour250
|
||||
# Command message styling - accent color with bold
|
||||
set -g message-style bg=colour75,fg=colour234,bold
|
||||
|
||||
# Command prompt styling
|
||||
set -g message-command-style bg=colour237,fg=colour255
|
||||
|
||||
#==============================================================================
|
||||
# WINDOW OPTIONS
|
||||
# 🪟 WINDOW OPTIONS
|
||||
#==============================================================================
|
||||
|
||||
# Constrain window size to the maximum size of any client connected to that window
|
||||
@@ -78,11 +107,21 @@ setw -g aggressive-resize on
|
||||
setw -g monitor-activity on
|
||||
set -g visual-activity off
|
||||
|
||||
# Window status activity styling - subtle notification
|
||||
setw -g window-status-activity-style fg=colour221,bg=colour236,none
|
||||
|
||||
# Window status bell styling
|
||||
setw -g window-status-bell-style fg=colour210,bg=colour235,bold
|
||||
setw -g window-status-bell-style fg=colour210,bg=colour236,bold
|
||||
|
||||
#==============================================================================
|
||||
# MOUSE & HISTORY
|
||||
# 🔄 COPY MODE STYLING
|
||||
#==============================================================================
|
||||
|
||||
# Copy mode colors
|
||||
setw -g mode-style bg=colour75,fg=colour234,bold
|
||||
|
||||
#==============================================================================
|
||||
# 🖱️ MOUSE & HISTORY
|
||||
#==============================================================================
|
||||
|
||||
# Enable mouse support
|
||||
@@ -95,14 +134,14 @@ set -g history-limit 6000
|
||||
set -g remain-on-exit on
|
||||
|
||||
#==============================================================================
|
||||
# KEY BINDINGS
|
||||
# ⌨️ KEY BINDINGS
|
||||
#==============================================================================
|
||||
|
||||
# Rename pane
|
||||
bind t command-prompt -p "(rename-pane)" -I "#T" "select-pane -T '%%'"
|
||||
bind t command-prompt -p " (rename-pane)" -I "#T" "select-pane -T '%%'"
|
||||
|
||||
# Reload config
|
||||
bind r source-file ~/.tmux.conf \; display-message "Config reloaded!"
|
||||
bind r source-file ~/.tmux.conf \; display-message " Config reloaded!"
|
||||
|
||||
# Split panes using | and -
|
||||
bind | split-window -h
|
||||
@@ -116,3 +155,11 @@ bind -n M-Right select-pane -R
|
||||
bind -n M-Up select-pane -U
|
||||
bind -n M-Down select-pane -D
|
||||
|
||||
#==============================================================================
|
||||
# 📦 POPUP STYLING (tmux 3.2+)
|
||||
#==============================================================================
|
||||
|
||||
# Popup border style
|
||||
set -g popup-border-style fg=colour75
|
||||
set -g popup-border-lines rounded
|
||||
|
||||
|
||||
+55
-20
@@ -38,16 +38,46 @@ return [
|
||||
|
||||
'fonts' => [
|
||||
// Popular Nerd Fonts / Powerline fonts
|
||||
// Install with: sudo apt-get install fonts-powerline
|
||||
// Install with: ./install-tmux-fonts.sh or see TMUX_FONTS_GUIDE.md
|
||||
'use_nerd_fonts' => env('TMUX_USE_NERD_FONTS', true),
|
||||
'symbols' => [
|
||||
'separator_left' => '', // Powerline arrow
|
||||
'separator_right' => '', // Powerline arrow
|
||||
'branch' => '', // Git branch
|
||||
'lock' => '', // Lock symbol
|
||||
// Powerline arrows (rounded style)
|
||||
'separator_left' => '', // Rounded powerline arrow left
|
||||
'separator_right' => '', // Rounded powerline arrow right
|
||||
'separator_thin_left' => '', // Thin separator
|
||||
'separator_thin_right' => '', // Thin separator
|
||||
|
||||
// Status icons
|
||||
'session' => '', // Terminal/session icon
|
||||
'window' => '', // Window icon
|
||||
'pane_active' => '●', // Active pane indicator
|
||||
'pane_inactive' => '○', // Inactive pane indicator
|
||||
|
||||
// System monitoring
|
||||
'cpu' => '', // CPU symbol
|
||||
'ram' => '', // RAM symbol
|
||||
'disk' => '', // Disk symbol
|
||||
'network' => '', // Network symbol
|
||||
'clock' => '', // Clock symbol
|
||||
'calendar' => '', // Calendar symbol
|
||||
'uptime' => '', // Uptime symbol
|
||||
|
||||
// Processing icons
|
||||
'download' => '', // Download/binaries
|
||||
'sync' => '', // Sync/backfill
|
||||
'release' => '', // Release
|
||||
'fix' => '', // Fix/wrench
|
||||
'trash' => '', // Trash/remove
|
||||
'tv' => '', // TV
|
||||
'movie' => '', // Movie
|
||||
'amazon' => '', // Amazon/shopping
|
||||
'irc' => '', // Chat/IRC
|
||||
|
||||
// Monitoring tools
|
||||
'htop' => '', // Process monitor
|
||||
'database' => '', // Database
|
||||
'redis' => '', // Redis
|
||||
'console' => '', // Console/terminal
|
||||
],
|
||||
],
|
||||
|
||||
@@ -56,24 +86,29 @@ return [
|
||||
'remain_on_exit' => true,
|
||||
'aggressive_resize' => true,
|
||||
'monitor_activity' => true,
|
||||
'border_style' => 'rounded', // rounded, heavy, double, simple
|
||||
'active_border_color' => 'colour39', // Bright blue
|
||||
'inactive_border_color' => 'colour238', // Dark grey
|
||||
'border_style' => 'heavy', // heavy for bolder lines
|
||||
'active_border_color' => 'colour75', // Sapphire blue (Catppuccin)
|
||||
'inactive_border_color' => 'colour238', // Dark grey
|
||||
],
|
||||
|
||||
'colors' => [
|
||||
// Modern color scheme (Dracula-inspired)
|
||||
'background' => 'colour235',
|
||||
'foreground' => 'colour250',
|
||||
'selection' => 'colour238',
|
||||
'comment' => 'colour244',
|
||||
'cyan' => 'colour117',
|
||||
'green' => 'colour114',
|
||||
'orange' => 'colour215',
|
||||
'pink' => 'colour212',
|
||||
'purple' => 'colour141',
|
||||
'red' => 'colour210',
|
||||
'yellow' => 'colour228',
|
||||
// Modern color scheme (Catppuccin Mocha inspired)
|
||||
'base' => 'colour234', // Darkest background (crust)
|
||||
'background' => 'colour235', // Main background (base)
|
||||
'surface' => 'colour237', // Surface for elevated elements
|
||||
'foreground' => 'colour255', // Main text (text)
|
||||
'subtext' => 'colour250', // Dimmed text (subtext0)
|
||||
'overlay' => 'colour238', // Overlay elements
|
||||
|
||||
// Accent colors (Catppuccin)
|
||||
'sapphire' => 'colour75', // Primary accent
|
||||
'teal' => 'colour116', // Secondary accent
|
||||
'green' => 'colour114', // Success
|
||||
'yellow' => 'colour221', // Warning
|
||||
'peach' => 'colour215', // Attention
|
||||
'red' => 'colour210', // Error/danger
|
||||
'pink' => 'colour218', // Special
|
||||
'mauve' => 'colour141', // Purple
|
||||
],
|
||||
|
||||
'keys' => [
|
||||
|
||||
Reference in New Issue
Block a user