Croft - TUI VSCode 克隆
摘要
Croft 是一个 VS Code 风格的三窗格工作区,完全在终端中运行,使用 Rust 构建,具备 tree-sitter 语法高亮、图像/PDF/电子表格的内联预览以及嵌入式 shell。
<p>免责声明:我不是该项目的作者。我只是在浏览 Codeberg 探索页面时偶然发现它的。</p>
<p>这是一个用 Rust 编写的 TUI VSCode 克隆,旨在与原始版本功能一致。它甚至提供完整的鼠标支持,并且能够渲染图像和 PDF。它很好地展示了现代 TUI 的能力。</p>
<p><a href="https://lobste.rs/s/2jd5yg/croft_tui_vscode_clone">评论</a></p>
查看缓存全文
缓存时间: 2026/05/31 14:20
# croft 来源:https://codeberg.org/vitali87/croft croft 一个完全在终端内运行的 VS Code 风格三面板工作区。使用 Rust 编写以保证性能,并作为单个静态二进制文件分发。 - **左侧面板(侧边栏):**资源管理器,支持多选、剪切/复制/粘贴、拖放文件移动,以及 VS Code 风格图标(Codicons / Devicons / Seti)。通过活动栏可切换另外两个侧边栏视图:全文搜索和远程(SSH)资源管理器。 - **右上方面板(编辑器):**代码编辑器,使用 `tree-sitter` 实现语法高亮,并内置预览标签页,支持 PNG / JPEG / GIF / BMP / WebP、PDF(带页面导航)以及 CSV / TSV / XLSX / XLS / ODS 电子表格。 - **右下方面板(终端):**一个真正的交互式 shell,你的 `$SHELL` 运行在真实的 PTY 上。 - 所有三个面板可通过拖动它们之间的接缝来调整大小。 构建于 [ratatui](https://ratatui.rs/) + [crossterm](https://github.com/crossterm-rs/crossterm) 之上,使用 [portable-pty](https://docs.rs/portable-pty/) 提供嵌入式 shell,[vt100](https://docs.rs/vt100/) 解析终端状态,[tree-sitter](https://tree-sitter.github.io/tree-sitter/) 实现增量、基于 AST 的语法高亮,[calamine](https://docs.rs/calamine/) 解析电子表格,以及 iTerm2 OSC 1337 内联图像协议实现图像/PDF预览。 ## 需求 需求|原因 ---|--- macOS 或 Linux|PTY 层使用 POSIX `forkpty`。尚不支持 Windows。 Rust 1.78+ 稳定版|用于编译二进制文件。 终端字体使用 Nerd Font|文件资源管理器图标是 Private Use Area 字形(Codicons、Devicons、Seti)。没有 Nerd Font 时,图标会显示为 `[?]` 方块。 256 色或真彩色终端|macOS Terminal.app、iTerm2、Alacritty、kitty、WezTerm、Ghostty 均符合要求。 iTerm2、WezTerm、Ghostty 或 kitty(可选)|通过 OSC 1337 实现内联图像/PDF/电子表格预览所必需。其他终端回退到显示元数据标题行,因此该功能仍有信息价值。 `pdftoppm`(来自 poppler-utils,可选)|多页 PDF 预览。使用 `brew install poppler`(macOS)或 `apt install poppler-utils`(Linux)安装。没有它,croft 会退回到 macOS 的 `sips` 仅显示第 1 页。 ### 安装 Rust `` curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh `` ### 安装 Nerd Font(macOS) `` brew install --cask font-meslo-lg-nerd-font `` 然后在 Terminal.app 的默认配置文件字体中设置它。最快的方法是使用捆绑的命令(编译后,见下文): `` ./target/release/croft setup-terminal `` 此命令通过 AppleScript 将默认配置文件字体设置为 PostScript 名称 `MesloLGSNFM-Regular`,字号 13pt。现有自定义配置文件不会被修改。完全退出 Terminal.app(cmd+Q)并重新打开以使更改生效。如果你想手动操作:Terminal.app → 设置 → 配置文件 → 你的默认配置文件 → 文本 → 字体 → 更改 → MesloLGS Nerd Font Mono Regular 13pt。 **为什么特别推荐 MesloLGS NF:**macOS Terminal.app 不像 iTerm2 那样为 Private Use Area 字形执行 CoreText 风格的字体回退。只有在*主*终端字体包含这些字形时,Nerd Font 字形才能显示。MesloLGS NF 提供了资源管理器使用的所有 Codicon、Devicon 和 Seti 字形。 > **PostScript 名称与显示名称。**AppleScript 需要*PostScript*名称,该名称嵌入在 .ttf 文件中,而不是 Terminal.app 字体选择器显示的名称。`MesloLGSNerdFontMono-Regular.ttf` 的 PostScript 名称是 `MesloLGSNFM-Regular`。传递显示名称会在 AppleScript 中静默无操作,Terminal.app 会保留之前的字体,这就是即使运行了设置命令后图标仍然显示为方块的原因。 ## 安装 最快路径,无需克隆: `` cargo install --git https://codeberg.org/vitali87/croft.git `` 这会将 croft 从最新的 `main` 分支编译,并将二进制文件放入 `~/.cargo/bin/croft`。重新运行相同命令以升级。 ### 从源码构建 `` git clone https://codeberg.org/vitali87/croft.git cd croft cargo build --release # 可选,安装到 ~/.cargo/bin cargo install --path . `` ## 运行 `` croft # 打开当前目录 croft ~/projects # 打开特定文件夹 croft --help croft setup-terminal --help `` ## 快捷键 ### 全局键 操作|快捷键 ---|--- `Ctrl+s`|保存当前文件 `Ctrl+q`|退出 `F1`|打开快捷键弹窗(所有绑定按面板分组,可滚动) `F6`|循环切换面板焦点(树 → 编辑器 → 终端 → 树) `Ctrl+b`|切换文件树/侧面板 `Ctrl+j`|切换终端面板 `Ctrl+Shift+j`|最大化终端面板(将编辑器/欢迎页折叠到零行,使终端填充资源管理器旁边的右列;再次按下恢复之前的分割) `Ctrl+p`(或使用下方 iTerm2 设置后的 `Cmd+p`)|快速打开:模糊搜索工作区文件名称并跳转到选定的文件(自动展开资源管理器以显示它) `Ctrl+Shift+e` / `Cmd+Shift+e`|从任何面板跳转到资源管理器侧边栏 `Ctrl+Shift+f` / `Cmd+Shift+f`|跳转到搜索侧边栏 `Ctrl+Shift+s` / `Cmd+Shift+s`|跳转到源代码管理(编辑器中也有效) `Ctrl+Shift+g` / `Cmd+Shift+g`|跳转到源代码管理(当编辑器未聚焦时;在编辑器中 `Cmd+Shift+G` 是跳转到底部) `Ctrl+Shift+d` / `Cmd+Shift+d`|跳转到运行和调试 `Ctrl+Shift+r` / `Cmd+Shift+r`|跳转到远程(SSH) `Ctrl+Shift+l` / `Cmd+Shift+l`|当连接到远程时,断开连接并回退到本地 croft 在你连接时的目录(`Ctrl+q` 仍然完全退出) 点击活动栏图标(左侧边缘)|在资源管理器、搜索、源代码管理、运行-调试和远程侧边栏视图之间切换 拖动侧边栏和编辑器之间的垂直接缝|调整侧边栏大小 拖动编辑器和终端之间的水平接缝|调整终端面板大小 鼠标滚轮|滚动指针所在的面板 ### 资源管理器(文件树)键 操作|快捷键 ---|--- `↑` / `↓`|移动选择 `Enter` 或 `→`(在文件上)|在编辑器中打开;在文件夹上:展开或折叠 `←`(在文件夹上)|折叠 `Shift` + `↑` / `↓` / `PageUp` / `PageDown` / `Home` / `End`|从锚点行扩展多选 `Shift` + 点击另一行|扩展多选到范围 `Alt` + 点击(macOS 上为 Option + 点击)或 `Ctrl` + 点击|切换某行是否在多选内 `Ctrl` + `A` / `Cmd` + `A`|选择所有可见行 `Esc`|清除多选 `Ctrl` + `C` / `Cmd` + `C`|复制选中的路径到资源管理器剪贴板 `Ctrl` + `X` / `Cmd` + `X`|剪切选中的路径到资源管理器剪贴板 `Ctrl` + `V` / `Cmd` + `V`|将剪贴板路径粘贴到聚焦的文件夹(剪切时移动,复制时复制) 将一行拖到文件夹上|将选中项移动到该文件夹内 `Alt` + 将一行拖到文件夹上|将选中项复制到该文件夹内而非移动 `Delete` / `Backspace`(或 `Cmd` + `Backspace`)|将每个选中的路径移动到操作系统垃圾箱。在 macOS 上,垃圾箱播放一次整个批次的音效。 右键点击|上下文菜单:剪切、复制、粘贴、重命名、删除(多选时显示项目数量),在空白区域上显示新建文件/新建文件夹 ### 搜索侧边栏键 操作|快捷键 ---|--- 输入|实时进行 `.gitignore` 感知的搜索;每次按键刷新(约 120 毫秒去抖,在 UI 线程外运行)。最多 200 个结果。 点击 `Aa`、`ab`、`.*` 切换|切换区分大小写/全词匹配/正则表达式;立即重新运行。激活的切换项以黄色背景显示。 `↑` / `↓` + `Enter`,或点击结果|在匹配行打开文件 ### 编辑器:文本 操作|快捷键 ---|--- 方向键、Home、End|导航(清除任何活动选择) `Shift` + 方向键 / `Shift` + `Home` / `End` / `PageUp` / `PageDown`|按相同移动方向扩展选择 `PageUp` / `PageDown`(Mac 上为 `fn` + `↑` / `fn` + `↓`)|正好滚动一个视口 任何可打印字符、Enter、Backspace、Delete、Tab|编辑(在活动选择上输入或删除会替换选择) 鼠标拖拽|选择文本;选择状态保持高亮直到复制或点击其他地方 `Ctrl` + `C` / `Cmd` + `C`|通过 OSC 52 将选择复制到系统剪贴板 `Ctrl` + `X` / `Cmd` + `X`|剪切选择 `Ctrl` + `V` / `Cmd` + `V`|在光标处粘贴;如有选择则替换 `Ctrl` + `Z` / `Cmd` + `Z`|撤销(连续输入合并为一步;退格、粘贴、剪切、替换各为单独一步) `Cmd` + `A`|选择整个缓冲区 `Ctrl` + `f` / `Cmd` + `f`|打开编辑器右上角内联查找栏——从选择(单行)或光标下的单词预填查询;输入时光标跳转到光标处或之后的第一个匹配项,并将活动匹配项以橙色高亮,其余匹配项以黄色高亮;`Enter` / `F3` 向前移动,`Shift+Enter` / `Shift+F3` 向后移动,`Esc` 关闭 `Ctrl` + `A`|移动到当前行首(类似 readline 风格) `Ctrl` + `E`|移动到当前行尾 `Ctrl` + `K`|从光标删除到行尾(复制到系统剪贴板) `Ctrl` + `U`|从光标删除到行首(复制到系统剪贴板) `Cmd` + `o`|在当前行下方新开一行,继承其缩进 `Cmd` + `Shift` + `o`|在当前行上方新开一行,继承其缩进 `Cmd` + `g``g`|跳转到文件顶部 `Cmd` + `N``Cmd` + `g``g`|跳转到行 `N`(计数可以前置,`Cmd` + `5``Cmd` + `g``g` → 第 5 行;计数也可以在第一个 `Cmd` + `g` 之后输入) `Cmd` + `Shift` + `G`|跳转到文件底部(带有前置计数时,跳转到该行) `Cmd` + `d``d`|删除当前行(复制到系统剪贴板) `Cmd` + `N``Cmd` + `d``d`|删除 `N` 行 `Cmd` + `y``y`|复制(yank)当前行到系统剪贴板 `Cmd` + `N``Cmd` + `y``y`|复制 `N` 行 `Esc`|清除当前选择 ### 编辑器:图像预览(`.png`、`.jpg`、`.jpeg`、`.gif`、`.bmp`、`.webp`) 标签页为只读。所有按键都会被吞掉,以防止意外按键损坏用户无法看到的缓冲区。 ### 编辑器:PDF 预览(`.pdf`) 操作|快捷键 ---|--- `→` / `Page Down` / `Space`|下一页 `←` / `Page Up`|上一页 `Home`|第一页 `End`|最后一页(当页数已知时) ### 编辑器:电子表格预览(`.csv`、`.tsv`、`.xlsx`、`.xls`、`.xlsb`、`.ods`) 操作|快捷键 ---|--- `↑` / `↓` / `←` / `→`|移动一行/一列 `PageUp` / `PageDown`|垂直移动一个完整视口 `Home`|跳转到第 1 行,第 1 列 `End`|跳转到最后一个可见页面 `Tab` / `Shift+Tab`|切换工作表(在多工作表工作簿中) ### 终端 操作|快捷键 ---|--- 任何按键|转发给 shell PTY(方向键、`Ctrl+字母`、`Alt+x`、功能键都转换为适当的 VT 转义序列) 鼠标拖拽|选择文本;选择状态保持高亮直到复制或点击其他地方 鼠标滚轮|在最多 5000 行回滚中滚动。在 alternate-screen 模式(vim / less / htop)下,滚轮会转发方向键以便运行的应用程序处理。任何按键都会跳回活动底部。 `Ctrl+Shift+c`(或使用 kitty 协议终端时的 `Cmd+c`)|显式复制终端的当前选择 `Ctrl+Shift+t`|在当前终端旁边打开另一个终端(可从任何面板操作)。每个终端都有自己的 PTY、回滚和选择。 `Ctrl+Shift+w`|关闭活动终端(当只剩下一个时无操作;使用 `Ctrl+J` 隐藏面板)。 `Ctrl+Shift+]`|切换到面板中的下一个终端。点击任何终端直接切换焦点。 ## macOS 用户 iTerm2 设置 编译后运行一次 Croft 的 iTerm2 设置: `` ./target/release/croft setup-iterm2 `` 这会写入默认配置文件字体设置以及 Croft 的 iTerm2 键盘设置: iTerm2 按键|安装的映射|Croft 执行的操作 ---|---|--- `⌘P`|`\x1b[112;9u`|快速打开:模糊搜索工作区文件 `⌘F`|`\x1b[102;9u`|编辑器内查找(输入时跳转到下一个匹配项) `⌘⇧E`|`\x1b[69;10u`|跳转到资源管理器侧边栏 `⌘⇧F`|`\x1b[70;10u`|跳转到搜索侧边栏 `⌘⇧S`|`\x1b[83;10u`|跳转到源代码管理 `⌘⇧D`|`\x1b[68;10u`|跳转到运行和调试 `⌘⇧R`|`\x1b[82;10u`|跳转到远程(SSH) `⌘⇧L`|`\x1b[76;10u`|断开远程会话并回退到本地 croft `⌘⇧N`|`\x1b[78;10u`|资源管理器“新建文件夹”提示(当树聚焦时) `⌃⇧J`|`\x1b[74;6u`|最大化终端面板(折叠编辑器/欢迎页;再次按下恢复之前的编辑器↔终端分割) `⌘V`|`\x1b[118;9u`(全局和配置文件按键映射中)|读取系统剪贴板并粘贴到聚焦的编辑器中,或当搜索活动时粘贴到搜索中 它还会将以下 iTerm2 / macOS 菜单快捷键移开(每个都映射到 `Cmd+Opt+`,以便原始的 iTerm2 操作仍可通过 croft 不使用的组合键访问): **编辑 → 查找 → 全局查找...** 从 `⌘⇧F` 移开,**编辑 → 粘贴** 从 `⌘V` 移开,**Shell → 使用相同配置文件垂直分割** 从 `⌘D` 移开,**Shell → 使用相同配置文件水平分割** 从 `⌘⇧D` 移开,**编辑 → 查找下一个 / 查找上一个 / 跳转到选择**,**文件 → 打印** 从 `⌘P` 移开,**窗口 → 选择标签页 1..9** 从 `⌘1..⌘9` 移开,以及 macOS 的**帮助 → 显示帮助菜单** 从 `⌘⇧/` 移开。设置完成后,使用 `⌘Q` 完全退出 iTerm2 并重新打开;iTerm2 在运行时缓存其 plist 文件。 ### 1. 右键点击到达 croft 默认情况下,iTerm2 在右键点击时显示自己的上下文菜单(复制/打开 URL/等),并且从不将其转发给正在运行的应用程序,因此 croft 的新建文件/新建文件夹菜单永远不会触发。 iTerm2 → 设置(`⌘,`) → 搜索 **"right click"** → 勾选 **"Right click reported to apps, does not open menu"**。之后,在 croft 的树面板中右键点击会打开 croft 的菜单。无需重启 iTerm2。Terminal.app 不公开此开关,因此右键点击仅限 iTerm2。 ### 2. Cmd+S 作为保存(以及其他 Cmd 快捷键) `Ctrl+S` 在任何终端中开箱即用即可保存。要让 `Cmd+S` 在 macOS 的 croft 中保存,需要额外一步,任何终端应用都无法自行解决。macOS 将 Cmd 修饰键保留给应用程序菜单;Terminal.app 和 iTerm2 都遵循此规则。iTerm2 ≥3.5 支持 kitty 键盘协议(croft 在启动时协商 `\x1b[>3u`),但即使同时启用 **Apps can change how keys are reported** 和 **Report keys using CSI u**,iTerm2 仍然不会通过 CSI u 传递 `Cmd+字母`。已验证。标准的解决方法是添加一行按键映射,将 `Cmd+字母` 重写为 `Ctrl+字母` 已经发送的字节。Croft 现有的经过测试的 `Ctrl+S` 处理程序会处理其余的。 iTerm2 → 设置 → **配置文件** → 默认 → **按键**选项卡 → **按键映射**子选项卡 → 点击 **+** → "Click to Set" → 按下 **⌘S** → 操作:**Send Hex Code** → 代码:`0x13` → 确定。 iTerm2 按键|十六进制代码|Croft 执行的操作 ---|---|--- `⌘S`|`0x13`|保存 `⌘Q`|`0x11`|退出 `⌘B`|`0x02`|切换文件树 `⌘C`|`0x03`|将当前选择(编辑器或终端)通过 OSC 52 复制到系统剪贴板 `⌘X`|`0x18`|剪切编辑器选择 `⌘Z`|`0x1a`|撤销上一次编辑器编辑 `⌘A`|`0x01`|在聚焦面板中选择全部(编辑器:选择整个缓冲区)。没有此映射时,iTerm2 会执行 **编辑 → 全选** 在整个 iTerm2 窗口上。 对于 `⌘⇧F` 和 `⌘V`,使用 `croft setup-iterm2`;它会在全局和每个配置文件中安装这两个映射。 ### 3. Cmd+Shift+F 跳转到搜索侧边栏 在 `setup-iterm2` 并重新启动 iTerm2 后,`⌘⇧F` 会从 croft 的任何位置跳转到搜索面板。安装的全局映射发送 `\x1b[70;10u`,这是 kitty 协议对 `Shift+Cmd+F` 的编码;crossterm 将其解码为 `KeyEvent { code: Char('F'), modifiers: SHIFT | SUPER }`,croft 将其处理为搜索。 ### 4. ⌘V 粘贴 在 `setup-iterm2` 并重新启动 iTerm2 后,工作流程如下: 1. 按下 `⌘⇧F`;搜索变为活动状态。 2. 按下 `⌘V`;iTerm2 发送 `\x1b[118;9u`,这是 kitty/CSI-u 对 `Cmd+V` 的编码。 3. Croft 将其处理为搜索粘贴,通过原生 `NSPasteboard` 读取 macOS 剪贴板,并将其插入搜索查询中。 当编辑器聚焦时,相同的 `⌘V` 路径会将内容粘贴到编辑器中,即使搜索侧边栏仍然可见。如果另一个终端发送的是正常的括号粘贴事件而不是 CSI-u 按键事件,croft 会以相同方式根据焦点路由。 **零设置替代方案:⌃⇧V。** 如果你不想触碰系统设置,请在搜索输入框中按 `⌃⇧V`(Control+Shift+V)。iTerm 原生将其编码为 `0x16` 字节,没有菜单冲突,也无需每个配置文件映射。croft 的搜索粘贴处理程序以与 ⌘V 相同的方式匹配它。 其他终端(kitty、Ghostty、WezTerm、Alacritty)会原生通过 kitty 协议传递 Cmd;croft 在启动时已经协商了该协议,因此 `Cmd+S`、`Cmd+Shift+F`、`Cmd+V` 等快捷键在这些终端中可以直接使用。
相似文章
@claugeAi: 我构建的项目 Clauge 是一个跨平台桌面应用(Rust + Tauri,约25MB,亚秒级冷启动),集成了7个开发工具……
Clauge 是一个开源跨平台桌面应用,使用 Rust 和 Tauri 构建,集成了多个开发者工具——包括并行编码代理、看板工作区和 API 客户端——全部具备 AI 能力。
@hasantoxr:发现这个后,我要卸载 Cursor 和其他所有 AI 编程工具。它叫 DeepSeek TUI,一个完整的编程代理…
DeepSeek TUI 是一个新的开源 CLI 编程代理,用 Rust 构建,利用 DeepSeek API 在终端本地运行。它提供文件编辑、Shell 命令执行和多种控制模式,无需浏览器或 IDE 插件。
@geekbb: 基于 Tauri(Rust + Svelte)的桌面应用,将编程 AI 代理、API 客户端、SQL/NoSQL 编辑器、SSH 终端、远程文件浏览器和项目管理看板整合在一个界面中,开发者不用在多个应用之间切换。 https://gith…
Clauge 是一个基于 Tauri(Rust + Svelte)的桌面应用,将编程 AI 代理、API 客户端、SQL/NoSQL 编辑器、SSH 终端、远程文件浏览器和项目管理看板集成在同一界面内,让开发者无需在多个应用间切换。
@QingQ77: 更快更智能的 VS Code TODO 树插件,TypeScript + Rust 重写,带优先级、标签、Git 感知和 AI Agent 接口。 https://github.com/real-Elysia886/Todo-Tree-N…
更快更智能的VS Code TODO树插件,TypeScript+Rust重写,带优先级、标签、Git感知和AI Agent接口。
@yucheng: 最近种草 @superdoteng ,已经一个月没打开过任何像是 cursor 的 ide 了。天然适合多开 workspace, 项目,worktree。里面的各种快捷键包括左右切 workspace, 上下切 repo,上下切 wor…
The user recommends superdoteng as an IDE alternative that excels at managing multiple workspaces, projects, and worktrees, with keyboard shortcuts and support for Grok Build.