Пример #1
0
	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")
Пример #2
0
    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)
Пример #3
0
	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)
Пример #4
0
 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")
Пример #5
0
    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)
Пример #6
0
 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})
Пример #7
0
	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})
Пример #8
0
    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)
Пример #9
0
	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)
Пример #10
0
    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)
Пример #11
0
	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)
Пример #12
0
    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)
Пример #13
0
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)
Пример #14
0
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)
Пример #15
0
	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)
Пример #16
0
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
Пример #17
0
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
Пример #18
0
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
Пример #19
0
	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)
Пример #20
0
	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))
Пример #21
0
    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))
Пример #22
0
    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)
Пример #23
0
	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)
Пример #24
0
    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)
Пример #25
0
	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)
Пример #26
0
    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)
Пример #27
0
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')
Пример #28
0
	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)
Пример #29
0
	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')
Пример #30
0
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')
Пример #31
0
	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')
Пример #32
0
    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')
Пример #33
0
	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')
Пример #34
0
	def is_enabled(self):
		pos = gs.sel(self.view).begin()
		return self.view.score_selector(pos, 'text.9o') > 0
Пример #35
0
 def is_enabled(self):
     pos = gs.sel(self.view).begin()
     return self.view.score_selector(pos, 'text.9o') > 0
Пример #36
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)
Пример #37
0
    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')