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 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 []