1

我想在崇高的文本中创建一个快捷方式,它执行以下操作:

  • 如果 R 的 REPL 已打开,则将所选文本发送到此 REPL
  • 否则在新窗口中打开一个 R REPL 并将文本发送到这个 REPL。

我正在使用 R-box。这个包有一个使用命令 repl_send 的 python 类 RboxSendTextCommand

       external_id = self.view.scope_name(0).split(" ")[0].split(".", 1)[1] 
        self.view.window().run_command("repl_send", {"external_id": external_id, "text": cmd})
        return

当没有打开 REPL 时,这会引发错误“无法找到 `r` 的 REPL”。我试图修改它

        try:
            self.view.window().run_command("repl_send", {"external_id": external_id, "text": cmd})
        except:
            self.view.window().run_command("run_existing_window_command",{"id": "repl_r", "file": "config/R/Main.sublime-menu"})
            self.view.window().run_command("repl_send", {"external_id": external_id, "text": cmd})
            return
        else:
            self.view.window().run_command("repl_send", {"external_id": external_id, "text": cmd})
            return

但是,当没有打开 REPL R 窗口时会发生相同的错误。你知道怎么做吗?我并不特别需要通过 R-box 脚本来做到这一点。

4

1 回答 1

1

首先,从 SublimeREPL 源代码来看,如果没有 REPL R 运行,它只会打印一条错误消息。它不会抛出任何错误。所以try...except...不会在这里工作。

class ReplSend(sublime_plugin.TextCommand):
    def run(self, edit, external_id, text, with_auto_postfix=True):
        for rv in manager.find_repl(external_id):
            ...
        else:
            sublime.error_message("Cannot find REPL for '{}'".format(external_id))

我不知道是否有更好的方法来做到这一点。但是,您可以通过其视图名称检测 REPL R。

    if App == "SublimeREPL":
        external_id = self.view.scope_name(0).split(" ")[0].split(".", 1)[1]
        current_window = self.view.window()
        found = False
        repl_name = "*REPL* [%s]" % external_id
        for w in sublime.windows():
            for v in w.views():
                if v.name() == repl_name:
                    found = True
        if not found:
            current_window.run_command("run_existing_window_command",{"id": "repl_r", "file": "config/R/Main.sublime-menu"})
        current_window.run_command("repl_send", {"external_id": external_id, "text": cmd})
        return

在新窗口中打开 REPL:

    sublime.run_command("new_window")
    created_window = sublime.active_window()
    created_window.run_command("run_existing_window_command",{"id": "repl_r", "file": "config/R/Main.sublime-menu"})
于 2014-09-12T03:32:34.023 回答