def run(self, edit): view = self.view if gs.is_go_source_view(view): if not gstest.handle_action(view, 'left-click'): view.run_command('gs_doc', {"mode": "goto"}) elif view.score_selector(gs.sel(view).begin(), "text.9o") > 0: view.window().run_command("gs9o_open_selection")
def run(self, edit, set_status=False): view = self.view def f(cl, err): def f2(cl, err): c = {} if len(cl) == 1: c = cl[0] if set_status: if c: s = '%s: %s' % (c['name'], c['type']) view.set_status(HINT_KEY, s) else: view.erase_status(HINT_KEY) else: if c: s = '%s %s\n%s' % (c['name'], c['class'], c['type']) else: s = '// %s' % (err or 'No calltips found') gs.show_output(HINT_KEY, s, print_output=False, syntax_file='GsDoc') sublime.set_timeout(lambda: f2(cl, err), 0) fn = view.file_name() src = gs.view_src(view) pos = gs.sel(view).begin() mg9.calltip(fn, src, pos, set_status, f)
def run(self, edit, set_status=False): view = self.view def f(cl, err): def f2(cl, err): c = {} if len(cl) == 1: c = cl[0] if set_status: if c: pfx = "func(" typ = c["type"] if typ.startswith(pfx): s = "func %s(%s" % (c["name"], typ[len(pfx) :]) else: s = "%s: %s" % (c["name"], typ) view.set_status(HINT_KEY, s) else: view.erase_status(HINT_KEY) else: if c: s = "%s %s\n%s" % (c["name"], c["class"], c["type"]) else: s = "// %s" % (err or "No calltips found") gs.show_output(HINT_KEY, s, print_output=False, syntax_file="GsDoc") sublime.set_timeout(lambda: f2(cl, err), 0) fn = view.file_name() src = gs.view_src(view) pos = gs.sel(view).begin() mg9.calltip(fn, src, pos, set_status, f)
def run(self, edit, after=True): insln = lambda: self.view.insert(edit, gs.sel(self.view).begin(), "\n") if after: self.view.run_command("move_to", {"to": "hardeol"}) insln() else: self.view.run_command("move_to", {"to": "hardbol"}) insln() self.view.run_command("move", {"by": "lines", "forward": False})
def on_query_completions(self, view, prefix, locations): pos = gs.sel(view).begin() if view.score_selector(pos, 'text.9o') == 0: return [] cl = set() hkey = _hkey(view.settings().get('9o.wd', '')) cl.update((k, k + ' ') for k in gs.dval(gs.aso().get(hkey), [])) cl.update((k, k + ' ') for k in aliases()) cl.update((k, k + ' ') for k in builtins()) cl.update(DEFAULT_CL) return ([cl_esc(e) for e in sorted(cl)], AC_OPTS)
def on_query_completions(self, view, prefix, locations): pos = gs.sel(view).begin() if view.score_selector(pos, 'text.9o') == 0: return [] cl = set() hkey = _hkey(view.settings().get('9o.wd', '')) cl.update((k, k+' ') for k in gs.dval(gs.aso().get(hkey), [])) cl.update((k, k+' ') for k in aliases()) cl.update((k, k+' ') for k in builtins()) cl.update(DEFAULT_CL) return ([cl_esc(e) for e in sorted(cl)], AC_OPTS)
def on_query_completions(self, view, prefix, locations): pos = gs.sel(view).begin() if view.score_selector(pos, 'text.9o') == 0: return [] cl = [] hkey = '9o.hist.%s' % view.settings().get('9o.wd', '') for i, cmd in enumerate(reversed(gs.dval(gs.aso().get(hkey), []))): if not cmd in cl: cl.append(('^%d %s' % (i + 1, cmd), cmd + ' ')) cl.extend(DEFAULT_CL) return (cl, AC_OPTS)
def on_query_completions(self, view, prefix, locations): pos = gs.sel(view).begin() if view.score_selector(pos, 'text.9o') == 0: return [] cl = [] hkey = '9o.hist.%s' % view.settings().get('9o.wd', '') for i, cmd in enumerate(reversed(gs.dval(gs.aso().get(hkey), []))): if not cmd in cl: cl.append(('^%d %s' % (i+1, cmd), cmd+' ')) cl.extend(DEFAULT_CL) return (cl, AC_OPTS)
def run(self, _, mode=''): view = self.view if (not gs.is_go_source_view(view)) or (mode not in ['goto', 'hint']): return pt = gs.sel(view).begin() src = view.substr(sublime.Region(0, view.size())) pt = len(src[:pt].encode("utf-8")) def f(docs, err): doc = '' if err: self.show_output('// Error: %s' % err) elif docs: if mode == "goto": fn = '' flags = 0 if len(docs) > 0: d = docs[0] fn = d.get('fn', '') row = d.get('row', 0) col = d.get('col', 0) if fn: gs.println('opening %s:%s:%s' % (fn, row, col)) vu.open(fn=fn, row=row, col=col) return self.show_output("%s: cannot find definition" % DOMAIN) elif mode == "hint": s = [] for d in docs: name = d.get('name', '') if name: kind = d.get('kind', '') pkg = d.get('pkg', '') if pkg: name = '%s.%s' % (pkg, name) src = d.get('src', '') if src: src = '\n//\n%s' % src doc = '// %s %s%s' % (name, kind, src) s.append(doc) doc = '\n\n\n'.join(s).strip() self.show_output(doc or "// %s: no docs found" % DOMAIN) mg9.doc(view.file_name(), src, pt, f)
def highlight(fr): sel = gs.sel(fr.view).begin() row, _ = fr.view.rowcol(sel) if fr.state == 1: fr.state = 0 cleanup(fr.view) regions = [] regions0 = [] domain0 = DOMAIN + '-zero' for r in fr.reports.values(): line = fr.view.line(fr.view.text_point(r.row, 0)) pos = line.begin() + r.col if pos >= line.end(): pos = line.end() if pos == line.begin(): regions0.append(sublime.Region(pos, pos)) else: regions.append(sublime.Region(pos, pos)) if regions: fr.view.add_regions(DOMAIN, regions, 'comment', 'dot', sublime.DRAW_EMPTY_AS_OVERWRITE) else: fr.view.erase_regions(DOMAIN) if regions0: fr.view.add_regions(domain0, regions0, 'comment', 'dot', sublime.HIDDEN) else: fr.view.erase_regions(domain0) msg = '' reps = fr.reports.copy() l = len(reps) if l > 0: msg = '%s (%d)' % (DOMAIN, l) r = reps.get(row) if r and r.msg: msg = '%s: %s' % (msg, r.msg) if fr.state != 0: msg = u'\u231B %s' % msg fr.view.set_status(DOMAIN, msg)
def highlight(fr): sel = gs.sel(fr.view).begin() row, _ = fr.view.rowcol(sel) if fr.state == 1: fr.state = 0 cleanup(fr.view) regions = [] regions0 = [] domain0 = DOMAIN + "-zero" for r in fr.reports.values(): line = fr.view.line(fr.view.text_point(r.row, 0)) pos = line.begin() + r.col if pos >= line.end(): pos = line.end() if pos == line.begin(): regions0.append(sublime.Region(pos, pos)) else: regions.append(sublime.Region(pos, pos)) if regions: fr.view.add_regions( DOMAIN, regions, "comment", "dot", sublime.DRAW_EMPTY_AS_OVERWRITE ) else: fr.view.erase_regions(DOMAIN) if regions0: fr.view.add_regions(domain0, regions0, "comment", "dot", sublime.HIDDEN) else: fr.view.erase_regions(domain0) msg = "" reps = fr.reports.copy() if len(reps) > 0: msg = "%s (%d)" % (DOMAIN, len(reps)) r = reps.get(row) if r and r.msg: msg = "%s: %s" % (msg, r.msg) if fr.state != 0: msg = u"\u231B %s" % msg fr.view.set_status(DOMAIN, msg)
def run(self, _, mode=''): view = self.view if (not gs.is_go_source_view(view)) or (mode not in ['goto', 'hint']): return pt = gs.sel(view).begin() src = view.substr(sublime.Region(0, view.size())) pt = len(src[:pt].encode("utf-8")) def f(docs, err): doc = '' if err: self.show_output('// Error: %s' % err) elif docs: if mode == "goto": fn = '' flags = 0 if len(docs) > 0: d = docs[0] fn = d.get('fn', '') row = d.get('row', 0) col = d.get('col', 0) if fn: gs.println('opening %s:%s:%s' % (fn, row, col)) gs.focus(fn, row, col) return self.show_output("%s: cannot find definition" % DOMAIN) elif mode == "hint": s = [] for d in docs: name = d.get('name', '') if name: kind = d.get('kind', '') pkg = d.get('pkg', '') if pkg: name = '%s.%s' % (pkg, name) src = d.get('src', '') if src: src = '\n//\n%s' % src doc = '// %s %s%s' % (name, kind, src) s.append(doc) doc = '\n\n\n'.join(s).strip() self.show_output(doc or "// %s: no docs found" % DOMAIN) mg9.doc(view.file_name(), src, pt, f)
def handle_action(view, action): fn = view.file_name() prefix, name = match_prefix_name(view.substr(view.word(gs.sel(view)))) ok = prefix and fn and fn.endswith("_test.go") if ok: if action == "right-click": pat = "^%s.*" % prefix else: pat = "^%s$" % name if prefix == "Benchmark": cmd = ["go", "test", "-test.run=none", '-test.bench="%s"' % pat] else: cmd = ["go", "test", '-test.run="%s"' % pat] view.run_command("gs9o_open", {"run": cmd}) return ok
def handle_action(view, action): fn = view.file_name() prefix, name = match_prefix_name(view.substr(view.word(gs.sel(view)))) ok = prefix and fn and fn.endswith('_test.go') if ok: if action == 'right-click': pat = '^%s.*' % prefix else: pat = '^%s$' % name if prefix == 'Benchmark': cmd = ['go', 'test', '-test.run=none', '-test.bench="%s"' % pat] else: cmd = ['go', 'test', '-test.run="%s"' % pat] view.run_command('gs9o_open', {'run': cmd}) return ok
def run(self, _): view = self.view pt = gs.sel(view).begin() src = view.substr(sublime.Region(0, view.size())) pt = len(src[:pt].encode("utf-8")) def f(res, err): if err: ui.error(DOMAIN, err) return fn = res.get('Fn') row = res.get('Line', -1) - 1 col = res.get('Col', 0) - 1 if not fn or row < 0: ui.note(DOMAIN, "no definition found") return gs.println('opening %s:%s:%s' % (fn, row, col)) vu.open(fn=fn, row=row, col=col) mg9.a_posdef(view.file_name(), pt, f)
def run(self, edit, up): view = self.view pos = gs.sel(view).begin() if view.score_selector(pos, 'prompt.9o') <= 0: return aso = gs.aso() vs = view.settings() wd = vs.get('9o.wd') hkey = _hkey(wd) hist = [s for s in gs.dval(aso.get(hkey), []) if s.strip()] if not hist: return r = view.extract_scope(pos) cmd = view.substr(r).strip('#').strip() try: idx = hist.index(cmd) + (-1 if up else 1) found = True except Exception: idx = -1 found = False if cmd and not found: hist.append(cmd) aso.set(hkey, hist) gs.save_aso() if idx >= 0 and idx < len(hist): cmd = hist[idx] elif up: if not found: cmd = hist[-1] else: cmd = '' view.replace(edit, r, '# %s \n' % cmd) n = view.line(r.begin()).end() view.sel().clear() view.sel().add(sublime.Region(n, n))
def run(self, edit): actions = [] v = self.view sel = gs.sel(v) if (sel.end() - sel.begin()) == 0: pos = sel.begin() inscope = lambda p: v.score_selector(p, 'path.9o') > 0 if inscope(pos): actions.append(v.substr(v.extract_scope(pos))) else: pos -= 1 if inscope(pos): actions.append(v.substr(v.extract_scope(pos))) else: line = v.line(pos) for cr in v.find_by_selector('path.9o'): if line.contains(cr): actions.append(v.substr(cr)) else: actions.append(v.substr(sel)) act_on(v, actions)
def run(self, edit): v = self.view sel = gs.sel(v) if (sel.end() - sel.begin()) == 0: pos = sel.begin() inscope = lambda p: v.score_selector(p, 'path.9o') > 0 if not inscope(pos): pos -= 1 if not inscope(pos): return r = v.extract_scope(pos) else: r = sel path = v.substr(r) if URL_PATH_PAT.match(path): if path.lower().startswith('gs.packages://'): path = os.path.join(sublime.packages_path(), path[14:]) else: try: if not URL_SCHEME_PAT.match(path): path = 'http://%s' % path gs.notify(DOMAIN, 'open url: %s' % path) webbrowser.open_new_tab(path) except Exception: gs.error_traceback(DOMAIN) return wd = v.settings().get('9o.wd') or active_wd() m = SPLIT_FN_POS_PAT.match(path) path = gs.apath((m.group(1) if m else path), wd) row = max(0, int(m.group(2)) - 1 if (m and m.group(2)) else 0) col = max(0, int(m.group(3)) - 1 if (m and m.group(3)) else 0) if os.path.exists(path): gs.focus(path, row, col, win=self.view.window()) else: gs.notify(DOMAIN, "Invalid path `%s'" % path)
def run(self, edit): v = self.view sel = gs.sel(v) if (sel.end() - sel.begin()) == 0: pos = sel.begin() inscope = lambda p: v.score_selector(p, 'path.9o') > 0 if not inscope(pos): pos -= 1 if not inscope(pos): return r = v.extract_scope(pos) else: r = sel path = v.substr(r) if URL_PATH_PAT.match(path): if path.lower().startswith('gs.packages://'): path = os.path.join(sublime.packages_path(), path[14:]) else: try: if not URL_SCHEME_PAT.match(path): path = 'http://%s' % path gs.notify(DOMAIN, 'open url: %s' % path) webbrowser.open_new_tab(path) except Exception: gs.error_traceback(DOMAIN) return wd = v.settings().get('9o.wd') or active_wd() m = SPLIT_FN_POS_PAT.match(path) path = gs.apath((m.group(1) if m else path), wd) row = max(0, int(m.group(2))-1 if (m and m.group(2)) else 0) col = max(0, int(m.group(3))-1 if (m and m.group(3)) else 0) if os.path.exists(path): gs.focus(path, row, col, win=self.view.window()) else: gs.notify(DOMAIN, "Invalid path `%s'" % path)
def _exec(view, edit, save_hist=False): pos = gs.sel(view).begin() line = view.line(pos) wd = view.settings().get('9o.wd') try: os.chdir(wd) except Exception: ui.trace(DOMAIN) ln = view.substr(line).split('#', 1) if len(ln) == 2: cmd = ln[1].strip() if cmd: vs = view.settings() aso = gs.aso() hkey = _hkey(wd) hist = gs.dval(aso.get(hkey), []) m = HIST_EXPAND_PAT.match(cmd) if m: pfx = m.group(1) hl = len(hist) idx = hl - int(m.group(2)) cmd = '' if idx >= 0 and idx < hl: cmd = hist[idx] if pfx == '^' or not cmd: view.replace(edit, line, ('%s# %s' % (ln[0], cmd))) return elif save_hist: try: hist.remove(cmd) except ValueError: pass hist.append(cmd) aso.set(hkey, hist) gs.save_aso() if not cmd: view.run_command('gs9o_init') return line = view.full_line(pos) ctx = '9o.exec.%s' % gs.uid() view.replace(edit, line, ('[`%s`]\n' % cmd)) view.run_command('gs9o_init') ep = view.full_line(line.begin()).end() view.add_regions(ctx, [sublime.Region(ep, ep)], '') hellip = u'[ \u22EF ]' ep += 1 view.insert(edit, ep, hellip+'\n\n') view.add_regions(ctx+'.done', [sublime.Region(ep, ep+len(hellip))], '') cli = cmd.split(' ', 1) if cli[0] == 'sh': a = cli[1].strip() if len(cli) == 2 else '' mk_cmd(view, wd, ctx, sh.cmd(a)).start() return nv = sh.env() a = [_exparg(s, nv) for s in shlex.split(gs.astr(cmd))] f = builtins().get(a[0]) if f: f(view, edit, a[1:], wd, ctx) else: mk_cmd(view, wd, ctx, a).start() else: view.insert(edit, gs.sel(view).begin(), '\n')
def run(self, _, mode=''): view = self.view if (not gs.is_go_source_view(view)) or (mode not in ['goto', 'hint', 'usage']): return pt = gs.sel(view).begin() src = view.substr(sublime.Region(0, view.size())) pt = len(src[:pt].encode("utf-8")) def f(docs, err): doc = '' if err: self.show_output('// Error: %s' % err) elif docs: if mode == "goto" or mode == "usage": fn = '' flags = 0 #method to open doc def open(d): fn = d.get('fn', '') row = d.get('row', 0) col = d.get('col', 0) if fn: gs.println('opening %s:%s:%s' % (fn, row, col)) gs.focus(fn, row, col) return self.show_output("%s: cannot find definition" % DOMAIN) if len(docs) > 1: def callback(idx): open(docs[idx]) def highlight(idx): d = docs[idx] fn = d.get('fn', '') row = d.get('row', 0) + 1 col = d.get('col', 0) + 1 sublime.active_window().open_file('%s:%s:%s' % (fn, row or 0, col or 0), sublime.TRANSIENT | sublime.ENCODED_POSITION) #list of usages lines = [] for d in docs: lines.append(d.get('fn', '') + ':' + str(d.get('row', 0) + 1) + ':' + str(d.get('col', 0) + 1)) sublime.active_window().show_quick_panel(lines, callback, on_highlight=highlight) return elif len(docs) == 1: open(docs[0]) return elif mode == "hint": s = [] for d in docs: name = d.get('name', '') if name: kind = d.get('kind', '') pkg = d.get('pkg', '') if pkg: name = '%s.%s' % (pkg, name) src = d.get('src', '') if src: src = '\n//\n%s' % src doc = '// %s %s%s' % (name, kind, src) s.append(doc) doc = '\n\n\n'.join(s).strip() self.show_output(doc or "// %s: no docs found" % DOMAIN) mg9.doc(view.file_name(), src, pt, f, mode)
def run(self, edit, save_hist=False): view = self.view pos = gs.sel(view).begin() line = view.line(pos) wd = view.settings().get('9o.wd') ln = view.substr(line).split('#', 1) if len(ln) == 2: cmd = ln[1].strip() if cmd: vs = view.settings() aso = gs.aso() hkey = '9o.hist.%s' % wd hist = gs.dval(aso.get(hkey), []) m = HIST_EXPAND_PAT.match(cmd) if m: pfx = m.group(1) hl = len(hist) idx = hl - int(m.group(2)) cmd = '' if idx >= 0 and idx < hl: cmd = hist[idx] if pfx == '^' or not cmd: view.replace(edit, line, ('%s# %s' % (ln[0], cmd))) return elif save_hist: try: hist.remove(cmd) except ValueError: pass hist.append(cmd) aso.set(hkey, hist) gs.save_aso() if not cmd: view.run_command('gs9o_init') return view.replace(edit, line, (u'[ `%s` %s ]' % (cmd, HOURGLASS))) rkey = '9o.exec.%s' % uuid.uuid4() view.add_regions(rkey, [sublime.Region(line.begin(), view.size())], '') view.run_command('gs9o_init') cli = cmd.split(' ', 1) # todo: move this into margo if cli[0] == 'sh': def on_done(c): out = gs.ustr('\n'.join(c.consume_outq())) sublime.set_timeout(lambda: push_output(view, rkey, out), 0) c = gsshell.Command(cmd=cli[1], shell=True, cwd=wd) c.on_done = on_done c.start() return f = globals().get('cmd_%s' % cli[0]) if f: args = shlex.split(gs.astr(cli[1])) if len(cli) == 2 else [] f(view, edit, args, wd, rkey) else: push_output(view, rkey, 'Invalid command %s' % cli) else: view.insert(edit, gs.sel(view).begin(), '\n')
def _exec(view, edit, save_hist=False): pos = gs.sel(view).begin() line = view.line(pos) wd = view.settings().get('9o.wd') try: os.chdir(wd) except Exception: ui.trace(DOMAIN) ln = view.substr(line).split('#', 1) if len(ln) == 2: cmd = ln[1].strip() if cmd: vs = view.settings() aso = gs.aso() hkey = _hkey(wd) hist = gs.dval(aso.get(hkey), []) m = HIST_EXPAND_PAT.match(cmd) if m: pfx = m.group(1) hl = len(hist) idx = hl - int(m.group(2)) cmd = '' if idx >= 0 and idx < hl: cmd = hist[idx] if pfx == '^' or not cmd: view.replace(edit, line, ('%s# %s' % (ln[0], cmd))) return elif save_hist: try: hist.remove(cmd) except ValueError: pass hist.append(cmd) aso.set(hkey, hist) gs.save_aso() if not cmd: view.run_command('gs9o_init') return line = view.full_line(pos) ctx = '9o.exec.%s' % gs.uid() view.replace(edit, line, ('[`%s`]\n' % cmd)) view.run_command('gs9o_init') ep = view.full_line(line.begin()).end() view.add_regions(ctx, [sublime.Region(ep, ep)], '') hellip = u'[ \u22EF ]' ep += 1 view.insert(edit, ep, hellip + '\n\n') view.add_regions(ctx + '.done', [sublime.Region(ep, ep + len(hellip))], '') cli = cmd.split(' ', 1) if cli[0] == 'sh': a = cli[1].strip() if len(cli) == 2 else '' mk_cmd(view, wd, ctx, sh.cmd(a)).start() return nv = sh.env() a = [_exparg(s, nv) for s in shlex.split(gs.astr(cmd))] f = builtins().get(a[0]) if f: f(view, edit, a[1:], wd, ctx) else: mk_cmd(view, wd, ctx, a).start() else: view.insert(edit, gs.sel(view).begin(), '\n')
def tip(self, edit): view = self.view pt = gs.sel(view).begin() if view.substr(sublime.Region(pt-1, pt)) == '(': depth = 1 else: depth = 0 c = '' while True: line = view.line(pt) scope = view.scope_name(pt) if 'string' in scope or 'comment' in scope: pt = view.extract_scope(pt).begin() - 1 continue c = view.substr(sublime.Region(pt-1, pt)) if not c: pt = -1 break if c.isalpha() and depth >= 0: while c.isalpha() or c == '.': pt += 1 c = view.substr(sublime.Region(pt-1, pt)) # curly braces ftw break # break outer while loop if c == ')': depth -= 1 elif c == '(': depth += 1 i = pt while True: pc = view.substr(sublime.Region(i-1, i)) if pc == '.' or pc.isalpha(): i -= 1 else: break if i != pt: pt = i continue pt -= 1 if pt <= line.begin(): pt = -1 break while not c.isalpha() and pt > 0: pt -= 1 c = view.substr(sublime.Region(pt-1, pt)) if pt <= 0 or view.scope_name(pt).strip() == 'source.go': return ({}, "can't find selector") line = view.line(pt) line_start = line.begin() s = view.substr(line) if not s: return ({}, 'no source') scopes = [ 'support.function.any-method.go', 'meta.function-call.go', 'support.function.builtin.go', ] found = False while True: scope = view.scope_name(pt).strip() for s in scopes: if scope.endswith(s): found = True break if found or pt <= line_start: break pt -= 1 if not found: return ({}, "can't find function call") s = view.substr(sublime.Region(line_start, pt)) m = END_SELECTOR_PAT.match(s) if not m: return ({}, "can't match selector") offset = (line_start + m.end()) sel = m.group(1) name = m.group(2) candidates = [] src = view.substr(sublime.Region(0, view.size())) fn = view.file_name() candidates, err = mg9.complete(fn, src, offset) if err: gs.notice(DOMAIN, err) else: c = {} for i in candidates: if i['name'] == name: if c: c = None break c = i if c: return (c, '') return ({}, 'no candidates found')
def run(self, edit, save_hist=False): view = self.view pos = gs.sel(view).begin() line = view.line(pos) wd = view.settings().get('9o.wd') try: os.chdir(wd) except Exception: gs.error_traceback(DOMAIN) ln = view.substr(line).split('#', 1) if len(ln) == 2: cmd = ln[1].strip() if cmd: vs = view.settings() aso = gs.aso() hkey = _hkey(wd) hist = gs.dval(aso.get(hkey), []) m = HIST_EXPAND_PAT.match(cmd) if m: pfx = m.group(1) hl = len(hist) idx = hl - int(m.group(2)) cmd = '' if idx >= 0 and idx < hl: cmd = hist[idx] if pfx == '^' or not cmd: view.replace(edit, line, ('%s# %s' % (ln[0], cmd))) return elif save_hist: try: hist.remove(cmd) except ValueError: pass hist.append(cmd) aso.set(hkey, hist) gs.save_aso() if not cmd: view.run_command('gs9o_init') return view.replace(edit, line, (u'[ `%s` %s ]' % (cmd, HOURGLASS))) rkey = '9o.exec.%s' % uuid.uuid4() view.add_regions(rkey, [sublime.Region(line.begin(), view.size())], '') view.run_command('gs9o_init') nv = sh.env() anv = nv.copy() seen = {} am = aliases() while True: cli = cmd.split(' ', 1) nm = cli[0] if not nm: break ag = cli[1].strip() if len(cli) == 2 else '' alias = am.get(nm, '') if not alias: break if alias in seen: gs.error(DOMAIN, 'recursive alias detected: `%s`' % alias) break seen[alias] = True anv['_args'] = ag cmd = string.Template(alias).safe_substitute(anv) if nm != 'sh': f = builtins().get(nm) if f: args = [] if ag: args = [ _exparg(s, nv) for s in shlex.split(gs.astr(ag)) ] f(view, edit, args, wd, rkey) return if nm == 'sh': args = sh.cmd(ag) else: args = sh.cmd(cmd) cmd_sh(view, edit, args, wd, rkey) else: view.insert(edit, gs.sel(view).begin(), '\n')
def run(self, edit, save_hist=False): view = self.view pos = gs.sel(view).begin() line = view.line(pos) wd = view.settings().get('9o.wd') try: os.chdir(wd) except Exception: gs.error_traceback(DOMAIN) ln = view.substr(line).split('#', 1) if len(ln) == 2: cmd = ln[1].strip() if cmd: vs = view.settings() aso = gs.aso() hkey = _hkey(wd) hist = gs.dval(aso.get(hkey), []) m = HIST_EXPAND_PAT.match(cmd) if m: pfx = m.group(1) hl = len(hist) idx = hl - int(m.group(2)) cmd = '' if idx >= 0 and idx < hl: cmd = hist[idx] if pfx == '^' or not cmd: view.replace(edit, line, ('%s# %s' % (ln[0], cmd))) return elif save_hist: try: hist.remove(cmd) except ValueError: pass hist.append(cmd) aso.set(hkey, hist) gs.save_aso() if not cmd: view.run_command('gs9o_init') return view.replace(edit, line, (u'[ `%s` %s ]' % (cmd, HOURGLASS))) rkey = '9o.exec.%s' % uuid.uuid4() view.add_regions(rkey, [sublime.Region(line.begin(), view.size())], '') view.run_command('gs9o_init') nv = sh.env() anv = nv.copy() seen = {} am = aliases() while True: cli = cmd.split(' ', 1) nm = cli[0] if not nm: break ag = cli[1].strip() if len(cli) == 2 else '' alias = am.get(nm, '') if not alias: break if alias in seen: gs.error(DOMAIN, 'recursive alias detected: `%s`' % alias) break seen[alias] = True anv['_args'] = ag cmd = string.Template(alias).safe_substitute(anv) if nm != 'sh': f = builtins().get(nm) if f: args = [] if ag: args = [_exparg(s, nv) for s in shlex.split(gs.astr(ag))] f(view, edit, args, wd, rkey) return if nm == 'sh': args = sh.cmd(ag) else: args = sh.cmd(cmd) cmd_sh(view, edit, args, wd, rkey) else: view.insert(edit, gs.sel(view).begin(), '\n')
def is_enabled(self): pos = gs.sel(self.view).begin() return self.view.score_selector(pos, 'text.9o') > 0
def run(self, edit): view = self.view pt = gs.sel(view).begin() if view.substr(sublime.Region(pt - 1, pt)) == '(': depth = 1 else: depth = 0 c = '' while True: line = view.line(pt) scope = view.scope_name(pt) if 'string' in scope or 'comment' in scope: pt = view.extract_scope(pt).begin() - 1 continue c = view.substr(sublime.Region(pt - 1, pt)) if not c: pt = -1 break if c.isalpha() and depth >= 0: while c.isalpha() or c == '.': pt += 1 c = view.substr(sublime.Region(pt - 1, pt)) # curly braces ftw break # break outer while loop if c == ')': depth -= 1 elif c == '(': depth += 1 i = pt while True: pc = view.substr(sublime.Region(i - 1, i)) if pc == '.' or pc.isalpha(): i -= 1 else: break if i != pt: pt = i continue pt -= 1 if pt <= line.begin(): pt = -1 break while not c.isalpha() and pt > 0: pt -= 1 c = view.substr(sublime.Region(pt - 1, pt)) if pt <= 0 or view.scope_name(pt).strip() == 'source.go': self.show_hint("// can't find selector") return line = view.line(pt) line_start = line.begin() s = view.substr(line) if not s: self.show_hint('// no source') return scopes = [ 'support.function.any-method.go', 'meta.function-call.go', 'support.function.builtin.go', ] found = False while True: scope = view.scope_name(pt).strip() for s in scopes: if scope.endswith(s): found = True break if found or pt <= line_start: break pt -= 1 if not found: self.show_hint("// can't find function call") return s = view.substr(sublime.Region(line_start, pt)) m = END_SELECTOR_PAT.match(s) if not m: self.show_hint("// can't match selector") return offset = (line_start + m.end()) sel = m.group(1) name = m.group(2) candidates = [] src = view.substr(sublime.Region(0, view.size())) fn = view.file_name() candidates, err = mg9.complete(fn, src, offset) if err: gs.notice(DOMAIN, err) else: c = {} for i in candidates: if i['name'] == name: if c: c = None break c = i if not c: self.show_hint('// no candidates found') return s = '// %s %s\n%s' % (c['name'], c['class'], c['type']) self.show_hint(s)
def run(self, edit, save_hist=False): view = self.view pos = gs.sel(view).begin() line = view.line(pos) wd = view.settings().get('9o.wd') ln = view.substr(line).split('#', 1) if len(ln) == 2: cmd = ln[1].strip() if cmd: vs = view.settings() aso = gs.aso() hkey = _hkey(wd) hist = gs.dval(aso.get(hkey), []) m = HIST_EXPAND_PAT.match(cmd) if m: pfx = m.group(1) hl = len(hist) idx = hl - int(m.group(2)) cmd = '' if idx >= 0 and idx < hl: cmd = hist[idx] if pfx == '^' or not cmd: view.replace(edit, line, ('%s# %s' % (ln[0], cmd))) return elif save_hist: try: hist.remove(cmd) except ValueError: pass hist.append(cmd) aso.set(hkey, hist) gs.save_aso() if not cmd: view.run_command('gs9o_init') return view.replace(edit, line, (u'[ `%s` %s ]' % (cmd, HOURGLASS))) rkey = '9o.exec.%s' % uuid.uuid4() view.add_regions(rkey, [sublime.Region(line.begin(), view.size())], '') view.run_command('gs9o_init') cli = cmd.split(' ', 1) nm = cli[0] ag = cli[1].strip() if len(cli) == 2 else '' if nm == "cd": args = [ag] if ag else [] cmd_cd(view, edit, args, wd, rkey) return # todo: move this into margo if nm == 'sh': def on_done(c): out = gs.ustr('\n'.join(c.consume_outq())) sublime.set_timeout(lambda: push_output(view, rkey, out), 0) c = gsshell.Command(cmd=ag, shell=True, cwd=wd) c.on_done = on_done c.start() return f = gs.gs9o.get(nm) or globals().get('cmd_%s' % nm) if f: args = shlex.split(gs.astr(ag)) if ag else [] f(view, edit, args, wd, rkey) else: push_output(view, rkey, 'Invalid command %s' % cli) else: view.insert(edit, gs.sel(view).begin(), '\n')