8d1332388c
This script makes it easier to spawn new tabs, splits, and other window types and set icons, titles, tab colors, and other properties An accompanying fish function allows executing the script with 'spwin' and an abbreviation with ':sw'
381 lines
12 KiB
Bash
Executable File
381 lines
12 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# Default values
|
|
type="tab"
|
|
title=""
|
|
cwd=""
|
|
active_bg=""
|
|
active_fg=""
|
|
inactive_bg=""
|
|
inactive_fg=""
|
|
cmd=""
|
|
cmd_flag=""
|
|
icon=""
|
|
|
|
# Icon dictionary for NerdFont glyphs
|
|
declare -A icons=(
|
|
["code"]=" " # Code icon
|
|
["git"]=" " # Git icon
|
|
["docs"]=" " # Docs icon
|
|
["web"]=" " # Web icon
|
|
["music"]=" " # Music icon
|
|
["bug"]=" " # Bug icon
|
|
["info"]=" " # Info icon
|
|
["question"]=" " # Question icon
|
|
["warning"]=" " # Warning icon
|
|
["error"]=" " # Error icon
|
|
["folder"]=" " # Folder icon
|
|
["file"]=" " # File icon
|
|
["lock"]=" " # Lock icon
|
|
["unlock"]=" " # Unlock icon
|
|
["key"]=" " # Key icon
|
|
["search"]=" " # Search icon
|
|
["clock"]=" " # Clock icon
|
|
["calendar"]=" " # Calendar icon
|
|
["download"]=" " # Download icon
|
|
["vim"]=" " # Vim icon
|
|
["nvim"]=" " # Neovim icon
|
|
["neovim"]=" " # Neovim icon
|
|
["python"]=" " # Python icon
|
|
["shell"]=" " # Shell icon
|
|
["rust"]=" " # Rust icon
|
|
["go"]=" " # Go icon
|
|
["java"]=" " # Java icon
|
|
["lua"]=" " # Lua icon
|
|
["cat"]=" " # Cat icon
|
|
["dog"]=" " # Dog icon
|
|
["fish"]=" " # Fish icon
|
|
["cow"]=" " # Cow icon
|
|
["bird"]=" " # Bird icon
|
|
["config"]=" " # Config icon
|
|
["home"]=" " # Home icon
|
|
["game"]=" " # Game icon
|
|
["image"]=" " # Image icon
|
|
["video"]=" " # Video icon
|
|
["pdf"]=" " # PDF icon
|
|
["music2"]=" " # Music2 icon
|
|
["archive"]=" " # Archive icon
|
|
["heart"]=" " # Heart icon
|
|
["md"]=" " # MarkDown icon
|
|
["apple"]=" " # Apple icon
|
|
["mac"]=" " # Apple icon
|
|
["google"]=" " # Google icon
|
|
["microsoft"]=" " # Microsoft icon
|
|
["ms"]=" " # Microsoft icon
|
|
["windows"]=" " # Windows icon
|
|
["slack"]=" " # Slack icon
|
|
["linux"]=" " # Linux icon
|
|
["ubuntu"]=" " # Linux icon
|
|
["archlinux"]=" " # ArchLinux icon
|
|
["arch"]=" " # ArchLinux icon
|
|
["debian"]=" " # Debian icon
|
|
["fedora"]=" " # Fedora icon
|
|
["freebsd"]=" " # FreeBSD icon
|
|
["gentoo"]=" " # Gentoo icon
|
|
["manjaro"]=" " # Manjaro icon
|
|
["nixos"]=" " # NixOS icon
|
|
["opensuse"]=" " # OpenSUSE icon
|
|
["suse"]=" " # OpenSUSE icon
|
|
["redhat"]=" " # RedHat icon
|
|
["centos"]=" " # RedHat icon
|
|
["endeavoros"]=" " # EndeavorOS icon
|
|
["endeavor"]=" " # EndeavorOS icon
|
|
["eos"]=" " # EndeavorOS icon
|
|
["github"]=" " # GitHub icon
|
|
["gh"]=" " # GitHub icon
|
|
["youtube"]=" " # YouTube icon
|
|
["yt"]=" " # YouTube icon
|
|
["poop"]=" " # Poop icon
|
|
["sun"]=" " # Sun icon
|
|
["moon"]=" " # Moon icon
|
|
["rain"]=" " # Rain icon
|
|
["cloud"]=" " # Cloud icon
|
|
["alien"]=" " # Alien icon
|
|
["lightbulb"]=" " # Lightbulb icon
|
|
["lightning"]=" " # Lightning icon
|
|
["night"]=" " # Night icon
|
|
["day"]=" " # Day icon
|
|
["chat"]=" " # Chat icon
|
|
["mail"]=" " # Mail icon
|
|
["terminal"]=" " # Terminal icon
|
|
["sleep"]=" " # Sleep icon
|
|
["bed"]=" " # Sleep icon
|
|
["note"]=" " # Note icon
|
|
["notes"]=" " # Note icon
|
|
["fire"]=" " # Fire icon
|
|
["trash"]=" " # Trash icon
|
|
["garbage"]=" " # Trash icon
|
|
["trashcan"]=" " # Trash icon
|
|
["recycle"]=" " # Trash icon
|
|
["water"]=" " # Water icon
|
|
["beer"]=" " # Beer icon
|
|
["coffee"]=" " # Coffee icon
|
|
["cake"]=" " # Cake icon
|
|
["package"]=" " # Package icon
|
|
["inbox"]=" " # Inbox icon
|
|
["outbox"]=" " # Outbox icon
|
|
["scissors"]=" " # Scissors icon
|
|
["stats"]=" " # Stats icon
|
|
["database"]=" " # Database icon
|
|
["link"]=" " # Link icon
|
|
["flag"]=" " # Flag icon
|
|
["pizza"]=" " # Pizza icon
|
|
["burger"]=" " # Burger icon
|
|
["success"]=" " # Success icon
|
|
["fail"]=" " # Fail icon
|
|
["warn"]=" " # Warn icon
|
|
["alert"]=" " # Warn icon
|
|
["car"]=" " # Car icon
|
|
["bicycle"]=" " # Bicycle icon
|
|
["bike"]=" " # Bicycle icon
|
|
["airplane"]=" " # Airplane icon
|
|
["plane"]=" " # Airplane icon
|
|
["boat"]=" " # Boat icon
|
|
["sailboat"]=" " # Boat icon
|
|
["ship"]=" " # Ship icon
|
|
["shipit"]=" " # Ship icon
|
|
["train"]=" " # Train icon
|
|
["subway"]=" " # Subway icon
|
|
["bus"]=" " # Bus icon
|
|
["motorbike"]=" " # Motorcycle icon
|
|
["motorcycle"]=" " # Motorcycle icon
|
|
["truck"]=" " # Truck icon
|
|
)
|
|
|
|
# Catppuccin Macchiato color palette with additional common colors
|
|
convert_color() {
|
|
case "$1" in
|
|
rosewater) echo "#f4dbd6" ;;
|
|
flamingo) echo "#f0c6c6" ;;
|
|
pink) echo "#f5bde6" ;;
|
|
mauve) echo "#c6a0f6" ;;
|
|
red) echo "#ed8796" ;;
|
|
maroon) echo "#ee99a0" ;;
|
|
peach) echo "#f5a97f" ;;
|
|
yellow) echo "#eed49f" ;;
|
|
green) echo "#a6da95" ;;
|
|
teal) echo "#8bd5ca" ;;
|
|
sky) echo "#91d7e3" ;;
|
|
sapphire) echo "#7dc4e4" ;;
|
|
blue) echo "#8aadf4" ;;
|
|
lavender) echo "#b7bdf8" ;;
|
|
text) echo "#cad3f5" ;;
|
|
subtext1) echo "#b8c0e0" ;;
|
|
subtext0) echo "#a5adcb" ;;
|
|
overlay2) echo "#939ab7" ;;
|
|
overlay1) echo "#8087a2" ;;
|
|
overlay0) echo "#6e738d" ;;
|
|
surface2) echo "#5b6078" ;;
|
|
surface1) echo "#494d64" ;;
|
|
surface0) echo "#363a4f" ;;
|
|
base) echo "#24273a" ;;
|
|
mantle) echo "#1e2030" ;;
|
|
crust) echo "#181926" ;;
|
|
black) echo "#181926" ;; # Crust
|
|
white) echo "#cad3f5" ;; # Text
|
|
gray) echo "#6e738d" ;; # Overlay0
|
|
grey) echo "#6e738d" ;; # Overlay0
|
|
silver) echo "#a5adcb" ;; # Subtext0
|
|
orange) echo "#f5a97f" ;; # Peach
|
|
brown) echo "#24273a" ;; # Base
|
|
purple) echo "#b7bdf8" ;; # Lavender
|
|
cyan) echo "#91d7e3" ;; # Sky
|
|
magenta) echo "#f5bde6" ;; # Pink
|
|
gold) echo "#eed49f" ;; # Yellow
|
|
*) echo "$1" ;; # If not a recognized color, assume it's already a hex code
|
|
esac
|
|
}
|
|
|
|
# Function to show usage
|
|
usage() {
|
|
echo "Usage: $0 [options] [command]"
|
|
echo "Options:"
|
|
echo " -t, --title <title> Set the tab/window title"
|
|
echo " -i, --icon <icon> Icon to prefix the title or set the title to (use icon name from the dictionary)"
|
|
echo " -c, --cmd <command> Command to run in the new tab/window"
|
|
echo " -d, --cwd <path> Set the working directory"
|
|
echo " -a, --active-bg <color> Active tab background color (tab only)"
|
|
echo " -f, --active-fg <color> Active tab foreground color (tab only)"
|
|
echo " -n, --inactive-bg <color> Inactive tab background color (tab only)"
|
|
echo " -g, --inactive-fg <color> Inactive tab foreground color (tab only)"
|
|
echo " -y, --type <type> Type of split or tab:"
|
|
echo " t, tab (tab)"
|
|
echo " v, vertical, vert (vertical split)"
|
|
echo " h, horizontal, horiz (horizontal split)"
|
|
echo " b, background, bg (background)"
|
|
echo " w, window, win (window)"
|
|
echo " o, overlay, over (overlay)"
|
|
echo " -h, --help Show this help message"
|
|
echo "Command:"
|
|
echo " Command to run in the new tab/window (e.g., 'nvim' or 'make')"
|
|
exit 1
|
|
}
|
|
|
|
# Parse arguments
|
|
while [[ "$#" -gt 0 ]]; do
|
|
case $1 in
|
|
-t | --title)
|
|
title="$2"
|
|
shift
|
|
;;
|
|
-i | --icon)
|
|
icon_name="$2"
|
|
if [[ -n "${icons[$icon_name]}" ]]; then
|
|
icon="${icons[$icon_name]}"
|
|
else
|
|
echo "Warning: Unrecognized icon name '$icon_name'."
|
|
icon=""
|
|
fi
|
|
shift
|
|
;;
|
|
-c | --cmd)
|
|
cmd_flag="$2"
|
|
shift
|
|
;;
|
|
-d | --cwd)
|
|
cwd="$2"
|
|
shift
|
|
;;
|
|
-a | --active-bg)
|
|
active_bg="$2"
|
|
shift
|
|
;;
|
|
-f | --active-fg)
|
|
active_fg="$2"
|
|
shift
|
|
;;
|
|
-n | --inactive-bg)
|
|
inactive_bg="$2"
|
|
shift
|
|
;;
|
|
-g | --inactive-fg)
|
|
inactive_fg="$2"
|
|
shift
|
|
;;
|
|
-y | --type)
|
|
type="$2"
|
|
shift
|
|
;;
|
|
-h | --help)
|
|
usage
|
|
;;
|
|
*)
|
|
# Any remaining argument is considered the command
|
|
if [[ -n "$cmd_flag" ]]; then
|
|
echo "Warning: Both '-c/--cmd' and positional command provided. Using positional command."
|
|
cmd="$*"
|
|
break
|
|
else
|
|
cmd="$*"
|
|
break
|
|
fi
|
|
;;
|
|
esac
|
|
shift
|
|
done
|
|
|
|
# Handle backward compatibility for the -c/--cmd flag
|
|
if [[ -n "$cmd_flag" ]]; then
|
|
if [[ -n "$cmd" ]]; then
|
|
echo "Warning: Both '-c/--cmd' and positional command provided. Using '-c/--cmd' value."
|
|
fi
|
|
cmd="$cmd_flag"
|
|
fi
|
|
|
|
# Normalize type values
|
|
case "$type" in
|
|
v | vertical | vert) type="v" ;;
|
|
h | horizontal | horiz) type="h" ;;
|
|
t) type="tab" ;;
|
|
b | background | bg) type="background" ;;
|
|
w | window | win) type="window" ;;
|
|
o | overlay | over) type="overlay" ;;
|
|
*)
|
|
if [[ "$type" != "tab" && "$type" != "v" && "$type" != "h" && "$type" != "background" && "$type" != "window" && "$type" != "overlay" ]]; then
|
|
echo "Invalid type. Must be 'tab', 'v', 'h', 'vert', 'vertical', 'horiz', 'horizontal', 'b', 'bg', 'background', 'w', 'win', 'window', 'o', 'over', 'overlay'."
|
|
exit 1
|
|
fi
|
|
;;
|
|
esac
|
|
|
|
# Convert color names to hex codes
|
|
active_bg=$(convert_color "$active_bg")
|
|
active_fg=$(convert_color "$active_fg")
|
|
inactive_bg=$(convert_color "$inactive_bg")
|
|
inactive_fg=$(convert_color "$inactive_fg")
|
|
|
|
# Adjust the type for kitty command
|
|
kitty_type="window"
|
|
case "$type" in
|
|
tab) kitty_type="tab" ;;
|
|
background) kitty_type="background" ;;
|
|
window) kitty_type="os-window" ;;
|
|
overlay) kitty_type="overlay-main" ;;
|
|
v) kitty_type="window" ;;
|
|
h) kitty_type="window" ;;
|
|
esac
|
|
|
|
# Set the title with the icon if provided
|
|
if [[ -n "$icon" ]]; then
|
|
if [[ "$type" == "tab" ]]; then
|
|
title_with_icon="$icon $title"
|
|
title_without_icon="$title"
|
|
else
|
|
title_with_icon="$icon $title"
|
|
title_without_icon="$title"
|
|
fi
|
|
else
|
|
title_with_icon="$title"
|
|
title_without_icon="$title"
|
|
fi
|
|
|
|
# Construct the launch command
|
|
launch_cmd="kitty @ launch --type=$kitty_type"
|
|
|
|
if [[ -n "$cwd" ]]; then
|
|
launch_cmd="$launch_cmd --cwd $cwd"
|
|
fi
|
|
|
|
if [[ "$type" == "tab" || "$type" == "window" ]]; then
|
|
launch_cmd="$launch_cmd --tab-title \"$title_with_icon\""
|
|
launch_cmd="$launch_cmd --title \"$title_without_icon\""
|
|
elif [[ "$type" == "background" || "$type" == "overlay" ]]; then
|
|
launch_cmd="$launch_cmd --window-title \"$title_without_icon\""
|
|
else
|
|
launch_cmd="$launch_cmd --window-title \"$title_with_icon\""
|
|
fi
|
|
|
|
# Add location for splits
|
|
if [[ "$type" == "v" ]]; then
|
|
launch_cmd="$launch_cmd --location=vsplit"
|
|
elif [[ "$type" == "h" ]]; then
|
|
launch_cmd="$launch_cmd --location=hsplit"
|
|
fi
|
|
|
|
# Append the command to the launch command
|
|
if [[ -n "$cmd" ]]; then
|
|
launch_cmd="$launch_cmd -- $cmd"
|
|
fi
|
|
|
|
# Run the launch command and check for errors
|
|
if ! eval "$launch_cmd" >/dev/null 2>&1; then
|
|
echo "Error: Failed to execute launch command."
|
|
exit 1
|
|
fi
|
|
|
|
# Set tab colors if type is 'tab' or 'window'
|
|
if [[ "$type" == "tab" || "$type" == "window" ]]; then
|
|
if [[ -n "$active_bg" || -n "$active_fg" || -n "$inactive_bg" || -n "$inactive_fg" ]]; then
|
|
color_cmd="kitty @ set-tab-color"
|
|
[[ -n "$active_bg" ]] && color_cmd="$color_cmd active_bg=$active_bg"
|
|
[[ -n "$active_fg" ]] && color_cmd="$color_cmd active_fg=$active_fg"
|
|
[[ -n "$inactive_bg" ]] && color_cmd="$color_cmd inactive_bg=$inactive_bg"
|
|
[[ -n "$inactive_fg" ]] && color_cmd="$color_cmd inactive_fg=$inactive_fg"
|
|
|
|
if ! eval "$color_cmd" >/dev/null 2>&1; then
|
|
echo "Error: Failed to set tab colors."
|
|
exit 1
|
|
fi
|
|
fi
|
|
fi
|