Files
shell-rs/Cargo.toml
T
XuzandClaude Opus 5.5 c679d9d8a0 SFTP 加内置编辑器:双击文件在编辑器标签里编辑,⌘S 原地写回
SFTP 里双击、回车、F4 或右键「编辑」一个文件(远程和本地都行),在中间区的「编辑器」标签里打开;
「新建 › 文件…」建好后也直接打开。同一个文件只开一个标签。先读后开:超过 5 MB、二进制或不是
UTF-8 的文件只弹说明,远程的可以改用「下载…」。

远程文件经打开它的 SFTP 标签的连接读写,不另起登录。保存是原地改写(截断后写原文件),所有者、
权限和链接都不变;保存前核对大小和修改时间,被别人改过就先问「覆盖」。BOM 和 CRLF 原样写回。
常见的约 15 种语言有语法高亮(gpui-kit 的 tree-sitter 特性;SQL 的语法库要求 cc ~1.2,所以
Cargo.lock 里 cc 退到 1.2.67)。

关闭有修改的标签问「保存 / 放弃修改 / 取消」;批量关闭、关 SFTP 标签、⌘Q(Windows / Linux 还有
窗口的关闭按钮)有未保存的文件时问一次。状态栏显示光标位置和编码、换行方式。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 21:37:26 +08:00

166 lines
5.1 KiB
TOML

[package]
name = "shellrs"
version = "0.1.2"
edition = "2024"
publish = false
description = "SSH client and host manager: terminal, SFTP, port forwarding"
license = "GPL-3.0-only"
repository = "https://github.com/since2006/shell-rs"
default-run = "shellrs"
# The app. On macOS and Linux it doubles as the `shellrs` command when
# started with arguments.
[[bin]]
name = "shellrs"
path = "src/main.rs"
# The `shellrs` command on its own, as a console program: Windows needs it,
# because the app is a GUI program there and has no console to print to.
[[bin]]
name = "shellrs-cli"
path = "src/bin/shellrs-cli.rs"
[dependencies]
gpui-kit = { version = "0.6.1", features = [
# The built-in editor's syntax highlighting, for what servers hold most:
# `tree-sitter` itself brings JSON. Each grammar is compiled C, so the
# list stays short.
"tree-sitter",
"tree-sitter-bash",
"tree-sitter-css",
"tree-sitter-diff",
"tree-sitter-go",
"tree-sitter-html",
"tree-sitter-javascript",
"tree-sitter-lua",
"tree-sitter-make",
"tree-sitter-markdown",
"tree-sitter-php",
"tree-sitter-python",
"tree-sitter-sql",
"tree-sitter-toml",
"tree-sitter-yaml",
] }
alacritty_terminal = "0.26"
anyhow = "1"
async-channel = "2"
base64 = "0.22"
clap = { version = "4", features = ["derive"] }
dirs = "6"
# Canonical local paths without the `\\?\` prefix std adds on Windows.
dunce = "1"
futures = "0.3"
portable-pty = "0.9"
rand = "0.9"
russh = "0.63"
russh-sftp = "=3.0.0"
serde_json = "1"
sys-locale = "0.3"
sha2 = "0.10"
uuid = { version = "1", features = ["v4"] }
chrono = "0.4"
rusqlite = { version = "0.40", features = ["bundled"] }
serde = { version = "1", features = ["derive"] }
tokio = { version = "1", features = ["fs", "io-util", "macros", "net", "rt", "sync", "time"] }
unicode-width = "0.2"
# `ssh://user:password@host:port` links, as bastion hosts open Xshell with.
url = "2"
percent-encoding = "2"
zeroize = "1"
keyring = "4"
trash = "5"
# Online update: the signed manifest, its versions and the downloads. The
# default features keep rustls with the OS trust store and the system proxy
# (a GUI app started from Finder or the Start menu has no HTTPS_PROXY).
minisign-verify = "0.2"
reqwest = { version = "0.13", features = ["blocking"] }
semver = { version = "1", features = ["serde"] }
[target.'cfg(unix)'.dependencies]
# `access(2)`: whether the folder ShellRS runs from can take its update.
libc = "0.2"
# The Dock icon when running outside an app bundle (`cargo run`). GPUI
# already builds these crates.
[target.'cfg(target_os = "macos")'.dependencies]
objc2 = "0.6"
objc2-app-kit = { version = "0.3", default-features = false, features = [
"std",
"NSApplication",
"NSImage",
"NSResponder",
] }
objc2-foundation = { version = "0.3", default-features = false, features = ["std", "NSData"] }
[target.'cfg(windows)'.dependencies]
windows-registry = "0.6"
windows-sys = { version = "0.61", features = [
"Win32_Security",
"Win32_Security_Authorization",
"Win32_Storage_FileSystem",
"Win32_System_IO",
"Win32_System_Pipes",
"Win32_System_Threading",
"Win32_UI_WindowsAndMessaging",
] }
# The icon in the Windows executables (build.rs).
[target.'cfg(windows)'.build-dependencies]
winresource = "0.1"
[dev-dependencies]
tokio = { version = "1", features = ["process", "test-util"] }
gpui-kit = { version = "0.6.1", features = ["test-support"] }
tempfile = "3"
minisign = "0.7"
# What the release workflow ships: smaller and faster than the default, at
# the cost of a longer build.
[profile.release]
lto = "thin"
codegen-units = 1
strip = true
# Optimize the rendering stack in debug builds (per gpui-kit's installation
# guide); shellrs itself stays unoptimized and debuggable.
[profile.dev.package]
gpui-pre = { opt-level = 3 }
gpui-pre-platform = { opt-level = 3 }
gpui-pre-macos = { opt-level = 3 }
gpui-base = { opt-level = 3 }
gpui-component = { opt-level = 3 }
gpui-kit = { opt-level = 3 }
gpui-kit-assets = { opt-level = 3 }
cosmic-text = { opt-level = 3 }
rustybuzz = { opt-level = 3 }
swash = { opt-level = 3 }
taffy = { opt-level = 3 }
ttf-parser = { opt-level = 3 }
resvg = { opt-level = 3 }
usvg = { opt-level = 3 }
zed-font-kit = { opt-level = 3 }
# Generating an RSA key and deriving a key from a passphrase take seconds
# unoptimized; the credential form does both.
rsa = { opt-level = 3 }
crypto-bigint = { opt-level = 3 }
crypto-primes = { opt-level = 3 }
bcrypt-pbkdf = { opt-level = 3 }
blowfish = { opt-level = 3 }
# The editor parses whole files of up to 5 MB to highlight them.
tree-sitter = { opt-level = 3 }
tree-sitter-bash = { opt-level = 3 }
tree-sitter-css = { opt-level = 3 }
tree-sitter-diff = { opt-level = 3 }
tree-sitter-go = { opt-level = 3 }
tree-sitter-html = { opt-level = 3 }
tree-sitter-javascript = { opt-level = 3 }
tree-sitter-json = { opt-level = 3 }
tree-sitter-lua = { opt-level = 3 }
tree-sitter-make = { opt-level = 3 }
tree-sitter-md = { opt-level = 3 }
tree-sitter-php = { opt-level = 3 }
tree-sitter-python = { opt-level = 3 }
tree-sitter-sequel = { opt-level = 3 }
tree-sitter-toml-ng = { opt-level = 3 }
tree-sitter-yaml = { opt-level = 3 }