Vim – jump to db function under cursor

Our database functions files grouped in the code repository by their schemas. I.e. there is a folder for every schema, and there are sql files named by function name inside the folders. So files hierarchy looks like

schema1
    function1.sql
    function2.sql
schema2
    function3.sql
...

If you have the similar code structure (what is quite common) and use vim as editor, then the following trick let you jump to the database function file under cursor with hotkey combination \gf (analogue with embedded gf – go file)
To go back use either command :b# or keys combination ctrl+shift+6 (all keys are for normal mode)

Place the following code into your .vimrc and redefine the value of the first variable with absolute path to your source directory.
Works only for schema prefixed functions with the corresponding folders in the repository.

""""""""""""""""""""""""""""""""""""""""""""""""
" Go to db function in the local repo
fu! GoFunction()
    " Redefine the _absolute_ path to the db folder
    let l:sourcePath = '/Users/username/db_repo/'

    let l:schema = ''
    let l:ff = ''
    let l:word = expand("") 
    let l:word = matchstr(l:word, '[^\(]*')
    let l:farr = split(l:word, '\.')
    :if len(l:farr) != 2
        echo 'Word "' . expand("") . '" is not a function'
    :else
        let l:schema = l:farr[0]
        let l:ff = l:farr[1]

        let l:fpath = l:sourcePath . l:schema .'/'. l:ff . '.sql'
        :if filereadable(l:fpath)
            execute ':edit ' l:fpath
        :else
            echo 'Can not read file ' l:fpath
        :endif
    :endif

    unlet l:sourcePath l:schema l:ff l:farr l:fpath l:word
endfu

nmap \gf :call GoFunction()
"""""""""""""""""""""""""""""""""""""""""""""""""

Hope it will be useful for somebody.

Advertisements
This entry was posted in Vim. Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s