Rafid
Rafid

Reputation: 20249

Vim : Moving Through Code

I want to be able to navigate the cursor across functions using Vim. Mainly, I want a command to allow me to go to the next function, like } allows me to go to the next paragraph. I found this:

Go to the end of the C++ function in Vim

Unfortunately, it doesn't seem to work fine in JavaScript. Also, I believe it would also not work for Python, as Python don't depend much on { and }.

Any help?

Upvotes: 9

Views: 1048

Answers (2)

Fonnae
Fonnae

Reputation: 523

I believe the standard vim motions will work for you in javascript. I think the $VIMRUNTIME/ftplugin/javascript.vim file defines function/Class/etc boundaries.

See :h ]m:

                        *]m*
]m          Go to [count] next start of a method (for Java or
            similar structured language).  When not before the
            start of a method, jump to the start or end of the
            class.  When no '{' is found after the cursor, this is
            an error.  |exclusive| motion.
                        *]M*
]M          Go to [count] next end of a method (for Java or
            similar structured language).  When not before the end
            of a method, jump to the start or end of the class.
            When no '}' is found after the cursor, this is an
            error. |exclusive| motion.
                        *[m*
[m          Go to [count] previous start of a method (for Java or
            similar structured language).  When not after the
            start of a method, jump to the start or end of the
            class.  When no '{' is found before the cursor this is
            an error. |exclusive| motion.
                        *[M*
[M          Go to [count] previous end of a method (for Java or
            similar structured language).  When not after the
            end of a method, jump to the start or end of the
            class.  When no '}' is found before the cursor this is
            an error. |exclusive| motion.

More precise JS movements from this: https://github.com/okcompute/vim-javascript-motions

For python, see $VIMRUNTIME/ftplugin/python.vim:

    execute "nnoremap <silent> <buffer> ]] :call <SID>Python_jump('n', '". b:next_toplevel."', 'W', v:count1)<cr>"
    execute "nnoremap <silent> <buffer> [[ :call <SID>Python_jump('n', '". b:prev_toplevel."', 'Wb', v:count1)<cr>"
    execute "nnoremap <silent> <buffer> ][ :call <SID>Python_jump('n', '". b:next_endtoplevel."', 'W', v:count1, 0)<cr>"
    execute "nnoremap <silent> <buffer> [] :call <SID>Python_jump('n', '". b:prev_endtoplevel."', 'Wb', v:count1, 0)<cr>"
    execute "nnoremap <silent> <buffer> ]m :call <SID>Python_jump('n', '". b:next."', 'W', v:count1)<cr>"
    execute "nnoremap <silent> <buffer> [m :call <SID>Python_jump('n', '". b:prev."', 'Wb', v:count1)<cr>"
    execute "nnoremap <silent> <buffer> ]M :call <SID>Python_jump('n', '". b:next_end."', 'W', v:count1, 0)<cr>"
    execute "nnoremap <silent> <buffer> [M :call <SID>Python_jump('n', '". b:prev_end."', 'Wb', v:count1, 0)<cr>"

Upvotes: 0

Stephen Paulger
Stephen Paulger

Reputation: 5343

In a Python file I find:

  • } will take me to the end of a block,
  • ]] will take me to the start of the next function.
  • [[ takes me to the start of the current function, or the one above if I keep pressing.

]} didn't seem to work though.

Upvotes: 8

Related Questions