【发布时间】:2016-10-01 17:26:33
【问题描述】:
我正在创建一个用于实时编码性能的程序,我想要一个基本的 S 表达式代码编辑器(我输入的内容将是 evaled 在适当的句法上下文中作为球拍代码)。
由于 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 插件文档 (docs.racket-lang.org/tools/index.html)?我自己没有读过,但它似乎可以教drracket的细节。此外,该页面还建议您检查框架 (docs.racket-lang.org/framework/index.html) - 它建立在您开始使用的球拍/gui 库之上。
-
不幸的是,我不知道使用 Racket gui 框架的“记事本”克隆。然而,这个例子比 DrRacket 短,所以看看源代码并询问是否有什么不合理的地方(注意:我已经有几年没有测试过了)。 github.com/soegaard/bracket/blob/master/gui/racket-cas.rkt#L411
-
@MattPeerson 谢谢,
framework确实是一个很棒的提示! -
@soegaard 谢谢,如果我决定进一步定制,我可能会使用你的代码作为参考。
标签: racket code-editor