拓冰建站拓冰建站
首页 / 资讯中心 / 正文

gpui-kit Editor 源代码编辑器组件完全指南:语法高亮、折叠、多光标与语言编辑规则

gpui-kit Editor 源代码编辑器组件完全指南语法高亮、折叠、多光标与语言编辑规则【免费下载链接】gpui-kitRust GUI components for building fantastic cross-platform desktop application by using GPUI.项目地址: https://gitcode.com/GitHub_Trending/gp/gpui-kitEditor是 gpui-kit 面向源代码编辑场景的多行文本编辑器组件内置语法高亮、行号、代码折叠、矩形列选、多光标与内置搜索/替换面板。本文以 Editor 官方文档 为主体结合仓库源码与测试用例系统讲解其语言编辑规则LanguageConfig、构建选项、快捷键体系、搜索 API、文本装饰、字体与外观定制读完即可在 GPUI 应用中集成一个可用的代码编辑器。Editor 与 Input、Textarea 的定位差异在 gpui-kit 的输入组件家族中三者针对不同场景见 input 模块目录Input单行输入用于用户名、搜索框等Textarea普通多行文本不需要语法意识Editor源代码编辑器需要语法高亮、缩进规则、括号配对等语言能力。use gpui_kit::component::input::{Editor, EditorState, TabSize};从实现上看Editor 组件 与Input、Textarea共享同一套底层输入引擎InputBaseState并通过Input::from_state复用单行 Input 的渲染管线再叠加代码编辑专属行为。在 state.rs 中AnyInputState枚举统一收编了InputState、TextareaState、EditorState和OtpState因此通过WindowExt::focused_input拿到的任意输入控件都可以用as_editor()取回编辑器状态。语言编辑规则LanguageConfig 与编辑器选项的边界两个独立维度的配置LanguageConfig描述语言级规则括号配对、缩进模式而.auto_close(bool)与.smart_indent(bool)是编辑器级选项。二者互相独立切换语言或替换语言规则时不会重置这两个编辑器选项。use gpui_kit::component::input::{ AutoClosingPair, BracketPair, language_config::LanguageConfig, SyntaxContext, set_language_config, }; let rules LanguageConfig::default() .brackets([BracketPair::new({, }), BracketPair::new((, ))]) .auto_closing_pairs([ AutoClosingPair::new({, }) .not_in([SyntaxContext::String, SyntaxContext::Comment]), AutoClosingPair::new((, )) .not_in([SyntaxContext::String, SyntaxContext::Comment]), ]); set_language_config(rust, rules, cx); let editor cx.new(|cx| { EditorState::new(window, cx) .language(rust) .auto_close(true) .smart_indent(true) });运行行为遵循「按功能分道」的原则自动补全、跳过结束符、成对 Backspace 使用auto_closing_pairs而 Enter 换行使用brackets与indentation_rules。因此即使关闭了自动补全在已有括号内换行依然可以触发正确缩进——因为这两条路径互不依赖。set_language_config 的即时生效与别名共享set_language_config替换当前应用中指定语言的配置已有编辑器在下一次编辑时立即使用它即使配置修改和编辑发生在同一个事件处理函数内——对应测试language_config_works_without_render_sync见 editor.rs 的测试模块先注册 JSON 的«»配对再执行一次完整渲染随后输入«依然得到«»证明注册的配置不会因渲染而丢失。语言别名共享同一份配置。例如python、py、pyi指向同一个规则集且不受对应 grammar feature 是否启用影响高亮语法与编辑规则是两套独立资源。测试aliases_share_config_even_when_registered_before_init证明即使在组件初始化之前用py注册配置之后用PYTHON或pyi切换语言别名依然共享精确注册的自定义 grammar 名称则优先于内置别名并保留原始大小写。未知语言统一使用LanguageConfig::default()。底层定义LanguageConfig 的默认值LanguageConfig定义在 crates/base/src/input/editor/language_config.rs字段如下字段类型默认值说明bracketsVecBracketPair() [] {}结构括号用于缩进判断与定界符之间换行auto_closing_pairsOptionVecAutoClosingPair() [] {} 均not_inString/CommentNone表示回退使用bracketsSome(vec![])禁用全部自动配对auto_close_beforeSharedString;:.,}])允许自动补全插入的后方字符空白与文档末尾始终允许indentation_rulesOptionIndentationRulesNone自定义 Enter 缩进模式关键语义源码注释与实现可印证配对定界符是字符串支持/*与*/这类多字符定界符空定界符会被忽略见closing_pairs()过滤逻辑builder 方法设置的是Some(...)所以「用auto_closing_pairs([])传空集合」 禁用全部自动配对not_in依赖语法上下文提供者SyntaxContextProvider。没有提供者时Base 层按Code上下文处理启用对应 Tree-sitter grammar 后Component 会自动安装语法上下文提供者见 syntax_context.rs。IndentationRules编译期正则IndentationRules::new(increase, decrease)接受两个已编译的regex::Regex。Enter 时分别匹配光标前、光标后的文本increase_indent_pattern命中则增加缩进decrease_indent_pattern命中则减少。未配置增加缩进模式时回退到结构括号判断——文本以某个brackets的 open 结尾即增加缩进见opens_indent实现。这些规则不会重新格式化已有行或粘贴内容。Component 内置的默认规则language_config.rstext无括号、无配对、无缩进规则json{}、[]、三组配对均在 String/Comment 上下文中禁用python额外识别末尾冒号正则r[\{\(\[:]\s*$增与r^\s*[\}\)\]]减其余语言仅使用结构括号。对应测试colon_indentation_is_language_specific验证if enabled:命中 Python 的增缩进模式而 rust/javascript/json/unknown 均无自定义缩进规则。LanguageProvider 与 grammar 资源Component 初始化时安装LanguageProviderinit在 language_config.rs统一提供语言名称、默认规则及每个编辑器的语法上下文提供者。首次编辑和切换语言后的语法选择都不依赖 render——测试syntax_follows_language_before_first_render_and_after_switch证明在第一次渲染之前Python 字符串内的(不会触发配对而切换 highlighter 到 rust 后同一位置立即启用结构配对。直接使用 Base 层时可通过set_language_provider安装自己的语言服务普通 Component 使用者只需调用set_language_config。高亮的 grammar 资源使用highlighter::GrammarConfig即 highlighter/registry.rs 中的LanguageConfig类型别名专门描述 grammar 名称、Tree-sitter Language、highlights/injections/locals 查询与编辑规则input::language_config::LanguageConfig明确区分。这是 Monaco 风格语言配置的已支持子集不直接加载 Monaco JSON 或.scm文件包围选区surround selection与自定义onEnterRules留待后续实现。基础用法行号、折叠与 Tab 尺寸let editor cx.new(|cx| { EditorState::new(window, cx) .language(rust) .line_number(true) .folding(true) .tab_size(TabSize { tab_size: 4, hard_tabs: false, }) .default_value(fn main() {\n println!(\Hello\);\n}) }); Editor::new(editor).h(px(320.)).language(rust)指定语法高亮语言。应用需要启用对应的 Cargo feature例如tree-sitter-rust或tree-sitter-markdown启用tree-sitter-languages可一次包含全部内置语法见 component/Cargo.toml涵盖 astro、bash、c/cpp、go、html、javascript、kotlin、lua、markdown、python、rust、sql、typescript/tsx、yaml、zig 等三十余种。.line_number(true)开启行号 gutter.folding(true)开启代码折叠对应 Base 层的FoldRange数据。TabSize { tab_size, hard_tabs }hard_tabs: false时 Tab 插入tab_size个空格true时插入真正的制表符。.default_value(...)设置初始内容。Editor::new(editor)以实体引用构建元素.h(px(320.))设定高度——代码编辑器必须显式给定高度或由父布局约束因为其滚动区域需要确定性的尺寸。编辑器选项let editor cx.new(|cx| { EditorState::new(window, cx) .language(json) .line_number(true) .folding(true) .show_whitespaces(true) .default_value(source) });show_whitespaces(true)会渲染空格与制表符的可见指示适合配置对比、YAML 等对空白敏感的文件。EditorState上的 builder 方法如tab_size见 crates/base/src/input/editor/indent.rs均返回Self可链式组合语言与编辑器偏好分开存储——LanguageConfig是语言级规则EditorState上的选项是实例级偏好源码注释明确Editor preferences are stored separately on EditorState。快捷键与矩形列选以下默认快捷键在编辑器聚焦时生效。macOS 的 Option 对应 Alt 修饰键Linux 的这些操作不使用 Super/Win操作macOSLinuxWindows在上方下方添加光标CmdOption↑ / ↓AltShift↑ / ↓CtrlAlt↑ / ↓逐字符扩展所有选区Shift← / →Shift← / →Shift← / →按词扩展所有选区OptionShift← / →CtrlShift← / →CtrlShift← / →鼠标添加光标Option左键点击Alt左键点击Alt左键点击矩形列选OptionShift左键拖动AltShift左键拖动AltShift左键拖动只保留活动光标EscapeEscapeEscape平台补充说明Linux额外支持与 Ghostty 一致的CtrlAlt左键拖动列选以及AltShift← / →按词选择Windows额外支持AltShift← / →逐字符选择三个平台都兼容Alt/Option左键拖动列选单击添加光标继续拖动则以鼠标按下位置为起点建立新的矩形选区在编辑区按住 Alt/Option 时鼠标指针显示为带 Alt 的选择手势优先于Ctrl/Cmd点击跳转定义。交互细节来自文档与行为约定矩形选区按显示行生成每行一个选区短行截断到已有文本边界输入与删除同时作用于所有选区松开鼠标结束拖动Escape 只保留活动光标若上下文菜单已打开则先处理菜单的 Escape使用 ↑ / ↓ 添加光标是累加操作反向按键不会收缩矩形高度——因此这是多光标编辑与鼠标列选并非持续的 Vim Visual Block 模式键盘输入期间光标保持可见空闲 300ms 后恢复闪烁部分 Linux 桌面使用CtrlAlt↑ / ↓切换工作区可能在编辑器收到事件前拦截快捷键因此Linux 默认不绑定这一组合上表均为键盘重映射后的逻辑修饰键。搜索与替换编辑器内置搜索面板。聚焦时按Ctrl-FWindows/Linux或Cmd-FmacOS打开Enter跳到下一个匹配ShiftEnter跳到上一个Escape关闭面板。面板还提供大小写敏感切换、上一个/下一个、替换与全部替换按钮匹配计数以1/3形式显示见 search.rs 的SearchPanel其匹配器逻辑有完整的单元测试覆盖test_search、test_search_label。以代码方式控制// 以代码方式打开查找面板 editor.update(cx, |state, cx| { state.open_search(false, cx); }); // 关闭它 editor.update(cx, |state, cx| { state.close_search(cx); });Editor默认启用搜索。如需禁用editor.update(cx, |state, cx| { state.set_searchable(false, cx); });只读编辑器仍可搜索——替换界面会自动隐藏面板通过is_replaceable()判断并降级为纯查找。文本装饰let decorations editor.update(cx, |state, cx| { state.create_decorations_collection(initial_decorations, cx) });返回的TextDecorationCollection需要存在多久就保留多久文本修改后其 range 会自动跟随内容变化。底层实现在 crates/base/src/input/editor/decorations.rs适合实现行内诊断下划线、diff 高亮、断点标记等场景。值与事件let source editor.read(cx).value(); editor.update(cx, |state, cx| { state.set_value(new_source, window, cx); });读取当前内容用editor.read(cx).value()编程式替换内容用set_value不影响 readonly 限制见下EditorState会发出InputEvent::Change、Focus、Blur等事件可用于受控同步、脏标记或自动保存。字体与行高Editor 默认使用主题中的等宽字体——mono_font_family与mono_font_size行高为字号的1.5 倍源码常量EDITOR_LINE_HEIGHT 1.5见 editor.rs。这只是默认值在 Editor 上设置的文本样式会覆盖它gutter 与行高都跟随字号变化——测试the_rows_follow_the_font_size验证默认主题 mono 字号下行为px(20.)设置text_size(px(24.))后行高变为px(36.)px(40.)则对应px(60.)主题加载时会核对平台默认等宽字体Menlo、Consolas、DejaVu Sans Mono是否已安装缺失时换成已安装的等宽字体再不行退到.SystemUIFont你自己指定的字体族则原样使用不做回退。Editor::new(editor).text_sm() Editor::new(editor) .font_family(JetBrains Mono) .text_size(px(15.))这些是元素通用的Styledtrait 方法font_weight、line_height用法相同——在 editor.rs 中Editor实现了Styled且渲染时先应用主题默认值、再以用户样式 refine因此链式设置总能正确覆盖默认字体。外观与交互状态Editor::new(editor) .h(px(480.)) .bordered(true) .disabled(false) .readonly(false) .aria_label(Rust 源代码)readonly预览文件但不允许修改。与disabled不同只读编辑器保持正常外观仍然可以聚焦、选中、复制和搜索只是拒绝用户对内容的修改set_value等程序调用不受影响Editor::new(editor).readonly(true)disabled整体禁用不响应焦点与输入bordered是否绘制边框appearance控制主题外观aria_label为屏幕阅读器提供可访问性标签context_menu替换右键默认菜单闭包接收一个空菜单并返回要显示的完整菜单默认项不会自动添加——适合接入「跳转定义」「复制路径」等编辑操作。渲染细节editor.rsEditor 通过Input::from_state复用单行 Input 的渲染管线并显式设置.focus_bordered(false)——因此Editor 聚焦时不会应用单行 Input 的焦点边框效果gutter、当前行背景与滚动条作为同一个编辑器表面对齐绘制。前后缀、密码显示切换和清除按钮只属于单行 InputEditor 的工具栏和操作按钮应组合在组件外部。总结gpui-kit 的Editor是一个以 Base 输入引擎为内核、叠加语言规则的完整源代码编辑器LanguageConfig提供 Monaco 风格的声明式编辑规则结构括号、自动配对、缩进正则EditorState承载实例级选项与编程 API搜索、装饰、值读写Editor元素则负责外观、字体、无障碍与只读/禁用语义。启用对应tree-sitter-*feature 后即可获得 Tree-sitter 语法高亮与上下文感知的配对行为是构建 IDE 类 GPUI 应用的直接选择。更完整的交互细节可继续阅读 Input 组件文档 与 Textarea 组件文档。【免费下载链接】gpui-kitRust GUI components for building fantastic cross-platform desktop application by using GPUI.项目地址: https://gitcode.com/GitHub_Trending/gp/gpui-kit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门