Skip to content

Commit

Permalink
Key mapping <Leader>R: Rename vars/functions/classes without deleting…
Browse files Browse the repository at this point in the history
… the word under the cursor

This pull request also adds the support for 'set selection=exclusive' to
the function 'rename_visual()' (bug fix).

'<Leader>R' in Normal mode:
---------------------------
Jedi-vim keeps the word under the cursor, moves the cursor to the end of the
word, and puts Vim in insert mode, where the user is expected to enter the
new variable name.

'<Leader>R' in Visual mode:
---------------------------
Use the selected text as the default answer to the prompt.
  • Loading branch information
jamescherti committed Dec 26, 2022
1 parent e073385 commit f286f9e
Show file tree
Hide file tree
Showing 5 changed files with 53 additions and 9 deletions.
1 change: 1 addition & 0 deletions README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -207,6 +207,7 @@ get more information. If you set them to ``""``, they are not assigned.
let g:jedi#usages_command = "<leader>n"
let g:jedi#completions_command = "<C-Space>"
let g:jedi#rename_command = "<leader>r"
let g:jedi#rename_command_keep_name = "<leader>R"
An example for setting up your project:

Expand Down
9 changes: 9 additions & 0 deletions autoload/jedi.vim
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ let s:default_settings = {
\ 'call_signatures_command': "'<leader>n'",
\ 'usages_command': "'<leader>n'",
\ 'rename_command': "'<leader>r'",
\ 'rename_command_keep_name': "'<leader>R'",
\ 'completions_enabled': 1,
\ 'popup_on_dot': 'g:jedi#completions_enabled',
\ 'documentation_command': "'K'",
Expand Down Expand Up @@ -370,6 +371,14 @@ function! jedi#rename_visual(...) abort
python3 jedi_vim.rename_visual()
endfunction

function! jedi#rename_keep_name(...) abort
python3 jedi_vim.rename(delete_word=False)
endfunction

function! jedi#rename_visual_keep_name(...) abort
python3 jedi_vim.rename_visual(use_selected_text_as_prompt_answer=True)
endfunction

function! jedi#completions(findstart, base) abort
python3 jedi_vim.completions()
endfunction
Expand Down
21 changes: 17 additions & 4 deletions doc/jedi-vim.txt
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,9 @@ Contents *jedi-vim-contents*
5.4 Go to stub |g:jedi#goto_stubs_command|
5.5. Show documentation |g:jedi#documentation_command|
5.6. Rename variables |g:jedi#rename_command|
5.7. Show name usages |g:jedi#usages_command|
5.8. Open module by name |:Pyimport|
5.7. Rename variables (Reuse name) |g:jedi#rename_command_keep_name|
5.8. Show name usages |g:jedi#usages_command|
5.9. Open module by name |:Pyimport|
6. Configuration |jedi-vim-configuration|
6.1. auto_initialization |g:jedi#auto_initialization|
6.2. auto_vim_configuration |g:jedi#auto_vim_configuration|
Expand Down Expand Up @@ -307,15 +308,27 @@ with the new one. The number of performed renames is displayed in the command
line.

------------------------------------------------------------------------------
5.7. `g:jedi#usages_command` *g:jedi#usages_command*
5.7. `g:jedi#rename_command_keep_name` *g:jedi#rename_command_keep_name*
Function: `jedi#rename()`
Default: <leader>R Rename variables
(This key mapping does not delete the word under the cursor)

Jedi-vim keeps the word currently under the cursor, moves the cursor to the end
of the word, and puts Vim in insert mode, where the user is expected to enter
the new variable name. Upon leaving insert mode, Jedi-vim then renames all
occurrences of the old variable name with the new one. The number of performed
renames is displayed in the command line.

------------------------------------------------------------------------------
5.8. `g:jedi#usages_command` *g:jedi#usages_command*
Function: `jedi#usages()`
Default: <leader>n Show usages of a name.

The quickfix window is populated with a list of all names which point to the
definition of the name under the cursor.

------------------------------------------------------------------------------
5.8. Open module by name *:Pyimport*
5.9. Open module by name *:Pyimport*
Function: `jedi#py_import(args)`
Default: :Pyimport e.g. `:Pyimport os` shows os.py in VIM.

Expand Down
4 changes: 4 additions & 0 deletions ftplugin/python/jedi.vim
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,10 @@ if g:jedi#auto_initialization
execute 'nnoremap <buffer> '.g:jedi#rename_command.' :call jedi#rename()<CR>'
execute 'vnoremap <buffer> '.g:jedi#rename_command.' :call jedi#rename_visual()<CR>'
endif
if len(g:jedi#rename_command_keep_name)
execute 'nnoremap <buffer> '.g:jedi#rename_command_keep_name.' :call jedi#rename_keep_name()<CR>'
execute 'vnoremap <buffer> '.g:jedi#rename_command_keep_name.' :call jedi#rename_visual_keep_name()<CR>'
endif
" documentation/pydoc
if len(g:jedi#documentation_command)
execute 'nnoremap <silent> <buffer>'.g:jedi#documentation_command.' :call jedi#show_documentation()<CR>'
Expand Down
27 changes: 22 additions & 5 deletions pythonx/jedi_vim.py
Original file line number Diff line number Diff line change
Expand Up @@ -998,7 +998,7 @@ def too_long():

@_check_jedi_availability(show_error=True)
@catch_and_print_exceptions
def rename():
def rename(delete_word=True):
if not int(vim.eval('a:0')):
# Need to save the cursor position before insert mode
cursor = vim.current.window.cursor
Expand All @@ -1010,7 +1010,12 @@ def rename():

vim_command("let s:jedi_replace_orig = expand('<cword>')")
line = vim_eval('getline(".")')
vim_command('normal! diw')

if delete_word:
vim_command('normal! diw')
else:
vim_command('normal! yiwel')

if re.match(r'\w+$', line[cursor[1]:]):
# In case the deleted word is at the end of the line we need to
# move the cursor to the end.
Expand Down Expand Up @@ -1042,9 +1047,17 @@ def rename():
return do_rename(replace)


def rename_visual():
replace = vim.eval('input("Rename to: ")')
orig = vim.eval('getline(".")[(getpos("\'<")[2]-1):getpos("\'>")[2]]')
def rename_visual(use_selected_text_as_prompt_answer=False):
orig = vim.eval('getline(".")[(getpos("\'<")[2]-1):getpos("\'>")[2]'
'-((&selection ==# "exclusive") ? 2 : 1)]')

input_text = ""
if use_selected_text_as_prompt_answer:
input_text = orig

replace = vim.eval(
'input("Rename to:", "{}")'.format(PythonToVimStr(input_text))
)
do_rename(replace, orig)


Expand All @@ -1056,6 +1069,10 @@ def do_rename(replace, orig=None):
if orig is None:
orig = vim_eval('s:jedi_replace_orig')

if orig == replace:
echo_highlight('Jedi did 0 renames.')
return

# Save original window / tab.
saved_tab = int(vim_eval('tabpagenr()'))
saved_win = int(vim_eval('winnr()'))
Expand Down

0 comments on commit f286f9e

Please sign in to comment.