Template-Bundle ghostty-template/Ghostty.app aufnehmen

War durch .gitignore-Regel *.app/ ausgeschlossen; make-ghostty-app.sh
braucht es aber als Basis. Explizit per git add -f aufgenommen.
This commit is contained in:
marcus.hinz
2026-06-24 18:52:00 +02:00
parent 401ddd6f98
commit ce173ebbdf
602 changed files with 45249 additions and 0 deletions
Binary file not shown.
@@ -0,0 +1,318 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dictionary SYSTEM "file://localhost/System/Library/DTDs/sdef.dtd">
<dictionary title="Ghostty Scripting Dictionary">
<suite name="Ghostty Suite" code="Ghst" description="Ghostty scripting support.">
<class name="application" code="capp" description="The Ghostty application.">
<cocoa class="NSApplication"/>
<property name="name" code="pnam" type="text" access="r" description="The name of the application."/>
<property name="frontmost" code="pisf" type="boolean" access="r" description="Is this the active application?">
<cocoa key="isActive"/>
</property>
<property name="front window" code="GFWn" type="window" access="r" description="The frontmost Ghostty window.">
<cocoa key="frontWindow"/>
</property>
<property name="version" code="vers" type="text" access="r" description="The version number of the application."/>
<responds-to command="perform action">
<cocoa method="handlePerformActionScriptCommand:"/>
</responds-to>
<responds-to command="new window">
<cocoa method="handleNewWindowScriptCommand:"/>
</responds-to>
<responds-to command="new tab">
<cocoa method="handleNewTabScriptCommand:"/>
</responds-to>
<responds-to command="new surface configuration">
<cocoa method="handleNewSurfaceConfigurationScriptCommand:"/>
</responds-to>
<responds-to command="quit">
<cocoa method="handleQuitScriptCommand:"/>
</responds-to>
<element type="window" access="r">
<cocoa key="scriptWindows"/>
</element>
<element type="terminal" access="r">
<cocoa key="terminals"/>
</element>
</class>
<class name="window" code="Gwnd" plural="windows" description="A Ghostty window containing one or more tabs.">
<cocoa class="GhosttyScriptWindow"/>
<property name="id" code="ID " type="text" access="r" description="Stable ID for this window."/>
<property name="name" code="pnam" type="text" access="r" description="The title of the window.">
<cocoa key="title"/>
</property>
<property name="selected tab" code="GWsT" type="tab" access="r" description="The selected tab in this window.">
<cocoa key="selectedTab"/>
</property>
<responds-to command="activate window">
<cocoa method="handleActivateWindowCommand:"/>
</responds-to>
<responds-to command="close window">
<cocoa method="handleCloseWindowCommand:"/>
</responds-to>
<element type="tab" access="r">
<cocoa key="tabs"/>
</element>
<element type="terminal" access="r">
<cocoa key="terminals"/>
</element>
</class>
<class name="tab" code="Gtab" plural="tabs" description="A tab within a Ghostty window.">
<cocoa class="GhosttyScriptTab"/>
<property name="id" code="ID " type="text" access="r" description="Stable ID for this tab."/>
<property name="name" code="pnam" type="text" access="r" description="The title of the tab.">
<cocoa key="title"/>
</property>
<property name="index" code="pidx" type="integer" access="r" description="1-based index of this tab in its window."/>
<property name="selected" code="GTsl" type="boolean" access="r" description="Whether this tab is selected in its window."/>
<property name="focused terminal" code="GTfT" type="terminal" access="r" description="The currently focused terminal surface in this tab.">
<cocoa key="focusedTerminal"/>
</property>
<responds-to command="select tab">
<cocoa method="handleSelectTabCommand:"/>
</responds-to>
<responds-to command="close tab">
<cocoa method="handleCloseTabCommand:"/>
</responds-to>
<element type="terminal" access="r">
<cocoa key="terminals"/>
</element>
</class>
<class name="terminal" code="Gtrm" plural="terminals" description="An individual terminal surface.">
<cocoa class="GhosttyScriptTerminal"/>
<property name="id" code="ID " type="text" access="r" description="Stable ID for this terminal surface."/>
<property name="name" code="pnam" type="text" access="r" description="Current terminal title.">
<cocoa key="title"/>
</property>
<property name="working directory" code="Gwdr" type="text" access="r" description="Current working directory for the terminal process."/>
<responds-to command="split">
<cocoa method="handleSplitCommand:"/>
</responds-to>
<responds-to command="focus">
<cocoa method="handleFocusCommand:"/>
</responds-to>
<responds-to command="close">
<cocoa method="handleCloseCommand:"/>
</responds-to>
</class>
<record-type name="surface configuration" code="GScf" description="Reusable settings applied when creating a terminal surface.">
<property name="font size" code="GScF" type="real" description="Font size in points.">
<cocoa key="fontSize"/>
</property>
<property name="initial working directory" code="GScD" type="text" description="Initial working directory for the terminal process.">
<cocoa key="workingDirectory"/>
</property>
<property name="command" code="GScC" type="text" description="Command to execute instead of the configured shell.">
<cocoa key="command"/>
</property>
<property name="initial input" code="GScI" type="text" description="Input sent to the terminal after launch.">
<cocoa key="initialInput"/>
</property>
<property name="wait after command" code="GScW" type="boolean" description="Keep the terminal open after command exit.">
<cocoa key="waitAfterCommand"/>
</property>
<property name="environment variables" code="GScE" description="Environment variables in KEY=VALUE format.">
<type type="text" list="yes"/>
<cocoa key="environmentVariables"/>
</property>
</record-type>
<enumeration name="split direction" code="GSpD" description="Direction for a new split.">
<enumerator name="right" code="GSrt" description="Split to the right."/>
<enumerator name="left" code="GSlf" description="Split to the left."/>
<enumerator name="down" code="GSdn" description="Split downward."/>
<enumerator name="up" code="GSup" description="Split upward."/>
</enumeration>
<enumeration name="input action" code="GIAc" description="Whether an input is pressed or released.">
<enumerator name="press" code="GIpr" description="Press."/>
<enumerator name="release" code="GIrl" description="Release."/>
</enumeration>
<enumeration name="mouse button" code="GMBt" description="A mouse button.">
<enumerator name="left button" code="GMlf" description="Left mouse button."/>
<enumerator name="right button" code="GMrt" description="Right mouse button."/>
<enumerator name="middle button" code="GMmd" description="Middle mouse button."/>
</enumeration>
<enumeration name="scroll momentum" code="GSMo" description="Momentum phase for inertial scrolling.">
<enumerator name="none" code="SMno" description="No momentum."/>
<enumerator name="began" code="SMbg" description="Momentum began."/>
<enumerator name="changed" code="SMch" description="Momentum changed."/>
<enumerator name="ended" code="SMen" description="Momentum ended."/>
<enumerator name="cancelled" code="SMcn" description="Momentum cancelled."/>
<enumerator name="may begin" code="SMmb" description="Momentum may begin."/>
<enumerator name="stationary" code="SMst" description="Stationary."/>
</enumeration>
<command name="perform action" code="GhstPfAc" description="Perform a Ghostty action string on a terminal.">
<direct-parameter type="text" description="The Ghostty action string."/>
<parameter name="on" code="GonT" type="terminal" description="Target terminal."/>
<result type="boolean" description="True when the action was performed."/>
</command>
<command name="new surface configuration" code="GhstNSCf" description="Create a reusable surface configuration object.">
<parameter name="from" code="GScS" type="surface configuration" optional="yes" description="Surface configuration to copy.">
<cocoa key="configuration"/>
</parameter>
<result type="surface configuration" description="The newly created surface configuration."/>
</command>
<command name="new window" code="GhstNWin" description="Create a new Ghostty window.">
<parameter name="with configuration" code="GNwS" type="surface configuration" optional="yes" description="Base surface configuration for the initial terminal.">
<cocoa key="configuration"/>
</parameter>
<result type="window" description="The newly created window."/>
</command>
<command name="new tab" code="GhstNTab" description="Create a new Ghostty tab.">
<parameter name="in" code="GNtW" type="window" optional="yes" description="Target window for the new tab.">
<cocoa key="window"/>
</parameter>
<parameter name="with configuration" code="GNtS" type="surface configuration" optional="yes" description="Base surface configuration for the initial terminal.">
<cocoa key="configuration"/>
</parameter>
<result type="tab" description="The newly created tab."/>
</command>
<command name="split" code="GhstSplt" description="Split a terminal in the given direction.">
<direct-parameter type="specifier" description="The terminal to split."/>
<parameter name="direction" code="GSpd" type="split direction" description="The direction to split.">
<cocoa key="direction"/>
</parameter>
<parameter name="with configuration" code="GSpS" type="surface configuration" optional="yes" description="Base surface configuration for the new split terminal.">
<cocoa key="configuration"/>
</parameter>
<result type="terminal" description="The newly created terminal."/>
</command>
<command name="focus" code="GhstFcus" description="Focus a terminal, bringing its window to the front.">
<direct-parameter type="specifier" description="The terminal to focus."/>
</command>
<command name="close" code="GhstClos" description="Close a terminal.">
<direct-parameter type="specifier" description="The terminal to close."/>
</command>
<command name="activate window" code="GhstAcWn" description="Activate a Ghostty window, bringing it to the front.">
<direct-parameter type="specifier" description="The window to activate."/>
</command>
<command name="select tab" code="GhstSlTb" description="Select a tab in its window.">
<direct-parameter type="specifier" description="The tab to select."/>
</command>
<command name="close tab" code="GhstClTb" description="Close a tab.">
<direct-parameter type="specifier" description="The tab to close."/>
</command>
<command name="close window" code="GhstClWn" description="Close a window.">
<direct-parameter type="specifier" description="The window to close."/>
</command>
<command name="input text" code="GhstInTx" description="Input text to a terminal as if it was pasted.">
<cocoa class="GhosttyScriptInputTextCommand"/>
<direct-parameter type="text" description="The text to input."/>
<parameter name="to" code="GItT" type="terminal" description="The terminal to input text to.">
<cocoa key="terminal"/>
</parameter>
</command>
<command name="send key" code="GhstSKey" description="Send a keyboard event to a terminal.">
<cocoa class="GhosttyScriptKeyEventCommand"/>
<direct-parameter type="text" description="The key name (e.g. &quot;enter&quot;, &quot;a&quot;, &quot;space&quot;)."/>
<parameter name="action" code="GKeA" type="input action" optional="yes" description="Press or release (default: press).">
<cocoa key="action"/>
</parameter>
<parameter name="modifiers" code="GKeM" type="text" optional="yes" description="Comma-separated modifier keys: shift, control, option, command.">
<cocoa key="modifiers"/>
</parameter>
<parameter name="to" code="GKeT" type="terminal" description="The terminal to send the key event to.">
<cocoa key="terminal"/>
</parameter>
</command>
<command name="send mouse button" code="GhstSMBt" description="Send a mouse button event to a terminal.">
<cocoa class="GhosttyScriptMouseButtonCommand"/>
<direct-parameter type="mouse button" description="The mouse button."/>
<parameter name="action" code="GMbA" type="input action" optional="yes" description="Press or release (default: press).">
<cocoa key="action"/>
</parameter>
<parameter name="modifiers" code="GMbM" type="text" optional="yes" description="Comma-separated modifier keys: shift, control, option, command.">
<cocoa key="modifiers"/>
</parameter>
<parameter name="to" code="GMbT" type="terminal" description="The terminal to send the event to.">
<cocoa key="terminal"/>
</parameter>
</command>
<command name="send mouse position" code="GhstSMPs" description="Send a mouse position event to a terminal.">
<cocoa class="GhosttyScriptMousePosCommand"/>
<parameter name="x" code="GMpX" type="real" description="Horizontal position in pixels.">
<cocoa key="x"/>
</parameter>
<parameter name="y" code="GMpY" type="real" description="Vertical position in pixels.">
<cocoa key="y"/>
</parameter>
<parameter name="modifiers" code="GMpM" type="text" optional="yes" description="Comma-separated modifier keys: shift, control, option, command.">
<cocoa key="modifiers"/>
</parameter>
<parameter name="to" code="GMpT" type="terminal" description="The terminal to send the event to.">
<cocoa key="terminal"/>
</parameter>
</command>
<command name="send mouse scroll" code="GhstSMSc" description="Send a mouse scroll event to a terminal.">
<cocoa class="GhosttyScriptMouseScrollCommand"/>
<parameter name="x" code="GMsX" type="real" description="Horizontal scroll delta.">
<cocoa key="x"/>
</parameter>
<parameter name="y" code="GMsY" type="real" description="Vertical scroll delta.">
<cocoa key="y"/>
</parameter>
<parameter name="precision" code="GMsP" type="boolean" optional="yes" description="High-precision scroll (e.g. trackpad). Default: false.">
<cocoa key="precision"/>
</parameter>
<parameter name="momentum" code="GMsM" type="scroll momentum" optional="yes" description="Momentum phase for inertial scrolling. Default: none.">
<cocoa key="momentum"/>
</parameter>
<parameter name="to" code="GMsT" type="terminal" description="The terminal to send the event to.">
<cocoa key="terminal"/>
</parameter>
</command>
</suite>
<!--
The Standard Suite definition below is copied from Apple's
/System/Library/ScriptingDefinitions/CocoaStandard.sdef, trimmed to only
include what we need.
-->
<suite name="Standard Suite" code="????" description="Common classes and commands for all applications.">
<command name="count" code="corecnte" description="Return the number of elements of a particular class within an object.">
<cocoa class="NSCountCommand"/>
<access-group identifier="*"/>
<direct-parameter type="specifier" requires-access="r" description="The objects to be counted."/>
<parameter name="each" code="kocl" type="type" optional="yes" description="The class of objects to be counted." hidden="yes">
<cocoa key="ObjectClass"/>
</parameter>
<result type="integer" description="The count."/>
</command>
<command name="exists" code="coredoex" description="Verify that an object exists.">
<cocoa class="NSExistsCommand"/>
<access-group identifier="*"/>
<direct-parameter type="any" requires-access="r" description="The object(s) to check."/>
<result type="boolean" description="Did the object(s) exist?"/>
</command>
<command name="quit" code="aevtquit" description="Quit the application.">
<cocoa class="NSQuitCommand"/>
</command>
</suite>
</dictionary>
Binary file not shown.
File diff suppressed because one or more lines are too long
@@ -0,0 +1,4 @@
{
"version" : "3.0",
"toolsVersion" : "17F42"
}
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,642 @@
_ghostty() {
# compat: mapfile -t COMPREPLY < <( "$@" )
_compreply() {
COMPREPLY=()
while IFS='' read -r line; do COMPREPLY+=("$line"); done < <( "$@" )
}
# -o nospace requires we add back a space when a completion is finished
# and not part of a --key= completion
_add_spaces() {
for idx in "${!COMPREPLY[@]}"; do
[ -n "${COMPREPLY[idx]}" ] && COMPREPLY[idx]="${COMPREPLY[idx]} ";
done
}
_fonts() {
local IFS=$'\n'
COMPREPLY=()
while read -r line; do COMPREPLY+=("$line"); done < <( compgen -P '"' -S '"' -W "$($ghostty +list-fonts | grep '^[A-Z]' )" -- "$cur")
}
_themes() {
local IFS=$'\n'
COMPREPLY=()
while read -r line; do COMPREPLY+=("$line"); done < <( compgen -P '"' -S '"' -W "$($ghostty +list-themes | sed -E 's/^(.*) \(.*$/\1/')" -- "$cur")
}
_files() {
_compreply compgen -o filenames -f -- "$cur"
for i in "${!COMPREPLY[@]}"; do
if [[ -d "${COMPREPLY[i]}" ]]; then
COMPREPLY[i]="${COMPREPLY[i]}/";
fi
if [[ -f "${COMPREPLY[i]}" ]]; then
COMPREPLY[i]="${COMPREPLY[i]} ";
fi
done
}
_dirs() {
_compreply compgen -o dirnames -d -- "$cur"
for i in "${!COMPREPLY[@]}"; do
if [[ -d "${COMPREPLY[i]}" ]]; then
COMPREPLY[i]="${COMPREPLY[i]}/";
fi
done
if [[ "${#COMPREPLY[@]}" == 0 && -d "$cur" ]]; then
COMPREPLY=( "$cur " )
fi
}
_handle_config() {
local config="--help"
config+=" --version"
config+=" --language="
config+=" --font-family="
config+=" --font-family-bold="
config+=" --font-family-italic="
config+=" --font-family-bold-italic="
config+=" --font-style="
config+=" --font-style-bold="
config+=" --font-style-italic="
config+=" --font-style-bold-italic="
config+=" --font-synthetic-style="
config+=" --font-feature="
config+=" --font-size="
config+=" --font-variation="
config+=" --font-variation-bold="
config+=" --font-variation-italic="
config+=" --font-variation-bold-italic="
config+=" --font-codepoint-map="
config+=" --clipboard-codepoint-map="
config+=" '--font-thicken '"
config+=" --font-thicken-strength="
config+=" --font-shaping-break="
config+=" --alpha-blending="
config+=" --adjust-cell-width="
config+=" --adjust-cell-height="
config+=" --adjust-font-baseline="
config+=" --adjust-underline-position="
config+=" --adjust-underline-thickness="
config+=" --adjust-strikethrough-position="
config+=" --adjust-strikethrough-thickness="
config+=" --adjust-overline-position="
config+=" --adjust-overline-thickness="
config+=" --adjust-cursor-thickness="
config+=" --adjust-cursor-height="
config+=" --adjust-box-thickness="
config+=" --adjust-icon-height="
config+=" --grapheme-width-method="
config+=" --freetype-load-flags="
config+=" --theme="
config+=" --background="
config+=" --foreground="
config+=" --background-image="
config+=" --background-image-opacity="
config+=" --background-image-position="
config+=" --background-image-fit="
config+=" '--background-image-repeat '"
config+=" --selection-foreground="
config+=" --selection-background="
config+=" '--selection-clear-on-typing '"
config+=" '--selection-clear-on-copy '"
config+=" --selection-word-chars="
config+=" --minimum-contrast="
config+=" --palette="
config+=" '--palette-generate '"
config+=" '--palette-harmonious '"
config+=" --cursor-color="
config+=" --cursor-opacity="
config+=" --cursor-style="
config+=" '--cursor-style-blink '"
config+=" --cursor-text="
config+=" '--cursor-click-to-move '"
config+=" '--mouse-hide-while-typing '"
config+=" --scroll-to-bottom="
config+=" --mouse-shift-capture="
config+=" '--mouse-reporting '"
config+=" --mouse-scroll-multiplier="
config+=" --background-opacity="
config+=" '--background-opacity-cells '"
config+=" --background-blur="
config+=" --unfocused-split-opacity="
config+=" --unfocused-split-fill="
config+=" --split-divider-color="
config+=" --split-preserve-zoom="
config+=" --search-foreground="
config+=" --search-background="
config+=" --search-selected-foreground="
config+=" --search-selected-background="
config+=" --command="
config+=" --initial-command="
config+=" --notify-on-command-finish="
config+=" --notify-on-command-finish-action="
config+=" --notify-on-command-finish-after="
config+=" --env="
config+=" --input="
config+=" '--wait-after-command '"
config+=" --abnormal-command-exit-runtime="
config+=" --scrollback-limit="
config+=" --scrollbar="
config+=" --link="
config+=" '--link-url '"
config+=" --link-previews="
config+=" '--maximize '"
config+=" --fullscreen="
config+=" --title="
config+=" --class="
config+=" --x11-instance-name="
config+=" --working-directory="
config+=" --keybind="
config+=" --key-remap="
config+=" --window-padding-x="
config+=" --window-padding-y="
config+=" '--window-padding-balance '"
config+=" --window-padding-color="
config+=" '--window-vsync '"
config+=" '--window-inherit-working-directory '"
config+=" '--tab-inherit-working-directory '"
config+=" '--split-inherit-working-directory '"
config+=" '--window-inherit-font-size '"
config+=" --window-decoration="
config+=" --window-title-font-family="
config+=" --window-subtitle="
config+=" --window-theme="
config+=" --window-colorspace="
config+=" --window-height="
config+=" --window-width="
config+=" --window-position-x="
config+=" --window-position-y="
config+=" --window-save-state="
config+=" '--window-step-resize '"
config+=" --window-new-tab-position="
config+=" --window-show-tab-bar="
config+=" --window-titlebar-background="
config+=" --window-titlebar-foreground="
config+=" --resize-overlay="
config+=" --resize-overlay-position="
config+=" --resize-overlay-duration="
config+=" '--focus-follows-mouse '"
config+=" --clipboard-read="
config+=" --clipboard-write="
config+=" '--clipboard-trim-trailing-spaces '"
config+=" '--clipboard-paste-protection '"
config+=" '--clipboard-paste-bracketed-safe '"
config+=" '--title-report '"
config+=" --image-storage-limit="
config+=" --copy-on-select="
config+=" --right-click-action="
config+=" --click-repeat-interval="
config+=" --config-file="
config+=" '--config-default-files '"
config+=" --confirm-close-surface="
config+=" '--quit-after-last-window-closed '"
config+=" --quit-after-last-window-closed-delay="
config+=" '--initial-window '"
config+=" --undo-timeout="
config+=" --quick-terminal-position="
config+=" --quick-terminal-size="
config+=" --gtk-quick-terminal-layer="
config+=" --gtk-quick-terminal-namespace="
config+=" --quick-terminal-screen="
config+=" --quick-terminal-animation-duration="
config+=" '--quick-terminal-autohide '"
config+=" --quick-terminal-space-behavior="
config+=" --quick-terminal-keyboard-interactivity="
config+=" --shell-integration="
config+=" --shell-integration-features="
config+=" --command-palette-entry="
config+=" --osc-color-report-format="
config+=" '--vt-kam-allowed '"
config+=" --custom-shader="
config+=" --custom-shader-animation="
config+=" --bell-features="
config+=" --bell-audio-path="
config+=" --bell-audio-volume="
config+=" --app-notifications="
config+=" --macos-non-native-fullscreen="
config+=" --macos-window-buttons="
config+=" --macos-titlebar-style="
config+=" --macos-titlebar-proxy-icon="
config+=" --macos-dock-drop-behavior="
config+=" --macos-option-as-alt="
config+=" '--macos-window-shadow '"
config+=" --macos-hidden="
config+=" '--macos-auto-secure-input '"
config+=" '--macos-secure-input-indication '"
config+=" '--macos-applescript '"
config+=" --macos-icon="
config+=" --macos-custom-icon="
config+=" --macos-icon-frame="
config+=" --macos-icon-ghost-color="
config+=" --macos-icon-screen-color="
config+=" --macos-shortcuts="
config+=" --linux-cgroup="
config+=" --linux-cgroup-memory-limit="
config+=" --linux-cgroup-processes-limit="
config+=" '--linux-cgroup-hard-fail '"
config+=" '--gtk-opengl-debug '"
config+=" --gtk-single-instance="
config+=" '--gtk-titlebar '"
config+=" --gtk-tabs-location="
config+=" '--gtk-titlebar-hide-when-maximized '"
config+=" --gtk-toolbar-style="
config+=" --gtk-titlebar-style="
config+=" '--gtk-wide-tabs '"
config+=" --gtk-custom-css="
config+=" '--desktop-notifications '"
config+=" '--progress-style '"
config+=" --bold-color="
config+=" --faint-opacity="
config+=" --term="
config+=" --enquiry-response="
config+=" --async-backend="
config+=" --auto-update="
config+=" --auto-update-channel="
case "$prev" in
--language) return ;;
--font-family) _fonts ;;
--font-family-bold) _fonts ;;
--font-family-italic) _fonts ;;
--font-family-bold-italic) _fonts ;;
--font-style) return ;;
--font-style-bold) return ;;
--font-style-italic) return ;;
--font-style-bold-italic) return ;;
--font-synthetic-style) _compreply compgen -W "bold no-bold italic no-italic bold-italic no-bold-italic" -- "$cur"; _add_spaces ;;
--font-feature) return ;;
--font-size) return ;;
--font-variation) return ;;
--font-variation-bold) return ;;
--font-variation-italic) return ;;
--font-variation-bold-italic) return ;;
--font-codepoint-map) return ;;
--clipboard-codepoint-map) return ;;
--font-thicken) return ;;
--font-thicken-strength) return ;;
--font-shaping-break) _compreply compgen -W "cursor no-cursor" -- "$cur"; _add_spaces ;;
--alpha-blending) _compreply compgen -W "native linear linear-corrected" -- "$cur"; _add_spaces ;;
--adjust-cell-width) return ;;
--adjust-cell-height) return ;;
--adjust-font-baseline) return ;;
--adjust-underline-position) return ;;
--adjust-underline-thickness) return ;;
--adjust-strikethrough-position) return ;;
--adjust-strikethrough-thickness) return ;;
--adjust-overline-position) return ;;
--adjust-overline-thickness) return ;;
--adjust-cursor-thickness) return ;;
--adjust-cursor-height) return ;;
--adjust-box-thickness) return ;;
--adjust-icon-height) return ;;
--grapheme-width-method) _compreply compgen -W "legacy unicode" -- "$cur"; _add_spaces ;;
--freetype-load-flags) _compreply compgen -W "hinting no-hinting force-autohint no-force-autohint monochrome no-monochrome autohint no-autohint light no-light" -- "$cur"; _add_spaces ;;
--theme) _themes ;;
--background) return ;;
--foreground) return ;;
--background-image) return ;;
--background-image-opacity) return ;;
--background-image-position) _compreply compgen -W "top-left top-center top-right center-left center-center center-right bottom-left bottom-center bottom-right center" -- "$cur"; _add_spaces ;;
--background-image-fit) _compreply compgen -W "contain cover stretch none" -- "$cur"; _add_spaces ;;
--background-image-repeat) return ;;
--selection-foreground) return ;;
--selection-background) return ;;
--selection-clear-on-typing) return ;;
--selection-clear-on-copy) return ;;
--selection-word-chars) return ;;
--minimum-contrast) return ;;
--palette) return ;;
--palette-generate) return ;;
--palette-harmonious) return ;;
--cursor-color) return ;;
--cursor-opacity) return ;;
--cursor-style) _compreply compgen -W "bar block underline block_hollow" -- "$cur"; _add_spaces ;;
--cursor-style-blink) return ;;
--cursor-text) return ;;
--cursor-click-to-move) return ;;
--mouse-hide-while-typing) return ;;
--scroll-to-bottom) _compreply compgen -W "keystroke no-keystroke output no-output" -- "$cur"; _add_spaces ;;
--mouse-shift-capture) _compreply compgen -W "false true always never" -- "$cur"; _add_spaces ;;
--mouse-reporting) return ;;
--mouse-scroll-multiplier) return ;;
--background-opacity) return ;;
--background-opacity-cells) return ;;
--background-blur) return ;;
--unfocused-split-opacity) return ;;
--unfocused-split-fill) return ;;
--split-divider-color) return ;;
--split-preserve-zoom) _compreply compgen -W "navigation no-navigation" -- "$cur"; _add_spaces ;;
--search-foreground) return ;;
--search-background) return ;;
--search-selected-foreground) return ;;
--search-selected-background) return ;;
--command) return ;;
--initial-command) return ;;
--notify-on-command-finish) _compreply compgen -W "never unfocused always" -- "$cur"; _add_spaces ;;
--notify-on-command-finish-action) _compreply compgen -W "bell no-bell notify no-notify" -- "$cur"; _add_spaces ;;
--notify-on-command-finish-after) return ;;
--env) return ;;
--input) return ;;
--wait-after-command) return ;;
--abnormal-command-exit-runtime) return ;;
--scrollback-limit) return ;;
--scrollbar) _compreply compgen -W "system never" -- "$cur"; _add_spaces ;;
--link) return ;;
--link-url) return ;;
--link-previews) _compreply compgen -W "false true osc8" -- "$cur"; _add_spaces ;;
--maximize) return ;;
--fullscreen) _compreply compgen -W "false true non-native non-native-visible-menu non-native-padded-notch" -- "$cur"; _add_spaces ;;
--title) return ;;
--class) return ;;
--x11-instance-name) return ;;
--working-directory) _dirs ;;
--keybind) return ;;
--key-remap) return ;;
--window-padding-x) return ;;
--window-padding-y) return ;;
--window-padding-balance) return ;;
--window-padding-color) _compreply compgen -W "background extend extend-always" -- "$cur"; _add_spaces ;;
--window-vsync) return ;;
--window-inherit-working-directory) return ;;
--tab-inherit-working-directory) return ;;
--split-inherit-working-directory) return ;;
--window-inherit-font-size) return ;;
--window-decoration) _compreply compgen -W "auto client server none" -- "$cur"; _add_spaces ;;
--window-title-font-family) return ;;
--window-subtitle) _compreply compgen -W "false working-directory" -- "$cur"; _add_spaces ;;
--window-theme) _compreply compgen -W "auto system light dark ghostty" -- "$cur"; _add_spaces ;;
--window-colorspace) _compreply compgen -W "srgb display-p3" -- "$cur"; _add_spaces ;;
--window-height) return ;;
--window-width) return ;;
--window-position-x) return ;;
--window-position-y) return ;;
--window-save-state) _compreply compgen -W "default never always" -- "$cur"; _add_spaces ;;
--window-step-resize) return ;;
--window-new-tab-position) _compreply compgen -W "current end" -- "$cur"; _add_spaces ;;
--window-show-tab-bar) _compreply compgen -W "always auto never" -- "$cur"; _add_spaces ;;
--window-titlebar-background) return ;;
--window-titlebar-foreground) return ;;
--resize-overlay) _compreply compgen -W "always never after-first" -- "$cur"; _add_spaces ;;
--resize-overlay-position) _compreply compgen -W "center top-left top-center top-right bottom-left bottom-center bottom-right" -- "$cur"; _add_spaces ;;
--resize-overlay-duration) return ;;
--focus-follows-mouse) return ;;
--clipboard-read) _compreply compgen -W "allow deny ask" -- "$cur"; _add_spaces ;;
--clipboard-write) _compreply compgen -W "allow deny ask" -- "$cur"; _add_spaces ;;
--clipboard-trim-trailing-spaces) return ;;
--clipboard-paste-protection) return ;;
--clipboard-paste-bracketed-safe) return ;;
--title-report) return ;;
--image-storage-limit) return ;;
--copy-on-select) _compreply compgen -W "false true clipboard" -- "$cur"; _add_spaces ;;
--right-click-action) _compreply compgen -W "ignore paste copy copy-or-paste context-menu" -- "$cur"; _add_spaces ;;
--click-repeat-interval) return ;;
--config-file) _files ;;
--config-default-files) return ;;
--confirm-close-surface) _compreply compgen -W "false true always" -- "$cur"; _add_spaces ;;
--quit-after-last-window-closed) return ;;
--quit-after-last-window-closed-delay) return ;;
--initial-window) return ;;
--undo-timeout) return ;;
--quick-terminal-position) _compreply compgen -W "top bottom left right center" -- "$cur"; _add_spaces ;;
--quick-terminal-size) return ;;
--gtk-quick-terminal-layer) _compreply compgen -W "overlay top bottom background" -- "$cur"; _add_spaces ;;
--gtk-quick-terminal-namespace) return ;;
--quick-terminal-screen) _compreply compgen -W "main mouse macos-menu-bar" -- "$cur"; _add_spaces ;;
--quick-terminal-animation-duration) return ;;
--quick-terminal-autohide) return ;;
--quick-terminal-space-behavior) _compreply compgen -W "remain move" -- "$cur"; _add_spaces ;;
--quick-terminal-keyboard-interactivity) _compreply compgen -W "none on-demand exclusive" -- "$cur"; _add_spaces ;;
--shell-integration) _compreply compgen -W "none detect bash elvish fish nushell zsh" -- "$cur"; _add_spaces ;;
--shell-integration-features) _compreply compgen -W "cursor no-cursor sudo no-sudo title no-title ssh-env no-ssh-env ssh-terminfo no-ssh-terminfo path no-path" -- "$cur"; _add_spaces ;;
--command-palette-entry) return ;;
--osc-color-report-format) _compreply compgen -W "none 8-bit 16-bit" -- "$cur"; _add_spaces ;;
--vt-kam-allowed) return ;;
--custom-shader) _files ;;
--custom-shader-animation) _compreply compgen -W "false true always" -- "$cur"; _add_spaces ;;
--bell-features) _compreply compgen -W "system no-system audio no-audio attention no-attention title no-title border no-border" -- "$cur"; _add_spaces ;;
--bell-audio-path) return ;;
--bell-audio-volume) return ;;
--app-notifications) _compreply compgen -W "clipboard-copy no-clipboard-copy config-reload no-config-reload" -- "$cur"; _add_spaces ;;
--macos-non-native-fullscreen) _compreply compgen -W "false true visible-menu padded-notch" -- "$cur"; _add_spaces ;;
--macos-window-buttons) _compreply compgen -W "visible hidden" -- "$cur"; _add_spaces ;;
--macos-titlebar-style) _compreply compgen -W "native transparent tabs hidden" -- "$cur"; _add_spaces ;;
--macos-titlebar-proxy-icon) _compreply compgen -W "visible hidden" -- "$cur"; _add_spaces ;;
--macos-dock-drop-behavior) _compreply compgen -W "new-tab new-window" -- "$cur"; _add_spaces ;;
--macos-option-as-alt) return ;;
--macos-window-shadow) return ;;
--macos-hidden) _compreply compgen -W "never always" -- "$cur"; _add_spaces ;;
--macos-auto-secure-input) return ;;
--macos-secure-input-indication) return ;;
--macos-applescript) return ;;
--macos-icon) _compreply compgen -W "official blueprint chalkboard microchip glass holographic paper retro xray custom custom-style" -- "$cur"; _add_spaces ;;
--macos-custom-icon) return ;;
--macos-icon-frame) _compreply compgen -W "aluminum beige plastic chrome" -- "$cur"; _add_spaces ;;
--macos-icon-ghost-color) return ;;
--macos-icon-screen-color) return ;;
--macos-shortcuts) _compreply compgen -W "allow deny ask" -- "$cur"; _add_spaces ;;
--linux-cgroup) _compreply compgen -W "never always single-instance" -- "$cur"; _add_spaces ;;
--linux-cgroup-memory-limit) return ;;
--linux-cgroup-processes-limit) return ;;
--linux-cgroup-hard-fail) return ;;
--gtk-opengl-debug) return ;;
--gtk-single-instance) _compreply compgen -W "false true detect" -- "$cur"; _add_spaces ;;
--gtk-titlebar) return ;;
--gtk-tabs-location) _compreply compgen -W "top bottom" -- "$cur"; _add_spaces ;;
--gtk-titlebar-hide-when-maximized) return ;;
--gtk-toolbar-style) _compreply compgen -W "flat raised raised-border" -- "$cur"; _add_spaces ;;
--gtk-titlebar-style) _compreply compgen -W "native tabs" -- "$cur"; _add_spaces ;;
--gtk-wide-tabs) return ;;
--gtk-custom-css) _files ;;
--desktop-notifications) return ;;
--progress-style) return ;;
--bold-color) return ;;
--faint-opacity) return ;;
--term) return ;;
--enquiry-response) return ;;
--async-backend) _compreply compgen -W "auto epoll io_uring" -- "$cur"; _add_spaces ;;
--auto-update) return ;;
--auto-update-channel) return ;;
*) _compreply compgen -W "$config" -- "$cur" ;;
esac
return 0
}
_handle_actions() {
local help="'--help ' --help"
local list_fonts="--family= --style= '--bold ' '--italic ' --help"
local list_keybinds="'--default ' '--docs ' '--plain ' --help"
local list_themes="'--path ' '--plain ' --color= --help"
local list_colors="'--plain ' --help"
local list_actions="'--docs ' --help"
local ssh_cache="'--clear ' --add= --remove= --host= --expire-days= --help"
local show_config="'--default ' '--changes-only ' '--docs ' --help"
local validate_config="--config-file= --help"
local show_face="--cp= --string= --style= --presentation= --help"
local new_window="--class= --help"
case "${COMP_WORDS[1]}" in
+help)
case $prev in
--help) return ;;
*) _compreply compgen -W "$help" -- "$cur" ;;
esac
;;
+list-fonts)
case $prev in
--family) return;;
--style) return;;
--bold) return ;;
--italic) return ;;
*) _compreply compgen -W "$list_fonts" -- "$cur" ;;
esac
;;
+list-keybinds)
case $prev in
--default) return ;;
--docs) return ;;
--plain) return ;;
*) _compreply compgen -W "$list_keybinds" -- "$cur" ;;
esac
;;
+list-themes)
case $prev in
--path) return ;;
--plain) return ;;
--color) _compreply compgen -W "all dark light" -- "$cur"; _add_spaces ;;
*) _compreply compgen -W "$list_themes" -- "$cur" ;;
esac
;;
+list-colors)
case $prev in
--plain) return ;;
*) _compreply compgen -W "$list_colors" -- "$cur" ;;
esac
;;
+list-actions)
case $prev in
--docs) return ;;
*) _compreply compgen -W "$list_actions" -- "$cur" ;;
esac
;;
+ssh-cache)
case $prev in
--clear) return ;;
--add) return;;
--remove) return;;
--host) return;;
--expire-days) return;;
*) _compreply compgen -W "$ssh_cache" -- "$cur" ;;
esac
;;
+show-config)
case $prev in
--default) return ;;
--changes-only) return ;;
--docs) return ;;
*) _compreply compgen -W "$show_config" -- "$cur" ;;
esac
;;
+validate-config)
case $prev in
--config-file) return ;;
*) _compreply compgen -W "$validate_config" -- "$cur" ;;
esac
;;
+show-face)
case $prev in
--cp) return;;
--string) return;;
--style) _compreply compgen -W "regular bold italic bold_italic" -- "$cur"; _add_spaces ;;
--presentation) _compreply compgen -W "text emoji" -- "$cur"; _add_spaces ;;
*) _compreply compgen -W "$show_face" -- "$cur" ;;
esac
;;
+new-window)
case $prev in
--class) return;;
*) _compreply compgen -W "$new_window" -- "$cur" ;;
esac
;;
*) _compreply compgen -W "--help" -- "$cur" ;;
esac
return 0
}
# begin main logic
local topLevel="-e"
topLevel+=" --help"
topLevel+=" --version"
topLevel+=" +version"
topLevel+=" +help"
topLevel+=" +list-fonts"
topLevel+=" +list-keybinds"
topLevel+=" +list-themes"
topLevel+=" +list-colors"
topLevel+=" +list-actions"
topLevel+=" +ssh-cache"
topLevel+=" +edit-config"
topLevel+=" +show-config"
topLevel+=" +validate-config"
topLevel+=" +show-face"
topLevel+=" +crash-report"
topLevel+=" +boo"
topLevel+=" +new-window"
local cur=""; local prev=""; local prevWasEq=false; COMPREPLY=()
local ghostty="$1"
# script assumes default COMP_WORDBREAKS of roughly $' \t\n"\'><=;|&(:'
# if = is missing this script will degrade to matching on keys only.
# eg: --key=
# this can be improved if needed see: https://github.com/ghostty-org/ghostty/discussions/2994
if [ "$2" = "=" ]; then cur=""
else cur="$2"
fi
if [ "$3" = "=" ]; then prev="${COMP_WORDS[COMP_CWORD-2]}"; prevWasEq=true;
else prev="${COMP_WORDS[COMP_CWORD-1]}"
fi
# current completion is double quoted add a space so the cursor progresses
if [[ "$2" == \"*\" ]]; then
COMPREPLY=( "$cur " );
return;
fi
case "$COMP_CWORD" in
1)
case "${COMP_WORDS[1]}" in
-e | --help | --version) return 0 ;;
--*) _handle_config ;;
*) _compreply compgen -W "${topLevel}" -- "$cur"; _add_spaces ;;
esac
;;
*)
case "$prev" in
-e | --help | --version) return 0 ;;
*)
if [[ "=" != "${COMP_WORDS[COMP_CWORD]}" && $prevWasEq != true ]]; then
# must be completing with a space after the key eg: '--<key> '
# clear out prev so we don't run any of the key specific completions
prev=""
fi
case "${COMP_WORDS[1]}" in
--*) _handle_config ;;
+*) _handle_actions ;;
esac
;;
esac
;;
esac
return 0
}
complete -o nospace -o bashdefault -F _ghostty ghostty
@@ -0,0 +1,17 @@
%YAML 1.2
---
# See http://www.sublimetext.com/docs/syntax.html
name: Ghostty Config
file_extensions:
- ghostty
scope: source.ghostty
contexts:
main:
# Comments
- match: '^\s*#.*$'
scope: comment.line.number-sign.ghostty
# Keywords
- match: '\b(language|font-family|font-family-bold|font-family-italic|font-family-bold-italic|font-style|font-style-bold|font-style-italic|font-style-bold-italic|font-synthetic-style|font-feature|font-size|font-variation|font-variation-bold|font-variation-italic|font-variation-bold-italic|font-codepoint-map|clipboard-codepoint-map|font-thicken|font-thicken-strength|font-shaping-break|alpha-blending|adjust-cell-width|adjust-cell-height|adjust-font-baseline|adjust-underline-position|adjust-underline-thickness|adjust-strikethrough-position|adjust-strikethrough-thickness|adjust-overline-position|adjust-overline-thickness|adjust-cursor-thickness|adjust-cursor-height|adjust-box-thickness|adjust-icon-height|grapheme-width-method|freetype-load-flags|theme|background|foreground|background-image|background-image-opacity|background-image-position|background-image-fit|background-image-repeat|selection-foreground|selection-background|selection-clear-on-typing|selection-clear-on-copy|selection-word-chars|minimum-contrast|palette|palette-generate|palette-harmonious|cursor-color|cursor-opacity|cursor-style|cursor-style-blink|cursor-text|cursor-click-to-move|mouse-hide-while-typing|scroll-to-bottom|mouse-shift-capture|mouse-reporting|mouse-scroll-multiplier|background-opacity|background-opacity-cells|background-blur|unfocused-split-opacity|unfocused-split-fill|split-divider-color|split-preserve-zoom|search-foreground|search-background|search-selected-foreground|search-selected-background|command|initial-command|notify-on-command-finish|notify-on-command-finish-action|notify-on-command-finish-after|env|input|wait-after-command|abnormal-command-exit-runtime|scrollback-limit|scrollbar|link|link-url|link-previews|maximize|fullscreen|title|class|x11-instance-name|working-directory|keybind|key-remap|window-padding-x|window-padding-y|window-padding-balance|window-padding-color|window-vsync|window-inherit-working-directory|tab-inherit-working-directory|split-inherit-working-directory|window-inherit-font-size|window-decoration|window-title-font-family|window-subtitle|window-theme|window-colorspace|window-height|window-width|window-position-x|window-position-y|window-save-state|window-step-resize|window-new-tab-position|window-show-tab-bar|window-titlebar-background|window-titlebar-foreground|resize-overlay|resize-overlay-position|resize-overlay-duration|focus-follows-mouse|clipboard-read|clipboard-write|clipboard-trim-trailing-spaces|clipboard-paste-protection|clipboard-paste-bracketed-safe|title-report|image-storage-limit|copy-on-select|right-click-action|click-repeat-interval|config-file|config-default-files|confirm-close-surface|quit-after-last-window-closed|quit-after-last-window-closed-delay|initial-window|undo-timeout|quick-terminal-position|quick-terminal-size|gtk-quick-terminal-layer|gtk-quick-terminal-namespace|quick-terminal-screen|quick-terminal-animation-duration|quick-terminal-autohide|quick-terminal-space-behavior|quick-terminal-keyboard-interactivity|shell-integration|shell-integration-features|command-palette-entry|osc-color-report-format|vt-kam-allowed|custom-shader|custom-shader-animation|bell-features|bell-audio-path|bell-audio-volume|app-notifications|macos-non-native-fullscreen|macos-window-buttons|macos-titlebar-style|macos-titlebar-proxy-icon|macos-dock-drop-behavior|macos-option-as-alt|macos-window-shadow|macos-hidden|macos-auto-secure-input|macos-secure-input-indication|macos-applescript|macos-icon|macos-custom-icon|macos-icon-frame|macos-icon-ghost-color|macos-icon-screen-color|macos-shortcuts|linux-cgroup|linux-cgroup-memory-limit|linux-cgroup-processes-limit|linux-cgroup-hard-fail|gtk-opengl-debug|gtk-single-instance|gtk-titlebar|gtk-tabs-location|gtk-titlebar-hide-when-maximized|gtk-toolbar-style|gtk-titlebar-style|gtk-wide-tabs|gtk-custom-css|desktop-notifications|progress-style|bold-color|faint-opacity|term|enquiry-response|async-backend|auto-update|auto-update-channel)\b'
scope: keyword.other.ghostty
@@ -0,0 +1,233 @@
set -l commands "+version +help +list-fonts +list-keybinds +list-themes +list-colors +list-actions +ssh-cache +edit-config +show-config +validate-config +show-face +crash-report +boo +new-window"
complete -c ghostty -f
complete -c ghostty -s e -l help -f
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l version -f
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l language -r -f -d "Set Ghostty's graphical user interface language to a language other than the system default language."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l font-family -r -f -a "(ghostty +list-fonts | grep '^[A-Z]')" -d "The font families to use."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l font-family-bold -r -f -a "(ghostty +list-fonts | grep '^[A-Z]')"
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l font-family-italic -r -f -a "(ghostty +list-fonts | grep '^[A-Z]')"
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l font-family-bold-italic -r -f -a "(ghostty +list-fonts | grep '^[A-Z]')"
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l font-style -r -f -d "The named font style to use for each of the requested terminal font styles."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l font-style-bold -r -f
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l font-style-italic -r -f
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l font-style-bold-italic -r -f
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l font-synthetic-style -r -f -a "bold no-bold italic no-italic bold-italic no-bold-italic" -d "Control whether Ghostty should synthesize a style if the requested style is not available in the specified font-family."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l font-feature -r -f -d "Apply a font feature."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l font-size -r -f -d "Font size in points."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l font-variation -r -f -d "A repeatable configuration to set one or more font variations values for a variable font."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l font-variation-bold -r -f
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l font-variation-italic -r -f
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l font-variation-bold-italic -r -f
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l font-codepoint-map -r -f -d "Force one or a range of Unicode codepoints to map to a specific named font."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l clipboard-codepoint-map -r -f -d "Map specific Unicode codepoints to replacement values when copying text to clipboard."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l font-thicken -f -d "Draw fonts with a thicker stroke, if supported."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l font-thicken-strength -r -f -d "Strength of thickening when `font-thicken` is enabled."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l font-shaping-break -r -f -a "cursor no-cursor" -d "Locations to break font shaping into multiple runs."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l alpha-blending -r -f -a "native linear linear-corrected" -d "What color space to use when performing alpha blending."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l adjust-cell-width -r -f -d "All of the configurations behavior adjust various metrics determined by the font."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l adjust-cell-height -r -f
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l adjust-font-baseline -r -f -d "Distance in pixels or percentage adjustment from the bottom of the cell to the text baseline."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l adjust-underline-position -r -f -d "Distance in pixels or percentage adjustment from the top of the cell to the top of the underline."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l adjust-underline-thickness -r -f -d "Thickness in pixels of the underline."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l adjust-strikethrough-position -r -f -d "Distance in pixels or percentage adjustment from the top of the cell to the top of the strikethrough."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l adjust-strikethrough-thickness -r -f -d "Thickness in pixels or percentage adjustment of the strikethrough."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l adjust-overline-position -r -f -d "Distance in pixels or percentage adjustment from the top of the cell to the top of the overline."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l adjust-overline-thickness -r -f -d "Thickness in pixels or percentage adjustment of the overline."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l adjust-cursor-thickness -r -f -d "Thickness in pixels or percentage adjustment of the bar cursor and outlined rect cursor."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l adjust-cursor-height -r -f -d "Height in pixels or percentage adjustment of the cursor."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l adjust-box-thickness -r -f -d "Thickness in pixels or percentage adjustment of box drawing characters."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l adjust-icon-height -r -f -d "Height in pixels or percentage adjustment of maximum height for nerd font icons."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l grapheme-width-method -r -f -a "legacy unicode" -d "The method to use for calculating the cell width of a grapheme cluster."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l freetype-load-flags -r -f -a "hinting no-hinting force-autohint no-force-autohint monochrome no-monochrome autohint no-autohint light no-light" -d "FreeType load flags to enable."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l theme -r -f -a "(ghostty +list-themes | sed -E 's/^(.*) \(.*\$/\1/')" -d "A theme to use."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l background -r -f -d "Background color for the window."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l foreground -r -f -d "Foreground color for the window."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l background-image -r -f -d "Background image for the terminal."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l background-image-opacity -r -f -d "Background image opacity."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l background-image-position -r -f -a "top-left top-center top-right center-left center-center center-right bottom-left bottom-center bottom-right center" -d "Background image position."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l background-image-fit -r -f -a "contain cover stretch none" -d "Background image fit."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l background-image-repeat -f -d "Whether to repeat the background image or not."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l selection-foreground -r -f -d "The foreground and background color for selection."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l selection-background -r -f
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l selection-clear-on-typing -f -d "Whether to clear selected text when typing."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l selection-clear-on-copy -f -d "Whether to clear selected text after copying."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l selection-word-chars -r -f -d "Characters that mark word boundaries during text selection operations such as double-clicking."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l minimum-contrast -r -f -d "The minimum contrast ratio between the foreground and background colors."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l palette -r -f -d "Color palette for the 256 color form that many terminal applications use."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l palette-generate -f -d "Whether to automatically generate the extended 256 color palette (indices 16255) from the base 16 ANSI colors."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l palette-harmonious -f -d "Invert the palette colors generated when `palette-generate` is enabled, so that the colors go in reverse order."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l cursor-color -r -f -d "The color of the cursor."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l cursor-opacity -r -f -d "The opacity level (opposite of transparency) of the cursor."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l cursor-style -r -f -a "bar block underline block_hollow" -d "The style of the cursor."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l cursor-style-blink -r -f -d "Sets the default blinking state of the cursor."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l cursor-text -r -f -d "The color of the text under the cursor."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l cursor-click-to-move -f -d "Enables the ability to move the cursor at prompts by clicking on a location in the prompt text."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l mouse-hide-while-typing -f -d "Hide the mouse immediately when typing."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l scroll-to-bottom -r -f -a "keystroke no-keystroke output no-output" -d "When to scroll the surface to the bottom."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l mouse-shift-capture -r -f -a "false true always never" -d "Determines whether running programs can detect the shift key pressed with a mouse click."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l mouse-reporting -f -d "Enable or disable mouse reporting."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l mouse-scroll-multiplier -r -f -d "Multiplier for scrolling distance with the mouse wheel."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l background-opacity -r -f -d "The opacity level (opposite of transparency) of the background."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l background-opacity-cells -f -d "Applies background opacity to cells with an explicit background color set."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l background-blur -r -f -d "Whether to blur the background when `background-opacity` is less than 1."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l unfocused-split-opacity -r -f -d "The opacity level (opposite of transparency) of an unfocused split."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l unfocused-split-fill -r -f -d "The color to dim the unfocused split."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l split-divider-color -r -f -d "The color of the split divider."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l split-preserve-zoom -r -f -a "navigation no-navigation" -d "Control when Ghostty preserves a zoomed split."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l search-foreground -r -f -d "The foreground and background color for search matches."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l search-background -r -f
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l search-selected-foreground -r -f -d "The foreground and background color for the currently selected search match."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l search-selected-background -r -f
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l command -r -f -d "The command to run, usually a shell."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l initial-command -r -f -d "This is the same as \"command\", but only applies to the first terminal surface created when Ghostty starts."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l notify-on-command-finish -r -f -a "never unfocused always" -d "Controls when command finished notifications are sent."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l notify-on-command-finish-action -r -f -a "bell no-bell notify no-notify" -d "If command finished notifications are enabled, this controls how the user is notified."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l notify-on-command-finish-after -r -f -d "If command finished notifications are enabled, this controls how long a command must have been running before a notification will be sent."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l env -r -f -d "Extra environment variables to pass to commands launched in a terminal surface."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l input -r -f -d "Data to send as input to the command on startup."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l wait-after-command -f -d "If true, keep the terminal open after the command exits."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l abnormal-command-exit-runtime -r -f -d "The number of milliseconds of runtime below which we consider a process exit to be abnormal."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l scrollback-limit -r -f -d "The size of the scrollback buffer in bytes."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l scrollbar -r -f -a "system never" -d "Control when the scrollbar is shown to scroll the scrollback buffer."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l link -r -f -d "Match a regular expression against the terminal text and associate clicking it with an action."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l link-url -f -d "Enable URL matching."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l link-previews -r -f -a "false true osc8" -d "Show link previews for a matched URL."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l maximize -f -d "Whether to start the window in a maximized state."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l fullscreen -r -f -a "false true non-native non-native-visible-menu non-native-padded-notch" -d "Start new windows in fullscreen."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l title -r -f -d "The title Ghostty will use for the window."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l class -r -f -d "The setting that will change the application class value."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l x11-instance-name -r -f -d "This controls the instance name field of the `WM_CLASS` X11 property when running under X11."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l working-directory -r -f -k -a "(__fish_complete_directories)" -d "The directory to change to after starting the command."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l keybind -r -f -d "Key bindings."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l key-remap -r -f -d "Remap modifier keys within Ghostty."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l window-padding-x -r -f -d "Horizontal window padding."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l window-padding-y -r -f -d "Vertical window padding."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l window-padding-balance -f -d "The viewport dimensions are usually not perfectly divisible by the cell size."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l window-padding-color -r -f -a "background extend extend-always" -d "The color of the padding area of the window."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l window-vsync -f -d "Synchronize rendering with the screen refresh rate."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l window-inherit-working-directory -f -d "If true, new windows will inherit the working directory of the previously focused window."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l tab-inherit-working-directory -f -d "If true, new tabs will inherit the working directory of the previously focused tab."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l split-inherit-working-directory -f -d "If true, new split panes will inherit the working directory of the previously focused split."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l window-inherit-font-size -f -d "If true, new windows and tabs will inherit the font size of the previously focused window."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l window-decoration -r -f -a "auto client server none" -d "Configure a preference for window decorations."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l window-title-font-family -r -f -d "The font that will be used for the application's window and tab titles."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l window-subtitle -r -f -a "false working-directory" -d "The text that will be displayed in the subtitle of the window."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l window-theme -r -f -a "auto system light dark ghostty" -d "The theme to use for the windows."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l window-colorspace -r -f -a "srgb display-p3" -d "The color space to use when interpreting terminal colors."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l window-height -r -f -d "The initial window size."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l window-width -r -f
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l window-position-x -r -f -d "The starting window position."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l window-position-y -r -f
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l window-save-state -r -f -a "default never always" -d "Whether to enable saving and restoring window state."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l window-step-resize -f -d "Resize the window in discrete increments of the focused surface's cell size."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l window-new-tab-position -r -f -a "current end" -d "The position where new tabs are created."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l window-show-tab-bar -r -f -a "always auto never" -d "Whether to show the tab bar."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l window-titlebar-background -r -f -d "Background color for the window titlebar."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l window-titlebar-foreground -r -f -d "Foreground color for the window titlebar."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l resize-overlay -r -f -a "always never after-first" -d "This controls when resize overlays are shown."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l resize-overlay-position -r -f -a "center top-left top-center top-right bottom-left bottom-center bottom-right" -d "If resize overlays are enabled, this controls the position of the overlay."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l resize-overlay-duration -r -f -d "If resize overlays are enabled, this controls how long the overlay is visible on the screen before it is hidden."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l focus-follows-mouse -f -d "If true, when there are multiple split panes, the mouse selects the pane that is focused."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l clipboard-read -r -f -a "allow deny ask" -d "Whether to allow programs running in the terminal to read/write to the system clipboard (OSC 52, for googling)."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l clipboard-write -r -f -a "allow deny ask"
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l clipboard-trim-trailing-spaces -f -d "Trims trailing whitespace on data that is copied to the clipboard."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l clipboard-paste-protection -f -d "Require confirmation before pasting text that appears unsafe."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l clipboard-paste-bracketed-safe -f -d "If true, bracketed pastes will be considered safe."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l title-report -f -d "Enables or disabled title reporting (CSI 21 t)."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l image-storage-limit -r -f -d "The total amount of bytes that can be used for image data (e.g."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l copy-on-select -r -f -a "false true clipboard" -d "Whether to automatically copy selected text to the clipboard."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l right-click-action -r -f -a "ignore paste copy copy-or-paste context-menu" -d "The action to take when the user right-clicks on the terminal surface."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l click-repeat-interval -r -f -d "The time in milliseconds between clicks to consider a click a repeat (double, triple, etc.) or an entirely new single click."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l config-file -r -F -d "Additional configuration files to read."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l config-default-files -f -d "When this is true, the default configuration file paths will be loaded."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l confirm-close-surface -r -f -a "false true always" -d "Confirms that a surface should be closed before closing it."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l quit-after-last-window-closed -f -d "Whether or not to quit after the last surface is closed."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l quit-after-last-window-closed-delay -r -f -d "Controls how long Ghostty will stay running after the last open surface has been closed."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l initial-window -f -d "This controls whether an initial window is created when Ghostty is run."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l undo-timeout -r -f -d "The duration that undo operations remain available."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l quick-terminal-position -r -f -a "top bottom left right center" -d "The position of the \"quick\" terminal window."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l quick-terminal-size -r -f -d "The size of the quick terminal."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l gtk-quick-terminal-layer -r -f -a "overlay top bottom background" -d "The layer of the quick terminal window."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l gtk-quick-terminal-namespace -r -f -d "The namespace for the quick terminal window."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l quick-terminal-screen -r -f -a "main mouse macos-menu-bar" -d "The screen where the quick terminal should show up."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l quick-terminal-animation-duration -r -f -d "Duration (in seconds) of the quick terminal enter and exit animation."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l quick-terminal-autohide -f -d "Automatically hide the quick terminal when focus shifts to another window."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l quick-terminal-space-behavior -r -f -a "remain move" -d "This configuration option determines the behavior of the quick terminal when switching between macOS spaces."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l quick-terminal-keyboard-interactivity -r -f -a "none on-demand exclusive" -d "Determines under which circumstances that the quick terminal should receive keyboard input."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l shell-integration -r -f -a "none detect bash elvish fish nushell zsh" -d "Whether to enable shell integration auto-injection or not."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l shell-integration-features -r -f -a "cursor no-cursor sudo no-sudo title no-title ssh-env no-ssh-env ssh-terminfo no-ssh-terminfo path no-path" -d "Shell integration features to enable."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l command-palette-entry -r -f -d "Custom entries into the command palette."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l osc-color-report-format -r -f -a "none 8-bit 16-bit" -d "Sets the reporting format for OSC sequences that request color information."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l vt-kam-allowed -f -d "If true, allows the \"KAM\" mode (ANSI mode 2) to be used within the terminal."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l custom-shader -r -F -d "Custom shaders to run after the default shaders."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l custom-shader-animation -r -f -a "false true always" -d "If `true` (default), the focused terminal surface will run an animation loop when custom shaders are used."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l bell-features -r -f -a "system no-system audio no-audio attention no-attention title no-title border no-border" -d "Bell features to enable if bell support is available in your runtime."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l bell-audio-path -r -f -d "If `audio` is an enabled bell feature, this is a path to an audio file."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l bell-audio-volume -r -f -d "If `audio` is an enabled bell feature, this is the volume to play the audio file at (relative to the system volume)."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l app-notifications -r -f -a "clipboard-copy no-clipboard-copy config-reload no-config-reload" -d "Control the in-app notifications that Ghostty shows."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l macos-non-native-fullscreen -r -f -a "false true visible-menu padded-notch" -d "If anything other than false, fullscreen mode on macOS will not use the native fullscreen, but make the window fullscreen without animations and using a new space."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l macos-window-buttons -r -f -a "visible hidden" -d "Whether the window buttons in the macOS titlebar are visible."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l macos-titlebar-style -r -f -a "native transparent tabs hidden" -d "The style of the macOS titlebar."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l macos-titlebar-proxy-icon -r -f -a "visible hidden" -d "Whether the proxy icon in the macOS titlebar is visible."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l macos-dock-drop-behavior -r -f -a "new-tab new-window" -d "Controls the windowing behavior when dropping a file or folder onto the Ghostty icon in the macOS dock."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l macos-option-as-alt -r -f -d "macOS doesn't have a distinct \"alt\" key and instead has the \"option\" key which behaves slightly differently."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l macos-window-shadow -f -d "Whether to enable the macOS window shadow."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l macos-hidden -r -f -a "never always" -d "If true, the macOS icon in the dock and app switcher will be hidden."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l macos-auto-secure-input -f -d "If true, Ghostty on macOS will automatically enable the \"Secure Input\" feature when it detects that a password prompt is being displayed."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l macos-secure-input-indication -f -d "If true, Ghostty will show a graphical indication when secure input is enabled."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l macos-applescript -f -d "If true, Ghostty exposes and handles the built-in AppleScript dictionary on macOS."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l macos-icon -r -f -a "official blueprint chalkboard microchip glass holographic paper retro xray custom custom-style" -d "Customize the macOS app icon."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l macos-custom-icon -r -f -d "The absolute path to the custom icon file."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l macos-icon-frame -r -f -a "aluminum beige plastic chrome" -d "The material to use for the frame of the macOS app icon."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l macos-icon-ghost-color -r -f -d "The color of the ghost in the macOS app icon."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l macos-icon-screen-color -r -f -d "The color of the screen in the macOS app icon."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l macos-shortcuts -r -f -a "allow deny ask" -d "Whether macOS Shortcuts are allowed to control Ghostty."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l linux-cgroup -r -f -a "never always single-instance" -d "Put every surface (tab, split, window) into a transient `systemd` scope."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l linux-cgroup-memory-limit -r -f -d "Memory limit for any individual terminal process (tab, split, window, etc.) in bytes."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l linux-cgroup-processes-limit -r -f -d "Number of processes limit for any individual terminal process (tab, split, window, etc.)."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l linux-cgroup-hard-fail -f -d "If this is false, then creating a transient `systemd` scope (for `linux-cgroup`) will be allowed to fail and the failure is ignored."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l gtk-opengl-debug -f -d "Enable or disable GTK's OpenGL debugging logs."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l gtk-single-instance -r -f -a "false true detect" -d "If `true`, the Ghostty GTK application will run in single-instance mode: each new `ghostty` process launched will result in a new window if there is already a running process."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l gtk-titlebar -f -d "When enabled, the full GTK titlebar is displayed instead of your window manager's simple titlebar."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l gtk-tabs-location -r -f -a "top bottom" -d "Determines the side of the screen that the GTK tab bar will stick to."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l gtk-titlebar-hide-when-maximized -f -d "If this is `true`, the titlebar will be hidden when the window is maximized, and shown when the titlebar is unmaximized."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l gtk-toolbar-style -r -f -a "flat raised raised-border" -d "Determines the appearance of the top and bottom bars tab bar."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l gtk-titlebar-style -r -f -a "native tabs" -d "The style of the GTK titlebar."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l gtk-wide-tabs -f -d "If `true` (default), then the Ghostty GTK tabs will be \"wide.\" Wide tabs are the new typical Gnome style where tabs fill their available space."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l gtk-custom-css -r -F -d "Custom CSS files to be loaded."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l desktop-notifications -f -d "If `true` (default), applications running in the terminal can show desktop notifications using certain escape sequences such as OSC 9 or OSC 777."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l progress-style -f -d "If `true` (default), applications running in the terminal can show graphical progress bars using the ConEmu OSC 9;4 escape sequence."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l bold-color -r -f -d "Modifies the color used for bold text in the terminal."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l faint-opacity -r -f -d "The opacity level (opposite of transparency) of the faint text."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l term -r -f -d "This will be used to set the `TERM` environment variable."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l enquiry-response -r -f -d "String to send when we receive `ENQ` (`0x05`) from the command that we are running."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l async-backend -r -f -a "auto epoll io_uring" -d "Configures the low-level API to use for async IO, eventing, etc."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l auto-update -r -f -d "Control the auto-update functionality of Ghostty."
complete -c ghostty -n "not __fish_seen_subcommand_from $commands" -l auto-update-channel -r -f -d "The release channel to use for auto-updates."
complete -c ghostty -n "string match -q -- '+*' (commandline -pt)" -f -a "+version +help +list-fonts +list-keybinds +list-themes +list-colors +list-actions +ssh-cache +edit-config +show-config +validate-config +show-face +crash-report +boo +new-window"
complete -c ghostty -n "__fish_seen_subcommand_from +list-fonts" -l family -r -f
complete -c ghostty -n "__fish_seen_subcommand_from +list-fonts" -l style -r -f
complete -c ghostty -n "__fish_seen_subcommand_from +list-fonts" -l bold -f
complete -c ghostty -n "__fish_seen_subcommand_from +list-fonts" -l italic -f
complete -c ghostty -n "__fish_seen_subcommand_from +list-keybinds" -l default -f
complete -c ghostty -n "__fish_seen_subcommand_from +list-keybinds" -l docs -f
complete -c ghostty -n "__fish_seen_subcommand_from +list-keybinds" -l plain -f
complete -c ghostty -n "__fish_seen_subcommand_from +list-themes" -l path -f
complete -c ghostty -n "__fish_seen_subcommand_from +list-themes" -l plain -f
complete -c ghostty -n "__fish_seen_subcommand_from +list-themes" -l color -r -f -a "all dark light"
complete -c ghostty -n "__fish_seen_subcommand_from +list-colors" -l plain -f
complete -c ghostty -n "__fish_seen_subcommand_from +list-actions" -l docs -f
complete -c ghostty -n "__fish_seen_subcommand_from +ssh-cache" -l clear -f
complete -c ghostty -n "__fish_seen_subcommand_from +ssh-cache" -l add -r -f
complete -c ghostty -n "__fish_seen_subcommand_from +ssh-cache" -l remove -r -f
complete -c ghostty -n "__fish_seen_subcommand_from +ssh-cache" -l host -r -f
complete -c ghostty -n "__fish_seen_subcommand_from +ssh-cache" -l expire-days -r -f
complete -c ghostty -n "__fish_seen_subcommand_from +show-config" -l default -f
complete -c ghostty -n "__fish_seen_subcommand_from +show-config" -l changes-only -f
complete -c ghostty -n "__fish_seen_subcommand_from +show-config" -l docs -f
complete -c ghostty -n "__fish_seen_subcommand_from +validate-config" -l config-file -r -F
complete -c ghostty -n "__fish_seen_subcommand_from +show-face" -l cp -r -f
complete -c ghostty -n "__fish_seen_subcommand_from +show-face" -l string -r -f
complete -c ghostty -n "__fish_seen_subcommand_from +show-face" -l style -r -f -a "regular bold italic bold_italic"
complete -c ghostty -n "__fish_seen_subcommand_from +show-face" -l presentation -r -f -a "text emoji"
complete -c ghostty -n "__fish_seen_subcommand_from +new-window" -l class -r -f
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,382 @@
# bash-preexec.sh -- Bash support for ZSH-like 'preexec' and 'precmd' functions.
# https://github.com/rcaloras/bash-preexec
#
#
# 'preexec' functions are executed before each interactive command is
# executed, with the interactive command as its argument. The 'precmd'
# function is executed before each prompt is displayed.
#
# Author: Ryan Caloras (ryan@bashhub.com)
# Forked from Original Author: Glyph Lefkowitz
#
# V0.6.0
#
# General Usage:
#
# 1. Source this file at the end of your bash profile so as not to interfere
# with anything else that's using PROMPT_COMMAND.
#
# 2. Add any precmd or preexec functions by appending them to their arrays:
# e.g.
# precmd_functions+=(my_precmd_function)
# precmd_functions+=(some_other_precmd_function)
#
# preexec_functions+=(my_preexec_function)
#
# 3. Consider changing anything using the DEBUG trap or PROMPT_COMMAND
# to use preexec and precmd instead. Preexisting usages will be
# preserved, but doing so manually may be less surprising.
#
# Note: This module requires two Bash features which you must not otherwise be
# using: the "DEBUG" trap, and the "PROMPT_COMMAND" variable. If you override
# either of these after bash-preexec has been installed it will most likely break.
# Tell shellcheck what kind of file this is.
# shellcheck shell=bash
# Make sure this is bash that's running and return otherwise.
# Use POSIX syntax for this line:
if [ -z "${BASH_VERSION-}" ]; then
return 1
fi
# We only support Bash 3.1+.
# Note: BASH_VERSINFO is first available in Bash-2.0.
if [[ -z "${BASH_VERSINFO-}" ]] || (( BASH_VERSINFO[0] < 3 || (BASH_VERSINFO[0] == 3 && BASH_VERSINFO[1] < 1) )); then
return 1
fi
# Avoid duplicate inclusion
if [[ -n "${bash_preexec_imported:-}" || -n "${__bp_imported:-}" ]]; then
return 0
fi
bash_preexec_imported="defined"
# WARNING: This variable is no longer used and should not be relied upon.
# Use ${bash_preexec_imported} instead.
# shellcheck disable=SC2034
__bp_imported="${bash_preexec_imported}"
# Should be available to each precmd and preexec
# functions, should they want it. $? and $_ are available as $? and $_, but
# $PIPESTATUS is available only in a copy, $BP_PIPESTATUS.
# TODO: Figure out how to restore PIPESTATUS before each precmd or preexec
# function.
__bp_last_ret_value="$?"
BP_PIPESTATUS=("${PIPESTATUS[@]}")
__bp_last_argument_prev_command="$_"
__bp_inside_precmd=0
__bp_inside_preexec=0
# Initial PROMPT_COMMAND string that is removed from PROMPT_COMMAND post __bp_install
__bp_install_string=$'__bp_trap_string="$(trap -p DEBUG)"\ntrap - DEBUG\n__bp_install'
# Fails if any of the given variables are readonly
# Reference https://stackoverflow.com/a/4441178
__bp_require_not_readonly() {
local var
for var; do
if ! ( unset "$var" 2> /dev/null ); then
echo "bash-preexec requires write access to ${var}" >&2
return 1
fi
done
}
# Remove ignorespace and or replace ignoreboth from HISTCONTROL
# so we can accurately invoke preexec with a command from our
# history even if it starts with a space.
__bp_adjust_histcontrol() {
local histcontrol
histcontrol="${HISTCONTROL:-}"
histcontrol="${histcontrol//ignorespace}"
# Replace ignoreboth with ignoredups
if [[ "$histcontrol" == *"ignoreboth"* ]]; then
histcontrol="ignoredups:${histcontrol//ignoreboth}"
fi
export HISTCONTROL="$histcontrol"
}
# This variable describes whether we are currently in "interactive mode";
# i.e. whether this shell has just executed a prompt and is waiting for user
# input. It documents whether the current command invoked by the trace hook is
# run interactively by the user; it's set immediately after the prompt hook,
# and unset as soon as the trace hook is run.
__bp_preexec_interactive_mode=""
# These arrays are used to add functions to be run before, or after, prompts.
declare -a precmd_functions
declare -a preexec_functions
# Trims leading and trailing whitespace from $2 and writes it to the variable
# name passed as $1
__bp_trim_whitespace() {
local var=${1:?} text=${2:-}
text="${text#"${text%%[![:space:]]*}"}" # remove leading whitespace characters
text="${text%"${text##*[![:space:]]}"}" # remove trailing whitespace characters
printf -v "$var" '%s' "$text"
}
# Trims whitespace and removes any leading or trailing semicolons from $2 and
# writes the resulting string to the variable name passed as $1. Used for
# manipulating substrings in PROMPT_COMMAND
__bp_sanitize_string() {
local var=${1:?} text=${2:-} sanitized
__bp_trim_whitespace sanitized "$text"
sanitized=${sanitized%;}
sanitized=${sanitized#;}
__bp_trim_whitespace sanitized "$sanitized"
printf -v "$var" '%s' "$sanitized"
}
# This function is installed as part of the PROMPT_COMMAND;
# It sets a variable to indicate that the prompt was just displayed,
# to allow the DEBUG trap to know that the next command is likely interactive.
__bp_interactive_mode() {
__bp_preexec_interactive_mode="on"
}
# This function is installed as part of the PROMPT_COMMAND.
# It will invoke any functions defined in the precmd_functions array.
__bp_precmd_invoke_cmd() {
# Save the returned value from our last command, and from each process in
# its pipeline. Note: this MUST be the first thing done in this function.
# BP_PIPESTATUS may be unused, ignore
# shellcheck disable=SC2034
__bp_last_ret_value="$?" BP_PIPESTATUS=("${PIPESTATUS[@]}")
# Don't invoke precmds if we are inside an execution of an "original
# prompt command" by another precmd execution loop. This avoids infinite
# recursion.
if (( __bp_inside_precmd > 0 )); then
return
fi
local __bp_inside_precmd=1
# Invoke every function defined in our function array.
local precmd_function
for precmd_function in "${precmd_functions[@]}"; do
# Only execute this function if it actually exists.
# Test existence of functions with: declare -[Ff]
if type -t "$precmd_function" 1>/dev/null; then
__bp_set_ret_value "$__bp_last_ret_value" "$__bp_last_argument_prev_command"
# Quote our function invocation to prevent issues with IFS
"$precmd_function"
fi
done
__bp_set_ret_value "$__bp_last_ret_value"
}
# Sets a return value in $?. We may want to get access to the $? variable in our
# precmd functions. This is available for instance in zsh. We can simulate it in bash
# by setting the value here.
__bp_set_ret_value() {
return ${1:+"$1"}
}
__bp_in_prompt_command() {
local prompt_command_array IFS=$'\n;'
read -rd '' -a prompt_command_array <<< "${PROMPT_COMMAND[*]:-}"
local trimmed_arg
__bp_trim_whitespace trimmed_arg "${1:-}"
local command trimmed_command
for command in "${prompt_command_array[@]:-}"; do
__bp_trim_whitespace trimmed_command "$command"
if [[ "$trimmed_command" == "$trimmed_arg" ]]; then
return 0
fi
done
return 1
}
# This function is installed as the DEBUG trap. It is invoked before each
# interactive prompt display. Its purpose is to inspect the current
# environment to attempt to detect if the current command is being invoked
# interactively, and invoke 'preexec' if so.
__bp_preexec_invoke_exec() {
# Save the contents of $_ so that it can be restored later on.
# https://stackoverflow.com/questions/40944532/bash-preserve-in-a-debug-trap#40944702
__bp_last_argument_prev_command="${1:-}"
# Don't invoke preexecs if we are inside of another preexec.
if (( __bp_inside_preexec > 0 )); then
return
fi
local __bp_inside_preexec=1
# Checks if the file descriptor is not standard out (i.e. '1')
# __bp_delay_install checks if we're in test. Needed for bats to run.
# Prevents preexec from being invoked for functions in PS1
if [[ ! -t 1 && -z "${__bp_delay_install:-}" ]]; then
return
fi
if [[ -n "${COMP_POINT:-}" || -n "${READLINE_POINT:-}" ]]; then
# We're in the middle of a completer or a keybinding set up by "bind
# -x". This obviously can't be an interactively issued command.
return
fi
if [[ -z "${__bp_preexec_interactive_mode:-}" ]]; then
# We're doing something related to displaying the prompt. Let the
# prompt set the title instead of me.
return
else
# If we're in a subshell, then the prompt won't be re-displayed to put
# us back into interactive mode, so let's not set the variable back.
# In other words, if you have a subshell like
# (sleep 1; sleep 2)
# You want to see the 'sleep 2' as a set_command_title as well.
if [[ 0 -eq "${BASH_SUBSHELL:-}" ]]; then
__bp_preexec_interactive_mode=""
fi
fi
if __bp_in_prompt_command "${BASH_COMMAND:-}"; then
# If we're executing something inside our prompt_command then we don't
# want to call preexec. Bash prior to 3.1 can't detect this at all :/
__bp_preexec_interactive_mode=""
return
fi
local this_command
this_command=$(LC_ALL=C HISTTIMEFORMAT='' builtin history 1)
this_command="${this_command#*[[:digit:]][* ] }"
# Sanity check to make sure we have something to invoke our function with.
if [[ -z "$this_command" ]]; then
return
fi
# Invoke every function defined in our function array.
local preexec_function
local preexec_function_ret_value
local preexec_ret_value=0
for preexec_function in "${preexec_functions[@]:-}"; do
# Only execute each function if it actually exists.
# Test existence of function with: declare -[fF]
if type -t "$preexec_function" 1>/dev/null; then
__bp_set_ret_value "${__bp_last_ret_value:-}"
# Quote our function invocation to prevent issues with IFS
"$preexec_function" "$this_command"
preexec_function_ret_value="$?"
if [[ "$preexec_function_ret_value" != 0 ]]; then
preexec_ret_value="$preexec_function_ret_value"
fi
fi
done
# Restore the last argument of the last executed command, and set the return
# value of the DEBUG trap to be the return code of the last preexec function
# to return an error.
# If `extdebug` is enabled a non-zero return value from any preexec function
# will cause the user's command not to execute.
# Run `shopt -s extdebug` to enable
__bp_set_ret_value "$preexec_ret_value" "$__bp_last_argument_prev_command"
}
__bp_install() {
# Exit if we already have this installed.
if [[ "${PROMPT_COMMAND[*]:-}" == *"__bp_precmd_invoke_cmd"* ]]; then
return 1
fi
trap '__bp_preexec_invoke_exec "$_"' DEBUG
# Preserve any prior DEBUG trap as a preexec function
eval "local trap_argv=(${__bp_trap_string:-})"
local prior_trap=${trap_argv[2]:-}
unset __bp_trap_string
if [[ -n "$prior_trap" ]]; then
eval '__bp_original_debug_trap() {
'"$prior_trap"'
}'
preexec_functions+=(__bp_original_debug_trap)
fi
# Adjust our HISTCONTROL Variable if needed.
#
# GHOSTTY: Don't modify HISTCONTROL. This hack is only needed to improve the
# accuracy of the command argument passed to the preexec functions, and we
# don't use that argument in our bash shell integration script (and nor does
# the __bp_original_debug_trap function above, which is the only other active
# preexec function).
#__bp_adjust_histcontrol
# Issue #25. Setting debug trap for subshells causes sessions to exit for
# backgrounded subshell commands (e.g. (pwd)& ). Believe this is a bug in Bash.
#
# Disabling this by default. It can be enabled by setting this variable.
if [[ -n "${__bp_enable_subshells:-}" ]]; then
# Set so debug trap will work be invoked in subshells.
set -o functrace > /dev/null 2>&1
shopt -s extdebug > /dev/null 2>&1
fi
local existing_prompt_command
# Remove setting our trap install string and sanitize the existing prompt command string
existing_prompt_command="${PROMPT_COMMAND:-}"
# Edge case of appending to PROMPT_COMMAND
existing_prompt_command="${existing_prompt_command//$__bp_install_string/:}" # no-op
existing_prompt_command="${existing_prompt_command//$'\n':$'\n'/$'\n'}" # remove known-token only
existing_prompt_command="${existing_prompt_command//$'\n':;/$'\n'}" # remove known-token only
__bp_sanitize_string existing_prompt_command "$existing_prompt_command"
if [[ "${existing_prompt_command:-:}" == ":" ]]; then
existing_prompt_command=
fi
# Install our hooks in PROMPT_COMMAND to allow our trap to know when we've
# actually entered something.
PROMPT_COMMAND='__bp_precmd_invoke_cmd'
PROMPT_COMMAND+=${existing_prompt_command:+$'\n'$existing_prompt_command}
if (( BASH_VERSINFO[0] > 5 || (BASH_VERSINFO[0] == 5 && BASH_VERSINFO[1] >= 1) )); then
PROMPT_COMMAND+=('__bp_interactive_mode')
else
# shellcheck disable=SC2179 # PROMPT_COMMAND is not an array in bash <= 5.0
PROMPT_COMMAND+=$'\n__bp_interactive_mode'
fi
# Add two functions to our arrays for convenience
# of definition.
precmd_functions+=(precmd)
preexec_functions+=(preexec)
# Invoke our two functions manually that were added to $PROMPT_COMMAND
__bp_precmd_invoke_cmd
__bp_interactive_mode
}
# Sets an installation string as part of our PROMPT_COMMAND to install
# after our session has started. This allows bash-preexec to be included
# at any point in our bash profile.
__bp_install_after_session_init() {
# bash-preexec needs to modify these variables in order to work correctly
# if it can't, just stop the installation
__bp_require_not_readonly PROMPT_COMMAND HISTCONTROL HISTTIMEFORMAT || return
local sanitized_prompt_command
__bp_sanitize_string sanitized_prompt_command "${PROMPT_COMMAND:-}"
if [[ -n "$sanitized_prompt_command" ]]; then
# shellcheck disable=SC2178 # PROMPT_COMMAND is not an array in bash <= 5.0
PROMPT_COMMAND=${sanitized_prompt_command}$'\n'
fi
# shellcheck disable=SC2179 # PROMPT_COMMAND is not an array in bash <= 5.0
PROMPT_COMMAND+=${__bp_install_string}
}
# Run our install so long as we're not delaying it.
if [[ -z "${__bp_delay_install:-}" ]]; then
__bp_install_after_session_init
fi
@@ -0,0 +1,315 @@
# Parts of this script are based on Kitty's bash integration. Kitty is
# distributed under GPLv3, so this file is also distributed under GPLv3.
# The license header is reproduced below:
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
# We need to be in interactive mode to proceed.
if [[ "$-" != *i* ]]; then builtin return; fi
# When automatic shell integration is active, we were started in POSIX
# mode and need to manually recreate the bash startup sequence.
if [ -n "$GHOSTTY_BASH_INJECT" ]; then
# Store a temporary copy of our startup flags and unset these global
# environment variables so we can safely handle reentrancy.
builtin declare __ghostty_bash_flags="$GHOSTTY_BASH_INJECT"
builtin unset ENV GHOSTTY_BASH_INJECT
# Restore an existing ENV that was replaced by the shell integration code.
if [[ -n "$GHOSTTY_BASH_ENV" ]]; then
builtin export ENV=$GHOSTTY_BASH_ENV
builtin unset GHOSTTY_BASH_ENV
fi
# Restore bash's default 'posix' behavior. Also reset 'inherit_errexit',
# which doesn't happen as part of the 'posix' reset.
builtin set +o posix
builtin shopt -u inherit_errexit 2>/dev/null
# Unexport HISTFILE if it was set by the shell integration code.
if [[ -n "$GHOSTTY_BASH_UNEXPORT_HISTFILE" ]]; then
builtin export -n HISTFILE
builtin unset GHOSTTY_BASH_UNEXPORT_HISTFILE
fi
# Manually source the startup files. See INVOCATION in bash(1) and
# run_startup_files() in shell.c in the Bash source code.
if builtin shopt -q login_shell; then
if [[ $__ghostty_bash_flags != *"--noprofile"* ]]; then
[ -r /etc/profile ] && builtin source "/etc/profile"
for __ghostty_rcfile in "$HOME/.bash_profile" "$HOME/.bash_login" "$HOME/.profile"; do
[ -r "$__ghostty_rcfile" ] && {
builtin source "$__ghostty_rcfile"
break
}
done
fi
else
if [[ $__ghostty_bash_flags != *"--norc"* ]]; then
# The location of the system bashrc is determined at bash build
# time via -DSYS_BASHRC and can therefore vary across distros:
# Arch, Debian, Ubuntu use /etc/bash.bashrc
# Fedora uses /etc/bashrc sourced from ~/.bashrc instead of SYS_BASHRC
# Void Linux uses /etc/bash/bashrc
# Nixos uses /etc/bashrc
for __ghostty_rcfile in /etc/bash.bashrc /etc/bash/bashrc /etc/bashrc; do
[ -r "$__ghostty_rcfile" ] && {
builtin source "$__ghostty_rcfile"
break
}
done
if [[ -z "$GHOSTTY_BASH_RCFILE" ]]; then GHOSTTY_BASH_RCFILE="$HOME/.bashrc"; fi
[ -r "$GHOSTTY_BASH_RCFILE" ] && builtin source "$GHOSTTY_BASH_RCFILE"
fi
fi
builtin unset __ghostty_rcfile
builtin unset __ghostty_bash_flags
builtin unset GHOSTTY_BASH_RCFILE
fi
# Add Ghostty binary to PATH if the path feature is enabled
if [[ "$GHOSTTY_SHELL_FEATURES" == *"path"* && -n "$GHOSTTY_BIN_DIR" ]]; then
if [[ ":$PATH:" != *":$GHOSTTY_BIN_DIR:"* ]]; then
export PATH="$PATH:$GHOSTTY_BIN_DIR"
fi
fi
# Sudo
if [[ "$GHOSTTY_SHELL_FEATURES" == *"sudo"* && -n "$TERMINFO" ]]; then
# Wrap `sudo` command to ensure Ghostty terminfo is preserved.
#
# This approach supports wrapping a `sudo` alias, but the alias definition
# must come _after_ this function is defined. Otherwise, the alias expansion
# will take precedence over this function, and it won't be wrapped.
function sudo {
builtin local sudo_has_sudoedit_flags="no"
for arg in "$@"; do
# Check if argument is '-e' or '--edit' (sudoedit flags)
if [[ "$arg" == "-e" || $arg == "--edit" ]]; then
sudo_has_sudoedit_flags="yes"
builtin break
fi
# Check if argument is neither an option nor a key-value pair
if [[ "$arg" != -* && "$arg" != *=* ]]; then
builtin break
fi
done
if [[ "$sudo_has_sudoedit_flags" == "yes" ]]; then
builtin command sudo "$@"
else
builtin command sudo --preserve-env=TERMINFO "$@"
fi
}
fi
# SSH Integration
if [[ "$GHOSTTY_SHELL_FEATURES" == *ssh-* ]]; then
function ssh() {
builtin local ssh_term ssh_opts
ssh_term="xterm-256color"
ssh_opts=()
# Configure environment variables for remote session
if [[ "$GHOSTTY_SHELL_FEATURES" == *ssh-env* ]]; then
ssh_opts+=(-o "SetEnv COLORTERM=truecolor")
ssh_opts+=(-o "SendEnv TERM_PROGRAM TERM_PROGRAM_VERSION")
fi
# Install terminfo on remote host if needed
if [[ "$GHOSTTY_SHELL_FEATURES" == *ssh-terminfo* ]]; then
builtin local ssh_user ssh_hostname
while IFS=' ' read -r ssh_key ssh_value; do
case "$ssh_key" in
user) ssh_user="$ssh_value" ;;
hostname) ssh_hostname="$ssh_value" ;;
esac
[[ -n "$ssh_user" && -n "$ssh_hostname" ]] && break
done < <(builtin command ssh -G "$@" 2>/dev/null)
if [[ -n "$ssh_hostname" ]]; then
builtin local ssh_target="${ssh_user}@${ssh_hostname}"
# Check if terminfo is already cached
if "$GHOSTTY_BIN_DIR/ghostty" +ssh-cache --host="$ssh_target" >/dev/null 2>&1; then
ssh_term="xterm-ghostty"
elif builtin command -v infocmp >/dev/null 2>&1; then
builtin local ssh_terminfo ssh_cpath_dir ssh_cpath
ssh_terminfo=$(infocmp -0 -x xterm-ghostty 2>/dev/null)
if [[ -n "$ssh_terminfo" ]]; then
builtin echo "Setting up xterm-ghostty terminfo on $ssh_hostname..." >&2
ssh_cpath_dir=$(mktemp -d "/tmp/ghostty-ssh-$ssh_user.XXXXXX" 2>/dev/null) || ssh_cpath_dir="/tmp/ghostty-ssh-$ssh_user.$$"
ssh_cpath="$ssh_cpath_dir/socket"
if builtin echo "$ssh_terminfo" | builtin command ssh -o ControlMaster=yes -o ControlPath="$ssh_cpath" -o ControlPersist=60s "$@" '
infocmp xterm-ghostty >/dev/null 2>&1 && exit 0
command -v tic >/dev/null 2>&1 || exit 1
mkdir -p ~/.terminfo 2>/dev/null && tic -x - 2>/dev/null && exit 0
exit 1
' 2>/dev/null; then
ssh_term="xterm-ghostty"
ssh_opts+=(-o "ControlPath=$ssh_cpath")
# Cache successful installation
"$GHOSTTY_BIN_DIR/ghostty" +ssh-cache --add="$ssh_target" >/dev/null 2>&1 || true
else
builtin echo "Warning: Failed to install terminfo." >&2
fi
else
builtin echo "Warning: Could not generate terminfo data." >&2
fi
else
builtin echo "Warning: ghostty command not available for cache management." >&2
fi
fi
fi
# Execute SSH with TERM environment variable
TERM="$ssh_term" builtin command ssh "${ssh_opts[@]}" "$@"
}
fi
# This is set to 1 when we're executing a command so that we don't
# send prompt marks multiple times.
_ghostty_executing=""
_ghostty_last_reported_cwd=""
function __ghostty_precmd() {
local ret="$?"
if test "$_ghostty_executing" != "0"; then
_GHOSTTY_SAVE_PS1="$PS1"
_GHOSTTY_SAVE_PS2="$PS2"
# Use 133;P (not 133;A) inside PS1 to avoid fresh-line behavior on
# readline redraws (e.g., vi mode switches, Ctrl-L). The initial
# 133;A with fresh-line is emitted once via printf below.
PS1='\[\e]133;P;k=i\a\]'$PS1'\[\e]133;B\a\]'
PS2='\[\e]133;P;k=s\a\]'$PS2'\[\e]133;B\a\]'
# Bash doesn't redraw the leading lines in a multiline prompt so we mark
# the start of each line (after each newline) as a secondary prompt. This
# correctly handles multiline prompts by setting the first to primary and
# the subsequent lines to secondary.
#
# We only replace the \n prompt escape, not literal newlines ($'\n'),
# because literal newlines may appear inside $(...) command substitutions
# where inserting escape sequences would break shell syntax.
if [[ "$PS1" == *"\n"* ]]; then
PS1="${PS1//\\n/\\n$'\\[\\e]133;P;k=s\\a\\]'}"
fi
# Cursor
if [[ "$GHOSTTY_SHELL_FEATURES" == *"cursor"* ]]; then
builtin local cursor=5 # blinking bar
[[ "$GHOSTTY_SHELL_FEATURES" == *"cursor:steady"* ]] && cursor=6 # steady bar
[[ "$PS1" != *"\[\e[${cursor} q\]"* ]] && PS1=$PS1"\[\e[${cursor} q\]"
[[ "$PS0" != *'\[\e[0 q\]'* ]] && PS0=$PS0'\[\e[0 q\]' # reset
fi
# Title (working directory)
if [[ "$GHOSTTY_SHELL_FEATURES" == *"title"* ]]; then
PS1=$PS1'\[\e]2;\w\a\]'
fi
fi
if test "$_ghostty_executing" != ""; then
# End of current command. Report its status.
builtin printf "\e]133;D;%s;aid=%s\a" "$ret" "$BASHPID"
fi
# Fresh line and start of prompt.
builtin printf "\e]133;A;redraw=last;cl=line;aid=%s\a" "$BASHPID"
# unfortunately bash provides no hooks to detect cwd changes
# in particular this means cwd reporting will not happen for a
# command like cd /test && cat. PS0 is evaluated before cd is run.
if [[ "$_ghostty_last_reported_cwd" != "$PWD" ]]; then
_ghostty_last_reported_cwd="$PWD"
builtin printf "\e]7;kitty-shell-cwd://%s%s\a" "$HOSTNAME" "$PWD"
fi
_ghostty_executing=0
}
function __ghostty_preexec() {
builtin local cmd="$1"
PS1="$_GHOSTTY_SAVE_PS1"
PS2="$_GHOSTTY_SAVE_PS2"
# Title (current command)
if [[ -n $cmd && "$GHOSTTY_SHELL_FEATURES" == *"title"* ]]; then
builtin printf "\e]2;%s\a" "${cmd//[[:cntrl:]]/}"
fi
# End of input, start of output.
builtin printf "\e]133;C;\a"
_ghostty_executing=1
}
if (( BASH_VERSINFO[0] > 4 || (BASH_VERSINFO[0] == 4 && BASH_VERSINFO[1] >= 4) )); then
__ghostty_preexec_hook() {
builtin local cmd
cmd=$(LC_ALL=C HISTTIMEFORMAT='' builtin history 1)
cmd="${cmd#*[[:digit:]][* ] }" # remove leading history number
[[ -n "$cmd" ]] && __ghostty_preexec "$cmd"
}
# Use function substitution in 5.3+. Otherwise, use command substitution.
# Any output (including escape sequences) goes to the terminal.
# Only define if not already set (allows re-sourcing).
if [[ -z "${__ghostty_ps0+x}" ]]; then
if (( BASH_VERSINFO[0] > 5 || (BASH_VERSINFO[0] == 5 && BASH_VERSINFO[1] >= 3) )); then
# shellcheck disable=SC2016
builtin readonly __ghostty_ps0='${ __ghostty_preexec_hook; }'
else
# shellcheck disable=SC2016
builtin readonly __ghostty_ps0='$(__ghostty_preexec_hook >/dev/tty)'
fi
fi
__ghostty_hook() {
builtin local ret=$?
__ghostty_precmd "$ret"
if [[ "$PS0" != *"$__ghostty_ps0"* ]]; then
PS0=$PS0"${__ghostty_ps0}"
fi
}
# Append our hook to PROMPT_COMMAND, preserving its existing type.
# shellcheck disable=SC2128,SC2178,SC2179
if [[ ";${PROMPT_COMMAND[*]:-};" != *";__ghostty_hook;"* ]]; then
if [[ -z "${PROMPT_COMMAND[*]}" ]]; then
if (( BASH_VERSINFO[0] > 5 || (BASH_VERSINFO[0] == 5 && BASH_VERSINFO[1] >= 1) )); then
PROMPT_COMMAND=(__ghostty_hook)
else
PROMPT_COMMAND="__ghostty_hook"
fi
elif [[ $(builtin declare -p PROMPT_COMMAND 2>/dev/null) == "declare -a "* ]]; then
PROMPT_COMMAND+=(__ghostty_hook)
else
[[ "${PROMPT_COMMAND}" =~ \;[[:space:]]*$ ]] || PROMPT_COMMAND+=";"
PROMPT_COMMAND+=" __ghostty_hook"
fi
fi
else
builtin source "$(dirname -- "${BASH_SOURCE[0]}")/bash-preexec.sh"
preexec_functions+=(__ghostty_preexec)
precmd_functions+=(__ghostty_precmd)
fi
@@ -0,0 +1,191 @@
{
use platform
use str
# Clean up XDG_DATA_DIRS by removing GHOSTTY_SHELL_INTEGRATION_XDG_DIR
if (and (has-env GHOSTTY_SHELL_INTEGRATION_XDG_DIR) (has-env XDG_DATA_DIRS)) {
set-env XDG_DATA_DIRS (str:replace $E:GHOSTTY_SHELL_INTEGRATION_XDG_DIR":" "" $E:XDG_DATA_DIRS)
unset-env GHOSTTY_SHELL_INTEGRATION_XDG_DIR
}
# List of enabled shell integration features
var features = [(str:split ',' $E:GHOSTTY_SHELL_FEATURES)]
# State tracking for semantic prompt sequences
# Values: 'prompt-start', 'pre-exec', 'post-exec'
fn set-prompt-state {|new| set-env __ghostty_prompt_state $new }
fn mark-prompt-start {
if (not-eq $E:__ghostty_prompt_state 'prompt-start') {
printf "\e]133;D;aid="$pid"\a"
}
set-prompt-state 'prompt-start'
printf "\e]133;A;aid="$pid"\a"
}
fn mark-output-start {|_|
set-prompt-state 'pre-exec'
printf "\e]133;C\a"
}
fn mark-output-end {|cmd-info|
set-prompt-state 'post-exec'
var exit-status = 0
# in case of error: retrieve exit status,
# unless does not exist (= builtin function failure), then default to 1
if (not-eq $nil $cmd-info[error]) {
set exit-status = 1
if (has-key $cmd-info[error] reason) {
if (has-key $cmd-info[error][reason] exit-status) {
set exit-status = $cmd-info[error][reason][exit-status]
}
}
}
printf "\e]133;D;"$exit-status";aid="$pid"\a"
}
# NOTE: OSC 133;B (end of prompt, start of input) cannot be reliably
# implemented at the script level in Elvish. The prompt function's output is
# escaped, and writing to /dev/tty has timing issues because Elvish renders
# its prompts on a background thread. Full semantic prompt support requires a
# native implementation: https://github.com/elves/elvish/pull/1917
fn sudo-with-terminfo {|@args|
var sudoedit = $false
for arg $args {
if (str:has-prefix $arg --) {
if (eq $arg --edit) {
set sudoedit = $true
break
}
} elif (str:has-prefix $arg -) {
if (str:contains (str:trim-prefix $arg -) e) {
set sudoedit = $true
break
}
} elif (not (str:contains $arg =)) {
break
}
}
if (not $sudoedit) { set args = [ --preserve-env=TERMINFO $@args ] }
(external sudo) $@args
}
fn ssh-integration {|@args|
var ssh-term = "xterm-256color"
var ssh-opts = []
# Configure environment variables for remote session
if (has-value $features ssh-env) {
set ssh-opts = (conj $ssh-opts ^
-o "SetEnv COLORTERM=truecolor" ^
-o "SendEnv TERM_PROGRAM TERM_PROGRAM_VERSION")
}
if (has-value $features ssh-terminfo) {
var ssh-user = ""
var ssh-hostname = ""
# Parse ssh config
for line [((external ssh) -G $@args)] {
var parts = [(str:fields $line)]
if (> (count $parts) 1) {
var ssh-key = $parts[0]
var ssh-value = $parts[1]
if (eq $ssh-key user) {
set ssh-user = $ssh-value
} elif (eq $ssh-key hostname) {
set ssh-hostname = $ssh-value
}
if (and (not-eq $ssh-user "") (not-eq $ssh-hostname "")) {
break
}
}
}
if (not-eq $ssh-hostname "") {
var ghostty = $E:GHOSTTY_BIN_DIR/"ghostty"
var ssh-target = $ssh-user"@"$ssh-hostname
# Check if terminfo is already cached
if (bool ?($ghostty +ssh-cache --host=$ssh-target)) {
set ssh-term = "xterm-ghostty"
} elif (has-external infocmp) {
var ssh-terminfo = ((external infocmp) -0 -x xterm-ghostty 2>/dev/null | slurp)
if (not-eq $ssh-terminfo "") {
echo "Setting up xterm-ghostty terminfo on "$ssh-hostname"..." >&2
use os
var ssh-cpath-dir = (os:temp-dir "ghostty-ssh-"$ssh-user".*")
var ssh-cpath = $ssh-cpath-dir"/socket"
if (bool ?(echo $ssh-terminfo | (external ssh) $@ssh-opts -o ControlMaster=yes -o ControlPath=$ssh-cpath -o ControlPersist=60s $@args '
infocmp xterm-ghostty >/dev/null 2>&1 && exit 0
command -v tic >/dev/null 2>&1 || exit 1
mkdir -p ~/.terminfo 2>/dev/null && tic -x - 2>/dev/null && exit 0
exit 1
' 2>/dev/null)) {
set ssh-term = "xterm-ghostty"
set ssh-opts = (conj $ssh-opts -o ControlPath=$ssh-cpath)
# Cache successful installation
$ghostty +ssh-cache --add=$ssh-target >/dev/null
} else {
echo "Warning: Failed to install terminfo." >&2
}
} else {
echo "Warning: Could not generate terminfo data." >&2
}
} else {
echo "Warning: ghostty command not available for cache management." >&2
}
}
}
with [E:TERM = $ssh-term] {
(external ssh) $@ssh-opts $@args
}
}
defer {
mark-prompt-start
}
set edit:before-readline = (conj $edit:before-readline $mark-prompt-start~)
set edit:after-readline = (conj $edit:after-readline $mark-output-start~)
set edit:after-command = (conj $edit:after-command $mark-output-end~)
if (str:contains $E:GHOSTTY_SHELL_FEATURES "cursor") {
var cursor = "5" # blinking bar
if (has-value $features cursor:steady) {
set cursor = "6" # steady bar
}
fn beam { printf "\e["$cursor" q" }
fn reset { printf "\e[0 q" }
set edit:before-readline = (conj $edit:before-readline $beam~)
set edit:after-readline = (conj $edit:after-readline {|_| reset })
}
if (and (has-value $features path) (has-env GHOSTTY_BIN_DIR)) {
if (not (has-value $paths $E:GHOSTTY_BIN_DIR)) {
set paths = [$@paths $E:GHOSTTY_BIN_DIR]
}
}
if (and (has-value $features sudo) (not-eq "" $E:TERMINFO) (has-external sudo)) {
edit:add-var sudo~ $sudo-with-terminfo~
}
if (and (str:contains $E:GHOSTTY_SHELL_FEATURES ssh-) (has-external ssh)) {
edit:add-var ssh~ $ssh-integration~
}
# Report changes to the current directory.
fn report-pwd { printf "\e]7;kitty-shell-cwd://%s%s\a" (platform:hostname) $pwd }
set after-chdir = (conj $after-chdir {|_| report-pwd })
report-pwd
}
@@ -0,0 +1,246 @@
# This shell script aims to be written in a way where it can't really fail
# or all failure scenarios are handled, so that we never leave the shell in
# a weird state. If you find a way to break this, please report a bug!
function ghostty_restore_xdg_data_dir -d "restore the original XDG_DATA_DIR value"
# If we don't have our own data dir then we don't need to do anything.
if not set -q GHOSTTY_SHELL_INTEGRATION_XDG_DIR
return
end
# If the data dir isn't set at all then we don't need to do anything.
if not set -q XDG_DATA_DIRS
return
end
# We need to do this so that XDG_DATA_DIRS turns into an array.
set --function --path xdg_data_dirs "$XDG_DATA_DIRS"
# If our data dir is in the list then remove it.
if set --function index (contains --index "$GHOSTTY_SHELL_INTEGRATION_XDG_DIR" $xdg_data_dirs)
set --erase --function xdg_data_dirs[$index]
end
# Re-export our data dir
if set -q xdg_data_dirs[1]
set --global --export --unpath XDG_DATA_DIRS "$xdg_data_dirs"
else
set --erase --global XDG_DATA_DIRS
end
set --erase GHOSTTY_SHELL_INTEGRATION_XDG_DIR
end
function ghostty_exit -d "exit the shell integration setup"
functions -e ghostty_restore_xdg_data_dir
functions -e ghostty_exit
exit 0
end
# We always try to restore the XDG data dir
ghostty_restore_xdg_data_dir
# If we aren't interactive or we've already run, don't run.
status --is-interactive || ghostty_exit
# We do the full setup on the first prompt render. We do this so that other
# shell integrations that setup the prompt and modify things are able to run
# first. We want to run _last_.
function __ghostty_setup --on-event fish_prompt -d "Setup ghostty integration"
functions -e __ghostty_setup
set --local features (string split , $GHOSTTY_SHELL_FEATURES)
# Parse the fish version for feature detection.
# Default to 0.0 if version is unavailable or malformed.
set -l fish_major 0
set -l fish_minor 0
if set -q version[1]
set -l fish_ver (string match -r '(\d+)\.(\d+)' -- $version[1])
if set -q fish_ver[2]; and test -n "$fish_ver[2]"
set fish_major "$fish_ver[2]"
end
if set -q fish_ver[3]; and test -n "$fish_ver[3]"
set fish_minor "$fish_ver[3]"
end
end
# Our OSC133A (prompt start) sequence. If we're using Fish >= 4.1
# then it supports click_events so we enable that.
set -g __ghostty_prompt_start_mark "\e]133;A\a"
if test "$fish_major" -gt 4; or test "$fish_major" -eq 4 -a "$fish_minor" -ge 1
set -g __ghostty_prompt_start_mark "\e]133;A;click_events=1\a"
end
if string match -q 'cursor*' -- $features
set -l cursor 5 # blinking bar
contains cursor:steady $features && set cursor 6 # steady bar
# Change the cursor to a beam on prompt.
function __ghostty_set_cursor_beam --on-event fish_prompt -V cursor -d "Set cursor shape"
if not functions -q fish_vi_cursor_handle
echo -en "\e[$cursor q"
end
end
function __ghostty_reset_cursor --on-event fish_preexec -d "Reset cursor shape"
if not functions -q fish_vi_cursor_handle
echo -en "\e[0 q"
end
end
end
# Add Ghostty binary to PATH if the path feature is enabled
if contains path $features; and test -n "$GHOSTTY_BIN_DIR"
fish_add_path --global --path --append "$GHOSTTY_BIN_DIR"
end
# When using sudo shell integration feature, ensure $TERMINFO is set
# and `sudo` is not already a function or alias
if contains sudo $features; and test -n "$TERMINFO"; and test file = (type -t sudo 2> /dev/null; or echo "x")
# Wrap `sudo` command to ensure Ghostty terminfo is preserved
function sudo -d "Wrap sudo to preserve terminfo"
set --function sudo_has_sudoedit_flags no
for arg in $argv
# Check if argument is '-e' or '--edit' (sudoedit flags)
if string match -q -- -e "$arg"; or string match -q -- --edit "$arg"
set --function sudo_has_sudoedit_flags yes
break
end
# Check if argument is neither an option nor a key-value pair
if not string match -r -q -- "^-" "$arg"; and not string match -r -q -- "=" "$arg"
break
end
end
if test "$sudo_has_sudoedit_flags" = yes
command sudo $argv
else
command sudo --preserve-env=TERMINFO $argv
end
end
end
# SSH Integration
set -l features (string split ',' -- "$GHOSTTY_SHELL_FEATURES")
if contains ssh-env $features; or contains ssh-terminfo $features
function ssh --wraps=ssh --description "SSH wrapper with Ghostty integration"
set -l features (string split ',' -- "$GHOSTTY_SHELL_FEATURES")
set -l ssh_term xterm-256color
set -l ssh_opts
# Configure environment variables for remote session
if contains ssh-env $features
set -a ssh_opts -o "SetEnv COLORTERM=truecolor"
set -a ssh_opts -o "SendEnv TERM_PROGRAM TERM_PROGRAM_VERSION"
end
# Install terminfo on remote host if needed
if contains ssh-terminfo $features
set -l ssh_user
set -l ssh_hostname
for line in (command ssh -G $argv 2>/dev/null)
set -l parts (string split ' ' -- $line)
if test (count $parts) -ge 2
switch $parts[1]
case user
set ssh_user $parts[2]
case hostname
set ssh_hostname $parts[2]
end
if test -n "$ssh_user"; and test -n "$ssh_hostname"
break
end
end
end
if test -n "$ssh_hostname"
set -l ssh_target "$ssh_user@$ssh_hostname"
# Check if terminfo is already cached
if test -x "$GHOSTTY_BIN_DIR/ghostty"; and "$GHOSTTY_BIN_DIR/ghostty" +ssh-cache --host="$ssh_target" >/dev/null 2>&1
set ssh_term xterm-ghostty
else if command -q infocmp
set -l ssh_terminfo
set -l ssh_cpath_dir
set -l ssh_cpath
set ssh_terminfo "$(infocmp -0 -x xterm-ghostty 2>/dev/null)"
if test -n "$ssh_terminfo"
echo "Setting up xterm-ghostty terminfo on $ssh_hostname..." >&2
set ssh_cpath_dir (mktemp -d "/tmp/ghostty-ssh-$ssh_user.XXXXXX" 2>/dev/null; or echo "/tmp/ghostty-ssh-$ssh_user."(random))
set ssh_cpath "$ssh_cpath_dir/socket"
if echo "$ssh_terminfo" | command ssh $ssh_opts -o ControlMaster=yes -o ControlPath="$ssh_cpath" -o ControlPersist=60s $argv '
infocmp xterm-ghostty >/dev/null 2>&1 && exit 0
command -v tic >/dev/null 2>&1 || exit 1
mkdir -p ~/.terminfo 2>/dev/null && tic -x - 2>/dev/null && exit 0
exit 1
' 2>/dev/null
set ssh_term xterm-ghostty
set -a ssh_opts -o "ControlPath=$ssh_cpath"
# Cache successful installation
if test -x "$GHOSTTY_BIN_DIR/ghostty"
"$GHOSTTY_BIN_DIR/ghostty" +ssh-cache --add="$ssh_target" >/dev/null 2>&1; or true
end
else
echo "Warning: Failed to install terminfo." >&2
end
else
echo "Warning: Could not generate terminfo data." >&2
end
else
echo "Warning: ghostty command not available for cache management." >&2
end
end
end
# Execute SSH with TERM environment variable
TERM="$ssh_term" command ssh $ssh_opts $argv
end
end
# Setup prompt marking
function __ghostty_mark_prompt_start --on-event fish_prompt --on-event fish_posterror
# If we never got the output end event, then we need to send it now.
if test "$__ghostty_prompt_state" != prompt-start
echo -en "\e]133;D\a"
end
set --global __ghostty_prompt_state prompt-start
echo -en $__ghostty_prompt_start_mark
end
function __ghostty_mark_output_start --on-event fish_preexec
set --global __ghostty_prompt_state pre-exec
echo -en "\e]133;C\a"
end
function __ghostty_mark_output_end --on-event fish_postexec
set --global __ghostty_prompt_state post-exec
echo -en "\e]133;D;$status\a"
end
# Report pwd. This is actually built-in to fish but only for terminals
# that match an allowlist and that isn't us.
function __update_cwd_osc --on-variable PWD -d 'Notify capable terminals when $PWD changes'
if status --is-command-substitution || set -q INSIDE_EMACS
return
end
printf \e\]7\;file://%s%s\a $hostname (string escape --style=url $PWD)
end
# Enable fish to handle reflow because Ghostty clears the prompt on resize.
set --global fish_handle_reflow 1
# Initial calls for first prompt
if string match -q 'cursor*' -- $features
__ghostty_set_cursor_beam
end
__ghostty_mark_prompt_start
__update_cwd_osc
end
ghostty_exit
@@ -0,0 +1,110 @@
# Ghostty shell integration
export module ghostty {
def has_feature [feature: string] {
$feature in ($env.GHOSTTY_SHELL_FEATURES | default "" | split row ',')
}
# Wrap `ssh` with Ghostty TERMINFO support
export def --wrapped ssh [...args] {
mut ssh_env = {}
mut ssh_opts = []
# `ssh-env`: use xterm-256color and propagate COLORTERM/TERM_PROGRAM vars
if (has_feature "ssh-env") {
$ssh_env.TERM = "xterm-256color"
$ssh_opts = [
"-o" "SetEnv COLORTERM=truecolor"
"-o" "SendEnv TERM_PROGRAM TERM_PROGRAM_VERSION"
]
}
# `ssh-terminfo`: auto-install xterm-ghostty terminfo on remote hosts
if (has_feature "ssh-terminfo") {
let ghostty = ($env.GHOSTTY_BIN_DIR? | default "") | path join "ghostty"
let ssh_cfg = ^ssh -G ...$args
| lines
| parse "{key} {value}"
| where key in ["user" "hostname"]
| select key value
| transpose -rd
| default {user: $env.USER hostname: "localhost"}
let ssh_id = $"($ssh_cfg.user)@($ssh_cfg.hostname)"
if (^$ghostty "+ssh-cache" $"--host=($ssh_id)" | complete | $in.exit_code == 0) {
$ssh_env.TERM = "xterm-ghostty"
} else {
$ssh_env.TERM = "xterm-256color"
let terminfo = try {
^infocmp -0 -x xterm-ghostty
} catch {
print -e "infocmp failed, using xterm-256color"
}
if ($terminfo | is-not-empty) {
print $"Setting up xterm-ghostty terminfo on ($ssh_cfg.hostname)..."
let ctrl_path = (
mktemp -td $"ghostty-ssh-($ssh_cfg.user).XXXXXX"
| path join "socket"
)
let remote_args = $ssh_opts ++ [
"-o" "ControlMaster=yes"
"-o" $"ControlPath=($ctrl_path)"
"-o" "ControlPersist=60s"
] ++ $args
$terminfo | ^ssh ...$remote_args '
infocmp xterm-ghostty >/dev/null 2>&1 && exit 0
command -v tic >/dev/null 2>&1 || exit 1
mkdir -p ~/.terminfo 2>/dev/null && tic -x - 2>/dev/null && exit 0
exit 1'
| complete
| if $in.exit_code == 0 {
^$ghostty "+ssh-cache" $"--add=($ssh_id)" e>| print -e
$ssh_env.TERM = "xterm-ghostty"
$ssh_opts = ($ssh_opts ++ ["-o" $"ControlPath=($ctrl_path)"])
} else {
print -e "terminfo install failed, using xterm-256color"
}
}
}
}
let ssh_args = $ssh_opts ++ $args
with-env $ssh_env {
^ssh ...$ssh_args
}
}
# Wrap `sudo` to preserve Ghostty's TERMINFO environment variable
export def --wrapped sudo [...args] {
mut sudo_args = $args
if (has_feature "sudo") {
# Extract just the sudo options (before the command)
let sudo_options = (
$args | take until {|arg|
not (($arg | str starts-with "-") or ($arg | str contains "="))
}
)
# Prepend TERMINFO preservation flag if not using sudoedit
if (not ("-e" in $sudo_options or "--edit" in $sudo_options)) {
$sudo_args = ($args | prepend "--preserve-env=TERMINFO")
}
}
^sudo ...$sudo_args
}
}
# Clean up XDG_DATA_DIRS by removing GHOSTTY_SHELL_INTEGRATION_XDG_DIR
if 'GHOSTTY_SHELL_INTEGRATION_XDG_DIR' in $env {
if 'XDG_DATA_DIRS' in $env {
$env.XDG_DATA_DIRS = ($env.XDG_DATA_DIRS | str replace $"($env.GHOSTTY_SHELL_INTEGRATION_XDG_DIR):" "")
}
hide-env GHOSTTY_SHELL_INTEGRATION_XDG_DIR
}
@@ -0,0 +1,61 @@
# Based on (started as) a copy of Kitty's zsh integration. Kitty is
# distributed under GPLv3, so this file is also distributed under GPLv3.
# The license header is reproduced below:
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
# This script is sourced automatically by zsh when ZDOTDIR is set to this
# directory. It therefore assumes it's running within our shell integration
# environment and should not be sourced manually (unlike ghostty-integration).
#
# This file can get sourced with aliases enabled. To avoid alias expansion
# we quote everything that can be quoted. Some aliases will still break us
# though.
# Restore the original ZDOTDIR value if GHOSTTY_ZSH_ZDOTDIR is set.
# Otherwise, unset the ZDOTDIR that was set during shell injection.
if [[ -n "${GHOSTTY_ZSH_ZDOTDIR+X}" ]]; then
'builtin' 'export' ZDOTDIR="$GHOSTTY_ZSH_ZDOTDIR"
'builtin' 'unset' 'GHOSTTY_ZSH_ZDOTDIR'
else
'builtin' 'unset' 'ZDOTDIR'
fi
# Use try-always to have the right error code.
{
# Zsh treats unset ZDOTDIR as if it was HOME. We do the same.
#
# Source the user's .zshenv before sourcing ghostty-integration because the
# former might set fpath and other things without which ghostty-integration
# won't work.
#
# Use typeset in case we are in a function with warn_create_global in
# effect. Unlikely but better safe than sorry.
'builtin' 'typeset' _ghostty_file=${ZDOTDIR-$HOME}"/.zshenv"
# Zsh ignores unreadable rc files. We do the same.
# Zsh ignores rc files that are directories, and so does source.
[[ ! -r "$_ghostty_file" ]] || 'builtin' 'source' '--' "$_ghostty_file"
} always {
if [[ -o 'interactive' ]]; then
# ${(%):-%x} is the path to the current file.
# On top of it we add :A:h to get the directory.
'builtin' 'typeset' _ghostty_file="${${(%):-%x}:A:h}"/ghostty-integration
if [[ -r "$_ghostty_file" ]]; then
'builtin' 'autoload' '-Uz' '--' "$_ghostty_file"
"${_ghostty_file:t}"
'builtin' 'unfunction' '--' "${_ghostty_file:t}"
fi
fi
'builtin' 'unset' '_ghostty_file'
}
@@ -0,0 +1,458 @@
# vim:ft=zsh
#
# Based on (started as) a copy of Kitty's zsh integration. Kitty is
# distributed under GPLv3, so this file is also distributed under GPLv3.
# The license header is reproduced below:
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
# Enables integration between zsh and ghostty.
#
# This is an autoloadable function. It's invoked automatically in shells
# directly spawned by Ghostty but not in any other shells. For example, running
# `exec zsh`, `sudo -E zsh`, `tmux`, or plain `zsh` will create a shell where
# ghostty-integration won't automatically run. Zsh users who want integration with
# Ghostty in all shells should add the following lines to their .zshrc:
#
# if [[ -n $GHOSTTY_RESOURCES_DIR ]]; then
# source "$GHOSTTY_RESOURCES_DIR"/shell-integration/zsh/ghostty-integration
# fi
#
# Implementation note: We can assume that alias expansion is disabled in this
# file, so no need to quote defensively. We still have to defensively prefix all
# builtins with `builtin` to avoid accidentally invoking user-defined functions.
# We avoid `function` reserved word as an additional defensive measure.
# Note that updating options with `builtin emulate -L zsh` affects the global options
# if it's called outside of a function. So nearly all code has to be in functions.
_entrypoint() {
builtin emulate -L zsh -o no_warn_create_global -o no_aliases
[[ -o interactive ]] || builtin return 0 # non-interactive shell
(( ! $+_ghostty_state )) || builtin return 0 # already initialized
# We require zsh 5.1+ (released Sept 2015) for features like functions_source,
# introspection arrays, and array pattern substitution.
if ! { builtin autoload -- is-at-least 2>/dev/null && is-at-least 5.1; }; then
builtin echo "Zsh ${ZSH_VERSION} is too old for ghostty shell integration (5.1+ required)" >&2
builtin return 1
fi
# 0: no OSC 133 [AC] marks have been written yet.
# 1: the last written OSC 133 C has not been closed with D yet.
# 2: none of the above.
builtin typeset -gi _ghostty_state
# Attempt to create a writable file descriptor to the TTY so that we can print
# to the TTY later even when STDOUT is redirected. This code is fairly subtle.
#
# - It's tempting to do `[[ -t 1 ]] && exec {_ghostty_state}>&1` but we cannot do this
# because it'll create a file descriptor >= 10 without O_CLOEXEC. This file
# descriptor will leak to child processes.
# - If we do `exec {3}>&1`, the file descriptor won't leak to the child processes
# but it'll still leak if the current process is replaced with another. In
# addition, it'll break user code that relies on fd 3 being available.
# - Zsh doesn't expose dup3, which would have allowed us to copy STDOUT with
# O_CLOEXEC. The only way to create a file descriptor with O_CLOEXEC is via
# sysopen.
# - `zmodload zsh/system` and `sysopen -o cloexec -wu _ghostty_fd -- /dev/tty` can
# fail with an error message to STDERR (the latter can happen even if /dev/tty
# is writable), hence the redirection of STDERR. We do it for the whole block
# for performance reasons (redirections are slow).
# - We must open the file descriptor right here rather than in _ghostty_deferred_init
# because there are broken zsh plugins out there that run `exec {fd}< <(cmd)`
# and then close the file descriptor more than once while suppressing errors.
# This could end up closing our file descriptor if we opened it in
# _ghostty_deferred_init.
typeset -gi _ghostty_fd
{
builtin zmodload zsh/system && (( $+builtins[sysopen] )) && {
{ [[ -w $TTY ]] && builtin sysopen -o cloexec -wu _ghostty_fd -- $TTY } ||
{ [[ -w /dev/tty ]] && builtin sysopen -o cloexec -wu _ghostty_fd -- /dev/tty }
}
} 2>/dev/null || (( _ghostty_fd = 1 ))
# Defer initialization so that other zsh init files can be configure
# the integration.
builtin typeset -ag precmd_functions
precmd_functions+=(_ghostty_deferred_init)
}
_ghostty_deferred_init() {
builtin emulate -L zsh -o no_warn_create_global -o no_aliases
# Enable semantic markup with OSC 133.
_ghostty_precmd() {
builtin local -i cmd_status=$?
builtin emulate -L zsh -o no_warn_create_global -o no_aliases
# Don't write OSC 133 D when our precmd handler is invoked from zle.
# Some plugins do that to update prompt on cd.
if ! builtin zle; then
# This code works incorrectly in the presence of a precmd or chpwd
# hook that prints. For example, sindresorhus/pure prints an empty
# line on precmd and marlonrichert/zsh-snap prints $PWD on chpwd.
# We'll end up writing our OSC 133 D mark too late.
#
# Another failure mode is when the output of a command doesn't end
# with LF and prompst_sp is set (it is by default). In this case
# we'll incorrectly state that '%' from prompt_sp is a part of the
# command's output.
if (( _ghostty_state == 1 )); then
# The last written OSC 133 C has not been closed with D yet.
# Close it and supply status.
builtin print -nu $_ghostty_fd '\e]133;D;'$cmd_status'\a'
(( _ghostty_state = 2 ))
elif (( _ghostty_state == 2 )); then
# There might be an unclosed OSC 133 C. Close that.
builtin print -nu $_ghostty_fd '\e]133;D\a'
fi
fi
builtin local mark1=$'%{\e]133;A;cl=line\a%}'
if [[ -o prompt_percent ]]; then
builtin typeset -g precmd_functions
if [[ ${precmd_functions[-1]} == _ghostty_precmd ]]; then
# This is the best case for us: we can add our marks to PS1 and
# PS2. This way our marks will be printed whenever zsh
# redisplays prompt: on reset-prompt, on SIGWINCH, and on
# SIGCHLD if notify is set. Themes that update prompt
# asynchronously from a `zle -F` handler might still remove our
# marks. Oh well.
# Restore PS1/PS2 to their pre-mark state if nothing else has
# modified them since we last added marks. This avoids exposing
# PS1 with our marks to other hooks (which can break themes like
# Pure that use pattern matching to strip/rebuild the prompt).
# If PS1 was modified (by a theme, async update, etc.), we
# keep the modified version, prioritizing the theme's changes.
builtin local ps1_changed=0
if [[ -n ${_ghostty_saved_ps1+x} ]]; then
if [[ $PS1 == $_ghostty_marked_ps1 ]]; then
PS1=$_ghostty_saved_ps1
PS2=$_ghostty_saved_ps2
elif [[ $PS1 != $_ghostty_saved_ps1 ]]; then
ps1_changed=1
fi
fi
# Save the clean PS1/PS2 before we add marks.
_ghostty_saved_ps1=$PS1
_ghostty_saved_ps2=$PS2
# Add our marks. Since we always start from a clean PS1
# (either restored above or freshly set by a theme), we can
# unconditionally add mark1 and markB.
builtin local mark2=$'%{\e]133;A;k=s\a%}'
builtin local markB=$'%{\e]133;B\a%}'
PS1=${mark1}${PS1}${markB}
# Handle multiline prompts by marking newline-separated
# continuation lines with k=s (mark2). We skip the newline
# immediately after mark1 to avoid introducing a double
# newline due to OSC 133;A's fresh-line behavior.
#
# We skip this when PS1 changed because injecting marks into
# newlines can break pattern matching in themes that
# strip/rebuild the prompt dynamically (e.g., Pure).
if (( ! ps1_changed )) && [[ $PS1 == *$'\n'* ]]; then
if [[ $PS1 == ${mark1}$'\n'* ]]; then
builtin local rest=${PS1#${mark1}$'\n'}
if [[ $rest == *$'\n'* ]]; then
PS1=${mark1}$'\n'${rest//$'\n'/$'\n'${mark2}}
fi
else
PS1=${PS1//$'\n'/$'\n'${mark2}}
fi
fi
# PS2 mark is needed when clearing the prompt on resize
PS2=${mark2}${PS2}${markB}
# Save the marked PS1 so we can detect modifications
# by other hooks in the next cycle.
_ghostty_marked_ps1=$PS1
(( _ghostty_state = 2 ))
else
# If our precmd hook is not the last, we cannot rely on prompt
# changes to stick, so we don't even try. At least we can move
# our hook to the end to have better luck next time. If there is
# another piece of code that wants to take this privileged
# position, this won't work well. We'll break them as much as
# they are breaking us.
precmd_functions=(${precmd_functions:#_ghostty_precmd} _ghostty_precmd)
# Plugins that invoke precmd hooks from zle do that before zle
# is trashed. This means that the cursor is in the middle of
# BUFFER and we cannot print our mark there. Prompt might
# already have a mark, so the following reset-prompt will write
# it. If it doesn't, there is nothing we can do.
if ! builtin zle; then
builtin print -rnu $_ghostty_fd -- $mark1[3,-3]
(( _ghostty_state = 2 ))
fi
fi
elif ! builtin zle; then
# Without prompt_percent we cannot patch prompt. Just print the
# mark, except when we are invoked from zle. In the latter case we
# cannot do anything.
builtin print -rnu $_ghostty_fd -- $mark1[3,-3]
(( _ghostty_state = 2 ))
fi
}
_ghostty_preexec() {
builtin emulate -L zsh -o no_warn_create_global -o no_aliases
# Restore the original PS1/PS2 if nothing else has modified them
# since our precmd added marks. This ensures other preexec hooks
# see a clean PS1 without our marks. If PS1 was modified (e.g.,
# by an async theme update), we leave it alone.
if [[ -n ${_ghostty_saved_ps1+x} && $PS1 == $_ghostty_marked_ps1 ]]; then
PS1=$_ghostty_saved_ps1
PS2=$_ghostty_saved_ps2
fi
# This will work incorrectly in the presence of a preexec hook that
# prints. For example, if MichaelAquilina/zsh-you-should-use installs
# its preexec hook before us, we'll incorrectly mark its output as
# belonging to the command (as if the user typed it into zle) rather
# than command output.
builtin print -nu $_ghostty_fd '\e]133;C\a'
(( _ghostty_state = 1 ))
}
# Enable reporting current working dir to terminal. Ghostty supports
# the kitty-shell-cwd format.
_ghostty_report_pwd() { builtin print -nu $_ghostty_fd '\e]7;kitty-shell-cwd://'"$HOST""$PWD"'\a'; }
chpwd_functions=(${chpwd_functions[@]} "_ghostty_report_pwd")
# An executed program could change cwd and report the changed cwd, so also report cwd at each new prompt
# as in this case chpwd_functions is insufficient. chpwd_functions is still needed for things like: cd x && something
functions[_ghostty_precmd]+="
_ghostty_report_pwd"
_ghostty_report_pwd
if [[ "$GHOSTTY_SHELL_FEATURES" == *"title"* ]]; then
# Enable terminal title changes, formatted for user-friendly display.
functions[_ghostty_precmd]+="
builtin print -rnu $_ghostty_fd \$'\\e]2;'\"\${(%):-%(4~|…/%3~|%~)}\"\$'\\a'"
functions[_ghostty_preexec]+="
builtin print -rnu $_ghostty_fd \$'\\e]2;'\"\${1//[[:cntrl:]]}\"\$'\\a'"
fi
if [[ "$GHOSTTY_SHELL_FEATURES" == *"cursor"* ]]; then
# Enable cursor shape changes depending on the current keymap.
# This implementation leaks blinking block cursor into external commands
# executed from zle. For example, users of fzf-based widgets may find
# themselves with a blinking block cursor within fzf.
_ghostty_zle_line_init _ghostty_zle_line_finish _ghostty_zle_keymap_select() {
builtin local steady=0
[[ "$GHOSTTY_SHELL_FEATURES" == *"cursor:steady"* ]] && steady=1
case ${KEYMAP-} in
vicmd|visual) builtin print -nu "$_ghostty_fd" "\e[$(( 1 + steady )) q" ;; # block
*) builtin print -nu "$_ghostty_fd" "\e[$(( 5 + steady )) q" ;; # bar
esac
}
# Restore the default shape before executing an external command
functions[_ghostty_preexec]+="
builtin print -rnu $_ghostty_fd \$'\\e[0 q'"
fi
# Emit semantic prompt markers at line-init if PS1 doesn't contain our
# marks. This ensures the terminal sees prompt markers even if another
# plugin (like zinit or oh-my-posh) regenerated PS1 after our precmd ran.
# We use 133;P instead of 133;A to avoid fresh-line behavior which would
# disrupt the display since the prompt has already been drawn. We also
# emit 133;B to mark the input area, which is needed for click-to-move.
(( $+functions[_ghostty_zle_line_init] )) || _ghostty_zle_line_init() { builtin true; }
functions[_ghostty_zle_line_init]="
if [[ \$PS1 != *$'%{\\e]133;A'* ]]; then
builtin print -nu \$_ghostty_fd '\\e]133;P;k=i\\a\\e]133;B\\a'
fi
"${functions[_ghostty_zle_line_init]}
# Add Ghostty binary to PATH if the path feature is enabled
if [[ "$GHOSTTY_SHELL_FEATURES" == *"path"* ]] && [[ -n "$GHOSTTY_BIN_DIR" ]]; then
if [[ ":$PATH:" != *":$GHOSTTY_BIN_DIR:"* ]]; then
builtin export PATH="$PATH:$GHOSTTY_BIN_DIR"
fi
fi
# Sudo
if [[ "$GHOSTTY_SHELL_FEATURES" == *"sudo"* ]] && [[ -n "$TERMINFO" ]]; then
# Wrap `sudo` command to ensure Ghostty terminfo is preserved
function sudo() {
builtin local sudo_has_sudoedit_flags="no"
for arg in "$@"; do
# Check if argument is '-e' or '--edit' (sudoedit flags)
if [[ "$arg" == "-e" || $arg == "--edit" ]]; then
sudo_has_sudoedit_flags="yes"
builtin break
fi
# Check if argument is neither an option nor a key-value pair
if [[ "$arg" != -* && "$arg" != *=* ]]; then
builtin break
fi
done
if [[ "$sudo_has_sudoedit_flags" == "yes" ]]; then
builtin command sudo "$@";
else
builtin command sudo --preserve-env=TERMINFO "$@";
fi
}
fi
# SSH Integration
if [[ "$GHOSTTY_SHELL_FEATURES" == *ssh-* ]]; then
function ssh() {
emulate -L zsh
setopt local_options no_glob_subst
local ssh_term ssh_opts
ssh_term="xterm-256color"
ssh_opts=()
# Configure environment variables for remote session
if [[ "$GHOSTTY_SHELL_FEATURES" == *ssh-env* ]]; then
ssh_opts+=(-o "SetEnv COLORTERM=truecolor")
ssh_opts+=(-o "SendEnv TERM_PROGRAM TERM_PROGRAM_VERSION")
fi
# Install terminfo on remote host if needed
if [[ "$GHOSTTY_SHELL_FEATURES" == *ssh-terminfo* ]]; then
local ssh_user ssh_hostname
while IFS=' ' read -r ssh_key ssh_value; do
case "$ssh_key" in
user) ssh_user="$ssh_value" ;;
hostname) ssh_hostname="$ssh_value" ;;
esac
[[ -n "$ssh_user" && -n "$ssh_hostname" ]] && break
done < <(command ssh -G "$@" 2>/dev/null)
if [[ -n "$ssh_hostname" ]]; then
local ssh_target="${ssh_user}@${ssh_hostname}"
# Check if terminfo is already cached
if "$GHOSTTY_BIN_DIR/ghostty" +ssh-cache --host="$ssh_target" >/dev/null 2>&1; then
ssh_term="xterm-ghostty"
elif (( $+commands[infocmp] )); then
local ssh_terminfo ssh_cpath_dir ssh_cpath
ssh_terminfo=$(infocmp -0 -x xterm-ghostty 2>/dev/null)
if [[ -n "$ssh_terminfo" ]]; then
print "Setting up xterm-ghostty terminfo on $ssh_hostname..." >&2
ssh_cpath_dir=$(mktemp -d "/tmp/ghostty-ssh-$ssh_user.XXXXXX" 2>/dev/null) || ssh_cpath_dir="/tmp/ghostty-ssh-$ssh_user.$$"
ssh_cpath="$ssh_cpath_dir/socket"
if builtin print -r "$ssh_terminfo" | command ssh "${ssh_opts[@]}" -o ControlMaster=yes -o ControlPath="$ssh_cpath" -o ControlPersist=60s "$@" '
infocmp xterm-ghostty >/dev/null 2>&1 && exit 0
command -v tic >/dev/null 2>&1 || exit 1
mkdir -p ~/.terminfo 2>/dev/null && tic -x - 2>/dev/null && exit 0
exit 1
' 2>/dev/null; then
ssh_term="xterm-ghostty"
ssh_opts+=(-o "ControlPath=$ssh_cpath")
# Cache successful installation
"$GHOSTTY_BIN_DIR/ghostty" +ssh-cache --add="$ssh_target" >/dev/null 2>&1 || true
else
print "Warning: Failed to install terminfo." >&2
fi
else
print "Warning: Could not generate terminfo data." >&2
fi
else
print "Warning: ghostty command not available for cache management." >&2
fi
fi
fi
# Execute SSH with TERM environment variable
TERM="$ssh_term" command ssh "${ssh_opts[@]}" "$@"
}
fi
# Some zsh users manually run `source ~/.zshrc` in order to apply rc file
# changes to the current shell. This is a terrible practice that breaks many
# things, including our shell integration. For example, Oh My Zsh and Prezto
# (both very popular among zsh users) will remove zle-line-init and
# zle-line-finish hooks if .zshrc is manually sourced. Prezto will also remove
# zle-keymap-select.
#
# Another common (and much more robust) way to apply rc file changes to the
# current shell is `exec zsh`. This will remove our integration from the shell
# unless it's explicitly invoked from .zshrc. This is not an issue with
# `exec zsh` but rather with our implementation of automatic shell integration.
# In the ideal world we would use add-zle-hook-widget to hook zle-line-init
# and similar widget. This breaks user configs though, so we have do this
# horrible thing instead.
builtin local hook func widget orig_widget flag
for hook in line-init line-finish keymap-select; do
func=_ghostty_zle_${hook/-/_}
(( $+functions[$func] )) || builtin continue
widget=zle-$hook
if [[ $widgets[$widget] == user:azhw:* &&
$+functions[add-zle-hook-widget] -eq 1 ]]; then
# If the widget is already hooked by add-zle-hook-widget at the top
# level, add our hook at the end. We MUST do it this way. We cannot
# just wrap the widget ourselves in this case because it would
# trigger bugs in add-zle-hook-widget.
add-zle-hook-widget $hook $func
else
if (( $+widgets[$widget] )); then
# There is a widget but it's not from add-zle-hook-widget. We
# can rename the original widget, install our own and invoke
# the original when we are called.
#
# Note: The leading dot is to work around bugs in
# zsh-syntax-highlighting.
orig_widget=._ghostty_orig_$widget
builtin zle -A $widget $orig_widget
if [[ $widgets[$widget] == user:* ]]; then
# No -w here to preserve $WIDGET within the original widget.
flag=
else
flag=w
fi
functions[$func]+="
builtin zle $orig_widget -N$flag -- \"\$@\""
fi
builtin zle -N $widget $func
fi
done
if (( $+functions[_ghostty_preexec] )); then
builtin typeset -ag preexec_functions
preexec_functions+=(_ghostty_preexec)
fi
builtin typeset -ag precmd_functions
if (( $+functions[_ghostty_precmd] )); then
precmd_functions=(${precmd_functions:#_ghostty_deferred_init} _ghostty_precmd)
_ghostty_precmd
else
precmd_functions=(${precmd_functions:#_ghostty_deferred_init})
fi
# Unfunction _ghostty_deferred_init to save memory. Don't unfunction
# ghostty-integration though because decent public functions aren't supposed to
# to unfunction themselves when invoked. Unfunctioning is done by calling code.
builtin unfunction _ghostty_deferred_init
}
_entrypoint
@@ -0,0 +1,22 @@
palette = 0=#262427
palette = 1=#ff666d
palette = 2=#b3e03a
palette = 3=#ffc739
palette = 4=#00cde8
palette = 5=#a392e8
palette = 6=#9deaf6
palette = 7=#fcfcfa
palette = 8=#545452
palette = 9=#ff7e83
palette = 10=#bee55e
palette = 11=#ffd05e
palette = 12=#1bd5eb
palette = 13=#b0a3eb
palette = 14=#acedf8
palette = 15=#fcfcfa
background = #262427
foreground = #fcfcfa
cursor-color = #fcfcfa
cursor-text = #000000
selection-background = #fcfcfa
selection-foreground = #262427
@@ -0,0 +1,22 @@
palette = 0=#000000
palette = 1=#a03050
palette = 2=#40d080
palette = 3=#e09040
palette = 4=#3060b0
palette = 5=#603090
palette = 6=#0090c0
palette = 7=#dbded8
palette = 8=#685656
palette = 9=#c06060
palette = 10=#90d050
palette = 11=#e0d000
palette = 12=#00b0c0
palette = 13=#801070
palette = 14=#20b0c0
palette = 15=#ffffff
background = #040404
foreground = #feffff
cursor-color = #e0d000
cursor-text = #000000
selection-background = #606060
selection-foreground = #ffffff
@@ -0,0 +1,22 @@
palette = 0=#090300
palette = 1=#db2d20
palette = 2=#01a252
palette = 3=#caba00
palette = 4=#01a0e4
palette = 5=#a16a94
palette = 6=#8fbece
palette = 7=#a5a2a2
palette = 8=#5c5855
palette = 9=#dbaec3
palette = 10=#3a3432
palette = 11=#4a4543
palette = 12=#807d7c
palette = 13=#bcbbba
palette = 14=#cdab53
palette = 15=#f7f7f7
background = #f7f7f7
foreground = #4a4543
cursor-color = #4a4543
cursor-text = #f7f7f7
selection-background = #a5a2a2
selection-foreground = #4a4543
@@ -0,0 +1,22 @@
palette = 0=#090300
palette = 1=#db2d20
palette = 2=#01a252
palette = 3=#fded02
palette = 4=#01a0e4
palette = 5=#a16a94
palette = 6=#b5e4f4
palette = 7=#a5a2a2
palette = 8=#5c5855
palette = 9=#e8bbd0
palette = 10=#47413f
palette = 11=#4a4543
palette = 12=#807d7c
palette = 13=#d6d5d4
palette = 14=#cdab53
palette = 15=#f7f7f7
background = #090300
foreground = #a5a2a2
cursor-color = #a5a2a2
cursor-text = #090300
selection-background = #4a4543
selection-foreground = #a5a2a2
@@ -0,0 +1,22 @@
palette = 0=#191919
palette = 1=#aa342e
palette = 2=#4b8c0f
palette = 3=#dbba00
palette = 4=#1370d3
palette = 5=#c43ac3
palette = 6=#008eb0
palette = 7=#bebebe
palette = 8=#525252
palette = 9=#f05b50
palette = 10=#95dc55
palette = 11=#ffe763
palette = 12=#60a4ec
palette = 13=#e26be2
palette = 14=#60b6cb
palette = 15=#f7f7f7
background = #102040
foreground = #dddddd
cursor-color = #007acc
cursor-text = #bfdbfe
selection-background = #bfdbfe
selection-foreground = #000000
@@ -0,0 +1,22 @@
palette = 0=#000000
palette = 1=#cd0000
palette = 2=#00cd00
palette = 3=#cdcd00
palette = 4=#1093f5
palette = 5=#cd00cd
palette = 6=#00cdcd
palette = 7=#faebd7
palette = 8=#404040
palette = 9=#ff0000
palette = 10=#00ff00
palette = 11=#ffff00
palette = 12=#11b5f6
palette = 13=#ff00ff
palette = 14=#00ffff
palette = 15=#ffffff
background = #111416
foreground = #eeeeec
cursor-color = #bbbbbb
cursor-text = #ffffff
selection-background = #eeeeec
selection-foreground = #333333
@@ -0,0 +1,22 @@
palette = 0=#040404
palette = 1=#d84a33
palette = 2=#5da602
palette = 3=#eebb6e
palette = 4=#417ab3
palette = 5=#e5c499
palette = 6=#bdcfe5
palette = 7=#dbded8
palette = 8=#685656
palette = 9=#d76b42
palette = 10=#99b52c
palette = 11=#ffb670
palette = 12=#97d7ef
palette = 13=#aa7900
palette = 14=#bdcfe5
palette = 15=#e4d5c7
background = #040404
foreground = #feffff
cursor-color = #feffff
cursor-text = #000000
selection-background = #606060
selection-foreground = #ffffff
@@ -0,0 +1,22 @@
palette = 0=#050404
palette = 1=#bd0013
palette = 2=#4ab118
palette = 3=#e7741e
palette = 4=#0f4ac6
palette = 5=#665993
palette = 6=#70a598
palette = 7=#f8dcc0
palette = 8=#4e7cbf
palette = 9=#fc5f5a
palette = 10=#9eff6e
palette = 11=#efc11a
palette = 12=#1997c6
palette = 13=#9b5953
palette = 14=#c8faf4
palette = 15=#f6f5fb
background = #1f1d45
foreground = #f8dcc0
cursor-color = #efbf38
cursor-text = #08080a
selection-background = #706b4e
selection-foreground = #f3d9c4
@@ -0,0 +1,22 @@
palette = 0=#241f31
palette = 1=#c01c28
palette = 2=#2ec27e
palette = 3=#e8b504
palette = 4=#1e78e4
palette = 5=#9841bb
palette = 6=#0ab9dc
palette = 7=#c0bfbc
palette = 8=#5e5c64
palette = 9=#ed333b
palette = 10=#4ad67c
palette = 11=#d2be36
palette = 12=#51a1ff
palette = 13=#c061cb
palette = 14=#4fd2fd
palette = 15=#f6f5f4
background = #ffffff
foreground = #000000
cursor-color = #000000
cursor-text = #ffffff
selection-background = #c0bfbc
selection-foreground = #000000
@@ -0,0 +1,22 @@
palette = 0=#241f31
palette = 1=#c01c28
palette = 2=#2ec27e
palette = 3=#f5c211
palette = 4=#1e78e4
palette = 5=#9841bb
palette = 6=#0ab9dc
palette = 7=#c0bfbc
palette = 8=#5e5c64
palette = 9=#ed333b
palette = 10=#57e389
palette = 11=#f8e45c
palette = 12=#51a1ff
palette = 13=#c061cb
palette = 14=#4fd2fd
palette = 15=#f6f5f4
background = #1d1d20
foreground = #ffffff
cursor-color = #ffffff
cursor-text = #1d1d20
selection-background = #ffffff
selection-foreground = #5e5c64
@@ -0,0 +1,22 @@
palette = 0=#151515
palette = 1=#ac4142
palette = 2=#7e8e50
palette = 3=#e5b567
palette = 4=#6c99bb
palette = 5=#9f4e85
palette = 6=#7dd6cf
palette = 7=#d0d0d0
palette = 8=#505050
palette = 9=#ac4142
palette = 10=#7e8e50
palette = 11=#e5b567
palette = 12=#6c99bb
palette = 13=#9f4e85
palette = 14=#7dd6cf
palette = 15=#f5f5f5
background = #212121
foreground = #d0d0d0
cursor-color = #d0d0d0
cursor-text = #151515
selection-background = #303030
selection-foreground = #d0d0d0
@@ -0,0 +1,22 @@
palette = 0=#1a1a1a
palette = 1=#f08898
palette = 2=#a4e09c
palette = 3=#f5dea4
palette = 4=#84b4f8
palette = 5=#c8a2f4
palette = 6=#90dcd0
palette = 7=#d0d6f0
palette = 8=#444444
palette = 9=#f08898
palette = 10=#a4e09c
palette = 11=#f5dea4
palette = 12=#84b4f8
palette = 13=#c8a2f4
palette = 14=#90dcd0
palette = 15=#ffffff
background = #1a1a1a
foreground = #d0d6f0
cursor-color = #f8b080
cursor-text = #1a1a1a
selection-background = #333333
selection-foreground = #d0d6f0
@@ -0,0 +1,22 @@
palette = 0=#f0f2f6
palette = 1=#d00c36
palette = 2=#3e9e28
palette = 3=#dd8c1a
palette = 4=#1c64f2
palette = 5=#8636ec
palette = 6=#159096
palette = 7=#4a4d66
palette = 8=#adb2bc
palette = 9=#d00c36
palette = 10=#3e9e28
palette = 11=#dd8c1a
palette = 12=#1c64f2
palette = 13=#8636ec
palette = 14=#159096
palette = 15=#4a4d66
background = #f0f2f6
foreground = #4a4d66
cursor-color = #fc6008
cursor-text = #f0f2f6
selection-background = #bdc2cc
selection-foreground = #4a4d66
@@ -0,0 +1,22 @@
palette = 0=#000000
palette = 1=#aa3731
palette = 2=#448c27
palette = 3=#cb9000
palette = 4=#325cc0
palette = 5=#7a3e9d
palette = 6=#0083b2
palette = 7=#b7b7b7
palette = 8=#777777
palette = 9=#f05050
palette = 10=#60cb00
palette = 11=#f2af50
palette = 12=#007acc
palette = 13=#e64ce6
palette = 14=#00aacb
palette = 15=#f7f7f7
background = #f7f7f7
foreground = #000000
cursor-color = #007acc
cursor-text = #bfdbfe
selection-background = #bfdbfe
selection-foreground = #000000
@@ -0,0 +1,22 @@
palette = 0=#112616
palette = 1=#7f2b27
palette = 2=#2f7e25
palette = 3=#717f24
palette = 4=#2f6a7f
palette = 5=#47587f
palette = 6=#327f77
palette = 7=#647d75
palette = 8=#3c4812
palette = 9=#e08009
palette = 10=#18e000
palette = 11=#bde000
palette = 12=#00aae0
palette = 13=#0058e0
palette = 14=#00e0c4
palette = 15=#73fa91
background = #0f1610
foreground = #637d75
cursor-color = #73fa91
cursor-text = #0f1610
selection-background = #1d4125
selection-foreground = #73fa91
@@ -0,0 +1,22 @@
palette = 0=#000000
palette = 1=#cd3131
palette = 2=#05bc79
palette = 3=#e5e512
palette = 4=#2472c8
palette = 5=#bc3fbc
palette = 6=#0fa8cd
palette = 7=#e5e5e5
palette = 8=#666666
palette = 9=#cd3131
palette = 10=#05bc79
palette = 11=#e5e512
palette = 12=#2472c8
palette = 13=#bc3fbc
palette = 14=#0fa8cd
palette = 15=#e5e5e5
background = #262a33
foreground = #e5e5e5
cursor-color = #f8f8f0
cursor-text = #b5b5a8
selection-background = #5a5c62
selection-foreground = #ece7e7
@@ -0,0 +1,22 @@
palette = 0=#000000
palette = 1=#c91b00
palette = 2=#00c200
palette = 3=#c7c400
palette = 4=#1c3fe1
palette = 5=#ca30c7
palette = 6=#00c5c7
palette = 7=#c7c7c7
palette = 8=#686868
palette = 9=#ff6e67
palette = 10=#5ffa68
palette = 11=#fffc67
palette = 12=#6871ff
palette = 13=#ff77ff
palette = 14=#60fdff
palette = 15=#ffffff
background = #2c2b2b
foreground = #d5a200
cursor-color = #c7c7c7
cursor-text = #8c8c8c
selection-background = #6b5b02
selection-foreground = #67e000
@@ -0,0 +1,22 @@
palette = 0=#1a1a1a
palette = 1=#cc372e
palette = 2=#26a439
palette = 3=#cdac08
palette = 4=#0869cb
palette = 5=#9647bf
palette = 6=#479ec2
palette = 7=#98989d
palette = 8=#464646
palette = 9=#ff453a
palette = 10=#32d74b
palette = 11=#ffd60a
palette = 12=#0a84ff
palette = 13=#bf5af2
palette = 14=#76d6ff
palette = 15=#ffffff
background = #1e1e1e
foreground = #ffffff
cursor-color = #98989d
cursor-text = #ffffff
selection-background = #3f638b
selection-foreground = #ffffff
@@ -0,0 +1,22 @@
palette = 0=#1a1a1a
palette = 1=#cc372e
palette = 2=#26a439
palette = 3=#cdac08
palette = 4=#0869cb
palette = 5=#9647bf
palette = 6=#479ec2
palette = 7=#98989d
palette = 8=#464646
palette = 9=#ff453a
palette = 10=#32d74b
palette = 11=#e5bc00
palette = 12=#0a84ff
palette = 13=#bf5af2
palette = 14=#69c9f2
palette = 15=#ffffff
background = #feffff
foreground = #000000
cursor-color = #98989d
cursor-text = #ffffff
selection-background = #abd8ff
selection-foreground = #000000
@@ -0,0 +1,22 @@
palette = 0=#333333
palette = 1=#da2700
palette = 2=#12c258
palette = 3=#ffc656
palette = 4=#518bfc
palette = 5=#e37bd9
palette = 6=#63fad5
palette = 7=#bab2b2
palette = 8=#777777
palette = 9=#ffb9b9
palette = 10=#e3f6aa
palette = 11=#ffddaa
palette = 12=#b3e8f3
palette = 13=#cbbaf9
palette = 14=#bcffc7
palette = 15=#efefef
background = #201f1e
foreground = #eee4d9
cursor-color = #872929
cursor-text = #fffbf2
selection-background = #25524a
selection-foreground = #f3fffd
@@ -0,0 +1,22 @@
palette = 0=#2c2c2c
palette = 1=#d3322d
palette = 2=#588b35
palette = 3=#fca93a
palette = 4=#2465c2
palette = 5=#7332b4
palette = 6=#64e1b8
palette = 7=#f7f7f7
palette = 8=#535353
palette = 9=#fa5852
palette = 10=#8dc252
palette = 11=#ffea51
palette = 12=#6ab5f8
palette = 13=#be68ca
palette = 14=#89ffdb
palette = 15=#fefefe
background = #1e1e1e
foreground = #eaeaea
cursor-color = #f7f7f7
cursor-text = #000000
selection-background = #46515e
selection-foreground = #f1f3f5
@@ -0,0 +1,22 @@
palette = 0=#232323
palette = 1=#ff000f
palette = 2=#8ce10b
palette = 3=#ffb900
palette = 4=#008df8
palette = 5=#6d43a6
palette = 6=#00d8eb
palette = 7=#ffffff
palette = 8=#444444
palette = 9=#ff2740
palette = 10=#abe15b
palette = 11=#ffd242
palette = 12=#0092ff
palette = 13=#9a5feb
palette = 14=#67fff0
palette = 15=#ffffff
background = #0e1019
foreground = #fffaf4
cursor-color = #ff0018
cursor-text = #ff8ca4
selection-background = #002a3b
selection-foreground = #ffffff
@@ -0,0 +1,22 @@
palette = 0=#3d352a
palette = 1=#cd5c5c
palette = 2=#86af80
palette = 3=#e8ae5b
palette = 4=#6495ed
palette = 5=#deb887
palette = 6=#b0c4de
palette = 7=#bbaa99
palette = 8=#554444
palette = 9=#cc5533
palette = 10=#88aa22
palette = 11=#ffa75d
palette = 12=#87ceeb
palette = 13=#996600
palette = 14=#b0c4de
palette = 15=#ddccbb
background = #1c1c1c
foreground = #ddeedd
cursor-color = #e2bbef
cursor-text = #000000
selection-background = #4d4d4d
selection-foreground = #ffffff
@@ -0,0 +1,22 @@
palette = 0=#202746
palette = 1=#c94922
palette = 2=#ac9739
palette = 3=#c08b30
palette = 4=#3d8fd1
palette = 5=#6679cc
palette = 6=#22a2c9
palette = 7=#979db4
palette = 8=#6b7394
palette = 9=#c76b29
palette = 10=#4f587c
palette = 11=#5e6687
palette = 12=#898ea4
palette = 13=#dfe2f1
palette = 14=#9c637a
palette = 15=#f5f7ff
background = #202746
foreground = #979db4
cursor-color = #979db4
cursor-text = #202746
selection-background = #5e6687
selection-foreground = #979db4
@@ -0,0 +1,22 @@
palette = 0=#000000
palette = 1=#fd5ff1
palette = 2=#87c38a
palette = 3=#ffd7b1
palette = 4=#85befd
palette = 5=#b9b6fc
palette = 6=#85befd
palette = 7=#e0e0e0
palette = 8=#4c4c4c
palette = 9=#fd5ff1
palette = 10=#94fa36
palette = 11=#f5ffa8
palette = 12=#96cbfe
palette = 13=#b9b6fc
palette = 14=#85befd
palette = 15=#e0e0e0
background = #161719
foreground = #c5c8c6
cursor-color = #d0d0d0
cursor-text = #151515
selection-background = #444444
selection-foreground = #c5c8c6
@@ -0,0 +1,22 @@
palette = 0=#21252b
palette = 1=#e06c75
palette = 2=#98c379
palette = 3=#e5c07b
palette = 4=#61afef
palette = 5=#c678dd
palette = 6=#56b6c2
palette = 7=#abb2bf
palette = 8=#767676
palette = 9=#e06c75
palette = 10=#98c379
palette = 11=#e5c07b
palette = 12=#61afef
palette = 13=#c678dd
palette = 14=#56b6c2
palette = 15=#abb2bf
background = #21252b
foreground = #abb2bf
cursor-color = #abb2bf
cursor-text = #21252b
selection-background = #323844
selection-foreground = #abb2bf
@@ -0,0 +1,22 @@
palette = 0=#000000
palette = 1=#de3e35
palette = 2=#3f953a
palette = 3=#d2b67c
palette = 4=#2f5af3
palette = 5=#950095
palette = 6=#3f953a
palette = 7=#bbbbbb
palette = 8=#000000
palette = 9=#de3e35
palette = 10=#3f953a
palette = 11=#d2b67c
palette = 12=#2f5af3
palette = 13=#a00095
palette = 14=#3f953a
palette = 15=#ffffff
background = #f9f9f9
foreground = #2a2c33
cursor-color = #bbbbbb
cursor-text = #ffffff
selection-background = #ededed
selection-foreground = #2a2c33
@@ -0,0 +1,22 @@
palette = 0=#110f18
palette = 1=#ff6767
palette = 2=#61ffca
palette = 3=#ffca85
palette = 4=#a277ff
palette = 5=#a277ff
palette = 6=#61ffca
palette = 7=#edecee
palette = 8=#4d4d4d
palette = 9=#ffca85
palette = 10=#a277ff
palette = 11=#ffca85
palette = 12=#a277ff
palette = 13=#a277ff
palette = 14=#61ffca
palette = 15=#edecee
background = #15141b
foreground = #edecee
cursor-color = #a277ff
cursor-text = #edecee
selection-background = #a277ff
selection-foreground = #edecee
@@ -0,0 +1,22 @@
palette = 0=#23262e
palette = 1=#f0266f
palette = 2=#8fd46d
palette = 3=#ffe66d
palette = 4=#102ee4
palette = 5=#ee5d43
palette = 6=#03d6b8
palette = 7=#c74ded
palette = 8=#4f545e
palette = 9=#f92672
palette = 10=#8fd46d
palette = 11=#ffe66d
palette = 12=#03d6b8
palette = 13=#ee5d43
palette = 14=#03d6b8
palette = 15=#c74ded
background = #23262e
foreground = #ffca28
cursor-color = #ee5d43
cursor-text = #ffd29c
selection-background = #292e38
selection-foreground = #00e8c6
@@ -0,0 +1,22 @@
palette = 0=#11151c
palette = 1=#ea6c73
palette = 2=#7fd962
palette = 3=#f9af4f
palette = 4=#53bdfa
palette = 5=#cda1fa
palette = 6=#90e1c6
palette = 7=#c7c7c7
palette = 8=#686868
palette = 9=#f07178
palette = 10=#aad94c
palette = 11=#ffb454
palette = 12=#59c2ff
palette = 13=#d2a6ff
palette = 14=#95e6cb
palette = 15=#ffffff
background = #0b0e14
foreground = #bfbdb6
cursor-color = #e6b450
cursor-text = #0b0e14
selection-background = #409fff
selection-foreground = #0b0e14
@@ -0,0 +1,22 @@
palette = 0=#000000
palette = 1=#ea6c6d
palette = 2=#6cbf43
palette = 3=#eca944
palette = 4=#3199e1
palette = 5=#9e75c7
palette = 6=#46ba94
palette = 7=#bababa
palette = 8=#686868
palette = 9=#f07171
palette = 10=#86b300
palette = 11=#f2ae49
palette = 12=#399ee6
palette = 13=#a37acc
palette = 14=#4cbf99
palette = 15=#d1d1d1
background = #f8f9fa
foreground = #5c6166
cursor-color = #ffaa33
cursor-text = #f8f9fa
selection-background = #035bd6
selection-foreground = #f8f9fa
@@ -0,0 +1,22 @@
palette = 0=#171b24
palette = 1=#ed8274
palette = 2=#87d96c
palette = 3=#facc6e
palette = 4=#6dcbfa
palette = 5=#dabafa
palette = 6=#90e1c6
palette = 7=#c7c7c7
palette = 8=#686868
palette = 9=#f28779
palette = 10=#d5ff80
palette = 11=#ffd173
palette = 12=#73d0ff
palette = 13=#dfbfff
palette = 14=#95e6cb
palette = 15=#ffffff
background = #1f2430
foreground = #cccac2
cursor-color = #ffcc66
cursor-text = #1f2430
selection-background = #409fff
selection-foreground = #1f2430
@@ -0,0 +1,22 @@
palette = 0=#17141f
palette = 1=#ff6b7f
palette = 2=#00bd9c
palette = 3=#e6c62f
palette = 4=#22e8df
palette = 5=#dc396a
palette = 6=#56b6c2
palette = 7=#f1f1f1
palette = 8=#495162
palette = 9=#fe9ea1
palette = 10=#98c379
palette = 11=#f9e46b
palette = 12=#91fff4
palette = 13=#da70d6
palette = 14=#bcf3ff
palette = 15=#ffffff
background = #191323
foreground = #cccccc
cursor-color = #e07d13
cursor-text = #ffffff
selection-background = #220525
selection-foreground = #f4f4f4
@@ -0,0 +1,22 @@
palette = 0=#1b1d1e
palette = 1=#e6dc44
palette = 2=#c8be46
palette = 3=#f4fd22
palette = 4=#737174
palette = 5=#747271
palette = 6=#62605f
palette = 7=#c6c5bf
palette = 8=#505354
palette = 9=#fff78e
palette = 10=#fff27d
palette = 11=#feed6c
palette = 12=#919495
palette = 13=#9a9a9d
palette = 14=#a3a3a6
palette = 15=#dadbd6
background = #1b1d1e
foreground = #6f6f6f
cursor-color = #fcef0c
cursor-text = #000000
selection-background = #4d504c
selection-foreground = #f0e04a
@@ -0,0 +1,22 @@
palette = 0=#20111b
palette = 1=#be100e
palette = 2=#858162
palette = 3=#d08b30
palette = 4=#426a79
palette = 5=#97522c
palette = 6=#989a9c
palette = 7=#968c83
palette = 8=#5e5252
palette = 9=#be100e
palette = 10=#858162
palette = 11=#d08b30
palette = 12=#426a79
palette = 13=#97522c
palette = 14=#989a9c
palette = 15=#d5ccba
background = #d5ccba
foreground = #45373c
cursor-color = #45373c
cursor-text = #d5ccba
selection-background = #968c83
selection-foreground = #45373c
@@ -0,0 +1,22 @@
palette = 0=#20111b
palette = 1=#be100e
palette = 2=#858162
palette = 3=#eaa549
palette = 4=#426a79
palette = 5=#97522c
palette = 6=#989a9c
palette = 7=#968c83
palette = 8=#5e5252
palette = 9=#be100e
palette = 10=#858162
palette = 11=#eaa549
palette = 12=#426a79
palette = 13=#97522c
palette = 14=#989a9c
palette = 15=#d5ccba
background = #20111b
foreground = #968c83
cursor-color = #968c83
cursor-text = #20111b
selection-background = #45373c
selection-foreground = #968c83
@@ -0,0 +1,22 @@
palette = 0=#573d26
palette = 1=#be2d26
palette = 2=#6ba18a
palette = 3=#e99d2a
palette = 4=#5a86ad
palette = 5=#ac80a6
palette = 6=#74a6ad
palette = 7=#e0dbb7
palette = 8=#9b6c4a
palette = 9=#e84627
palette = 10=#95d8ba
palette = 11=#d0d150
palette = 12=#b8d3ed
palette = 13=#d19ecb
palette = 14=#93cfd7
palette = 15=#fff9d5
background = #2a1f1d
foreground = #e0dbb7
cursor-color = #644a33
cursor-text = #8a7059
selection-background = #563c27
selection-foreground = #e0dbbb
@@ -0,0 +1,22 @@
palette = 0=#000000
palette = 1=#486e6f
palette = 2=#dd9999
palette = 3=#a06666
palette = 4=#888888
palette = 5=#999999
palette = 6=#aaaaaa
palette = 7=#c1c1c1
palette = 8=#404040
palette = 9=#486e6f
palette = 10=#dd9999
palette = 11=#a06666
palette = 12=#888888
palette = 13=#999999
palette = 14=#aaaaaa
palette = 15=#c1c1c1
background = #000000
foreground = #c1c1c1
cursor-color = #c1c1c1
cursor-text = #8e8e8e
selection-background = #c1c1c1
selection-foreground = #000000
@@ -0,0 +1,22 @@
palette = 0=#000000
palette = 1=#5f8787
palette = 2=#fbcb97
palette = 3=#e78a53
palette = 4=#888888
palette = 5=#999999
palette = 6=#aaaaaa
palette = 7=#c1c1c1
palette = 8=#404040
palette = 9=#5f8787
palette = 10=#fbcb97
palette = 11=#e78a53
palette = 12=#888888
palette = 13=#999999
palette = 14=#aaaaaa
palette = 15=#c1c1c1
background = #000000
foreground = #c1c1c1
cursor-color = #c1c1c1
cursor-text = #8e8e8e
selection-background = #c1c1c1
selection-foreground = #000000
@@ -0,0 +1,22 @@
palette = 0=#000000
palette = 1=#5f8787
palette = 2=#ddeecc
palette = 3=#99bbaa
palette = 4=#888888
palette = 5=#999999
palette = 6=#aaaaaa
palette = 7=#c1c1c1
palette = 8=#404040
palette = 9=#5f8787
palette = 10=#ddeecc
palette = 11=#99bbaa
palette = 12=#888888
palette = 13=#999999
palette = 14=#aaaaaa
palette = 15=#c1c1c1
background = #000000
foreground = #c1c1c1
cursor-color = #c1c1c1
cursor-text = #8e8e8e
selection-background = #c1c1c1
selection-foreground = #000000
@@ -0,0 +1,22 @@
palette = 0=#000000
palette = 1=#5f8787
palette = 2=#d0dfee
palette = 3=#5f81a5
palette = 4=#888888
palette = 5=#999999
palette = 6=#aaaaaa
palette = 7=#c1c1c1
palette = 8=#404040
palette = 9=#5f8787
palette = 10=#d0dfee
palette = 11=#5f81a5
palette = 12=#888888
palette = 13=#999999
palette = 14=#aaaaaa
palette = 15=#c1c1c1
background = #000000
foreground = #c1c1c1
cursor-color = #c1c1c1
cursor-text = #8e8e8e
selection-background = #c1c1c1
selection-foreground = #000000
@@ -0,0 +1,22 @@
palette = 0=#000000
palette = 1=#5f8787
palette = 2=#9b8d7f
palette = 3=#8c7f70
palette = 4=#888888
palette = 5=#999999
palette = 6=#aaaaaa
palette = 7=#c1c1c1
palette = 8=#404040
palette = 9=#5f8787
palette = 10=#9b8d7f
palette = 11=#8c7f70
palette = 12=#888888
palette = 13=#999999
palette = 14=#aaaaaa
palette = 15=#c1c1c1
background = #000000
foreground = #c1c1c1
cursor-color = #c1c1c1
cursor-text = #8e8e8e
selection-background = #c1c1c1
selection-foreground = #000000
@@ -0,0 +1,22 @@
palette = 0=#000000
palette = 1=#5f8787
palette = 2=#7799bb
palette = 3=#556677
palette = 4=#888888
palette = 5=#999999
palette = 6=#aaaaaa
palette = 7=#c1c1c1
palette = 8=#404040
palette = 9=#5f8787
palette = 10=#7799bb
palette = 11=#556677
palette = 12=#888888
palette = 13=#999999
palette = 14=#aaaaaa
palette = 15=#c1c1c1
background = #000000
foreground = #c1c1c1
cursor-color = #c1c1c1
cursor-text = #8e8e8e
selection-background = #c1c1c1
selection-foreground = #000000
@@ -0,0 +1,22 @@
palette = 0=#000000
palette = 1=#5f8787
palette = 2=#eceee3
palette = 3=#974b46
palette = 4=#888888
palette = 5=#999999
palette = 6=#aaaaaa
palette = 7=#c1c1c1
palette = 8=#404040
palette = 9=#5f8787
palette = 10=#eceee3
palette = 11=#974b46
palette = 12=#888888
palette = 13=#999999
palette = 14=#aaaaaa
palette = 15=#c1c1c1
background = #000000
foreground = #c1c1c1
cursor-color = #c1c1c1
cursor-text = #8e8e8e
selection-background = #c1c1c1
selection-foreground = #000000
@@ -0,0 +1,22 @@
palette = 0=#000000
palette = 1=#5f8787
palette = 2=#a5aaa7
palette = 3=#626b67
palette = 4=#888888
palette = 5=#999999
palette = 6=#aaaaaa
palette = 7=#c1c1c1
palette = 8=#404040
palette = 9=#5f8787
palette = 10=#a5aaa7
palette = 11=#626b67
palette = 12=#888888
palette = 13=#999999
palette = 14=#aaaaaa
palette = 15=#c1c1c1
background = #000000
foreground = #c1c1c1
cursor-color = #c1c1c1
cursor-text = #8e8e8e
selection-background = #c1c1c1
selection-foreground = #000000
@@ -0,0 +1,22 @@
palette = 0=#000000
palette = 1=#5f8787
palette = 2=#f3ecd4
palette = 3=#eecc6c
palette = 4=#888888
palette = 5=#999999
palette = 6=#aaaaaa
palette = 7=#c1c1c1
palette = 8=#404040
palette = 9=#5f8787
palette = 10=#f3ecd4
palette = 11=#eecc6c
palette = 12=#888888
palette = 13=#999999
palette = 14=#aaaaaa
palette = 15=#c1c1c1
background = #000000
foreground = #c1c1c1
cursor-color = #c1c1c1
cursor-text = #8e8e8e
selection-background = #c1c1c1
selection-foreground = #000000
@@ -0,0 +1,22 @@
palette = 0=#000000
palette = 1=#5f8787
palette = 2=#aa9988
palette = 3=#777755
palette = 4=#888888
palette = 5=#999999
palette = 6=#aaaaaa
palette = 7=#c1c1c1
palette = 8=#404040
palette = 9=#5f8787
palette = 10=#aa9988
palette = 11=#777755
palette = 12=#888888
palette = 13=#999999
palette = 14=#aaaaaa
palette = 15=#c1c1c1
background = #000000
foreground = #c1c1c1
cursor-color = #c1c1c1
cursor-text = #8e8e8e
selection-background = #c1c1c1
selection-foreground = #000000
@@ -0,0 +1,22 @@
palette = 0=#000000
palette = 1=#5f8787
palette = 2=#f8f7f2
palette = 3=#79241f
palette = 4=#888888
palette = 5=#999999
palette = 6=#aaaaaa
palette = 7=#c1c1c1
palette = 8=#404040
palette = 9=#5f8787
palette = 10=#f8f7f2
palette = 11=#79241f
palette = 12=#888888
palette = 13=#999999
palette = 14=#aaaaaa
palette = 15=#c1c1c1
background = #000000
foreground = #c1c1c1
cursor-color = #c1c1c1
cursor-text = #8e8e8e
selection-background = #c1c1c1
selection-foreground = #000000
@@ -0,0 +1,22 @@
palette = 0=#000000
palette = 1=#b87a7a
palette = 2=#7ab87a
palette = 3=#b8b87a
palette = 4=#7a7ab8
palette = 5=#b87ab8
palette = 6=#7ab8b8
palette = 7=#d9d9d9
palette = 8=#4c4c4c
palette = 9=#dbbdbd
palette = 10=#bddbbd
palette = 11=#dbdbbd
palette = 12=#bdbddb
palette = 13=#dbbddb
palette = 14=#bddbdb
palette = 15=#ffffff
background = #0d1926
foreground = #d9e6f2
cursor-color = #d9e6f2
cursor-text = #0d1926
selection-background = #c1ddff
selection-foreground = #000000
@@ -0,0 +1,22 @@
palette = 0=#0a4c62
palette = 1=#99246e
palette = 2=#5cb1b3
palette = 3=#eab9a8
palette = 4=#90a5bd
palette = 5=#9d54a7
palette = 6=#7e83cc
palette = 7=#f0e8d6
palette = 8=#463c5d
palette = 9=#c87272
palette = 10=#0a6c7e
palette = 11=#7a3188
palette = 12=#5f3d63
palette = 13=#bc94b7
palette = 14=#5e6071
palette = 15=#0a6c7e
background = #1c0c28
foreground = #babab9
cursor-color = #fcfad6
cursor-text = #000000
selection-background = #606060
selection-foreground = #ffffff
@@ -0,0 +1,22 @@
palette = 0=#292d3e
palette = 1=#ff8288
palette = 2=#b4e88d
palette = 3=#f4d69f
palette = 4=#82aaff
palette = 5=#e9c1ff
palette = 6=#89ebff
palette = 7=#d0d0d0
palette = 8=#9094a4
palette = 9=#ff8b92
palette = 10=#ddffa7
palette = 11=#ffe585
palette = 12=#9cc4ff
palette = 13=#ddb0f6
palette = 14=#a3f7ff
palette = 15=#ffffff
background = #006984
foreground = #c5f2ff
cursor-color = #ffcc00
cursor-text = #292d3e
selection-background = #2baeca
selection-foreground = #eceff1
@@ -0,0 +1,22 @@
palette = 0=#101116
palette = 1=#ff5680
palette = 2=#00ff9c
palette = 3=#fffc58
palette = 4=#00b0ff
palette = 5=#d57bff
palette = 6=#76c1ff
palette = 7=#c7c7c7
palette = 8=#686868
palette = 9=#ff6e67
palette = 10=#5ffa68
palette = 11=#fffc67
palette = 12=#6871ff
palette = 13=#d682ec
palette = 14=#60fdff
palette = 15=#ffffff
background = #101116
foreground = #00a2ff
cursor-color = #76ff9f
cursor-text = #a6a6a6
selection-background = #c1deff
selection-foreground = #000000
@@ -0,0 +1,22 @@
palette = 0=#41444d
palette = 1=#fc2f52
palette = 2=#25a45c
palette = 3=#ff936a
palette = 4=#3476ff
palette = 5=#7a82da
palette = 6=#4483aa
palette = 7=#cdd4e0
palette = 8=#8f9aae
palette = 9=#ff6480
palette = 10=#3fc56b
palette = 11=#f9c859
palette = 12=#10b1fe
palette = 13=#ff78f8
palette = 14=#5fb9bc
palette = 15=#ffffff
background = #282c34
foreground = #b9c0cb
cursor-color = #ffcc00
cursor-text = #282c34
selection-background = #b9c0ca
selection-foreground = #272b33
@@ -0,0 +1,22 @@
palette = 0=#373a41
palette = 1=#d52753
palette = 2=#23974a
palette = 3=#df631c
palette = 4=#275fe4
palette = 5=#823ff1
palette = 6=#27618d
palette = 7=#babbc2
palette = 8=#676a77
palette = 9=#ff6480
palette = 10=#3cbc66
palette = 11=#c5a332
palette = 12=#0099e1
palette = 13=#ce33c0
palette = 14=#6d93bb
palette = 15=#d3d3d3
background = #f9f9f9
foreground = #373a41
cursor-color = #f32759
cursor-text = #ffffff
selection-background = #daf0ff
selection-foreground = #373a41
@@ -0,0 +1,22 @@
palette = 0=#4f4f4f
palette = 1=#ff6c60
palette = 2=#a8ff60
palette = 3=#ffffb6
palette = 4=#96cbfe
palette = 5=#ff73fd
palette = 6=#c6c5fe
palette = 7=#eeeeee
palette = 8=#7c7c7c
palette = 9=#ffb6b0
palette = 10=#ceffac
palette = 11=#ffffcc
palette = 12=#b5dcff
palette = 13=#ff9cfe
palette = 14=#dfdffe
palette = 15=#ffffff
background = #0000a4
foreground = #ffff4e
cursor-color = #ffa560
cursor-text = #ffffff
selection-background = #a4a4a4
selection-foreground = #0000a4
@@ -0,0 +1,22 @@
palette = 0=#000000
palette = 1=#cc0403
palette = 2=#19cb00
palette = 3=#cecb00
palette = 4=#0d73cc
palette = 5=#cb1ed1
palette = 6=#0dcdcd
palette = 7=#dddddd
palette = 8=#767676
palette = 9=#f2201f
palette = 10=#23fd00
palette = 11=#fffd00
palette = 12=#1a8fff
palette = 13=#fd28ff
palette = 14=#14ffff
palette = 15=#ffffff
background = #141d2b
foreground = #9fef00
cursor-color = #9fef00
cursor-text = #111111
selection-background = #a4b1cd
selection-foreground = #141d2b
@@ -0,0 +1,22 @@
palette = 0=#362c24
palette = 1=#b10b00
palette = 2=#007232
palette = 3=#8b4c00
palette = 4=#005cb4
palette = 5=#9b0097
palette = 6=#006a78
palette = 7=#baa99d
palette = 8=#514337
palette = 9=#de1100
palette = 10=#008f40
palette = 11=#ae6000
palette = 12=#0074e1
palette = 13=#c300bd
palette = 14=#008697
palette = 15=#eae1da
background = #f1ebe6
foreground = #362c24
cursor-color = #362c24
cursor-text = #f1ebe6
selection-background = #362c24
selection-foreground = #f1ebe6
@@ -0,0 +1,22 @@
palette = 0=#31363b
palette = 1=#ed1515
palette = 2=#11d116
palette = 3=#f67400
palette = 4=#1d99f3
palette = 5=#9b59b6
palette = 6=#1abc9c
palette = 7=#eff0f1
palette = 8=#7f8c8d
palette = 9=#c0392b
palette = 10=#1cdc9a
palette = 11=#fdbc4b
palette = 12=#3daee9
palette = 13=#8e44ad
palette = 14=#16a085
palette = 15=#fcfcfc
background = #31363b
foreground = #eff0f1
cursor-color = #eff0f1
cursor-text = #31363b
selection-background = #eff0f1
selection-foreground = #31363b
@@ -0,0 +1,22 @@
palette = 0=#191919
palette = 1=#ff355b
palette = 2=#b7e876
palette = 3=#ffc251
palette = 4=#76d4ff
palette = 5=#ba76e7
palette = 6=#6cbfb5
palette = 7=#c2c8d7
palette = 8=#4c4c4c
palette = 9=#ff355b
palette = 10=#b7e876
palette = 11=#ffc251
palette = 12=#76d5ff
palette = 13=#ba76e7
palette = 14=#6cbfb5
palette = 15=#c2c8d7
background = #191919
foreground = #b3c9d7
cursor-color = #f34b00
cursor-text = #002831
selection-background = #b3c9d7
selection-foreground = #191919
@@ -0,0 +1,22 @@
palette = 0=#000000
palette = 1=#da4939
palette = 2=#519f50
palette = 3=#ffd24a
palette = 4=#6d9cbe
palette = 5=#d0d0ff
palette = 6=#6e9cbe
palette = 7=#ffffff
palette = 8=#585858
palette = 9=#ff7b6b
palette = 10=#83d182
palette = 11=#ffff7c
palette = 12=#9fcef0
palette = 13=#ffffff
palette = 14=#a0cef0
palette = 15=#ffffff
background = #2b2b2b
foreground = #e6e1dc
cursor-color = #ffffff
cursor-text = #c0bbb6
selection-background = #5a647e
selection-foreground = #e6e1dc
@@ -0,0 +1,22 @@
palette = 0=#1f1f1f
palette = 1=#f81118
palette = 2=#2dc55e
palette = 3=#ecba0f
palette = 4=#2a84d2
palette = 5=#4e5ab7
palette = 6=#1081d6
palette = 7=#d6dbe5
palette = 8=#d6dbe5
palette = 9=#de352e
palette = 10=#1dd361
palette = 11=#f3bd09
palette = 12=#1081d6
palette = 13=#5350b9
palette = 14=#0f7ddb
palette = 15=#ffffff
background = #131313
foreground = #d6dbe5
cursor-color = #b9b9b9
cursor-text = #101010
selection-background = #1f1f1f
selection-foreground = #d6dbe5
@@ -0,0 +1,22 @@
palette = 0=#000000
palette = 1=#bb0000
palette = 2=#00bb00
palette = 3=#bbbb00
palette = 4=#0d0dc8
palette = 5=#bb00bb
palette = 6=#00bbbb
palette = 7=#bbbbbb
palette = 8=#555555
palette = 9=#ff5555
palette = 10=#55ff55
palette = 11=#ffff55
palette = 12=#5555ff
palette = 13=#ff55ff
palette = 14=#55ffff
palette = 15=#ffffff
background = #000000
foreground = #bbbbbb
cursor-color = #bbbbbb
cursor-text = #ffffff
selection-background = #b5d5ff
selection-foreground = #000000
@@ -0,0 +1,22 @@
palette = 0=#000000
palette = 1=#bb0000
palette = 2=#00bb00
palette = 3=#bbbb00
palette = 4=#0000bb
palette = 5=#bb00bb
palette = 6=#00bbbb
palette = 7=#bbbbbb
palette = 8=#555555
palette = 9=#ff5555
palette = 10=#2fd92f
palette = 11=#bfbf15
palette = 12=#5555ff
palette = 13=#ff55ff
palette = 14=#22cccc
palette = 15=#ffffff
background = #ffffff
foreground = #000000
cursor-color = #000000
cursor-text = #ffffff
selection-background = #b5d5ff
selection-foreground = #000000
@@ -0,0 +1,22 @@
palette = 0=#4f4f4f
palette = 1=#ff6c60
palette = 2=#a8ff60
palette = 3=#ffffb6
palette = 4=#96cbfe
palette = 5=#ff73fd
palette = 6=#c6c5fe
palette = 7=#eeeeee
palette = 8=#7c7c7c
palette = 9=#ffb6b0
palette = 10=#ceffac
palette = 11=#ffffcc
palette = 12=#b5dcff
palette = 13=#ff9cfe
palette = 14=#dfdffe
palette = 15=#ffffff
background = #000000
foreground = #bbbbbb
cursor-color = #ffa560
cursor-text = #ffffff
selection-background = #363983
selection-foreground = #f2f2f2
@@ -0,0 +1,22 @@
palette = 0=#000000
palette = 1=#cc0000
palette = 2=#4e9a06
palette = 3=#c4a000
palette = 4=#3465a4
palette = 5=#75507b
palette = 6=#06989a
palette = 7=#d3d7cf
palette = 8=#555753
palette = 9=#ef2929
palette = 10=#8ae234
palette = 11=#fce94f
palette = 12=#729fcf
palette = 13=#ad7fa8
palette = 14=#34e2e2
palette = 15=#eeeeec
background = #000000
foreground = #ffffff
cursor-color = #ffffff
cursor-text = #000000
selection-background = #b5d5ff
selection-foreground = #000000
@@ -0,0 +1,22 @@
palette = 0=#000000
palette = 1=#cc0000
palette = 2=#4e9a06
palette = 3=#c4a000
palette = 4=#3465a4
palette = 5=#75507b
palette = 6=#06989a
palette = 7=#b9bdb5
palette = 8=#555753
palette = 9=#ef2929
palette = 10=#7dd527
palette = 11=#d6c329
palette = 12=#729fcf
palette = 13=#ad7fa8
palette = 14=#27d5d5
palette = 15=#eeeeec
background = #ffffff
foreground = #000000
cursor-color = #000000
cursor-text = #ffffff
selection-background = #b5d5ff
selection-foreground = #000000
@@ -0,0 +1,22 @@
palette = 0=#090300
palette = 1=#a2524c
palette = 2=#55a049
palette = 3=#bfce72
palette = 4=#6657b3
palette = 5=#984ca3
palette = 6=#67b6bd
palette = 7=#ffffff
palette = 8=#000000
palette = 9=#a2524c
palette = 10=#55a049
palette = 11=#bfce72
palette = 12=#6657b3
palette = 13=#984ca3
palette = 14=#67b6bd
palette = 15=#f7f7f7
background = #40318d
foreground = #7869c4
cursor-color = #7869c4
cursor-text = #40318d
selection-background = #7869c4
selection-foreground = #40318d
@@ -0,0 +1,22 @@
palette = 0=#000000
palette = 1=#aa0000
palette = 2=#00aa00
palette = 3=#aa5500
palette = 4=#0d0db7
palette = 5=#aa00aa
palette = 6=#00aaaa
palette = 7=#aaaaaa
palette = 8=#555555
palette = 9=#ff5555
palette = 10=#55ff55
palette = 11=#ffff55
palette = 12=#5555ff
palette = 13=#ff55ff
palette = 14=#55ffff
palette = 15=#ffffff
background = #000000
foreground = #aaaaaa
cursor-color = #b8b8b8
cursor-text = #ffffff
selection-background = #c1deff
selection-foreground = #000000
@@ -0,0 +1,22 @@
palette = 0=#000000
palette = 1=#f8282a
palette = 2=#328a5d
palette = 3=#fa701d
palette = 4=#135cd0
palette = 5=#9f00bd
palette = 6=#33c3c1
palette = 7=#b3b3b3
palette = 8=#555753
palette = 9=#fb0416
palette = 10=#2cc631
palette = 11=#e3bd0e
palette = 12=#1670ff
palette = 13=#e900b0
palette = 14=#3ad5ce
palette = 15=#eeeeec
background = #ffffff
foreground = #262626
cursor-color = #62c6ef
cursor-text = #ffffff
selection-background = #6fd3fc
selection-foreground = #041730
@@ -0,0 +1,22 @@
palette = 0=#2f2833
palette = 1=#fc644d
palette = 2=#a5f69c
palette = 3=#e9d7a5
palette = 4=#3b79c7
palette = 5=#f92672
palette = 6=#74d3de
palette = 7=#d5ced9
palette = 8=#7e6c88
palette = 9=#fc644d
palette = 10=#a5f69c
palette = 11=#e9d7a5
palette = 12=#3b79c7
palette = 13=#f92672
palette = 14=#74d3de
palette = 15=#ffffff
background = #2f2833
foreground = #d5ced9
cursor-color = #d5ced9
cursor-text = #2f2833
selection-background = #7e6c88
selection-foreground = #d5ced9
@@ -0,0 +1,22 @@
palette = 0=#282828
palette = 1=#ee5396
palette = 2=#25be6a
palette = 3=#08bdba
palette = 4=#78a9ff
palette = 5=#be95ff
palette = 6=#33b1ff
palette = 7=#dfdfe0
palette = 8=#484848
palette = 9=#f16da6
palette = 10=#46c880
palette = 11=#2dc7c4
palette = 12=#8cb6ff
palette = 13=#c8a5ff
palette = 14=#52bdff
palette = 15=#e4e4e5
background = #161616
foreground = #f2f4f8
cursor-color = #f2f4f8
cursor-text = #161616
selection-background = #2a2a2a
selection-foreground = #f2f4f8

Some files were not shown because too many files have changed in this diff Show More