" Only do this when not done yet for this buffer if exists("b:did_editortools_ftplugin") finish endif let b:did_editortools_ftplugin = 1 map pp :call EditorToolsMenu() map pL :call RenameVariable() map pP :call RenamePackageFromPath() map pI :call IntroduceTemporaryVariable() function! EditorToolsMenu() let list = [ "RenameVariable", "RenamePackageFromPath", "IntroduceTemporaryVariable" ] let command = PickFromList( "EditorTools Command", list ) if command == "" echo "cancelling" return endif let Fn = function(command) call Fn() endfunction function! RenameVariable() let newvar = input("New variable name? ") if newvar == "" echo "cancelling" return endif let line = line('.') " should backtrack to $ or % or the like let col = col('.') let filename = expand('%') let command = "editortools renamevariable -c " . col . " -l " . line . " -r " . newvar call Exec_command_and_replace_buffer( command ) endfunction function! RenamePackageFromPath() let line = line('.') let col = col('.') let filename = expand('%') let command = "editortools renamepackagefrompath -f " . filename call Exec_command_and_replace_buffer( command ) endfunction function! IntroduceTemporaryVariable() range let start_pos = getpos("'<") let end_pos = getpos("'>") let start_str = start_pos[1] . "," . start_pos[2] let end_str = end_pos[1] . "," . end_pos[2] let varname = input("Name for temporary variable? ") let cmd = "editortools introducetemporaryvariable -s " . start_str . " -e " . end_str if varname != "" let cmd .= " -v " . varname endif call Exec_command_and_replace_buffer( cmd ) endfunction " Utility functions ------------- " Execute a command using the shell and replace the entire buffer " with the retuned contents. TODO: Needs error handling function! Exec_command_and_replace_buffer(command) " echo a:command let buffer_contents = join( getline(1,"$"), "\n" ) let result_str = system(a:command, buffer_contents ) let result = split( result_str, "\n" ) call setline( 1, result ) endfunction " Ovid's function to implement a simple menu function! PickFromList( name, list, ... ) let lines = [ 'Choose a '. a:name . ':' ] \ + map(range(1, len(a:list)), 'v:val .": ". a:list[v:val - 1]') let choice = inputlist(lines) - 1 if ( choice < 0 ) return "" else return a:list[choice] endif endfunction