Example #1
0
        def update_result(result, varnames=None):
            if not sel0.empty(): return
            if result is None: result = 'None'
            sel_line = view.line(sel0)
            line = view.substr(sel_line)
            if sel0.empty():
                varnames = get_assigned_vars(line)
            else:
                varnames = None

            # to_underscore = lambda m: u'"{0}"'.format(u'_'*len(m.group(1)))
            # line_x = re.sub(ur'"(.*)"', to_underscore, line)
            # line_x = re.sub(ur"'(.*)'", to_underscore, line_x)
            # if u'#' in line_x:
            #     i = line_x.rfind(u'#')
            #     line = line[:i].rstrip()
            line = strip_line_comment(line)
            if not varnames:
                append = u'  # -> ' + result
            else:
                varnames = u', '.join(varnames)
                append = u'  # {0} -> {1}'.format(varnames, result)
            
            # selection points
            line += append
            a = sel_line.begin() + len(line)
            b = a - len(append)

            e = view.begin_edit()
            view.replace(e, view.line(sel0), line)
            set_selection(view, sublime.Region(a,b))
            view.end_edit(e)
Example #2
0
    def run(self, edit):
        view = self.view
        sel = view.sel()

        sel0 = sel[0]
        if view.substr(sel0).strip().startswith(u'#'):
            sel0 = sublime.Region(sel0.begin(), sel0.begin())
        if sel0.empty():
            block = view.line(sel[0])
            the_line = view.substr(block)
            # stripping preceding spaces
            strip_count = len(the_line) - len(the_line.lstrip())
            block = sublime.Region(block.begin()+strip_count, block.end())
        elif '\n' in view.substr(sel0):
            # multiline selection
            block = view.line(sel[0])
        else:
            block = sel0
        code = view.substr(block)
        code = clear_code(code)

        # result should be a unicode string
        def update_result(result, varnames=None):
            if not sel0.empty(): return
            if result is None: result = 'None'
            sel_line = view.line(sel0)
            line = view.substr(sel_line)
            if sel0.empty():
                varnames = get_assigned_vars(line)
            else:
                varnames = None

            # to_underscore = lambda m: u'"{0}"'.format(u'_'*len(m.group(1)))
            # line_x = re.sub(ur'"(.*)"', to_underscore, line)
            # line_x = re.sub(ur"'(.*)'", to_underscore, line_x)
            # if u'#' in line_x:
            #     i = line_x.rfind(u'#')
            #     line = line[:i].rstrip()
            line = strip_line_comment(line)
            if not varnames:
                append = u'  # -> ' + result
            else:
                varnames = u', '.join(varnames)
                append = u'  # {0} -> {1}'.format(varnames, result)
            
            # selection points
            line += append
            a = sel_line.begin() + len(line)
            b = a - len(append)

            e = view.begin_edit()
            view.replace(e, view.line(sel0), line)
            set_selection(view, sublime.Region(a,b))
            view.end_edit(e)

        def eval_code():
            try:
                result = proxy.execute(code)
            except RemoteError:
                row_offset = view.rowcol(block.begin())[0]
                handle_remote_error(proxy, view, row_offset)
                return
            if sel0.empty():
                if not code.startswith((
                    'from ','import ',
                    '%'    # ipython magic commands
                )):
                    update_result(result)
            elif '\n' not in code:
                # selection on single line, we replace it evaled
                edit = view.begin_edit()
                view.replace(edit, sel0, result)
                view.end_edit(edit)
                a = sel0.begin()
                b = a + len(result)
                sel.clear()
                sel.add(sublime.Region(a,b))
            else:
                pass # do nothing on multiline selection

        def question_code():
            try:
                result = proxy.question(code)
            except RemoteError:
                handle_remote_error(proxy)
                return
            window = view.window()
            panel = window.get_output_panel('ipython_object_info')
            window.run_command(
                "show_panel", {"panel": "output.ipython_object_info"}
            )
            window.focus_view(panel)
            set_view_text(panel, result)
            panel.settings().set("syntax", "Packages/IPython/ipython_output.tmLanguage")
            panel.show(panel.size(), False) # scroll to bottom

            def foo():
                view.show_at_center(view.sel()[0].begin())
            sublime.set_timeout(foo, 10)


        if code.endswith(u'?') or code.startswith(u'?'):
            set_selection(view, block)
            sublime.set_timeout(question_code, 10)
        else:
            flash_select(view, block, callback=eval_code)

        return []