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