Question

Background

  • I'm creating a Most Recently Used Function Browser plugin for Vim.
  • I need to find the name of the current function the cursor is in.
  • For other languages I could search for "{ }" enclosures, but python uses whitespace/tabs.

Example

Assume I have these functions in foo.py...

def foo(file):
    fileLines = []
    with open(file, 'r') as f:
        for line in f:
            fileLines.append(line)

    def nested_function():
        pass

    # FILE POSITION
    for line in fileLines:
        print line

I want to write a function that returns the name of the function of a position ("FILE POSITION" in the example)

def get_function_scope(sourceFile, lineNumber, columnNumber):
    pass

So for the above example I want something like...

fxnName = get_function_scope("foo.py", lineNumber=9, columnNumber=4)
print fxnName
# "foo"

Approaches

  • Exuberant CTags gives me a nice list of all function/class/method locations but not the line numbers of the scope each function occupies.
  • Not sure if inspect can help even if code isn't "live"?
  • I'm thinking of working backwards from the indents until I reach a function/method definition.

Is there is a standard way of doing this that I'm not aware of?

Was it helpful?

Solution

This is a solution I came up with:

https://gist.github.com/cgreer/7366297

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top