制作一个sublime text 3宏来评估一行,然后将光标移动到下一行

时间:2017-06-15 23:05:29

标签: json r macros sublimetext3 sublimerepl

我心爱的gedit R pluginno longer maintained,我上次使用的强制downgrade solution突然停止工作,我上次更新了ubuntu。写作已经有一段时间了,我正在探索崇高的文本。我已经安装了REPL来将代码发送到命令行,我试图设置像他们习惯的键绑定。

特别是,我试图让CTRL + SHIFT + R向控制台发送一行代码,运行它,然后将编辑器中的光标向下移动到下一行。这样我可以多次按CTRL + SHIFT + R来逐行运行脚本。 (这类似于Rstudio&CTRL + Enter的行为)

谷歌搜索,我发现了这个(旧的)solution。它不起作用,可能是因为它是为崇高的文本2而写的。更多的谷歌搜索,我想出了如何让它几乎工作:

//This is a macro for evaluate and move down
[
 {"command": "repl_transfer_current", "args": {"scope": "lines"}}
// {"command": "move", "args": {"mode": "lines", "amount": 1}}
]

以下是我添加到默认键盘映射的内容:

{ "keys": ["ctrl+shift+r"], "command": "run_macro_file", "args": {"file": "Packages/User/geditlike_lineeval.sublime-macro"}}

如上所述,sublime文本将我的代码行发送到终端并运行它。第二行应该向下发送光标,但它不起作用,当我取消注释时宏就失败了。

我似乎无法找到有关崇高文本命令的大量文档。 move'-----------------ISFSASHR------FSHAQADFAG' 中我能找到的最好的[1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 10, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 17, 18, 18, 18, 18] 。我的语法错了吗?我怎样才能做到这一点?

BONUS:如何让sublime文本运行该行,然后跳到下一个非空非注释行。这似乎更难 - 我看到许多键绑定涉及正则表达式等。

修改 我的问题是我错过了JSON行之间的逗号。如果在行之间添加逗号,则在该github页面上链接的代码可以正常工作。

1 个答案:

答案 0 :(得分:3)

您要链接到的解决方案应该在Sublime 2和3中工作(假设提供repl_transfer_current命令的插件适用于两者),但由于宏不正确,因此无法正常工作格式化。

  

[编辑]   Sublime本身提供的move命令不会接受宏正在使用的参数。据推测,如果这对你有用,那么某些包装也会提供这些东西。如果是这样,您可能需要相应调整下面的示例代码。   [/编辑]

目前的问题是,Sublime中的几乎(但不是全部)配置文件都是JSON格式(略微放宽以允许注释),上面列出的宏代码和链接的解决方案不是有效的JSON,因为它中的第一个和第二个命令没有用逗号分隔。

以下内容应该有效:

[
   {"command": "repl_transfer_current", "args": {"scope": "lines"}},
   {"command": "move", "args": {"mode": "lines", "amount": 1}}
]

我认为您上面链接的Sublime文档适用于Sublime 2.一个很好的资源是Unofficial Documentation,它还包含list of commands(以及许多其他好东西)。< / p>

为了做这样的事情并让它继续向下移动,直到它到达第一个非空白的非评论行,你需要一个简单的插件

具体来说,它必须向下移动光标(使用现有的move命令),然后检查当前行以查看它是空白还是注释,如果是,则再次移动。然后,您可以使用该命令代替宏中的move命令。

对于奖励分数,这里是一个插件的例子,它做了类似的事情。它比它需要的更冗长,以便它更有启发性,并且可能需要额外的调整(R不是我使用/知道的语言之一),但它应该让你开始。

有关其工作原理的更多信息,您可以查看API Reference以查看可在插件中使用的所有内部命令。

要使用此功能,请从菜单中选择Tools > Developer > New Plugin...,然后用此处显示的插件代码替换显示的全部存根代码,并使用.py扩展名保存(名称不重要) :

import sublime
import sublime_plugin
import re

# A regex that matches a line that's blank or contains a comment.
# Adjust as needed
_r_blank = re.compile("^\s*(#.*)?$")

class RAdvanceNextCommand(sublime_plugin.TextCommand):
    def run(self, edit):
        # Get the count of lines in the buffer so we know when to stop
        last_line = self.line_at(self.view.size())

        while True:
            # Move to the next line
            self.view.run_command("move", {"by": "lines", "forward": True})

            # Get the current cursor position in the file
            caret = self.view.sel()[0].begin()

            # Get the new current line number
            cur_line = self.line_at(caret)

            # Get the contents of the current line
            content = self.view.substr(self.view.line(caret))

            # If the current line is the last line, or the contents of
            # the current line does not match the regex, break out now.
            if cur_line == last_line or not _r_blank.match(content):
                break

        # Jump to the start of the line
        self.view.run_command("move_to", {"to": "bol"})

    # Convert a 0 based offset into the file into a 0 based line in
    # the file.
    def line_at(self, point):
        return self.view.rowcol(point)[0]

这实现了一个名为r_advance_next的新命令,它将光标向下移动通过文件,跳过完全空白行或包含行注释的行(假设我的正则表达式符合要求)。

有了这个,你的宏看起来像这样:

[
    {"command": "repl_transfer_current", "args": {"scope": "lines"}},
    {"command": "r_advance_next"}
]

此外,您还可以使用以下键绑定。因为你使用 Control + Enter 提到了RStudio,这就是我在这里使用的。此绑定应用了一个上下文,以便它仅在当前文件是R文件时应用,以便在不合适时不会触发。

{ "keys": ["ctrl+enter"], "command": "run_macro_file",
  "args": {"file": "Packages/User/geditlike_lineeval.sublime-macro"},
  "context": [
    { "key": "selector", "operator": "equal", "operand": "source.r"}
  ]
}

对于 BONUS 奖励标记,您可以直接在此处显示的插件命令中运行repl_transfer_current命令,在这种情况下,您根本不需要使用宏你可以直接将密钥绑定到插件中的命令。在这种情况下,您可能希望以不同的方式命名该类(例如RTransferAndAdvanceCommand或某些此类),以便命令名称更有意义。