homeresumeabout
Custom VIM functions to navigate buffers by class names
08.08.21
So. I know the title is not the greatest. Sorry. :-) Here's what I'm trying to do in GVIM:
  1. Navigate from the current buffer to another buffer (by selecting a word that can be interpreted as the name of the file I want to go to).
  2. Keep a list of where I've been.
  3. Navigate back to previous files - in reverse order of when I saw them.
  4. Use simple controls that make sense in navigating forward and backward.
Yeah... that's why the title was a bit of a stretch.
In the end I used C-LeftMouse (Control + Left click) to navigate forward, and C-RightMouse to navigate backward. I know it's a bit backward, but it follows navigating forward with the left mouse when you're in a web page. The code I put in my _vimrc (the underscore comes from using GVIM on msWin) is shown below:
let s:bufNameList = []

function PushFileJump()
	if len(s:bufNameList) == 0
		let prev = bufname("#")
		call add(s:bufNameList, strpart( prev, 0, stridx(prev,".") ) )
	endif
	call add(s:bufNameList, getreg('z') )
endfunction

function PopFileJump()
	if len(s:bufNameList) > 0
		call remove(s:bufNameList,-1)
		call setreg( 'z', get(s:bufNameList,-1) )
	endif
endfunction

map! <C-LeftMouse> <LeftMouse><Esc>b"zye:b<Space><C-r>z.<C-q>	<CR>:call PushFileJump()<CR>
map <C-LeftMouse> <LeftMouse>b"zye:b<Space><C-r>z.<C-q>	<CR>:call PushFileJump()<CR>
map! <C-RightMouse>  <Esc>:call PopFileJump()<CR>:b<Space><C-r>z.<C-q>	<CR>
map <C-RightMouse>  :call PopFileJump()<CR>:b<Space><C-r>z.<C-q>	<CR>

To explain a bit, I used a List, and carried the file I want to go to in the z register. C-LeftMouse copies the word I clicked on into the z register, navigates to that word as a file, and then calls PushFileJump to add the new file into the List.
The only reason why PushFileJump is a bit more complex than that is because I need to add the previous buffers name to the List if it was the file I started navigating at.
C-RightMouse is simpler. It calls PopFileJump, which removes the current buffer name and sets the z register to the last buffer name in the List. The rest of the mapped command for C-RightMouse finishes using the z register to navigate to the previously seen file.
This should allow me to quickly navigate forward and backward - but it throws away anything I back over... so there is still some room for improvement.