最近在 runjs 里写代码,发现代码块不支持自动缩进和快捷键添加注释,很不方便。
于是,让 deepseek 帮忙写了个。
支持大多数常见语言,如果有未识别的语言,则与上一行的空白符位置对齐。
注释支持单行注释和多行注释,默认使用单行注释,多行注释需要在特定语言下配置。
代码
自动缩进原理
1 首先获取上一行的缩进空白符,然后再根据不同语言的特点,在不同关键词下增加不同的缩进
2 上一行的缩进空白符是保底缩进,如果是无法识别的语言,就默认与上一行缩进对齐了
3 如果是已知语言的已知关键词,则根据 langRules 配置里的规则,调用 action 进行计算最终缩进
使用说明
把上面的代码放到思源 js 代码片段中即可。
如果你有自定义语言的需求,可通过 langRules 配置你自己的语言规则。
比如
const langRules = {
// JavaScript/TypeScript
javascript: {
pattern: /([{([]|=>|\b(if|for|while|switch|function|class)\b.*\))\s*$/i,
action: (base) => addIndent(base),
comment: {
prefix: '// ', // 单行注释
suffix: '',
isWrap: false
},
},
...
}
1 正则表示不同关键词结尾的前面应该加什么样的缩进,具体缩进数由 action 函数决定。
2 action 默认调用 addIndent 添加缩进,默认是上一行的缩进 + 空格或 tab(这个由思源 tab 空格数设置决定的)。
3 当然也可以在 action 里自行处理,base 参数就是上一行的缩进空白符。
4 comment 是注释配置,如果单行配置只需要配置 prefix 即可,如果多行注释,还需要配置 suffix,isWrap 的意思是多行注释下,如果 true,则只会在选中文本前后添加注释标记,如果 false,则每行都添加注释。
常见问题
1 默认使用空格还是 Tab 缩进?支持 2 个空格还是 4 个空格?
1)默认缩进是你上一行的空白符,即你上一行是什么就是什么
2)当特定语言缩进时,缩进空白符由你的思源配置决定的,即设置-> 编辑器->Tab 空格数(当 0 时是 tab,大于 0 则是指定的空格数)
2 支持手机版吗?
支持(但注释不支持,因为手机版无法按快捷键)
3 性能如何?
没有性能瓶颈问题,因为获取上一行空白符的算法是从当前光标开始向上遍历,直到出现换行符为止,通常只需要遍历几个结点就找到上一个换行符了
4 未支持的语言会怎样?
未支持的语言,则会与上一行的开始位置对齐
注释,则默认是 //
5 新的语言,不知道怎么配置正则该怎么办?
把代码放到 ai 里,让 ai 帮忙写,推荐 deepseek-r1
6 这个代码的稳定性如何?
非常稳定,详情请参考 [js] 代码块自动缩进及 ctrl+/ 添加注释 - wilsons 的回帖
7 注释是单行注释?还是多行注释?
注释支持单行注释和多行注释,默认使用单行注释,多行注释需要在特定语言下配置。
但要注意,如果配置 isWrap: true,可能会存在注释嵌套问题,没有按行注释兼容性好。
8 与其他软件添加的注释兼容吗?
兼容
9 注释的后面可以不添加空格吗?
可以,只需要在你的语言配置下面去掉 prefix 前的空格和 suffix 后的空格即可
10 其他注意事项
注意,添加注释时,最好选中整行或非空白符的开始处,如果选中行的一半,则从一半处注释,下次也最好选择一半取消注释(即同上次选择一致),否则可能非预期结果。
另外,不要选择空白符的中间开始注释,因为取消注释时,会计算注释标记后面或结束符的前面的空白符数,如果不足思源 tabSpace 整数倍,则会删除这多余的空白符,这是为了兼容其他软件的注释而做出的牺牲,而在空白符中间选择,很可能破坏空白符的结构。
AI 使用心得
deepseek-r1 不愧是世界第一的推理模型,解决问题的能力超强。
但目前的 ai 就像一个纯纯的武林高手,武力值很高,但理解力不足。
你需要不停的引导并告诉它思路,才能不断修正,从而给出满意的答复。
1 问题不要太宽泛,要具体,除非你要的思路,而不是具体解决问题的办法。
2 不要不停的问问题,而自己不去测试,不去理解,不然问着问着,你的代码就会从可运行,到不可运行,到逐渐凌乱。
3 分解问题,当 ai 的答复不是你想要的答案时,要自己测试并理解后,分析出哪些是正确的,哪些不正确,找出不正确的部分,尝试让 ai 去修复,当修复不理想时要给出自己的思路及可能的解决办法。(有时,你无论怎样调整问法或给出改进意见,ai 都无法完成,这时要考虑自行调试修正有问题的点后,再让 ai 处理其他问题。)
4 关键时要用新对话,比如,当 ai 的回复逐渐凌乱或不理想时。
5 给出全代码或关键代码,并说明你期望结果及存在问题。
6 总之,要用正确的答案不断迭代去问,比如,用测试无误的代码去问下一个问题或让修复有问题的部分或你想改进的点等。
打赏作者
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于