多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

Godot 官方文档 CodeEdit 类详解:从括号补全到代码补全的编辑器控件完全指南

Godot 官方文档 CodeEdit 类详解:从括号补全到代码补全的编辑器控件完全指南 文档教程游戏开发【免费下载链接】godot-docsGodot Engine official documentation项目地址https://gitcode.com/GitHub_Trending/go/godot-docs点击查看免费下载导读CodeEdit 是 Godot 引擎本仓库 godot-docs 为 Godot Engine 官方文档提供的一个专门用于编辑纯文本代码的多行文本编辑控件。它继承了 TextEdit 的全部文本编辑能力并额外内置了行号、行折叠、代码补全、缩进管理、字符串/注释定界符、书签/断点/执行行标记等一系列代码编辑器特性是构建脚本编辑器、自定义 IDE 或任何面向代码输入界面的核心基础控件。阅读本文后你将掌握 CodeEdit 的完整属性、方法、信号与主题定制接口并能直接基于这些 API 搭建一个具备代码补全、符号跳转与断点标记能力的自定义代码编辑器。CodeEdit 是什么继承体系与定位根据 classes/class_codeedit.rst 的类声明CodeEdit 的完整继承链为CodeEdit TextEdit Control CanvasItem Node Object它本质上是 TextEdit 的专用化子类。TextEdit 的定位是多行文本编辑器它也有有限度的代码编辑设施例如语法高亮支持如需更高级的代码编辑功能请参见 CodeEdit见 TextEdit 类描述。而 CodeEdit 则进一步提供了代码编辑器中常见的大量特性行号、行折叠、代码补全、缩进管理以及字符串/注释管理。有两个需要特别注意的基础约定文字方向无论系统 locale 如何CodeEdit 默认始终使用从左到右LTR的文本方向来正确展示源代码。零基索引作为 TextEdit 的子类行号和列号均以零为基准与数组索引一致。例如第一行文本通过get_line(0)获取第二行通过get_line(1)获取。在 Godot 引擎自身架构中CodeEdit 也是脚本编辑器的底层载体。这一点可以从仓库内的 ScriptEditorBase 类文档 得到印证其get_base_editor()方法返回用于编辑脚本的底层 Control对于文本脚本而言就是一个 CodeEdit。同时 GDScriptSyntaxHighlighter 类文档 也明确指出该语法高亮器可用于 TextEdit 和 CodeEdit 节点——这意味着你可以为 CodeEdit 挂载语法高亮实现完整的源码着色体验。基础编辑能力行号与缩进管理行号显示CodeEdit 可以通过一组gutters_*属性控制行号栏gutter的显示属性类型默认值说明gutters_draw_line_numbersboolfalse是否绘制行号栏。行号从1开始逐行递增在行号栏上点击并拖动可整行选中文本gutters_line_numbers_min_digitsint3为行号栏预留的最小宽度按字符数计gutters_zero_pad_line_numbersboolfalse是否基于总行数对行号进行零填充如001、002…前提是gutters_draw_line_numbers为true对应的 setter/getter 为set_draw_line_numbers()/is_draw_line_numbers_enabled()、set_line_numbers_min_digits()/get_line_numbers_min_digits()、set_line_numbers_zero_padded()/is_line_numbers_zero_padded()。缩进配置属性类型默认值说明indent_sizeint4一次缩进一次 Tab 键按下对应的字符数若indent_use_spaces开启则为空格数量indent_use_spacesboolfalse使用空格代替制表符进行缩进indent_automaticboolfalse新行插入时若发现indent_automatic_prefixes中的前缀自动多缩进一级若发现括号对的起始键匹配的闭合括号会被移动到新的行indent_automatic_prefixesArray[String][:, {, [, (]触发自动缩进的前缀集合缩进相关的操作方法与输入动作直接挂钩do_indent()无选区时在光标处插入缩进有选区时按indent_lines()方式缩进选中行等价于ProjectSettings.input/ui_text_indent动作所用缩进字符取决于indent_use_spaces与indent_sizeindent_lines()缩进所有被选中或光标所在的行unindent_lines()反向操作等价于ProjectSettings.input/ui_text_dedent动作convert_indent(from_line -1, to_line -1)将from_line到to_line之间的缩进统一转换为indent_use_spaces指定的形式制表符或空格参数传-1表示转换全文。配合自动缩进与括号补全见下文CodeEdit 可以复刻现代 IDE 中回车后自动缩进、花括号自动换行的输入体验。自动括号补全与匹配高亮CodeEdit 内置了自动括号补全系统由以下属性驱动属性类型默认值说明auto_brace_completion_enabledboolfalse为true时输入或自动补全插入起始括号后自动插入对应的闭合括号在起始括号上按退格键时自动删除闭合括号auto_brace_completion_highlight_matchingboolfalse为true时光标位于任一侧括号上即高亮配对括号匹配时加下划线不匹配时用brace_mismatch_color着色auto_brace_completion_pairsDictionary{ \: \, : , (: ), [: ], {: } }括号对字典键为起始符号、值为匹配的闭合符号auto_brace_completion_pairs的默认值覆盖了常见的引号与括号场景双引号、单引号、圆括号、方括号、花括号。由于字典中的括号实际上是符号字符串你可以按语言需求定制任意配对例如为模板语法注册与的配对add_auto_brace_completion_pair(!--, --)等。配套的方法包括add_auto_brace_completion_pair(start_key, end_key)新增一对括号起始键和结束键都必须是符号且只有起始键要求唯一get_auto_brace_completion_close_key(open_key)获取指定起始键的闭合键has_auto_brace_completion_open_key(open_key)/has_auto_brace_completion_close_key(close_key)分别判断起始键 / 闭合键是否存在。行折叠与代码区域行折叠开关line_folding属性bool默认false控制是否允许折叠行。若为falsefold_line()等折叠方法将不起作用且can_fold_line()恒返回false。折叠判定规则由can_fold_line(line)定义当某一行满足以下任一条件时即为可折叠它是合法代码区域见下文代码区域的起始行它是注释块或字符串块的起始行它的下一个非空行拥有更大的缩进依据 TextEdit 的get_indent_level()。折叠操作 API 一览方法说明fold_line(line)折叠指定行若可折叠unfold_line(line)展开指定行或展开当前被折叠行隐藏住的行fold_all_lines()折叠所有可折叠的行unfold_all_lines()展开所有已折叠的行toggle_foldable_line(line)切换指定行代码块的折叠状态toggle_foldable_lines_at_carets()切换所有光标所在行的代码块折叠状态is_line_folded(line)判断指定行是否已折叠get_folded_lines()返回所有当前已折叠的行号数组代码区域Code Region代码区域是 CodeEdit 特有的代码组织方式它是一段代码折叠时会被高亮标记用于辅助组织长脚本。其核心机制是用注释定界符 起始/结束标签圈定区域默认标签为region/endregion配合行注释定界符后形如#region与#endregion。#region 初始化逻辑 var health : 100 var max_health : 100 #endregion相关方法create_code_region()用当前选区创建代码区域。前提是至少定义一个单行注释定界符见下文add_comment_delimiter()set_code_region_tags(start region, end endregion)自定义区域起始/结束标签不含注释定界符get_code_region_start_tag()/get_code_region_end_tag()获取当前起始/结束标签is_line_code_region_start(line)/is_line_code_region_end(line)判断指定行是否为区域起点/终点。折叠栏fold gutter负责呈现区域折叠状态gutters_draw_fold_gutter属性bool默认false开启后每个可折叠行绘制can_fold_code_region图标每个已折叠行绘制folded_code_region图标点击图标即可切换折叠toggle_foldable_line()。注意line_folding必须为true图标才会显示。字符串与注释定界符管理CodeEdit 能够识别哪些文本处于字符串或注释区域中这依赖**定界符delimiter**机制。两个数组属性管理全局配置属性类型默认值说明delimiter_stringsArray[String][ , \ \]字符串定界符数组赋值会清空所有既有字符串定界符delimiter_commentsArray[String][]注释定界符数组赋值会清空所有既有注释定界符注意默认的字符串定界符写法 与\ \是起始键 空格 结束键的编码形式表示从到、从到。在运行时可通过以下方法动态管理定界符add_string_delimiter(start_key, end_key, line_only false)定义从start_key到end_key的字符串定界符。两个键都应为符号start_key不能与其他定界符共享。若line_only为true或end_key为空字符串则该区域不会延续到下一行add_comment_delimiter(start_key, end_key, line_only false)同上用于注释定界符remove_string_delimiter(start_key)/remove_comment_delimiter(start_key)移除指定定界符clear_string_delimiters()/clear_comment_delimiters()清空全部定界符has_string_delimiter(start_key)/has_comment_delimiter(start_key)判断是否存在某定界符get_delimiter_start_key(index)/get_delimiter_end_key(index)按索引获取区域起始/结束键。查询接口是定界符机制的实战核心is_in_string(line, column -1)若line的column处于字符串中返回该字符串区域的定界符索引不传column时若整行都是字符串则返回索引否则返回-1is_in_comment(line, column -1)同上用于注释区域判定get_delimiter_start_position(line, column)/get_delimiter_end_position(line, column)若给定行列位于字符串或注释内返回该区域的起始/结束位置Vector2x 为行、y 为列若不在或找不到对应端点两个值均为-1。这一组 API 让你能够精确判断光标是否在字符串里从而在实现自动补全、括号匹配或语法着色时避免误判。代码补全系统从候选队列到弹出菜单代码补全是 CodeEdit 最强大的特性。它由属性、虚拟方法、信号与方法构成一个完整的闭环。开关与触发属性类型默认值说明code_completion_enabledboolfalse为true时ProjectSettings.input/ui_text_completion_query输入动作会请求代码补全code_completion_prefixesArray[String][]设置触发代码补全的前缀如.、(等当用户触发补全请求时引擎会调用可覆写的虚拟方法_request_code_completion(force)若被覆写则不会发送code_completion_requested信号否则发送code_completion_requested信号供外部处理。候选选项与弹出补全候选由以下方法驱动add_code_completion_option(type, display_text, insert_text, text_color Color(1,1,1,1), icon null, value null, location 1024)向候选队列提交一个条目。type为CodeCompletionKind枚举见下文display_text是菜单上显示的文字insert_text是选中后插入的文本location表示该选项相对补全查询位置的来源层级参考CodeCompletionLocation枚举。注意该列表会替换所有现有候选update_code_completion_options(force)提交所有通过add_code_completion_option()添加的候选若force为true则强制弹出补全菜单。同样会替换所有现有候选request_code_completion(force false)触发code_completion_requested信号force为true时绕过所有检查否则要求光标位于单词中或前缀之后若当前所有选项都是文件路径、节点路径或信号类型则会忽略本次请求confirm_code_completion(replace false)将选中条目插入文本replace为true时替换而非合并现有文本cancel_code_completion()取消补全菜单set_code_completion_selected_index(index)/get_code_completion_selected_index()设置/获取当前选中选项的索引get_code_completion_options()/get_code_completion_option(index)获取全部选项或指定选项。每个选项是包含以下键值对的 DictionarykindCodeCompletionKind、display_text菜单显示文本、insert_text选中后插入的文本、font_color菜单文字颜色、icon菜单图标、default_value符号的值set_code_hint(code_hint)/set_code_hint_draw_below(draw_below)设置光标处的代码提示文本传空字符串清除并控制提示绘制在主光标下方还是上方get_text_for_code_completion()返回在光标处插入字符0xFFFF的完整文本供补全实现分析上下文。# 典型的补全提供流程在 code_completion_requested 信号中填充候选 func _on_code_completion_requested() - void: clear_code_completion_options() # 可选清空旧候选 add_code_completion_option( CodeEdit.CodeCompletionKind.KIND_FUNCTION, my_function(), my_function(), Color(0.6, 0.9, 1.0) ) update_code_completion_options(false)注示例方法clear_code_completion_options对应引擎实际实现中的清空接口具体以引擎 API 为准。两个可覆写的虚拟方法_filter_code_completion_candidates(candidates)覆写后决定candidates中哪些条目应被展示。入参与返回值均为Dictionary数组内容参见get_code_completion_option()_confirm_code_completion(replace)覆写后自定义选中条目的插入逻辑replace为true时替换既有文本。CodeCompletionKind 枚举补全类型常量值含义KIND_CLASS0类KIND_FUNCTION1函数KIND_SIGNAL2Godot 信号KIND_VARIABLE3变量KIND_MEMBER4成员KIND_ENUM5枚举项KIND_CONSTANT6常量KIND_NODE_PATH7Godot 节点路径KIND_FILE_PATH8文件路径KIND_PLAIN_TEXT9未分类文本KIND_KEYWORD10关键字CodeCompletionLocation 枚举选项来源常量值含义LOCATION_LOCAL0选项与补全查询位置处于同一局部作用域例如局部变量LOCATION_PARENT_MASK256选项来自包含当前查询位置的类或其父类与类深度0本地类、1父类、2祖父类……做按位或来记录深度LOCATION_OTHER_USER_CODE512选项来自非局部、非派生类的用户代码例如 Autoload 单例LOCATION_OTHER1024选项来自其他引擎代码例如内置类这也是add_code_completion_option()中location参数的默认值location参数并非始终存在。仓库内的 Godot 4.1 升级指南 记录了该 API 的演进CodeEdit的add_code_completion_option方法在 4.1 版本新增了可选的location参数对应引擎 PR GH-75746GDScript 完全兼容C# 二进制兼容性需借助兼容层。这意味着基于旧版本编写的补全代码仍可编译运行但新代码建议显式传入location以获得更准确的候选排序。符号查找与悬停提示CodeEdit 提供了一套符号symbol级别的交互机制用于实现按住点击跳转定义悬停显示文档等 IDE 功能。它依赖以下属性与信号属性类型默认值说明symbol_lookup_on_clickboolfalse为true时经symbol_validate验证过的单词被点击后触发symbol_lookup信号symbol_tooltip_on_hoverboolfalse为true时鼠标悬停于单词上会触发symbol_hovered信号典型交互链路如下用户悬停某个符号引擎发出symbol_validate(symbol)信号前提symbol_lookup_on_click为true外部代码校验该符号是否可查找并调用set_symbol_lookup_word_as_valid(valid)回执结果若校验有效且用户点击该词引擎发出symbol_lookup(symbol, line, column)若开启了symbol_tooltip_on_hover悬停延迟达到ProjectSettings.gui/timers/tooltip_delay_sec秒后发出symbol_hovered(symbol, line, column)与Control.mouse_entered不同它不会立即触发。func _on_symbol_validate(symbol: String) - void: # 自定义校验逻辑例如判断 symbol 是否存在于符号表中 set_symbol_lookup_word_as_valid(_symbol_table.has(symbol)) func _on_symbol_lookup(symbol: String, line: int, column: int) - void: # 跳转到符号定义位置 pass配套的文本取用方法get_text_for_symbol_lookup()返回在光标处插入字符0xFFFF的完整文本get_text_with_cursor_char(line, column)返回在指定行列处插入字符0xFFFF的完整文本set_symbol_lookup_word_as_valid(valid)设置symbol_validate信号所发出的符号是否为有效查找目标。书签、断点与执行行标记CodeEdit 为调试器与代码导航场景提供了三种行级标记全部由 gutter 呈现属性类型默认值说明gutters_draw_bookmarksboolfalse书签栏与断点、执行行共享同一栏位gutters_draw_breakpoints_gutterboolfalse断点栏点击该栏位会切换该行的断点状态与书签、执行行共享栏位gutters_draw_executing_linesboolfalse执行行标记栏与书签、断点共享栏位对应的状态读写方法书签set_line_as_bookmarked(line, bookmarked)、is_line_bookmarked(line)、get_bookmarked_lines()、clear_bookmarked_lines()断点set_line_as_breakpoint(line, breakpointed)、is_line_breakpointed(line)、get_breakpointed_lines()、clear_breakpointed_lines()执行行set_line_as_executing(line, executing)、is_line_executing(line)、get_executing_lines()、clear_executing_lines()。set_line_as_breakpoint()等 setter 在标记置真且对应 gutter 开启时会在栏位中绘制对应主题图标bookmark、breakpoint、executing_line。这些 API 正是调试器在脚本编辑器中断点可视化与当前执行行高亮的实现基础。此外行删除会影响标记breakpoint_toggled(line)信号在断点被添加或移除时发出若某行通过退格键被删除会在旧行号上发出该信号。行级快捷操作删除、复制、合并与移动CodeEdit 内置了大量针对行的编辑操作便于复刻现代编辑器的快捷键行为方法说明delete_lines()删除所有被选中或光标所在的行duplicate_lines()复制所有包含任意光标、且被选中的行无论光标在行内何处都会将整行复制到当前行下方duplicate_selection()复制所有选中的文本并复制所有光标所在的行join_lines(line_ending )将所有选中的行或光标所在行与其下一行合并中间的空白会被移除若下一行有内容则用line_ending连接move_lines_up()/move_lines_down()将选中或光标所在的行整体上移 / 下移信号一览信号参数触发时机breakpoint_toggledline: int某行断点被添加或移除时若行因退格被删除在旧行号上发出code_completion_requested—用户请求代码补全时若覆写了_request_code_completion()或code_completion_enabled为false则不发出symbol_hoveredsymbol: String, line: int, column: int光标在符号上停留达到ProjectSettings.gui/timers/tooltip_delay_sec秒后需symbol_tooltip_on_hover为truesymbol_lookupsymbol: String, line: int, column: int用户点击了有效符号时symbol_validatesymbol: String用户悬停于符号上应校验并调用set_symbol_lookup_word_as_valid()响应需symbol_lookup_on_click为true外观定制主题属性CodeEdit 提供丰富的主题项可完全自定义编辑器观感。颜色Color主题项默认值用途bookmark_colorColor(0.5, 0.64, 1, 0.8)书签行书签图标的颜色brace_mismatch_colorColor(1, 0.2, 0.2, 1)不匹配括号的着色breakpoint_colorColor(0.9, 0.29, 0.3, 1)断点图标的颜色code_folding_colorColor(0.8, 0.8, 0.8, 0.8)所有行折叠相关图标的颜色completion_background_colorColor(0.17, 0.16, 0.2, 1)代码补全弹窗的背景色completion_existing_colorColor(0.87, 0.87, 0.87, 0.13)补全选项中匹配文本的背景高亮色completion_scroll_colorColor(1, 1, 1, 0.29)补全弹窗滚动条颜色completion_scroll_hovered_colorColor(1, 1, 1, 0.4)滚动条悬停时颜色completion_selected_colorColor(0.26, 0.26, 0.27, 1)补全弹窗当前选中项的背景高亮色executing_line_colorColor(0.98, 0.89, 0.27, 1)执行行图标的颜色folded_code_region_colorColor(0.68, 0.46, 0.77, 0.2)已折叠代码区域的背景行高亮色line_length_guideline_colorColor(0.3, 0.5, 0.8, 0.1)主行长指导线颜色次级指导线自动应用 50% 透明度line_number_colorColor(0.67, 0.67, 0.67, 0.4)行号颜色常量int主题项默认值用途completion_lines7补全弹窗同时最多显示的选项数completion_max_width50补全选项的最大宽度超出部分被截断completion_scroll_width6补全弹窗滚动条宽度图标与样式图标Texture2Dbookmark、breakpoint、can_fold可折叠行图标、can_fold_code_region可折叠代码区域图标、completion_color_bg补全中颜色预览框的背景面板用于半透明颜色显示、executing_line、folded已折叠且可展开图标、folded_code_region已折叠代码区域图标、folded_eol_icon折叠行行尾图标样式盒StyleBoxcompletion用于代码补全弹窗的边框与背景绘制。行长指导线line_length_guidelines属性Array[int]默认[]在指定列绘制垂直参考线用于代码规范约束如 80/100 列限制。第一个条目被视为主要硬指导线绘制得更醒目次级指导线使用 50% 透明度的line_length_guideline_color。实战组合搭建一个最小化的代码编辑界面综合以上 API可以在 Godot 中通过场景树或脚本快速搭建一个具备核心编辑器能力的 CodeEdit。以下示例展示了属性组合与信号接线extends Control onready var code_edit: CodeEdit $CodeEdit func _ready() - void: # 基础编辑体验 code_edit.gutters_draw_line_numbers true code_edit.gutters_line_numbers_min_digits 4 code_edit.indent_size 4 code_edit.indent_use_spaces true code_edit.indent_automatic true code_edit.line_folding true code_edit.gutters_draw_fold_gutter true # 代码补全 code_edit.code_completion_enabled true code_edit.code_completion_prefixes [.] code_edit.code_completion_requested.connect(_on_code_completion_requested) # 括号补全与匹配高亮 code_edit.auto_brace_completion_enabled true code_edit.auto_brace_completion_highlight_matching true # 注释 / 字符串定界符以 GDScript 为例 code_edit.add_comment_delimiter(#, , true) # 单行注释 code_edit.add_string_delimiter(\, \, false) code_edit.add_string_delimiter(, , false) # 断点栏供调试集成 code_edit.gutters_draw_breakpoints_gutter true code_edit.breakpoint_toggled.connect(_on_breakpoint_toggled) func _on_code_completion_requested() - void: add_code_completion_option( CodeEdit.CodeCompletionKind.KIND_KEYWORD, extends, extends ) update_code_completion_options(false) func _on_breakpoint_toggled(line: int) - void: print(断点切换于行, line)运行这段脚本即可获得带行号的编辑区、自动缩进、括号自动补全与匹配高亮、#注释识别、可点击切换的断点栏以及按需弹出的代码补全菜单。如需语法着色可将 GDScriptSyntaxHighlighter 或自定义的SyntaxHighlighter资源挂载到 CodeEdit 上从而把文本编辑器升级为真正的源码编辑器。小结CodeEdit 把现代代码编辑器的高频能力浓缩为一个开箱即用的 Godot 控件行号与缩进管理、自动括号补全与匹配高亮、行折叠与代码区域、字符串/注释定界符识别、完整的代码补全闭环候选队列 → 过滤 → 确认插入、符号查找与悬停提示以及面向调试的书签/断点/执行行标记。其 API 设计以可覆写的虚拟方法 信号双通道开放既能通过code_completion_requested、symbol_validate等信号与外部逻辑解耦也可直接继承 CodeEdit 覆写_request_code_completion()等钩子深度定制。无论是为游戏内嵌一个脚本输入框、制作教学工具还是构建自定义编辑器CodeEdit 都是最直接的技术底座。如需继续深挖可对照阅读基类 TextEdit 文档掌握全部底层文本编辑能力、ScriptEditorBase 文档了解引擎脚本编辑器如何复用 CodeEdit以及 Godot 4.1 升级指南了解补全 API 的版本演进。赞分享文档教程游戏开发【免费下载链接】godot-docsGodot Engine official documentation项目地址https://gitcode.com/GitHub_Trending/go/godot-docs点击查看免费下载相关推荐AvalonEdit代码编辑器中的智能代码补全功能详解AvalonEdit代码编辑器中的智能代码补全功能详解 引言 AvalonEdit作为一款强大的WPF文本编辑器组件内置了智能代码补全功能。这项功能通过下拉窗UI库/组件开发工具Zed 代码补全机制详解LSP 符号补全与 AI 编辑预测的双通道配置与实现Zed 代码补全机制详解LSP 符号补全与 AI 编辑预测的双通道配置与实现 本文基于 Zed 官方文档 completions.md https://lin开发工具代码编辑器桌面应用Feathr特征注册表如何实现企业级特征管理与共享Feathr特征注册表如何实现企业级特征管理与共享 Feathr特征注册表是企业级特征存储平台的核心组件为数据科学家和工程师提供统一的特征管理、共享与协作能上一篇bili2text终极指南三分钟将B站视频变文字稿的免费神器下一篇ContextMenuManager革命性Windows右键菜单智能管理方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表