Install Asset
Install via Godot
To maintain one source of truth, Godot Asset Library is just a mirror of the old asset library so you can download directly on Godot via the integrated asset library browser
Quick Information
A Godot editor plugin that enables developers to create custom shortcuts for inserting frequently-used text snippets.
GODOT插件:快捷键插入文本
插件名字:Godot Shortcut Text
版本:1.0.0
支持godot版本:4.6以上 4.x(兼容版)
插件介绍:
这是一个Godot插件,能让开发者实现自定义快捷键来插入自己想要的文本。虽然编辑器可以根据开发者输入的前几个字母来提示开发者可能想输入的单词,但对于一些特殊的文本,比如: #region #endregion 编辑器却没有做到单词提示,这降低了开发效率,并且这款插件可以自定义更加长的文本而不仅限于一个单词。 该插件由本人开发,目前还是测试版,有部分漏洞,后续我会持续更新。
目录
-1. 安装教程
-2. 详细使用方法
--2.1 single key 与 multiple key
--2.2 Normal模式(默认模式)
--2.3 Repeat模式(重复模式)
--2.4 Embrace模式(包围模式)
--2.5 snippet代码块
-3. 漏洞以及警告
--3.1 非.gd文件不支持
--3.2 关于多键触发的快捷键冲突
--3.3 关于单键触发的快捷键冲突
--3.4 转义字符
-4. 联系方式
1. 安装教程
此插件安装过程与Godot其他插件的安装过程相同,如果你已经会安装并使用Godot插件,则可以跳过这一章。
(1)在下载地址中下载插件版本的压缩包并解压。
(2)在你的项目文件中新建一个名为addons的文件夹,并把解压后的文件拖入addons文件夹中。
(3)打开你的游戏项目,在编辑器左上角中选择:项目 -> 项目设置 -> 插件,插件名会显示在列表中,启动插件。
(4)编辑器下方出现一栏名为“Godot Shortcut Text”的面板,则插件启动成功。
2. 详细使用方法
2.1 single key 与 multiple key
首先开发者可以选择快捷键是单键触发还是多键触发。
注意,单键触发的意思是只有一个触发键(A-Z,0-9),但是依然可以添加任意数量的修饰键(Ctrl Alt Shift mac的Ctrl用 command代替),而多键触发是可以选择任意数量的触发键。
这里我建议用单键触发,因为多键触发的底层实现逻辑与单键触发的不一样,多键触发更容易被快捷键冲突影响(见3.2 关于多键触发的快捷键冲突),虽然单键触发也会有快捷键冲突,但影响比较小,所以建议用单键触发。
2.2 Normal模式(默认模式)
默认模式,在插件面板中新建一个自定义快捷键,在Insert_Text中输入你想插入的文本,支持大部分转义字符(见3.4 转义字符),但我建议你用{n}代替\n(原因见见3.4 转义字符),插件会自动把{n}替换成\n并在Key文本框中输入你想要的快捷键,按下回车键后会自动检测Key文本框并选择第一个支持的触发键(a-z A-Z 0-9),然后你可以选择任意数量的修饰键,并启用自定义快捷键。
在代码文本中按下快捷键即可自动插入先前自定义的文本。
2.3 Repeat模式(重复模式)
"@onready var "想必是一个很常用的文本,但是如果在普通模式中插入,我们会发现我们还要在每次插入后亲自换行才能在下一行插入新的"@onready var ",这对我们来说太麻烦了,而Repeat模式刚好能帮我们解决这个问题。
Repeat模式与普通模式不同的是,它会在插入前检测输入光标所在行是否以自定义文本相同,如果相同,则Repeat模式会先自动换行,再插入自定义文本。并且,如果输入光标所在行以制表符tab开头,Repeat也会自动帮你在新行插入相同数量的制表符tab
2.4 Embrace模式(包围模式)
Embace模式是一个特殊的模式,为了方便理解,我先举个例子:
想想当你正在敲代码,已经敲完一整段单词的时候,你发现你忘记给这个单词叫括号[]了,这时你可以选中这个单词然后敲下[键,编辑器会自动帮你给单词加括号而不必重新输入一遍。
Embrace模式就类似于上述功能,你可以选择一段文本,并且在文本两端插入自定义字符,选中的文本用{s}代替。
在举个例子,#region #endregion用来在godot中注释代码块,如果我们想实现为选中的代码块两边分别插入#region #endregion,你可以选择Embrace模式并在自定义文本框中输入: #region{nt}{s}{nt}#endregion,此处{s}就是选中文本的位置。同时Embrace模式也具备Repeat模式的自动添加制表符tab功能,你只要输入{t},就能插入输入光标所在行的前置制表符tab相同数量的制表符,你也可以用{nt},{nt}是先换行,再插入制表符。
2.5 snippet代码块
在插件面板上方有个snippet manager选项卡,这是自定义代码块,自定义代码块和前面的功能区别是用户可以在插件文件夹下的Custom_Text.json文件中自定义自己想要的代码块,此处有示例,你可以在文件中配置你的自定义插入文本、触发键(同单键触发,选取字符串中第一个可识别的按键),和是否启用其他三个修饰键,插入模式(0为Normal模式,1为Repeat模式,2为Embrace模式),以及是否启用。
启用后,即可在插件面板Snippet_Manager选项卡中按下Reset_InputAction按钮来将你的自定义代码块与动作映射绑定。
snippet代码块的实现逻辑与单键触发相同,不同的是snippet能更好地支持多行文本以及转义字符,snippet支持任何转义字符。(不受3.4 转义字符的限制)
3. 漏洞以及警告
3.1 非.gd文件不支持
由于插件通过 EditorInterface.get_script_editor().get_current_script() 来获取当前的脚本页面,但是该方法无法获取非脚本文件,意思是该插件只对.gd文件有效,如果你想用该插件在godot内置编辑器中修改类似.txt(或者 .json)文件,那么抱歉,目前插件无法提供这类功能,后续更新将会尝试实现在不同文件上依然能使用。
3.2 关于多键触发的快捷键冲突
3.2.1 触发原理
与单键触发不同,单键触发的底层逻辑是给快捷键注册动作映射,以在godot编辑器内使用,而多键触发是依赖 _input(event: InputEvent)的event.is_pressed() 判断是否触发,具体实现逻辑是:
1.判断是否按下触发键中的某个键
2.遍历所有设置的触发键,如果所有触发键都被按下(通过event.is_pressed()判断),则触发快捷键。
3.2.2 快捷键优先级
这种做法有一个问题,就是godot引擎本身是自带了一些快捷键的,比如 Ctrl + R 为查找功能,如果你的快捷键设置为 Ctrl + R + (其他触发键) 或者 Ctrl + Alt + R + (其他触发键),那么godot都会优先识别出Ctrl + R,并把你的快捷键视为Ctrl + R的变种,导致自定义快捷键被godot引擎快捷键给拦截而无法触发。
类似的godot快捷键拦截非常普遍,导致大多数自定义快捷键都被占用了,不过自定义快捷键与godot引擎快捷键的优先级是混乱的,比如之前提到 Ctrl + R + (其他触发键) 或者 Ctrl + Alt + R + (其他触发键)的优先级低于godot引擎的查找功能,但是如果你设置 Ctrl + Alt + Shift + R + (其他触发键) 就可以正常触发,这是因为 Ctrl + Shift + R 默认绑定的是另一个功能——“在文件中替换”(script_text_editor/replace_in_files),而这个功能的优先级低于多键触发的优先级,所以不会被抢跑
3.2.3 快捷键拦截
同时插件的多键触发和单键触发都设置了 get_viewport().set_input_as_handled() ,这会阻止快捷键继续传播,比如 Ctrl + S 是godot引擎快捷键中的保存,如果你设置了 Ctrl + S 的自定义快捷键,那么保存功能的快捷键将会被插件快捷键拦截,这样你就不能使用快捷键保存功能了。
3.3 关于单键触发的快捷键冲突
3.3.1 触发原理
由于单键触发是依赖动作映射实现的,动作映射的优先级比大部分godot引擎快捷键高,所以能更好地处理快捷键冲突。
3.3.2 快捷键冲突警告
同时为了防止开发者设置冲突的快捷键,当开发者设置与godot引擎快捷键冲突的自定义快捷键时,Godot Shortcut Text将会在编辑器输出面板中打印错误信息提示你快捷键冲突,不过这并不会影响自定义快捷键的使用,你可以选择在Godot Shortcut Text插件面板中关闭快捷键冲突警告。(兼容版不支持快捷键冲突警告,因为4.6以前的版本不支持获取godot快捷键列表)
3.3.3 单键触发的动作映射
由于单键触发依赖动作映射,所以单键触发快捷键的优先级依赖于godot引擎授予动作映射的优先级,但是依然有小部分godot内置快捷键以及系统快捷键的优先级大于插件快捷键的优先级(例如 Ctrl + Q 退出编辑器),这是无法避免的。
如果在重启项目或者重启插件时发现自定义快捷键没有效果,这可能是因为插件未能正确注册动作映射,在插件面板中有一个 Reset InputAction 的按钮,可以尝试重新注册动作映射。
由于单键触发会注册动作映射,所以有极小的概率会与你的项目的动作映射有冲突,单键触发动作映射的注册名为 "Godot_Shortcut_Text_InputMapAction" + str(Short_cut_index) ,不过大部分情况不会出现动作映射冲突的问题因为自定义快捷键动作映射的注册名以"Godot_Shortcut_Text_InputMapAction"作为前缀,当然你也可以在插件面板中看到单键触发的动作映射注册名
---3.3.4 快捷键拦截
同时插件的多键触发和单键触发都设置了 get_viewport().set_input_as_handled() ,这会阻止快捷键继续传播,比如 Ctrl + S 是godot引擎快捷键中的保存,如果你设置了 Ctrl + S 的自定义快捷键,那么保存功能的快捷键将会被插件快捷键拦截,这样你就不能使用快捷键保存功能了。
3.4 转义字符
该插件支持的转义字符如下:
"\n", # 换行
"\t", # 制表符
"\r", # 回车
"\\", # 反斜杠本身
"\"", # 双引号
"\'", # 单引号
"\a", # 响铃
"\b", # 退格
"\f", # 换页
"\v" # 垂直制表符
但是由于插件有存档系统,意思是如果你在自定义文本中输入"\n"当你重启插件或者重启项目的时候,插件会从插件的.json文件中读取"\n"并错误显示在自定义文本中,这样你会发现自定义文本中的"\n"不见了,注意这里换行符并没有消失,只是无法正确显示因为LineEdit把"\n"识别为换行而无法正确显示,不过你可以用{n}代替,插件会自动把{n}转义为换行符,例如:
#region\n 建议你替换为
#region{n}
4. 联系方式
作者邮箱: [email protected]
作者QQ:3046671548
A Godot editor plugin that enables developers to create custom shortcuts for inserting frequently-used text snippets.
Reviews
Quick Information
A Godot editor plugin that enables developers to create custom shortcuts for inserting frequently-used text snippets.