[js] 代码块自动缩进及 ctrl+/ 添加注释

本贴最后更新于 239 天前,其中的信息可能已经斗转星移

最近在 runjs 里写代码,发现代码块不支持自动缩进和快捷键添加注释,很不方便。

于是,让 deepseek 帮忙写了个。

支持大多数常见语言,如果有未识别的语言,则与上一行的空白符位置对齐。

注释支持单行注释和多行注释,默认使用单行注释,多行注释需要在特定语言下配置。

r125.gif

代码

https://gitee.com/wish163/mysoft/blob/main/%E6%80%9D%E6%BA%90/%E6%80%9D%E6%BA%90%E4%BB%A3%E7%A0%81%E5%9D%97%E8%87%AA%E5%8A%A8%E7%BC%A9%E8%BF%9B%E5%92%8C%E6%B7%BB%E5%8A%A0%E6%B3%A8%E9%87%8A.js

自动缩进原理

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 总之,要用正确的答案不断迭代去问,比如,用测试无误的代码去问下一个问题或让修复有问题的部分或你想改进的点等。

打赏作者

  • 思源笔记

    思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。

    融合块、大纲和双向链接,重构你的思维。

    28442 引用 • 119752 回帖
  • 代码片段

    代码片段分为 CSS 与 JS 两种代码,添加在 [设置 - 外观 - 代码片段] 中,这些代码会在思源笔记加载时自动执行,用于改善笔记的样式或功能。

    用户在该标签下分享代码片段时需在帖子标题前添加 [css] [js] 用于区分代码片段类型。

    285 引用 • 1983 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • wilsons

    看来大家都不在代码块中写代码,看来一个好的需求必须经过调查才行。trollface

    @EmberSky 写这个代码的时候我就隐隐的感觉你会喜欢,不知道为什么,没想到果然如此。trollface

    2 回复
  • 因为担心 JS 会引入未知的问题,所以我选择手动按 Tab huaji

    1 回复
    我都是先用,有 bug 再说
    HugZephyr
  • HugZephyr 1 评论

    那必须,因为我是后台嘛

    其实好早之前就有这个需求了,只是一直不知道怎么搞

    哈哈,我也是,所以我就让 deepseek 帮忙写了
    wilsons
  • wilsons 1 1 评论

    这个 js 很稳定,因为原理很简单,仅仅获取上一行的的空白符,大不了获取不到,不缩进嘛,然后再根据不同的语言去增加可能的空白符,比如 if{后面要比 if 前面的空白符多 4 个等,以形成嵌套,大不了规则匹配不到就不增加空白符嘛。

    除此之外,没有多余的操作,除了读取数据,就是插入空白符,且并没有拦截回车的默认行为,因此即使 js 失效或出错,都不会引起异常,所以一般不会引起意外问题,建议尝试下,相对于输入效率,意外的概率基本可以忽略了。

    至少我从开发完成的那一刻起,就没有发现过 bug,不是发布后,是代码写完后没有发现过 bug,即连测试过程都没有测试出 bug。以往其他代码,总会在测试的时候发现 bug,然后修复,但这个从写完代码开始,一个 bug 没发现,足见其稳定性。

    大概实现过程如下,我首先给 deepseekd dom 结构及我的代码框架,留下没实现的部分,然后 deepseek 补充完善,刚开始几轮交互 deepseek 给的结果效果不理想,不是 bug,是没达到预期,然后我修改后,把正确的给它,让它实现之前错误的部分,提出期望的结果是什么,大概一一两轮就改好。然后接下来发现涉及到全文本结点扫描,我让他优化,它给出缓存优化方案,这个方案是有问题的,因为每次输入代码文本结构会变化,实际上缓存无法被命中,于是我提出向上查找换行符方案,然后它就改好了。然后我把修改好的代码再次让它检查是否有问题及改进点,它提了几条,我采纳了一两条。然后整合后,代码测试正常,没有发现问题,我又浏览了一遍代码整体结构(具体实现细节,比如字符截取过程等没看,只看了大的方向),然后用调试工具,把整个代码流程跟踪了一遍,认为可能出问题的点也跟踪了下,没有发现异常,然后后续的使用过程中也没有发现 bug,可以说从代码写好的那一刻就没发现 bug,哈哈,deepseek 还是很牛的。

    由于文字太长,就不写到评论里了。

    1 回复
    有意思,有空试试
    JeffreyChen
  • wilsons 2

    @EmberSky @siyuan100861186 @JeffreyChen

    已更新至 0.0.5

    0.0.3 及之后版本支持添加注释了!

    ctrl/meta + / 即可添加/取消注释

    妥妥的一个小型 IDE 了 👏

    再配合这个 [js] 代码块优化之折叠 / 展开 / 预览 / 全屏 / 悬浮横向滚动条

    或配合这个 请问思源有没有办法单独调整每个页面的 "显示字号" 和 "页面宽度",要单独调整不影响其它页面 - wilsons 的回帖

    完美!

    1 回复
    4 操作
    wilsons 在 2025-04-29 18:20:47 更新了该回帖
    wilsons 在 2025-04-29 17:42:47 更新了该回帖
    wilsons 在 2025-04-29 16:35:31 更新了该回帖
    wilsons 在 2025-04-29 16:32:58 更新了该回帖
  • 不是,为什么会这么复杂??

    不要看表面,核心估计就一两百行,全是注释和配置啥的,有些不同算法只是注释了也没删除。 我算了下,语言配置400多行,再去掉注释,也就300来行,大多还是辅助函数,核心算法就更少了。
    wilsons
  • siyuan100861186 1

    今晚就试试

  • wilsons

    0.0.6 新增 Shift+Backspace 删除一个单位的空白符

  • 起始/末尾插入块(我的快捷键是 Ctrl+Enter)之后,缩进的空格会被带到新块:

    1 回复
  • wilsons 1

    已做了兼容处理,这个不是代码逻辑的问题,这个是组合键按键的影响。

    增加了这个判断

    if (event.key === 'Enter' && !event.ctrlKey && !event.metaKey && !event.shiftKey && !event.altKey) {
        .......
    }
    
  • simuliya 1

    使用未定义规则的语言不会走默认的规则,需要在 455 行改成

    const rules = langRules[lang]?.comment || langRules._default.comment; 
    
    1 回复
  • wilsons

    感谢!已修复!

  • ruhe

    如果更新{}大括号补全就好了,补全之后鼠标在//的位置,就跟编程软件中一样

    {
        //
    }
    
    1 回复
  • wilsons

    可以让 ai 试试,ai 擅长小修小补

    1 回复
  • ruhe

    好的

请输入回帖内容 ...
wilsons
正式入驻知乎了,以后新贴主要在这里。 欢迎大家订阅关注! 你的关注对我是莫大鼓励,也能让我持续产出优质内容,我们一起成长 🙏 点这里立即关注:https://www.zhihu.com/people/wilsonses

推荐标签 标签

  • 音乐

    你听到信仰的声音了么?

    63 引用 • 513 回帖 • 1 关注
  • OpenShift

    红帽提供的 PaaS 云,支持多种编程语言,为开发人员提供了更为灵活的框架、存储选择。

    14 引用 • 20 回帖 • 687 关注
  • PHP

    PHP(Hypertext Preprocessor)是一种开源脚本语言。语法吸收了 C 语言、 Java 和 Perl 的特点,主要适用于 Web 开发领域,据说是世界上最好的编程语言。

    167 引用 • 408 回帖 • 494 关注
  • Spark

    Spark 是 UC Berkeley AMP lab 所开源的类 Hadoop MapReduce 的通用并行框架。Spark 拥有 Hadoop MapReduce 所具有的优点;但不同于 MapReduce 的是 Job 中间输出结果可以保存在内存中,从而不再需要读写 HDFS,因此 Spark 能更好地适用于数据挖掘与机器学习等需要迭代的 MapReduce 的算法。

    74 引用 • 46 回帖 • 563 关注
  • 运维

    互联网运维工作,以服务为中心,以稳定、安全、高效为三个基本点,确保公司的互联网业务能够 7×24 小时为用户提供高质量的服务。

    151 引用 • 257 回帖 • 1 关注
  • OneDrive
    2 引用 • 2 关注
  • 机器学习

    机器学习(Machine Learning)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。

    78 引用 • 37 回帖
  • Facebook

    Facebook 是一个联系朋友的社交工具。大家可以通过它和朋友、同事、同学以及周围的人保持互动交流,分享无限上传的图片,发布链接和视频,更可以增进对朋友的了解。

    4 引用 • 15 回帖 • 445 关注
  • 笔记

    好记性不如烂笔头。

    315 引用 • 790 回帖
  • 思源笔记

    思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。

    融合块、大纲和双向链接,重构你的思维。

    28442 引用 • 119750 回帖
  • Python

    Python 是一种面向对象、直译式电脑编程语言,具有近二十年的发展历史,成熟且稳定。它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用缩进来定义语句块。

    561 引用 • 677 回帖 • 1 关注
  • 服务

    提供一个服务绝不仅仅是简单的把硬件和软件累加在一起,它包括了服务的可靠性、服务的标准化、以及对服务的监控、维护、技术支持等。

    41 引用 • 24 回帖 • 2 关注
  • 996
    13 引用 • 200 回帖 • 6 关注
  • SendCloud

    SendCloud 由搜狐武汉研发中心孵化的项目,是致力于为开发者提供高质量的触发邮件服务的云端邮件发送平台,为开发者提供便利的 API 接口来调用服务,让邮件准确迅速到达用户收件箱并获得强大的追踪数据。

    2 引用 • 8 回帖 • 544 关注
  • LaTeX

    LaTeX(音译“拉泰赫”)是一种基于 ΤΕΧ 的排版系统,由美国计算机学家莱斯利·兰伯特(Leslie Lamport)在 20 世纪 80 年代初期开发,利用这种格式,即使使用者没有排版和程序设计的知识也可以充分发挥由 TeX 所提供的强大功能,能在几天,甚至几小时内生成很多具有书籍质量的印刷品。对于生成复杂表格和数学公式,这一点表现得尤为突出。因此它非常适用于生成高印刷质量的科技和数学类文档。

    14 引用 • 84 回帖 • 1 关注
  • Docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的操作系统上。容器完全使用沙箱机制,几乎没有性能开销,可以很容易地在机器和数据中心中运行。

    498 引用 • 934 回帖
  • 尊园地产

    昆明尊园房地产经纪有限公司,即:Kunming Zunyuan Property Agency Company Limited(简称“尊园地产”)于 2007 年 6 月开始筹备,2007 年 8 月 18 日正式成立,注册资本 200 万元,公司性质为股份经纪有限公司,主营业务为:代租、代售、代办产权过户、办理银行按揭、担保、抵押、评估等。

    1 引用 • 22 回帖 • 838 关注
  • SOHO

    为成为自由职业者在家办公而努力吧!

    7 引用 • 55 回帖 • 1 关注
  • MySQL

    MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是最流行的关系型数据库管理系统之一。

    695 引用 • 538 回帖
  • V2Ray
    1 引用 • 15 回帖 • 5 关注
  • Ant-Design

    Ant Design 是服务于企业级产品的设计体系,基于确定和自然的设计价值观上的模块化解决方案,让设计者和开发者专注于更好的用户体验。

    17 引用 • 23 回帖 • 12 关注
  • 微软

    微软是一家美国跨国科技公司,也是世界 PC 软件开发的先导,由比尔·盖茨与保罗·艾伦创办于 1975 年,公司总部设立在华盛顿州的雷德蒙德(Redmond,邻近西雅图)。以研发、制造、授权和提供广泛的电脑软件服务业务为主。

    8 引用 • 44 回帖 • 2 关注
  • Quicker

    Quicker 您的指尖工具箱!操作更少,收获更多!

    39 引用 • 170 回帖
  • 外包

    有空闲时间是接外包好呢还是学习好呢?

    26 引用 • 234 回帖 • 3 关注
  • Kafka

    Kafka 是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)是现代系统中许多功能的基础。 这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。

    36 引用 • 35 回帖
  • TensorFlow

    TensorFlow 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor)。

    20 引用 • 19 回帖 • 1 关注
  • DNSPod

    DNSPod 建立于 2006 年 3 月份,是一款免费智能 DNS 产品。 DNSPod 可以为同时有电信、网通、教育网服务器的网站提供智能的解析,让电信用户访问电信的服务器,网通的用户访问网通的服务器,教育网的用户访问教育网的服务器,达到互联互通的效果。

    6 引用 • 26 回帖 • 548 关注