Vim Tips Wiki
Advertisement

Previous TipNext Tip

Tip: #822 - Add Java import statements automatically

Created: November 17, 2004 12:18 Complexity: basic Author: Richard Faber Version: 5.7 Karma: 6/3 Imported from: Tip#822

I like the build (make) process to be fast... Eclipse/Netbeans users are excited about "auto-import" features...

Vim can do it just fine.... Well, I just got this working today....and it may need some tweaking.

If It doesn't work for you.... take some java.... that compiles... break one of the imports (assume you don't using foo.*; syntax much).

Then comment lines below starting from bottom up.... watch editing happen.... try to do edits slow to reproduce whats here.

I generally hit F1 key to build with (jikes) (tip # 3).... 90% of build failures are missing import statements....

If you already have a ctags system (tip #804, 94, etc)... the information can be found!

I hit F1 (:make), then hit F9 (add import for keword found under cursor)...then F1 (make/build)....and so on. (FAST)


(Add Import)

noremap <F9> <esc>
\<C-W>}o//TEMP MARKER<esc> 
\<C-W>P1G/public class<cr><esc>yy<C-W>pG?import<cr><esc>p<esc> 
\<C-W>P1G/package<cr><esc>yy<C-W>pG?import<cr><esc>p<esc> 
\$xa.<esc>0jwwi<cr><esc>kdd<esc> 
\wDx<esc>kJxx<esc>$a;<esc> 
\0cwimport<esc> 
\:update<cr><esc> 
\/TEMP MARKER<cr>dd<esc> 

(Make)

:noremap <F1> :update<cr>:make<cr><C-W>j<esc>:cw 3<cr><C-W>p

Comments

the JavaImp plugin (http://www.vim.org/scripts/script.php?script_id=325) is also a very good solution to this problem.

it has some other nice goodies as well (i use a slightly modified version of it for auto import, smart import sorting, and tab completion of class names).

Anonymous , November 18, 2004 9:37


This change handles Interfaces too...(Assumes public starts at col 0. Note: public final class not working)

\<C-W>P1G/^public <cr><esc>yy<C-W>pG?import<cr><esc>p<esc> 
(PS. Thanks for reminder about [/scripts/script.php?script_id=325 vimscript #325]. Currently, its too complex for me... but good script ideas) 
(My favorite, really, is to let perl do the filtering.... It has nice regex) 

Richard Faber

Anonymous , November 19, 2004 7:54


A slightly more robust implementation, but essentially the same:


noremap <F5> :call JavaInsertImport()<CR> function! JavaInsertImport()

exe "normal mz" 
let cur_class = expand("<cword>") 
try 
exe "normal \<C-W>}" 
exe "normal \<C-W>P" 
1 
if search('^public.* \%(class\|interface\) ' . cur_class) > 0 
1 
if search('^package ') > 0 
yank y 
else 
throw "Package definition not found!" 
endif 
else 
throw cur_class . ": class not found!" 
endif 
exe "normal \<C-W>pG" 
" insert after last import or in first line 
if search('^import ', 'b') > 0 
put y 
else 
1 
put! y 
endif 
exe "normal cwimport\<Esc>$R." . cur_class . ";\<Esc>" 
catch /.*/ 
echoerr v:exception 
finally 
exe "normal \<C-W>z" 
exe "normal `z" 
endtry 

endfunction


Anonymous , November 23, 2004 14:25


Very cool..... Thanks for the above post.... works much better than my hack. (Richard Faber)

Anonymous , November 24, 2004 7:04


Thanks!

I have a couple of small improvements. Do not add import statement if one already exists and update regexps to cope better with whitespaces.

noremap <F5> :call JavaInsertImport()<CR> function! JavaInsertImport()

exe "normal mz" 
let cur_class = expand("<cword>") 
try 
if search('^\s*import\s.*\.' . cur_class . '\s*;') > 0 
throw getline('.') . ": import already exist!" 
endif 
exe "normal \<C-W>}" 
exe "normal \<C-W>P" 
1 
if search('^\s*public.*\s\%(class\|interface\)\s\+' . cur_class) > 0 
1 
if search('^\s*package\s') > 0 
yank y 
else 
throw "Package definition not found!" 
endif 
else 
throw cur_class . ": class not found!" 
endif 
exe "normal \<C-W>pG" 
" insert after last import or in first line 
if search('^\s*import\s', 'b') > 0 
put y 
else 
1 
put! y 
endif 
exe "normal d0cwimport\<Esc>" 
substitute/\s\+/ /g 
exe "normal 2ER." . cur_class . ";\<Esc>lD" 
catch /.*/ 
echoerr v:exception 
finally 
exe "normal \<C-W>z" 
exe "normal `z" 
endtry 

endfunction

Anonymous , November 24, 2004 15:01


By the way Richard, I'm not trying to be rude or the likes by posting as Anonymous. I do have an account on vim.org and I actually thought that the posts were signed with my user name when I was logged in, but apparantly not!

..Jess Thrysoee

Thrysoee , November 24, 2004 15:20


Revised version which doesn't clutter the buffer list and uses wincmd

noremap <F5> :call JavaInsertImport()<CR> function! JavaInsertImport()

exe "normal mz" 
let cur_class = expand("<cword>") 
try 
if search('^\s*import\s.*\.' . cur_class . '\s*;') > 0 
throw getline('.') . ": import already exist!" 
endif 
wincmd } 
wincmd P 
1 
if search('^\s*public.*\s\%(class\|interface\)\s\+' . cur_class) > 0 
1 
if search('^\s*package\s') > 0 
yank y 
else 
throw "Package definition not found!" 
endif 
else 
throw cur_class . ": class not found!" 
endif 
wincmd p 
normal G 
" insert after last import or in first line 
if search('^\s*import\s', 'b') > 0 
put y 
else 
1 
put! y 
endif 
substitute/^\s*package/import/g 
substitute/\s\+/ /g 
exe "normal 2ER." . cur_class . ";\<Esc>lD" 
catch /.*/ 
echoerr v:exception 
finally 
" wipe preview window (from buffer list) 
silent! wincmd P 
if &previewwindow 
bwipeout 
endif 
exe "normal `z" 
endtry 

endfunction


Thrysoee , December 2, 2004 14:23


Advertisement