rename: refactor into do_rename, add rename_visual

This adds a visual mode map for renaming, which asks for the new name
via input().

`rename` itself could be changed to use `input()`, too - but I've left
it for now.
This commit is contained in:
Daniel Hahler
2015-05-02 18:51:08 +02:00
parent 154e2dbae3
commit 4d67c1a6e3
3 changed files with 57 additions and 38 deletions

View File

@@ -179,6 +179,10 @@ function! jedi#rename(...)
PythonJedi jedi_vim.rename() PythonJedi jedi_vim.rename()
endfunction endfunction
function! jedi#rename_visual(...)
PythonJedi jedi_vim.rename_visual()
endfunction
function! jedi#completions(findstart, base) function! jedi#completions(findstart, base)
PythonJedi jedi_vim.completions() PythonJedi jedi_vim.completions()
endfunction endfunction

View File

@@ -19,6 +19,7 @@ if g:jedi#auto_initialization
" rename " rename
if g:jedi#rename_command != '' if g:jedi#rename_command != ''
execute "nnoremap <buffer> ".g:jedi#rename_command." :call jedi#rename()<CR>" execute "nnoremap <buffer> ".g:jedi#rename_command." :call jedi#rename()<CR>"
execute "vnoremap <buffer> ".g:jedi#rename_command." :call jedi#rename_visual()<CR>"
endif endif
" documentation/pydoc " documentation/pydoc
if g:jedi#documentation_command != '' if g:jedi#documentation_command != ''

View File

@@ -425,63 +425,77 @@ def rename():
vim_command('autocmd InsertLeave <buffer> call jedi#rename(1)') vim_command('autocmd InsertLeave <buffer> call jedi#rename(1)')
vim_command('augroup END') vim_command('augroup END')
vim_eval("let s:jedi_replace_orig = expand('<cword>')") vim_command("let s:jedi_replace_orig = expand('<cword>')")
vim_command('normal! diw') vim_command('normal! diw')
vim_command(':startinsert') vim_command(':startinsert')
else: else:
# reset autocommand # reset autocommand
vim_command('autocmd! jedi_rename InsertLeave') vim_command('autocmd! jedi_rename InsertLeave')
# Save original window / tab.
saved_tab = int(vim_eval('tabpagenr()'))
saved_win = int(vim_eval('winnr()'))
replace = vim_eval("expand('<cword>')") replace = vim_eval("expand('<cword>')")
vim_command('normal! u') # undo new word vim_command('normal! u') # undo new word
cursor = vim.current.window.cursor cursor = vim.current.window.cursor
vim_command('normal! u') # undo the space at the end vim_command('normal! u') # undo the space at the end
vim.current.window.cursor = cursor vim.current.window.cursor = cursor
if replace is None: return do_rename(replace)
echo_highlight('No rename possible, if no name is given.')
else:
orig = vim_eval('s:jedi_replace_orig')
temp_rename = goto(is_related_name=True, no_output=True)
# sort the whole thing reverse (positions at the end of the line
# must be first, because they move the stuff before the position).
temp_rename = sorted(temp_rename, reverse=True,
key=lambda x: (x.module_path, x.start_pos))
buffers = set()
for r in temp_rename:
if r.in_builtin_module():
continue
if vim.current.buffer.name != r.module_path:
result = new_buffer(r.module_path)
if not result:
echo_highlight("Jedi-vim: failed to create buffer window for {}!".format(r.module_path))
continue
buffers.add(vim.current.buffer.name) def rename_visual():
replace = vim.eval('input("Rename to: ")')
orig = vim.eval('getline(".")[(getpos("\'<")[2]-1):getpos("\'>")[2]]')
do_rename(replace, orig)
# Save view.
saved_view = vim_eval('winsaveview()')
vim.current.window.cursor = r.start_pos def do_rename(replace, orig = None):
vim_command('normal! c{:d}l{}'.format(len(orig), replace)) if replace is None:
echo_highlight('No rename possible, if no name is given.')
return
# Restore view. if orig is None:
vim_command('call winrestview(%s)' % PythonToVimStr(saved_view)) orig = vim_eval('s:jedi_replace_orig')
# Restore previous tab and window. # Save original window / tab.
vim_command('tabnext {:d}'.format(saved_tab)) saved_tab = int(vim_eval('tabpagenr()'))
vim_command('{:d}wincmd w'.format(saved_win)) saved_win = int(vim_eval('winnr()'))
if len(buffers) > 1: temp_rename = goto(is_related_name=True, no_output=True)
echo_highlight('Jedi did {:d} renames in {:d} buffers!'.format( # sort the whole thing reverse (positions at the end of the line
len(temp_rename), len(buffers))) # must be first, because they move the stuff before the position).
else: temp_rename = sorted(temp_rename, reverse=True,
echo_highlight('Jedi did {:d} renames!'.format(len(temp_rename))) key=lambda x: (x.module_path, x.start_pos))
buffers = set()
for r in temp_rename:
if r.in_builtin_module():
continue
if vim.current.buffer.name != r.module_path:
result = new_buffer(r.module_path)
if not result:
echo_highlight("Jedi-vim: failed to create buffer window for {}!".format(r.module_path))
continue
buffers.add(vim.current.buffer.name)
# Save view.
saved_view = vim_eval('winsaveview()')
# Replace original word.
vim.current.window.cursor = r.start_pos
vim_command('normal! c{:d}l{}'.format(len(orig), replace))
# Restore view.
vim_command('call winrestview(%s)' % PythonToVimStr(saved_view))
# Restore previous tab and window.
vim_command('tabnext {:d}'.format(saved_tab))
vim_command('{:d}wincmd w'.format(saved_win))
if len(buffers) > 1:
echo_highlight('Jedi did {:d} renames in {:d} buffers!'.format(
len(temp_rename), len(buffers)))
else:
echo_highlight('Jedi did {:d} renames!'.format(len(temp_rename)))
@_check_jedi_availability(show_error=True) @_check_jedi_availability(show_error=True)