diff --git a/functions.py b/functions.py index 90fc1fe6..c68ec1d9 100644 --- a/functions.py +++ b/functions.py @@ -109,6 +109,24 @@ class Definition(object): def column(self): return self.definition.start_pos[1] + @property + def description(self): + d = self.definition + if isinstance(d, evaluate.InstanceElement): + d = d.var + if isinstance(d, evaluate.parsing.Name): + d = d.parent + + if isinstance(d, (evaluate.Class, evaluate.Instance)): + d = 'class ' + str(d.name) + elif isinstance(d, (evaluate.Function, evaluate.parsing.Function)): + d = 'def ' + str(d.name) + elif isinstance(d, evaluate.parsing.Module): + d = 'module ' + str(d.path) + else: + d = d.get_code().replace('\n', '') + return d + def __str__(self): if self.module_path[0] == '/': position = '@%s' % (self.line_nr) diff --git a/plugin/jedi.vim b/plugin/jedi.vim index 1a65bfd4..dea1e355 100644 --- a/plugin/jedi.vim +++ b/plugin/jedi.vim @@ -10,6 +10,12 @@ if !has('python') finish endif +" load plugin only once +if exists("g:loaded_jedi") || &cp + finish +endif +let g:loaded_jedi = 1 + " ------------------------------------------------------------------------ " completion " ------------------------------------------------------------------------ @@ -109,7 +115,14 @@ if 1: vim.current.window.cursor = d.line_nr, d.column else: # multiple solutions - echo_highlight("Multiple solutions: Not implemented yet.") + lst = [] + for d in definitions: + if d.in_builtin_module(): + lst.append(dict(text='Builtin ' + d.description)) + else: + lst.append(dict(filename=d.module_path, lnum=d.line_nr, col=d.column, text=d.description)) + vim.command('call setqflist(%s)' % str(lst)) + vim.command('call add_goto_window()') #print 'end', strout PYTHONEOF @@ -122,11 +135,16 @@ if 1: for tab_nr in range(int(vim.eval("tabpagenr('$')"))): for buf_nr in vim.eval("tabpagebuflist(%i + 1)" % tab_nr): buf_nr = int(buf_nr) - 1 - buf_path = vim.buffers[buf_nr].name - if buf_path == path: - # tab exists, just switch to that tab - vim.command('tabfirst | tabnext %i' % (tab_nr + 1)) - break + try: + buf_path = vim.buffers[buf_nr].name + except IndexError: + # just do good old asking for forgiveness. don't know why this happens :-) + pass + else: + if buf_path == path: + # tab exists, just switch to that tab + vim.command('tabfirst | tabnext %i' % (tab_nr + 1)) + break else: continue break @@ -136,6 +154,28 @@ if 1: PYTHONEOF endfunction +function! s:add_goto_window() + set lazyredraw + cclose + execute 'belowright copen 3' + set nolazyredraw + if g:jedi#use_tabs_not_buffers == 1 + map :call jedi#goto_window_on_enter() + endif + au WinLeave q " automatically leave, if an option is chosen + redraw! +endfunction + +function! jedi#goto_window_on_enter() + let l:list = getqflist() + let l:data = l:list[line('.') - 1] + if l:data.bufnr + call jedi#tabnew(bufname(l:data.bufnr)) + call cursor(l:data.lnum, l:data.col) + else + echohl WarningMsg | echo "Builtin module cannot be opened." | echohl None + endif +endfunction " ------------------------------------------------------------------------ " Initialization of jedi-vim " ------------------------------------------------------------------------ diff --git a/test/run.py b/test/run.py index 648333e9..df63a0db 100755 --- a/test/run.py +++ b/test/run.py @@ -108,24 +108,7 @@ def run_goto_test(correct, source, line_nr, line, path): print(traceback.format_exc()) return 1 else: - lst = [] - for r in result: - r = r.definition - if isinstance(r, evaluate.InstanceElement): - r = r.var - if isinstance(r, evaluate.parsing.Name): - r = r.parent - - if isinstance(r, (evaluate.Class, evaluate.Instance)): - r = 'class ' + str(r.name) - elif isinstance(r, (evaluate.Function, evaluate.parsing.Function)): - r = 'def ' + str(r.name) - elif isinstance(r, evaluate.parsing.Module): - r = 'module ' + str(r.path) - else: - r = r.get_code().replace('\n', '') - lst.append(r) - comp_str = str(sorted(lst)) + comp_str = str(sorted(r.description for r in result)) if comp_str != correct: print('Solution @%s not right, received %s, wanted %s'\ % (line_nr - 1, comp_str, correct))