address changes

This commit is contained in:
David Matos
2026-01-27 00:51:50 +01:00
parent 0a2b90ed64
commit d70eef69f9
2 changed files with 39 additions and 42 deletions

View File

@@ -84,8 +84,8 @@ Nushell's vendor autoload mechanism. Ghostty then automatically imports
the module using the `-e "use ghostty *"` flag when starting Nushell. the module using the `-e "use ghostty *"` flag when starting Nushell.
Nushell provides many shell features itself, such as `title` and `cursor`, Nushell provides many shell features itself, such as `title` and `cursor`,
so our integration focuses on Ghostty-specific features like `sudo`. Additionally, so our integration focuses on Ghostty-specific features like `sudo`,
we also provide `ssh-integration` via the `ssh-env` and `ssh-terminfo` features. `ssh-env`, and `ssh-terminfo`.
The shell integration is automatically enabled when running Nushell in Ghostty, The shell integration is automatically enabled when running Nushell in Ghostty,
but you can also load it manually is shell integration is disabled: but you can also load it manually is shell integration is disabled:

View File

@@ -4,17 +4,6 @@ export module ghostty {
$feature in ($env.GHOSTTY_SHELL_FEATURES | default "" | split row ',') $feature in ($env.GHOSTTY_SHELL_FEATURES | default "" | split row ',')
} }
# Enables SSH environment variable compatibility.
# Converts TERM from xterm-ghostty to xterm-256color
# and propagates COLORTERM, TERM_PROGRAM, and TERM_PROGRAM_VERSION
# check your sshd_config on remote host to see if these variables are accepted
def set_ssh_env []: nothing -> record<ssh_term: string, ssh_opts: list<string>> {
return {
ssh_term: "xterm-256color"
ssh_opts: ["-o" "SetEnv COLORTERM=truecolor" "-o" "SendEnv TERM_PROGRAM TERM_PROGRAM_VERSION"]
}
}
# Enables automatic terminfo installation on remote hosts. # Enables automatic terminfo installation on remote hosts.
# Attempts to install Ghostty's terminfo entry using infocmp and tic when # Attempts to install Ghostty's terminfo entry using infocmp and tic when
# connecting to hosts that lack it. # connecting to hosts that lack it.
@@ -24,7 +13,6 @@ export module ghostty {
ssh_opts: list<string> ssh_opts: list<string>
ssh_args: list<string> ssh_args: list<string>
]: [nothing -> record<ssh_term: string, ssh_opts: list<string>>] { ]: [nothing -> record<ssh_term: string, ssh_opts: list<string>>] {
mut ssh_opts = $ssh_opts
let ssh_cfg = ^ssh -G ...($ssh_args) let ssh_cfg = ^ssh -G ...($ssh_args)
| lines | lines
| parse "{key} {value}" | parse "{key} {value}"
@@ -43,20 +31,16 @@ export module ghostty {
) )
if not $is_cached { if not $is_cached {
let ssh_opts_copy = $ssh_opts
let terminfo_data = try { ^infocmp -0 -x xterm-ghostty } catch { let terminfo_data = try { ^infocmp -0 -x xterm-ghostty } catch {
print "Warning: Could not generate terminfo data." print "Warning: Could not generate terminfo data."
return {ssh_term: "xterm-256color" ssh_opts: $ssh_opts_copy} return {ssh_term: "xterm-256color" ssh_opts: $ssh_opts}
} }
print $"Setting up xterm-ghostty terminfo on ($ssh_cfg.hostname)..." print $"Setting up xterm-ghostty terminfo on ($ssh_cfg.hostname)..."
let ctrl_path = ( let ctrl_path = (
try { mktemp -td $"ghostty-ssh-($ssh_cfg.user).XXXXXX"
mktemp -td $"ghostty-ssh-($ssh_cfg.user).XXXXXX" | path join "socket"
} catch {
$"/tmp/ghostty-ssh-($ssh_cfg.user).($nu.pid)"
} | path join "socket"
) )
let master_parts = $ssh_opts ++ ["-o" "ControlMaster=yes" "-o" $"ControlPath=($ctrl_path)" "-o" "ControlPersist=60s"] ++ $ssh_args let master_parts = $ssh_opts ++ ["-o" "ControlMaster=yes" "-o" $"ControlPath=($ctrl_path)" "-o" "ControlPersist=60s"] ++ $ssh_args
@@ -78,12 +62,45 @@ export module ghostty {
} }
^$ghostty_bin ...(["+ssh-cache" $"--add=($ssh_id)"]) o+e>| ignore ^$ghostty_bin ...(["+ssh-cache" $"--add=($ssh_id)"]) o+e>| ignore
$ssh_opts ++= ["-o" $"ControlPath=($ctrl_path)"]
return {ssh_term: "xterm-ghostty" ssh_opts: ($ssh_opts ++ ["-o" $"ControlPath=($ctrl_path)"])}
} }
return {ssh_term: "xterm-ghostty" ssh_opts: $ssh_opts} return {ssh_term: "xterm-ghostty" ssh_opts: $ssh_opts}
} }
# Wrap `ssh` with Ghostty TERMINFO support
export def --wrapped ssh [...ssh_args: string]: any -> any {
if ($ssh_args | is-empty) {
return (^ssh)
}
# `ssh-env` enables SSH environment variable compatibility.
# Converts TERM from xterm-ghostty to xterm-256color
# and propagates COLORTERM, TERM_PROGRAM, and TERM_PROGRAM_VERSION
# Check your sshd_config on remote host to see if these variables are accepted
let base_ssh_opts = if (has_feature "ssh-env") {
["-o" "SetEnv COLORTERM=truecolor" "-o" "SendEnv TERM_PROGRAM TERM_PROGRAM_VERSION"]
} else {
[]
}
let base_ssh_term = if (has_feature "ssh-env") {
"xterm-256color"
} else {
($env.TERM? | default "")
}
let session = if (has_feature "ssh-terminfo") {
set_ssh_terminfo $base_ssh_opts $ssh_args
} else {
{ssh_term: $base_ssh_term ssh_opts: $base_ssh_opts}
}
let ssh_parts = $session.ssh_opts ++ $ssh_args
with-env {TERM: $session.ssh_term} {
^ssh ...$ssh_parts
}
}
# Wrap `sudo` to preserve Ghostty's TERMINFO environment variable # Wrap `sudo` to preserve Ghostty's TERMINFO environment variable
export def --wrapped sudo [ export def --wrapped sudo [
...args # Arguments to pass to `sudo` ...args # Arguments to pass to `sudo`
@@ -106,26 +123,6 @@ export module ghostty {
^sudo ...$sudo_args ^sudo ...$sudo_args
} }
# Wrap `ssh` to provide ghostty `ssh-integration`
export def --wrapped ssh [...ssh_args: string]: any -> any {
if ($ssh_args | is-empty) {
return (^ssh)
}
mut session = {ssh_term: "" ssh_opts: []}
let shell_features = $env.GHOSTTY_SHELL_FEATURES | split row ','
if (has_feature "ssh-env") {
$session = set_ssh_env
}
if (has_feature "ssh-terminfo") {
$session = set_ssh_terminfo $session.ssh_opts $ssh_args
}
let ssh_parts = $session.ssh_opts ++ $ssh_args
with-env {TERM: $session.ssh_term} {
^ssh ...$ssh_parts
}
}
} }
# Clean up XDG_DATA_DIRS by removing GHOSTTY_SHELL_INTEGRATION_XDG_DIR # Clean up XDG_DATA_DIRS by removing GHOSTTY_SHELL_INTEGRATION_XDG_DIR