Advertisement
Guest User

Vim plugin

a guest
Feb 11th, 2011
134
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
VIM 3.19 KB | None | 0 0
  1. let s:current_function_bufname = 'Current\ Function\/Subroutine'  
  2. function! s:get_current_function_name(no_echo)  
  3.     let lnum = line(".")  
  4.     let col = col(".")  
  5.     if a:no_echo  
  6.         let s:current_function_name = getline(search("^[^s]*sub .*$", 'bW'))  
  7.     else  
  8.         echohl ModeMsg  
  9.         echo getline(search("^[^s]*sub .*$", 'bW'))  
  10.         "echo getline(search("^[^ \t#/]\\{2}.*[^:]\s*$", 'bW'))  
  11.         echohl None  
  12.     endif  
  13. endfun  
  14.    
  15. let s:previous_winbufnr = 1  
  16. let s:current_function_name = ''  
  17. let s:current_function_buffer_created = 0  
  18. let s:current_function_bufnr = 2  
  19. function! s:show_current_function()  
  20.     let total_buffers = winnr('$')  
  21.     let current_winbufnr = winnr()  
  22.     if s:previous_winbufnr != current_winbufnr  
  23.         if bufname(current_winbufnr) == s:current_function_bufname  
  24.             if s:previous_winbufnr < current_winbufnr  
  25.                 let i = current_winbufnr + 1  
  26.                 if i > total_buffers  
  27.                     let i = 1  
  28.                 endif  
  29.                 if i == s:current_function_bufnr  
  30.                     let i = i + 1  
  31.                 endif  
  32.                 if i > total buffers  
  33.                     let i = 1  
  34.                 endif  
  35.                 exec i.'wincmd w'  
  36.             else  
  37.                 let i = current_winbufnr - 1  
  38.                 if i < 1  
  39.                     let i = total_buffers  
  40.                 endif  
  41.                 if i == s:current_function_bufnr  
  42.                     let i = i - 1  
  43.                 endif  
  44.                 if i < 1  
  45.                     let i = total_buffers  
  46.                 endif  
  47.                 try  
  48.                     exec i.'wincmd w'  
  49.                 finally  
  50.                     exec total_buffers.'wincmd w'  
  51.                 endtry  
  52.             endif  
  53.         endif  
  54.         let s:previous_winbufnr = current_winbufnr  
  55.         return 1  
  56.     endif  
  57.  
  58.     if s:current_function_buffer_created == 0  
  59.         exec 'top 1 split '.s:current_function_bufname  
  60.         call s:set_as_scratch_buffer()  
  61.         let s:current_function_buffer_created = 1  
  62.         let s:current_function_bufnr = winnr()  
  63.     endif  
  64.  
  65.     call s:activate_buffer_by_name(s:current_function_bufname)  
  66.     setlocal modifiable  
  67.  
  68.     call s:get_current_function_name(1)  
  69.     call setline(1, s:current_function_name)  
  70.  
  71.     setlocal nomodifiable  
  72.     call s:activate_buffer_by_name(bufname(current_winbufnr))  
  73. endfunction  
  74.  
  75. function! s:set_as_scratch_buffer()  
  76.    setlocal noswapfile  
  77.    setlocal nomodifiable  
  78.    setlocal bufhidden=delete  
  79.    setlocal buftype=nofile  
  80.    setlocal nobuflisted  
  81.    setlocal nonumber  
  82.    setlocal nowrap  
  83.    setlocal cursorline  
  84. endfunction  
  85.  
  86. function! s:activate_buffer_by_name(name)  
  87.    for i in range(1, winnr('$'))  
  88.       let name = bufname(winbufnr(i))  
  89.       let full_name = fnamemodify(bufname(winbufnr(i)), ':p')  
  90.       if name == a:name || full_name == a:name  
  91.          exec i.'wincmd w'  
  92.          return 1  
  93.       endif  
  94.    endfor  
  95.    return 0  
  96. endfunction  
  97.  
  98. autocmd! CursorMoved,CursorMovedI,BufWinEnter * call s:show_current_function()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement