如何在空行上下文中运行sublime-text命令?

时间:2017-08-24 18:50:28

标签: regex sublimetext3

当我在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成为键盘混搭。 :(

2 个答案:

答案 0 :(得分:2)

只需添加一个上下文来检查该行上的前一个文本是否为空(或仅包含reprepl,具体取决于您按下的键是否已添加到文档之前键绑定操作 - 我现在不在计算机上检查)和上下文检查该行上的以下文本是否为空:

{ "key": "preceding_text", "operator": "regex_match", "operand": "^$|^repl?$", "match_all": true },
{ "key": "following_text", "operator": "regex_match", "operand": "^$", "match_all": true },

您可以查看默认的键绑定,了解有关使用preceding_textfollowing_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}