如果没有REPL运行并发送到REPL,则启动REPL的快捷方式

时间:2014-09-10 21:42:52

标签: python sublimetext sublime-text-plugin sublimerepl

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

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

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

       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

这会抛出错误"找不到`r`"的REPL没有打开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脚本来做到这一点。

1 个答案:

答案 0 :(得分: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"})