xref: /vim-8.2.3635/runtime/ftplugin/python.vim (revision 4f4d51a9)
1071d4279SBram Moolenaar" Vim filetype plugin file
2071d4279SBram Moolenaar" Language:	python
301164a65SBram Moolenaar" Maintainer:	Tom Picton <[email protected]>
401164a65SBram Moolenaar" Previous Maintainer: James Sully <[email protected]>
5c95a302aSBram Moolenaar" Previous Maintainer: Johannes Zellner <[email protected]>
6*4f4d51a9SBram Moolenaar" Last Change:	Mon, 5 October 2020
701164a65SBram Moolenaar" https://github.com/tpict/vim-ftplugin-python
8071d4279SBram Moolenaar
9071d4279SBram Moolenaarif exists("b:did_ftplugin") | finish | endif
10071d4279SBram Moolenaarlet b:did_ftplugin = 1
119a7224b5SBram Moolenaarlet s:keepcpo= &cpo
129a7224b5SBram Moolenaarset cpo&vim
13071d4279SBram Moolenaar
14071d4279SBram Moolenaarsetlocal cinkeys-=0#
15071d4279SBram Moolenaarsetlocal indentkeys-=0#
1692dff182SBram Moolenaarsetlocal include=^\\s*\\(from\\\|import\\)
17*4f4d51a9SBram Moolenaarsetlocal define=^\\s*\\(def\\\|class\\)
1898ef233eSBram Moolenaar
1998ef233eSBram Moolenaar" For imports with leading .., append / and replace additional .s with ../
2098ef233eSBram Moolenaarlet b:grandparent_match = '^\(.\.\)\(\.*\)'
2198ef233eSBram Moolenaarlet b:grandparent_sub = '\=submatch(1)."/".repeat("../",strlen(submatch(2)))'
2298ef233eSBram Moolenaar
2398ef233eSBram Moolenaar" For imports with a single leading ., replace it with ./
2498ef233eSBram Moolenaarlet b:parent_match = '^\.\(\.\)\@!'
2598ef233eSBram Moolenaarlet b:parent_sub = './'
2698ef233eSBram Moolenaar
2798ef233eSBram Moolenaar" Replace any . sandwiched between word characters with /
2898ef233eSBram Moolenaarlet b:child_match = '\(\w\)\.\(\w\)'
2998ef233eSBram Moolenaarlet b:child_sub = '\1/\2'
3098ef233eSBram Moolenaar
3198ef233eSBram Moolenaarsetlocal includeexpr=substitute(substitute(substitute(
3298ef233eSBram Moolenaar      \v:fname,
3398ef233eSBram Moolenaar      \b:grandparent_match,b:grandparent_sub,''),
3498ef233eSBram Moolenaar      \b:parent_match,b:parent_sub,''),
3598ef233eSBram Moolenaar      \b:child_match,b:child_sub,'g')
3698ef233eSBram Moolenaar
37071d4279SBram Moolenaarsetlocal suffixesadd=.py
3836782084SBram Moolenaarsetlocal comments=b:#,fb:-
3936782084SBram Moolenaarsetlocal commentstring=#\ %s
40071d4279SBram Moolenaar
4140962ec9SBram Moolenaarif has('python3')
4240962ec9SBram Moolenaar  setlocal omnifunc=python3complete#Complete
4363b74a83SBram Moolenaarelseif has('python')
4463b74a83SBram Moolenaar  setlocal omnifunc=pythoncomplete#Complete
4540962ec9SBram Moolenaarendif
46a40ceaf8SBram Moolenaar
47071d4279SBram Moolenaarset wildignore+=*.pyc
48071d4279SBram Moolenaar
49dc083288SBram Moolenaarlet b:next_toplevel='\v%$\|^(class\|def\|async def)>'
50dc083288SBram Moolenaarlet b:prev_toplevel='\v^(class\|def\|async def)>'
5101164a65SBram Moolenaarlet b:next_endtoplevel='\v%$\|\S.*\n+(def\|class)'
5201164a65SBram Moolenaarlet b:prev_endtoplevel='\v\S.*\n+(def\|class)'
53dc083288SBram Moolenaarlet b:next='\v%$\|^\s*(class\|def\|async def)>'
54dc083288SBram Moolenaarlet b:prev='\v^\s*(class\|def\|async def)>'
557f2e9d7cSBram Moolenaarlet b:next_end='\v\S\n*(%$\|^(\s*\n*)*(class\|def\|async def)\|^\S)'
567f2e9d7cSBram Moolenaarlet b:prev_end='\v\S\n*(^(\s*\n*)*(class\|def\|async def)\|^\S)'
57e18dbe86SBram Moolenaar
5863b74a83SBram Moolenaarif !exists('g:no_plugin_maps') && !exists('g:no_python_maps')
597dda86f2SBram Moolenaar    execute "nnoremap <silent> <buffer> ]] :call <SID>Python_jump('n', '". b:next_toplevel."', 'W', v:count1)<cr>"
607dda86f2SBram Moolenaar    execute "nnoremap <silent> <buffer> [[ :call <SID>Python_jump('n', '". b:prev_toplevel."', 'Wb', v:count1)<cr>"
6163b74a83SBram Moolenaar    execute "nnoremap <silent> <buffer> ][ :call <SID>Python_jump('n', '". b:next_endtoplevel."', 'W', v:count1, 0)<cr>"
6263b74a83SBram Moolenaar    execute "nnoremap <silent> <buffer> [] :call <SID>Python_jump('n', '". b:prev_endtoplevel."', 'Wb', v:count1, 0)<cr>"
637dda86f2SBram Moolenaar    execute "nnoremap <silent> <buffer> ]m :call <SID>Python_jump('n', '". b:next."', 'W', v:count1)<cr>"
647dda86f2SBram Moolenaar    execute "nnoremap <silent> <buffer> [m :call <SID>Python_jump('n', '". b:prev."', 'Wb', v:count1)<cr>"
6563b74a83SBram Moolenaar    execute "nnoremap <silent> <buffer> ]M :call <SID>Python_jump('n', '". b:next_end."', 'W', v:count1, 0)<cr>"
6663b74a83SBram Moolenaar    execute "nnoremap <silent> <buffer> [M :call <SID>Python_jump('n', '". b:prev_end."', 'Wb', v:count1, 0)<cr>"
67abd468edSBram Moolenaar
687dda86f2SBram Moolenaar    execute "onoremap <silent> <buffer> ]] :call <SID>Python_jump('o', '". b:next_toplevel."', 'W', v:count1)<cr>"
697dda86f2SBram Moolenaar    execute "onoremap <silent> <buffer> [[ :call <SID>Python_jump('o', '". b:prev_toplevel."', 'Wb', v:count1)<cr>"
7063b74a83SBram Moolenaar    execute "onoremap <silent> <buffer> ][ :call <SID>Python_jump('o', '". b:next_endtoplevel."', 'W', v:count1, 0)<cr>"
7163b74a83SBram Moolenaar    execute "onoremap <silent> <buffer> [] :call <SID>Python_jump('o', '". b:prev_endtoplevel."', 'Wb', v:count1, 0)<cr>"
727dda86f2SBram Moolenaar    execute "onoremap <silent> <buffer> ]m :call <SID>Python_jump('o', '". b:next."', 'W', v:count1)<cr>"
737dda86f2SBram Moolenaar    execute "onoremap <silent> <buffer> [m :call <SID>Python_jump('o', '". b:prev."', 'Wb', v:count1)<cr>"
7463b74a83SBram Moolenaar    execute "onoremap <silent> <buffer> ]M :call <SID>Python_jump('o', '". b:next_end."', 'W', v:count1, 0)<cr>"
7563b74a83SBram Moolenaar    execute "onoremap <silent> <buffer> [M :call <SID>Python_jump('o', '". b:prev_end."', 'Wb', v:count1, 0)<cr>"
76abd468edSBram Moolenaar
777dda86f2SBram Moolenaar    execute "xnoremap <silent> <buffer> ]] :call <SID>Python_jump('x', '". b:next_toplevel."', 'W', v:count1)<cr>"
787dda86f2SBram Moolenaar    execute "xnoremap <silent> <buffer> [[ :call <SID>Python_jump('x', '". b:prev_toplevel."', 'Wb', v:count1)<cr>"
7963b74a83SBram Moolenaar    execute "xnoremap <silent> <buffer> ][ :call <SID>Python_jump('x', '". b:next_endtoplevel."', 'W', v:count1, 0)<cr>"
8063b74a83SBram Moolenaar    execute "xnoremap <silent> <buffer> [] :call <SID>Python_jump('x', '". b:prev_endtoplevel."', 'Wb', v:count1, 0)<cr>"
817dda86f2SBram Moolenaar    execute "xnoremap <silent> <buffer> ]m :call <SID>Python_jump('x', '". b:next."', 'W', v:count1)<cr>"
827dda86f2SBram Moolenaar    execute "xnoremap <silent> <buffer> [m :call <SID>Python_jump('x', '". b:prev."', 'Wb', v:count1)<cr>"
8363b74a83SBram Moolenaar    execute "xnoremap <silent> <buffer> ]M :call <SID>Python_jump('x', '". b:next_end."', 'W', v:count1, 0)<cr>"
8463b74a83SBram Moolenaar    execute "xnoremap <silent> <buffer> [M :call <SID>Python_jump('x', '". b:prev_end."', 'Wb', v:count1, 0)<cr>"
8563b74a83SBram Moolenaarendif
86071d4279SBram Moolenaar
8736782084SBram Moolenaarif !exists('*<SID>Python_jump')
887dda86f2SBram Moolenaar  fun! <SID>Python_jump(mode, motion, flags, count, ...) range
8901164a65SBram Moolenaar      let l:startofline = (a:0 >= 1) ? a:1 : 1
9001164a65SBram Moolenaar
91e18dbe86SBram Moolenaar      if a:mode == 'x'
92e18dbe86SBram Moolenaar          normal! gv
93e18dbe86SBram Moolenaar      endif
94e18dbe86SBram Moolenaar
9501164a65SBram Moolenaar      if l:startofline == 1
96e18dbe86SBram Moolenaar          normal! 0
9701164a65SBram Moolenaar      endif
98e18dbe86SBram Moolenaar
997dda86f2SBram Moolenaar      let cnt = a:count
100071d4279SBram Moolenaar      mark '
101071d4279SBram Moolenaar      while cnt > 0
102e18dbe86SBram Moolenaar          call search(a:motion, a:flags)
103071d4279SBram Moolenaar          let cnt = cnt - 1
104071d4279SBram Moolenaar      endwhile
105e18dbe86SBram Moolenaar
10601164a65SBram Moolenaar      if l:startofline == 1
107e18dbe86SBram Moolenaar          normal! ^
10801164a65SBram Moolenaar      endif
109071d4279SBram Moolenaar  endfun
11036782084SBram Moolenaarendif
111071d4279SBram Moolenaar
11236782084SBram Moolenaarif has("browsefilter") && !exists("b:browsefilter")
113071d4279SBram Moolenaar    let b:browsefilter = "Python Files (*.py)\t*.py\n" .
114071d4279SBram Moolenaar                \ "All Files (*.*)\t*.*\n"
115071d4279SBram Moolenaarendif
1169a7224b5SBram Moolenaar
117abd468edSBram Moolenaarif !exists("g:python_recommended_style") || g:python_recommended_style != 0
118b1332080SBram Moolenaar    " As suggested by PEP8.
119*4f4d51a9SBram Moolenaar    setlocal expandtab tabstop=4 softtabstop=4 shiftwidth=4
120abd468edSBram Moolenaarendif
121b1332080SBram Moolenaar
122*4f4d51a9SBram Moolenaar" Use pydoc for keywordprg.
123*4f4d51a9SBram Moolenaar" Unix users preferentially get pydoc3, then pydoc2.
124*4f4d51a9SBram Moolenaar" Windows doesn't have a standalone pydoc executable in $PATH by default, nor
125*4f4d51a9SBram Moolenaar" does it have separate python2/3 executables, so Windows users just get
126*4f4d51a9SBram Moolenaar" whichever version corresponds to their installed Python version.
127*4f4d51a9SBram Moolenaarif executable('python3')
128*4f4d51a9SBram Moolenaar  setlocal keywordprg=python3\ -m\ pydoc
129*4f4d51a9SBram Moolenaarelseif executable('python')
130*4f4d51a9SBram Moolenaar  setlocal keywordprg=python\ -m\ pydoc
13163b74a83SBram Moolenaarendif
13263b74a83SBram Moolenaar
13363b74a83SBram Moolenaar" Script for filetype switching to undo the local stuff we may have changed
13463b74a83SBram Moolenaarlet b:undo_ftplugin = 'setlocal cinkeys<'
13563b74a83SBram Moolenaar      \ . '|setlocal comments<'
13663b74a83SBram Moolenaar      \ . '|setlocal commentstring<'
13763b74a83SBram Moolenaar      \ . '|setlocal expandtab<'
13863b74a83SBram Moolenaar      \ . '|setlocal include<'
13963b74a83SBram Moolenaar      \ . '|setlocal includeexpr<'
14063b74a83SBram Moolenaar      \ . '|setlocal indentkeys<'
14163b74a83SBram Moolenaar      \ . '|setlocal keywordprg<'
14263b74a83SBram Moolenaar      \ . '|setlocal omnifunc<'
14363b74a83SBram Moolenaar      \ . '|setlocal shiftwidth<'
14463b74a83SBram Moolenaar      \ . '|setlocal softtabstop<'
14563b74a83SBram Moolenaar      \ . '|setlocal suffixesadd<'
14663b74a83SBram Moolenaar      \ . '|setlocal tabstop<'
14763b74a83SBram Moolenaar      \ . '|silent! nunmap <buffer> [M'
14863b74a83SBram Moolenaar      \ . '|silent! nunmap <buffer> [['
14963b74a83SBram Moolenaar      \ . '|silent! nunmap <buffer> []'
15063b74a83SBram Moolenaar      \ . '|silent! nunmap <buffer> [m'
15163b74a83SBram Moolenaar      \ . '|silent! nunmap <buffer> ]M'
15263b74a83SBram Moolenaar      \ . '|silent! nunmap <buffer> ]['
15363b74a83SBram Moolenaar      \ . '|silent! nunmap <buffer> ]]'
15463b74a83SBram Moolenaar      \ . '|silent! nunmap <buffer> ]m'
15563b74a83SBram Moolenaar      \ . '|silent! ounmap <buffer> [M'
15663b74a83SBram Moolenaar      \ . '|silent! ounmap <buffer> [['
15763b74a83SBram Moolenaar      \ . '|silent! ounmap <buffer> []'
15863b74a83SBram Moolenaar      \ . '|silent! ounmap <buffer> [m'
15963b74a83SBram Moolenaar      \ . '|silent! ounmap <buffer> ]M'
16063b74a83SBram Moolenaar      \ . '|silent! ounmap <buffer> ]['
16163b74a83SBram Moolenaar      \ . '|silent! ounmap <buffer> ]]'
16263b74a83SBram Moolenaar      \ . '|silent! ounmap <buffer> ]m'
16363b74a83SBram Moolenaar      \ . '|silent! xunmap <buffer> [M'
16463b74a83SBram Moolenaar      \ . '|silent! xunmap <buffer> [['
16563b74a83SBram Moolenaar      \ . '|silent! xunmap <buffer> []'
16663b74a83SBram Moolenaar      \ . '|silent! xunmap <buffer> [m'
16763b74a83SBram Moolenaar      \ . '|silent! xunmap <buffer> ]M'
16863b74a83SBram Moolenaar      \ . '|silent! xunmap <buffer> ]['
16963b74a83SBram Moolenaar      \ . '|silent! xunmap <buffer> ]]'
17063b74a83SBram Moolenaar      \ . '|silent! xunmap <buffer> ]m'
17163b74a83SBram Moolenaar      \ . '|unlet! b:browsefilter'
17263b74a83SBram Moolenaar      \ . '|unlet! b:child_match'
17363b74a83SBram Moolenaar      \ . '|unlet! b:child_sub'
17463b74a83SBram Moolenaar      \ . '|unlet! b:grandparent_match'
17563b74a83SBram Moolenaar      \ . '|unlet! b:grandparent_sub'
17663b74a83SBram Moolenaar      \ . '|unlet! b:next'
17763b74a83SBram Moolenaar      \ . '|unlet! b:next_end'
17863b74a83SBram Moolenaar      \ . '|unlet! b:next_endtoplevel'
17963b74a83SBram Moolenaar      \ . '|unlet! b:next_toplevel'
18063b74a83SBram Moolenaar      \ . '|unlet! b:parent_match'
18163b74a83SBram Moolenaar      \ . '|unlet! b:parent_sub'
18263b74a83SBram Moolenaar      \ . '|unlet! b:prev'
18363b74a83SBram Moolenaar      \ . '|unlet! b:prev_end'
18463b74a83SBram Moolenaar      \ . '|unlet! b:prev_endtoplevel'
18563b74a83SBram Moolenaar      \ . '|unlet! b:prev_toplevel'
18663b74a83SBram Moolenaar      \ . '|unlet! b:undo_ftplugin'
187b1332080SBram Moolenaar
1889a7224b5SBram Moolenaarlet &cpo = s:keepcpo
1899a7224b5SBram Moolenaarunlet s:keepcpo
190