def palette_declarations(self, view, direct=False): def f(res, err): if err: gs.notice('GsDeclarations', err) else: decls = res.get('file_decls', []) decls.sort(key=lambda v: v.get('row', 0)) added = 0 for i, v in enumerate(decls): loc = Loc(v['fn'], v['row'], v['col']) s = '%s %s' % (v['kind'], (v['repr'] or v['name'])) self.add_item(s, self.jump_to, (view, loc)) added += 1 if added < 1: self.add_item(['', 'No declarations found']) self.do_show_panel() margo.call(path='/declarations', args={ 'fn': view.file_name(), 'src': view.substr(sublime.Region(0, view.size())), }, default={}, cb=f, message='fetching file declarations')
def palette_declarations(self, view, direct=False): def f(res, err): if err: gs.notice('GsDeclarations', err) else: decls = res.get('file_decls', []) decls.sort(key=lambda v: v.get('row', 0)) added = 0 for i, v in enumerate(decls): loc = Loc(v['fn'], v['row'], v['col']) s = '%s %s' % (v['kind'], (v['repr'] or v['name'])) self.add_item(s, self.jump_to, (view, loc)) added += 1 if added < 1: self.add_item(['', 'No declarations found']) self.do_show_panel() margo.call( path='/declarations', args={ 'fn': view.file_name(), 'src': view.substr(sublime.Region(0, view.size())), }, default={}, cb=f, message='fetching file declarations' )
def run(self, dir=''): if dir == '.': self.present_current() elif dir: self.present('', '', dir) else: def f(res, err): if err: gs.notice(DOMAIN, err) return ents, m = handle_pkgdirs_res(res) if ents: ents.insert(0, "Current Package") def cb(i, win): if i == 0: self.present_current() elif i >= 1: self.present('', '', os.path.dirname(m[ents[i]])) gs.show_quick_panel(ents, cb) else: gs.show_quick_panel([['', 'No source directories found']]) margo.call( path='/pkgdirs', args={}, default={}, cb=f, message='fetching pkg dirs' )
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())) 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) margo.call( path='/doc', args={ 'fn': view.file_name(), 'src': src, 'offset': pt, }, default=[], cb=f, message='fetching docs' )
def run(self, _, mode=''): view = self.view if (not gs.is_go_source_view(view)) or (mode not in ['goto', 'hint']): return pt = view.sel()[0].begin() src = view.substr(sublime.Region(0, view.size())) 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) margo.call( path='/doc', args={ 'fn': view.file_name(), 'src': src, 'offset': pt, }, default=[], cb=f, message='fetching docs' )
def present(self, vfn, src, pkg_dir): win = self.window if win is None: return def f(res, err): if err: gs.notice(DOMAIN, err) return decls = res.get('file_decls', []) for d in res.get('pkg_decls', []): if not vfn or d['fn'] != vfn: decls.append(d) for d in decls: dname = (d['repr'] or d['name']) trailer = [] trailer.extend(GOOS_PAT.findall(d['fn'])) trailer.extend(GOARCH_PAT.findall(d['fn'])) if trailer: trailer = ' (%s)' % ', '.join(trailer) else: trailer = '' d['ent'] = '%s %s%s' % (d['kind'], dname, trailer) ents = [] decls.sort(key=lambda d: d['ent']) for d in decls: ents.append(d['ent']) def cb(i): if i >= 0: d = decls[i] gs.focus(d['fn'], d['row'], d['col'], win) if ents: win.show_quick_panel(ents, cb) else: win.show_quick_panel([['', 'No declarations found']], lambda x: None) margo.call( path='/declarations', args={ 'fn': vfn, 'src': src, 'pkg_dir': pkg_dir, }, default={}, cb=f, message='fetching pkg declarations' )
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())) 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) margo.call( path="/doc", args={"fn": view.file_name(), "src": src, "offset": pt}, default=[], cb=f, message="fetching docs", )
def palette_imports(self, view, direct=False): indent = '' if direct else ' ' src = view.substr(sublime.Region(0, view.size())) def f(im, err): if err: gs.notice(DOMAIN, err) return delete_imports = [] add_imports = [] for path in im.get('paths', []): skipAdd = False for i in im.get('imports', []): if i.get('path') == path: skipAdd = True name = i.get('name', '') if not name: name = basename(path) if name == path: delete_imports.append( ('%sdelete: %s' % (indent, name), i)) else: delete_imports.append( ('%sdelete: %s ( %s )' % (indent, name, path), i)) if not skipAdd: add_imports.append(('%s%s' % (indent, path), { 'path': path, 'add': True })) for i in sorted(delete_imports): self.add_item(i[0], self.toggle_import, (view, i[1])) if len(delete_imports) > 0: self.add_item(' ', self.show_palette, 'imports') for i in sorted(add_imports): self.add_item(i[0], self.toggle_import, (view, i[1])) self.do_show_panel() margo.call(path='/import_paths', args={ 'fn': view.file_name(), 'src': src, }, cb=f, message='fetching pkg import paths')
def present(self, vfn, src, pkg_dir): win = self.window if win is None: return def f(res, err): if err: gs.notice(DOMAIN, err) return decls = res.get("file_decls", []) for d in res.get("pkg_decls", []): if not vfn or d["fn"] != vfn: decls.append(d) for d in decls: dname = d["repr"] or d["name"] trailer = [] trailer.extend(GOOS_PAT.findall(d["fn"])) trailer.extend(GOARCH_PAT.findall(d["fn"])) if trailer: trailer = " (%s)" % ", ".join(trailer) else: trailer = "" d["ent"] = "%s %s%s" % (d["kind"], dname, trailer) ents = [] decls.sort(key=lambda d: d["ent"]) for d in decls: ents.append(d["ent"]) def cb(i): if i >= 0: d = decls[i] gs.focus(d["fn"], d["row"], d["col"], win) if ents: win.show_quick_panel(ents, cb) else: win.show_quick_panel([["", "No declarations found"]], lambda x: None) margo.call( path="/declarations", args={"fn": vfn, "src": src, "pkg_dir": pkg_dir}, default={}, cb=f, message="fetching pkg declarations", )
def palette_imports(self, view, direct=False): indent = '' if direct else ' ' src = view.substr(sublime.Region(0, view.size())) def f(im, err): if err: gs.notice(DOMAIN, err) return delete_imports = [] add_imports = [] for path in im.get('paths', []): skipAdd = False for i in im.get('imports', []): if i.get('path') == path: skipAdd = True name = i.get('name', '') if not name: name = basename(path) if name == path: delete_imports.append(('%sdelete: %s' % (indent, name), i)) else: delete_imports.append(('%sdelete: %s ( %s )' % (indent, name, path), i)) if not skipAdd: add_imports.append(('%s%s' % (indent, path), {'path': path, 'add': True})) for i in sorted(delete_imports): self.add_item(i[0], self.toggle_import, (view, i[1])) if len(delete_imports) > 0: self.add_item(' ', self.show_palette, 'imports') for i in sorted(add_imports): self.add_item(i[0], self.toggle_import, (view, i[1])) self.do_show_panel() margo.call( path='/import_paths', args={ 'fn': view.file_name(), 'src': src, }, cb=f, message='fetching pkg import paths' )
def run(self): def f(res, err): if err: gs.notice(DOMAIN, err) return ents, m = handle_pkgdirs_res(res) if ents: def cb(i, win): if i >= 0: dirname = gs.basedir_or_cwd(m[ents[i]]) win.run_command("gs_browse_files", {"dir": dirname}) gs.show_quick_panel(ents, cb) else: gs.show_quick_panel([["", "No source directories found"]]) margo.call(path="/pkgdirs", args={}, default={}, cb=f, message="fetching pkg dirs")
def check_depends(): changelog_fn = gs.dist_path("CHANGELOG.md") try: with open(changelog_fn) as f: s = f.read() except IOError: gs.notice(DOMAIN, traceback.format_exc()) return changes = split_changes(s) if changes: def cb(): aso = gs.aso() old_rev = aso.get('changelog.rev', '') new_rev = changes[0][0] if new_rev > old_rev: aso.set('changelog.rev', new_rev) gs.save_aso() new_changes = [ 'GoSublime: Recent Updates (you may need to restart Sublime Text for changes to take effect)', '------------------------------------------------------------------------------------------', ] for change in changes: rev, msg = change if rev > old_rev: new_changes.append('\n%s\n\t%s' % (rev, msg)) else: break new_changes.append('\nSee %s for the full CHANGELOG\n' % changelog_fn) new_changes = '\n'.join(new_changes) gs.show_output(DOMAIN, new_changes, print_output=False) sublime.set_timeout(cb, 0) else: margo.call( path='/', args='hello', message='hello MarGo' )
def run(self): def f(res, err): if err: gs.notice(DOMAIN, err) return ents, m = handle_pkgdirs_res(res) if ents: def cb(i, win): if i >= 0: dirname = gs.basedir_or_cwd(m[ents[i]]) win.run_command('gs_browse_files', {'dir': dirname}) gs.show_quick_panel(ents, cb) else: gs.show_quick_panel([['', 'No source directories found']]) margo.call( path='/pkgdirs', args={}, default={}, cb=f, message='fetching pkg dirs' )
def check_depends(): gr = gs.go_env_goroot() if not gr: gs.notice(DOMAIN, 'The `go` command cannot be found') return e = gs.env() if not e.get('GOROOT'): os.environ['GOROOT'] = gr elif not e.get('GOPATH'): gs.notice(DOMAIN, "GOPATH and/or GOROOT appear to be unset") gs.println( 'GoSublime: checking dependencies', ('\tGOROOT is: %s' % e.get('GOROOT', gr)), ('\tGOPATH is: %s' % e.get('GOPATH', '')) ) missing = [] for cmd in ('gocode', 'MarGo'): if not call_cmd([cmd, '--help']): missing.append(cmd) if missing: def cb(i, _): if i == 0: run_go_get() items = [[ 'GoSublime depends on gocode and MarGo', 'Install %s (using `go get`)' % ', '.join(missing), 'gocode repo: %s' % GOCODE_REPO, 'MarGo repo: %s' % MARGO_REPO, ]] gs.show_quick_panel(items, cb) gs.println(DOMAIN, '\n'.join(items[0])) return changelog_fn = os.path.join(sublime.packages_path(), 'GoSublime', "CHANGELOG.md") try: with open(changelog_fn) as f: s = f.read() except IOError: gs.notice(DOMAIN, traceback.format_exc()) return changes = split_changes(s) if changes: def cb(): settings_fn = 'GoSublime-GsDepends.sublime-settings' settings = sublime.load_settings(settings_fn) new_rev = changes[-1][0] old_rev = settings.get('tracking_rev', '') def on_panel_close(i, win): if i > 0: settings.set('tracking_rev', new_rev) sublime.save_settings(settings_fn) win.open_file(changelog_fn) if i == 1: run_go_get() if new_rev > old_rev: items = [ [ " ", "GoSublime updated to %s" % new_rev, " ", ], [ "Install/Update dependencies: Gocode, MarGo", "go get -u %s" % GOCODE_REPO, "go get -u %s" % MARGO_REPO, ], [ "View changelog", "Packages/GoSublime/CHANGELOG.md" " ", ] ] gs.show_quick_panel(items, on_panel_close) sublime.set_timeout(cb, 0) else: margo.call( path='/', args='hello', message='hello MarGo' )