Vim Tips Wiki
(Remove html character entities)
Line 59: Line 59:
   
 
==Comments==
 
==Comments==
I implemented another way to look for the name of the current function in c_stl.vim (http://hermitte.free.fr/vim/ressources/vimfiles/ftplugin/c/).
+
I implemented another way to look for the name of the current function in c_stl.vim ([http://hermitte.free.fr/vim/ressources/vimfiles/ftplugin/c/ http://hermitte.free.fr/vim/ressources/vimfiles/ftplugin/c/]).
   
 
However the search is very slow and time consuming when we try to guess the current function when there is no current function. I guess using <tt>:normal [[</tt> could have been more effective.
 
However the search is very slow and time consuming when we try to guess the current function when there is no current function. I guess using <tt>:normal [[</tt> could have been more effective.
Line 66: Line 66:
   
 
----
 
----
  +
I have modified the code from above to cater for test case below...
  +
fun! FunctionName()
  +
"set a mark at our current position
  +
normal mz
  +
"while foundcontrol == 1, keep looking up the line to find something that
  +
"isn't a control statement
  +
"find the previous '{' and get the line above it
  +
"if the line matches a control statement, set found control to 1 so
  +
"we can look farther back in the file for the beginning of the
  +
"actual function we are in
  +
let foundstr = ""
  +
let strArrow = ""
  +
let strList = ["while", "for", "if", "else", "try", "catch", "case"]
  +
let foundcontrol = 1
  +
while (foundcontrol)
  +
?{
  +
normal k0
  +
let tempstring = getline(".")
  +
let foundcontrol = 0
  +
for item in strList
  +
let foundstridx=match(tempstring,item)
  +
if(foundstridx &gt;= 0)
  +
let foundstr = strpart(tempstring, foundstridx, 10) . strArrow . foundstr
  +
let tempstring = ""
  +
let strArrow = "&lt;-"
  +
let foundcontrol = 1
  +
break
  +
endif
  +
endfor
  +
if (foundcontrol == 0)
  +
let foundstridx = match(tempstring, "(")
  +
if(foundstridx &gt;= 0)
  +
"we may found a function
  +
"go back to where our original cursor located
  +
normal `z
  +
let tempstring = tempstring . strArrow . foundstr
  +
return tempstring
  +
else
  +
"may not be a function, just a inner block here
  +
let foundcontrol=1
  +
endif
  +
endif
  +
endwhile
  +
return tempstring
  +
endfun
  +
test case:
  +
  +
try place at "hihi" and "hoho" and call the function
  +
function()
  +
{
  +
haha
  +
{
  +
hoho
  +
}
  +
case huhu:
  +
{
  +
hihi
  +
}
  +
}

Revision as of 02:17, 20 July 2009

Duplicate tip

This tip is very similar to the following:

These tips need to be merged – see the merge guidelines.

Tip 1296 Printable Monobook Previous Next

created August 3, 2006 · complexity intermediate · author Alex Esplin · version n/a


In looking through the various tips/scripts available, I couldn't find anything to show the name of the function I was editing if it was nested, such as a member function of a sub-class. Everything else I could find looked in the first column for the latest '{'. To enable this, add the following to your .gvimrc or .vimrc: (I left the comments so anyone who wants to modify this can easily follow it)

fun FunctionName()
  "set a mark at our current position
  normal mz
  "while foundcontrol == 1, keep looking up the line to find something that
  "isn't a control statement
  let foundcontrol = 1
  while (foundcontrol)
    "find the previous '{' and get the line above it
    ?{
    normal k0
    let tempstring = getline(".")
    "if the line matches a control statement, set found control to 1 so
    "we can look farther back in the file for the beginning of the
    "actual function we are in
    if(match(tempstring, "while") >= 0)
      let foundcontrol = 1
    elseif(match(tempstring, "for") >= 0)
      let foundcontrol = 1
    elseif(match(tempstring, "if") >= 0)
      let foundcontrol = 1
    elseif(match(tempstring, "else") >= 0)
      let foundcontrol = 1
    elseif(match(tempstring, "try") >= 0)
      let foundcontrol = 1
    elseif(match(tempstring, "catch") >= 0)
      let foundcontrol = 1
    else
      normal `z
      let foundcontrol = 0
      return tempstring
    endif
  endwhile
  return tempstring
endfun

"this mapping assigns a variable to be the name of the function found by
"FunctionName() then echoes it back so it isn't erased if Vim shifts your
"location on screen returning to the line you started from in FunctionName()
map \func :let name = FunctionName()<CR> :echo name<CR>

Comments

I implemented another way to look for the name of the current function in c_stl.vim (http://hermitte.free.fr/vim/ressources/vimfiles/ftplugin/c/).

However the search is very slow and time consuming when we try to guess the current function when there is no current function. I guess using :normal [[ could have been more effective.

Using the preview windows instead of the statusline could be an option to think about (see previousWord.vim in the same place).


I have modified the code from above to cater for test case below...

fun! FunctionName()
	"set a mark at our current position
	normal mz
	"while foundcontrol == 1, keep looking up the line to find something that
	"isn't a control statement
	"find the previous '{' and get the line above it
	"if the line matches a control statement, set found control to 1 so
	"we can look farther back in the file for the beginning of the
	"actual function we are in
	let foundstr = ""
	let strArrow = ""
	let strList = ["while", "for", "if", "else", "try", "catch", "case"]
	let foundcontrol = 1
	while (foundcontrol)
		?{
		normal k0
		let tempstring = getline(".")
		let foundcontrol = 0
		for item in strList
			let foundstridx=match(tempstring,item)
			if(foundstridx >= 0)
				let foundstr = strpart(tempstring, foundstridx, 10) . strArrow . foundstr 
				let tempstring = ""
				let strArrow = "<-"
				let foundcontrol = 1
				break
			endif
		endfor
		if (foundcontrol == 0)
			let foundstridx = match(tempstring, "(")
			if(foundstridx >= 0)
                                "we may found a function
                                "go back to where our original cursor located
				normal `z
				let tempstring = tempstring . strArrow . foundstr
				return tempstring
			else
                               "may not be a function, just a inner block here
				let foundcontrol=1
			endif
		endif
	endwhile
	return tempstring
endfun

test case:

try place at "hihi" and "hoho" and call the function

function()
{
	haha
	{
		hoho
	}
	case huhu:
	{
		hihi
	}
}