Wednesday, August 22, 2007

Vim Tips for Java #6: Auto-Bracketing Within Vim

One of the things that I've learnt that Netbeans is able to do, was the ability to perform auto-bracket completion. For a while, I was missing that nifty little feature when I reverted back to using vim, and I tried tweaking around with vim to provide the same feature, only with limited success. Only after writing my tip on tab-completion had I realised that I have already a complete solution in providing for auto-brackets.

The following script I have will allow me to detect whether if I really wanted a closing bracket/brace or whether if has already been inserted previously by the auto-bracketing script, and hence I should skip it, by checking what the current character on the cursor right is. So here's what's needed to be added to your .vimrc in order for it to work:


autocmd Filetype java imap ( ()<left>
function! My_BracketComplete()
let char = strpart(getline('.'), col('.')-1, 1)
if (char == ")")
return "\<Right>"
else
return ")"
endif
endfunction
autocmd FileType java inoremap ) <C-R>=My_BracketComplete()<CR>

autocmd Filetype java imap { {}<left><cr><cr><up><tab>
function! My_BraceComplete()
let char = strpart(getline('.'), col('.')-1, 1)
if (char == ")")
return "\<Right>"
else
return "}"
endif
endfunction
autocmd FileType java inoremap } <C-R>=My_BraceComplete()<CR>


While it is neither the cleanest nor the most elegant way, but it replicates faithfully with what Netbeans does. Unfortunately, this solution will still not work for quotes and double-quotes because of the nature of the 'imap' command, which will make vim go into a non-terminating loop. So if some of you have thought of a better way to do this, do share it with me by posting your solution on my blog.

If you like reading this, you may also enjoy:

4 comments:

albert said...

thanks very much! I've been looking for it, too!

Anonymous said...

vim.org already has a script that solves all these issues (including quotes, and all the other brackets). Its located at:
http://www.vim.org/scripts/script.php?script_id=1849

Vincent Liu said...

Cheers for that, I'll go look it up myself as well :)

Anonymous said...

amazing!

Post a Comment