Croft - TUI VSCode 克隆

Lobsters Hottest 工具

摘要

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` 等快捷键在这些终端中可以直接使用。

相似文章

@geekbb: 基于 Tauri(Rust + Svelte)的桌面应用,将编程 AI 代理、API 客户端、SQL/NoSQL 编辑器、SSH 终端、远程文件浏览器和项目管理看板整合在一个界面中,开发者不用在多个应用之间切换。 https://gith…

X AI KOLs Timeline

Clauge 是一个基于 Tauri(Rust + Svelte)的桌面应用,将编程 AI 代理、API 客户端、SQL/NoSQL 编辑器、SSH 终端、远程文件浏览器和项目管理看板集成在同一界面内,让开发者无需在多个应用间切换。