当我在lisp文件中的空行上键入'repl'时,我想打开一个“sbcl”repl。
到目前为止,我已经有了这个键绑定,
[
{
"keys": ["r", "e", "p", "l"],
"command": "run_existing_window_command",
"args": {
"id": "repl_sbcl",
"file": "config/CommonLisp/Main.sublime-menu"
},
"context": [
{ "key": "selector", "operator": "equal", "operand": "source.lisp"},
]
}
]
它工作正常,除了它在我不希望它触发的情况下触发,即在代码中
(defun (bla) repl)
或在评论中
; repl
我只希望它在空行上触发,用{HERE}
表示(示例代码来自'实用的普通lisp'一书)
(defun dump-db ()
(progn
(format t "~%") ; print a newline, prettier in a repl
(dolist (cd *songs*)
(format t "~{~a:~10t~a~%~}~%" cd))))
{HERE}
(add-record
(make-cd "Butterflies (On Luci's Way) - Demo" "*Shels" 8 nil))
{HERE}
如何使用Sublime的context
?
编辑:尽管是那个问这个问题的人,但我发现这是一个非常糟糕的主意。使用"keys": ["r", "e", "p", "l"]
等绑定会破坏撤消历史记录。 Sublime的键绑定侦听器与历史记录之间的交互是,如果添加这样的句柄,您键入的每个字母都将添加到撤消历史记录 非常非常糟糕。 Ctrl-z成为键盘混搭。 :(
答案 0 :(得分:2)
只需添加一个上下文来检查该行上的前一个文本是否为空(或仅包含rep
或repl
,具体取决于您按下的键是否已添加到文档之前键绑定操作 - 我现在不在计算机上检查)和上下文检查该行上的以下文本是否为空:
{ "key": "preceding_text", "operator": "regex_match", "operand": "^$|^repl?$", "match_all": true },
{ "key": "following_text", "operator": "regex_match", "operand": "^$", "match_all": true },
您可以查看默认的键绑定,了解有关使用preceding_text
和following_text
上下文的更多示例。还有一些关于unofficial docs的详细信息。
要从多行注释中排除键绑定,您可以将选择器更改为source.lisp - comment
。
答案 1 :(得分:1)
根据https://stackoverflow.com/a/45875699/2302759的帮助,我想出了这个配置:
// opens an sbcl repl when you type 'repl' in a lisp context
{
"keys": ["r", "e", "p", "l"],
"command": "run_existing_window_command",
"args": {
"id": "repl_sbcl",
"file": "config/CommonLisp/Main.sublime-menu"
},
"context": [
{ "key": "following_text", "operator": "regex_match", "operand": "^$", "match_all": true },
{ "key": "selector", "operator": "equal", "operand": "source.lisp"},
{ "key": "preceding_text", "operator": "regex_match", "operand": "^[repl]*", "match_all": true }
]
}
第一个上下文匹配行尾,第二个上下文仅匹配.lisp文件,最后,第三个上下文匹配行之前没有任何内容,除了可能延迟的'repl'字符
配置现在完全匹配测试用例:)
(defun dump-db ()
(progn
(format t "~%") ; print a newline, prettier in a repl
(dolist (cd *songs*)
(format t "~{~a:~10t~a~%~}~%" cd))))
{HERE}
(add-record
(make-cd "Butterflies (On Luci's Way) - Demo" "*Shels" 8 nil))
{HERE}