diff --git a/application.py b/application.py index a7b2a87..603070d 100755 --- a/application.py +++ b/application.py @@ -1089,7 +1089,7 @@ class Application(object): def get_minibuffer_lines(self): lines2 = [] - if self.error_string: + if self.error_string and False: maxlen = self.config['max_error_len'] if len(self.error_string) < maxlen: s = self.error_string diff --git a/etags.py b/etags.py index 0bbc19d..b66e9bd 100644 --- a/etags.py +++ b/etags.py @@ -30,6 +30,9 @@ class TagManager(object): def get(self, name): return self.etags.tag_map.get(name, []) + def list(self): + return self.etags.record_list + def update(self): if self.is_outdated(): self.run() diff --git a/method/tags.py b/method/tags.py index 7cbb33b..55c1755 100644 --- a/method/tags.py +++ b/method/tags.py @@ -4,16 +4,71 @@ import completer from etags import TagManager import default -class FindTag(Method): - args = [arg('tag', p='Tag name: ', dv=default.current_token, ld=True, h='Search for a tag')] +class TagBase(Method): + _is_method = False + def _setup(self, w, vargs): + InitTags().execute(w) + if 'tag-base' in w.buffer.settings[w.mode.name]: + base = w.buffer.settings[w.mode.name].get('tag-base') + manager = w.application.state['tags'][base] + return base, manager + else: + w.application.mini_buffer.add_callback(self._resume) + self._old_window = w + self._old_vargs = vargs + return None, None + + def _resume(self, s): + self._execute(self._old_window, **self._old_vargs) + + def _goto_record(self, w, r): + b = w.application.open_path(r.path) + w.application.switch_buffer(b) + b.windows[0].goto_line(r.line) + + def _display_records(self, records): + cwd = os.getcwd() + if not cwd.endswith('/'): + cwd += '/' + + tpls = [(r.path.replace(cwd, ''), r.line, r.defn) for r in records] + data = '\n'.join(['%s:%d:%s' % tpl for tpl in tpls]) + '\n' + return data + +class SearchTags(TagBase): + _is_method = True + args = [arg('query', p='Query: ', h='Search all tags')] + def _execute(self, w, **vargs): + query = vargs['query'] + b = w.buffer + a = w.application + + base, m = self._setup(w, vargs) + if base is None: + return + + records = [r for r in m.etags.record_list if query in r.name] + + if len(records) == 0: + w.set_error('no records matched query %r' % query) + return + + data = self._display_records(records) + a.data_buffer("*Tag-Records*", data, switch_to=True, modename='error') + w.set_error('found %d records for query %r' % (len(records), query)) + +class FindTag(TagBase): + _is_method = True + args = [arg('tag', p='Tag name: ', dv=default.current_token, ld=True, + h='Search for a tag')] def _execute(self, w, **vargs): tag = vargs['tag'] b = w.buffer a = w.application - InitTags().execute(w) - base = b.settings[w.mode.name].get('tag-base') - m = a.state['tags'][base] + base, m = self._setup(w, vargs) + if base is None: + return records = m.get(tag) if not records: @@ -21,19 +76,11 @@ class FindTag(Method): return if len(records) == 1: - b = a.open_path(records[0].path) - a.switch_buffer(b) - b.windows[0].goto_line(records[0].line) + self._goto_record(w, records[0]) w.set_error('found one record for tag %r' % tag) return - cwd = os.getcwd() - if not cwd.endswith('/'): - cwd += '/' - - tpls = [(r.path.replace(cwd, ''), r.line, r.defn) for r in records] - - data = '\n'.join(['%s:%d:%s' % tpl for tpl in tpls]) + '\n' + data = self._display_records(records) a.data_buffer("*Tag-Records*", data, switch_to=True, modename='error') w.set_error('found %d records for tag %r' % (len(records), tag)) @@ -83,6 +130,7 @@ class InitTags(Method): self._prompt = "Enter source directory: " c = completer.get_completer('path') d = os.path.dirname(w.buffer.path) + a.clear_error() #xyz a.open_mini_buffer(self._prompt, self._cb, tabber=c, startvalue=d) def _cb(self, v): diff --git a/minibuffer.py b/minibuffer.py index da73812..dd8de90 100644 --- a/minibuffer.py +++ b/minibuffer.py @@ -26,6 +26,12 @@ class MiniBuffer(buffer.Buffer): def name(self): return "*Minibuffer*" + def add_callback(self, f): + cb = self.callback + def newcb(s): + cb(s) + f(s) + self.callback = newcb def do_callback(self): self.callback(self.make_string()) def close(self):