gpt4 book ai didi

racket - Racket 中的基本代码编辑器功能

转载 作者:行者123 更新时间:2023-12-02 08:28:35 28 4
gpt4 key购买 nike

我正在为现场编码表演创建一个程序,为此我需要一个基本的 S 表达式代码编辑器(我输入的内容将在适当的语法上下文中评估为 Racket 代码)。

由于 DrRacket 本身是用 Racket 编写的,因此我预计重新创建其代码编辑器的文本编辑功能将相当轻松,并且会被记录下来,但我没有找到任何指导。到目前为止我有以下代码:

(define frame (new frame% [label "Simple Edit"]
[width 800]
[height 800]))
(define canvas (new editor-canvas% [parent frame]))
(define text (new text%))
(send canvas set-editor text)
(send frame show #t)

(define menu-bar (new menu-bar% [parent frame]))
(define edit-menu (new menu% [label "Edit"] [parent menu-bar]))
(define execution-menu (new menu% [label "Execution"] [parent menu-bar]))
(new menu-item% [label "Run"]
[parent execution-menu]
[callback (λ (mi e) (update (send text get-text)))]
[shortcut #\R]
[shortcut-prefix '(cmd)])
(append-editor-operation-menu-items edit-menu #f)

(define delta (make-object style-delta% 'change-size 14))
(send delta set-face "Menlo")
(send text change-style delta)

这样我就可以将字体及其大小设置为合适的,并且可以进行复制和粘贴操作等。但有很多意想不到的行为,例如:

  • 按修饰符+字母组合键仍会插入该字母,而不是忽略它。
  • 按 alt+left 或 cmd+left(Mac 用户)会将插入符号移动单个字符(而不是单词)或移动到页边距。
  • 双击不会选择单词。

我不想重新发明轮子,所以我努力用谷歌搜索但无济于事,尝试查看 DrRacket 源代码(对于我对语言的理解仍然有限来说太复杂了)等等。似乎是关于使用 GUI 工具包本身的一个很好的解释(这不仅仅是引用),而且我上面粘贴的内容让我进行了大量的反复试验,所以我不期待实现所有这些基本的文本编辑工作都是手动完成的。

如果有人有一个项目源代码来举例说明如何完成此任务,一些解决了该问题的包,或者一些可以让我走上正轨的指针,我将不胜感激!

最佳答案

DrRacket 大量使用 framework 库,它是构建在 racket/gui 之上的更高级别的 GUI 组件工具包。 。支持语法高亮的编辑器组件接口(interface)为 color:text<%> ,它支持相当先进的、完全可定制的语法突出显示,基于您提供给 start-colorer 的任意词法分析函数。方法。 color:text<%>接口(interface)本身基于 text:basic<%> 之上,也来自framework并实现您描述的一些非着色相关的编辑行为。

color:text<%>是一个接口(interface),不能直接使用,但是framework还提供 color:text% ,一个可以像任何其他组件一样创建和操作的具体实现。如果您需要更多灵 active ,还有 color:text-mixin ,允许添加 color:text<%>任意文本编辑器类的功能。 text:basic<%> 存在相似之处形式为 text:basic% text:basic-mixin .

framework的源代码是 the gui-lib package, available on GitHub here 的一部分。您还可以在 DrRacket 中浏览源代码,而无需克隆任何内容 - 只需右键单击模块名称并选择 Open main.rkt 或类似选项,或使用 File → Open Require Path。 .. 菜单选项并输入已安装模块的路径以打开其源代码。

更好地了解如何使用 color:text<%> 的语法着色功能,查看 syntax-color/default-lexer 也可能有用。对于实现所需协议(protocol)的非常简单的词法分析器或 syntax-color/racket-lexer DrRacket 实际使用的更复杂的词法分析器来突出显示 Racket 代码。

最后,还值得注意的是,所有这些实际上都可以通过使用 #lang 在 DrRacket 本身内进行自定义机制,如此定制#lang实际上可以提供自己的词法分析器,DrRacket 将使用它。这显然需要最少的重新发明轮子,但听起来您想完全实现自己的编辑器,在这种情况下使用 framework 中的组件将是您最好的选择。

关于racket - Racket 中的基本代码编辑器功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37583997/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com