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*63b74a83SBram Moolenaar" Last Change: Sun 17 Mar 2019 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\\) 1798ef233eSBram Moolenaar 1898ef233eSBram Moolenaar" For imports with leading .., append / and replace additional .s with ../ 1998ef233eSBram Moolenaarlet b:grandparent_match = '^\(.\.\)\(\.*\)' 2098ef233eSBram Moolenaarlet b:grandparent_sub = '\=submatch(1)."/".repeat("../",strlen(submatch(2)))' 2198ef233eSBram Moolenaar 2298ef233eSBram Moolenaar" For imports with a single leading ., replace it with ./ 2398ef233eSBram Moolenaarlet b:parent_match = '^\.\(\.\)\@!' 2498ef233eSBram Moolenaarlet b:parent_sub = './' 2598ef233eSBram Moolenaar 2698ef233eSBram Moolenaar" Replace any . sandwiched between word characters with / 2798ef233eSBram Moolenaarlet b:child_match = '\(\w\)\.\(\w\)' 2898ef233eSBram Moolenaarlet b:child_sub = '\1/\2' 2998ef233eSBram Moolenaar 3098ef233eSBram Moolenaarsetlocal includeexpr=substitute(substitute(substitute( 3198ef233eSBram Moolenaar \v:fname, 3298ef233eSBram Moolenaar \b:grandparent_match,b:grandparent_sub,''), 3398ef233eSBram Moolenaar \b:parent_match,b:parent_sub,''), 3498ef233eSBram Moolenaar \b:child_match,b:child_sub,'g') 3598ef233eSBram Moolenaar 36071d4279SBram Moolenaarsetlocal suffixesadd=.py 3736782084SBram Moolenaarsetlocal comments=b:#,fb:- 3836782084SBram Moolenaarsetlocal commentstring=#\ %s 39071d4279SBram Moolenaar 4040962ec9SBram Moolenaarif has('python3') 4140962ec9SBram Moolenaar setlocal omnifunc=python3complete#Complete 42*63b74a83SBram Moolenaarelseif has('python') 43*63b74a83SBram Moolenaar setlocal omnifunc=pythoncomplete#Complete 4440962ec9SBram Moolenaarendif 45a40ceaf8SBram Moolenaar 46071d4279SBram Moolenaarset wildignore+=*.pyc 47071d4279SBram Moolenaar 48dc083288SBram Moolenaarlet b:next_toplevel='\v%$\|^(class\|def\|async def)>' 49dc083288SBram Moolenaarlet b:prev_toplevel='\v^(class\|def\|async def)>' 5001164a65SBram Moolenaarlet b:next_endtoplevel='\v%$\|\S.*\n+(def\|class)' 5101164a65SBram Moolenaarlet b:prev_endtoplevel='\v\S.*\n+(def\|class)' 52dc083288SBram Moolenaarlet b:next='\v%$\|^\s*(class\|def\|async def)>' 53dc083288SBram Moolenaarlet b:prev='\v^\s*(class\|def\|async def)>' 547f2e9d7cSBram Moolenaarlet b:next_end='\v\S\n*(%$\|^(\s*\n*)*(class\|def\|async def)\|^\S)' 557f2e9d7cSBram Moolenaarlet b:prev_end='\v\S\n*(^(\s*\n*)*(class\|def\|async def)\|^\S)' 56e18dbe86SBram Moolenaar 57*63b74a83SBram Moolenaarif !exists('g:no_plugin_maps') && !exists('g:no_python_maps') 587dda86f2SBram Moolenaar execute "nnoremap <silent> <buffer> ]] :call <SID>Python_jump('n', '". b:next_toplevel."', 'W', v:count1)<cr>" 597dda86f2SBram Moolenaar execute "nnoremap <silent> <buffer> [[ :call <SID>Python_jump('n', '". b:prev_toplevel."', 'Wb', v:count1)<cr>" 60*63b74a83SBram Moolenaar execute "nnoremap <silent> <buffer> ][ :call <SID>Python_jump('n', '". b:next_endtoplevel."', 'W', v:count1, 0)<cr>" 61*63b74a83SBram Moolenaar execute "nnoremap <silent> <buffer> [] :call <SID>Python_jump('n', '". b:prev_endtoplevel."', 'Wb', v:count1, 0)<cr>" 627dda86f2SBram Moolenaar execute "nnoremap <silent> <buffer> ]m :call <SID>Python_jump('n', '". b:next."', 'W', v:count1)<cr>" 637dda86f2SBram Moolenaar execute "nnoremap <silent> <buffer> [m :call <SID>Python_jump('n', '". b:prev."', 'Wb', v:count1)<cr>" 64*63b74a83SBram Moolenaar execute "nnoremap <silent> <buffer> ]M :call <SID>Python_jump('n', '". b:next_end."', 'W', v:count1, 0)<cr>" 65*63b74a83SBram Moolenaar execute "nnoremap <silent> <buffer> [M :call <SID>Python_jump('n', '". b:prev_end."', 'Wb', v:count1, 0)<cr>" 66abd468edSBram Moolenaar 677dda86f2SBram Moolenaar execute "onoremap <silent> <buffer> ]] :call <SID>Python_jump('o', '". b:next_toplevel."', 'W', v:count1)<cr>" 687dda86f2SBram Moolenaar execute "onoremap <silent> <buffer> [[ :call <SID>Python_jump('o', '". b:prev_toplevel."', 'Wb', v:count1)<cr>" 69*63b74a83SBram Moolenaar execute "onoremap <silent> <buffer> ][ :call <SID>Python_jump('o', '". b:next_endtoplevel."', 'W', v:count1, 0)<cr>" 70*63b74a83SBram Moolenaar execute "onoremap <silent> <buffer> [] :call <SID>Python_jump('o', '". b:prev_endtoplevel."', 'Wb', v:count1, 0)<cr>" 717dda86f2SBram Moolenaar execute "onoremap <silent> <buffer> ]m :call <SID>Python_jump('o', '". b:next."', 'W', v:count1)<cr>" 727dda86f2SBram Moolenaar execute "onoremap <silent> <buffer> [m :call <SID>Python_jump('o', '". b:prev."', 'Wb', v:count1)<cr>" 73*63b74a83SBram Moolenaar execute "onoremap <silent> <buffer> ]M :call <SID>Python_jump('o', '". b:next_end."', 'W', v:count1, 0)<cr>" 74*63b74a83SBram Moolenaar execute "onoremap <silent> <buffer> [M :call <SID>Python_jump('o', '". b:prev_end."', 'Wb', v:count1, 0)<cr>" 75abd468edSBram Moolenaar 767dda86f2SBram Moolenaar execute "xnoremap <silent> <buffer> ]] :call <SID>Python_jump('x', '". b:next_toplevel."', 'W', v:count1)<cr>" 777dda86f2SBram Moolenaar execute "xnoremap <silent> <buffer> [[ :call <SID>Python_jump('x', '". b:prev_toplevel."', 'Wb', v:count1)<cr>" 78*63b74a83SBram Moolenaar execute "xnoremap <silent> <buffer> ][ :call <SID>Python_jump('x', '". b:next_endtoplevel."', 'W', v:count1, 0)<cr>" 79*63b74a83SBram Moolenaar execute "xnoremap <silent> <buffer> [] :call <SID>Python_jump('x', '". b:prev_endtoplevel."', 'Wb', v:count1, 0)<cr>" 807dda86f2SBram Moolenaar execute "xnoremap <silent> <buffer> ]m :call <SID>Python_jump('x', '". b:next."', 'W', v:count1)<cr>" 817dda86f2SBram Moolenaar execute "xnoremap <silent> <buffer> [m :call <SID>Python_jump('x', '". b:prev."', 'Wb', v:count1)<cr>" 82*63b74a83SBram Moolenaar execute "xnoremap <silent> <buffer> ]M :call <SID>Python_jump('x', '". b:next_end."', 'W', v:count1, 0)<cr>" 83*63b74a83SBram Moolenaar execute "xnoremap <silent> <buffer> [M :call <SID>Python_jump('x', '". b:prev_end."', 'Wb', v:count1, 0)<cr>" 84*63b74a83SBram Moolenaarendif 85071d4279SBram Moolenaar 8636782084SBram Moolenaarif !exists('*<SID>Python_jump') 877dda86f2SBram Moolenaar fun! <SID>Python_jump(mode, motion, flags, count, ...) range 8801164a65SBram Moolenaar let l:startofline = (a:0 >= 1) ? a:1 : 1 8901164a65SBram Moolenaar 90e18dbe86SBram Moolenaar if a:mode == 'x' 91e18dbe86SBram Moolenaar normal! gv 92e18dbe86SBram Moolenaar endif 93e18dbe86SBram Moolenaar 9401164a65SBram Moolenaar if l:startofline == 1 95e18dbe86SBram Moolenaar normal! 0 9601164a65SBram Moolenaar endif 97e18dbe86SBram Moolenaar 987dda86f2SBram Moolenaar let cnt = a:count 99071d4279SBram Moolenaar mark ' 100071d4279SBram Moolenaar while cnt > 0 101e18dbe86SBram Moolenaar call search(a:motion, a:flags) 102071d4279SBram Moolenaar let cnt = cnt - 1 103071d4279SBram Moolenaar endwhile 104e18dbe86SBram Moolenaar 10501164a65SBram Moolenaar if l:startofline == 1 106e18dbe86SBram Moolenaar normal! ^ 10701164a65SBram Moolenaar endif 108071d4279SBram Moolenaar endfun 10936782084SBram Moolenaarendif 110071d4279SBram Moolenaar 11136782084SBram Moolenaarif has("browsefilter") && !exists("b:browsefilter") 112071d4279SBram Moolenaar let b:browsefilter = "Python Files (*.py)\t*.py\n" . 113071d4279SBram Moolenaar \ "All Files (*.*)\t*.*\n" 114071d4279SBram Moolenaarendif 1159a7224b5SBram Moolenaar 116abd468edSBram Moolenaarif !exists("g:python_recommended_style") || g:python_recommended_style != 0 117b1332080SBram Moolenaar " As suggested by PEP8. 118b1332080SBram Moolenaar setlocal expandtab shiftwidth=4 softtabstop=4 tabstop=8 119abd468edSBram Moolenaarendif 120b1332080SBram Moolenaar 121b1332080SBram Moolenaar" First time: try finding "pydoc". 122b1332080SBram Moolenaarif !exists('g:pydoc_executable') 123b1332080SBram Moolenaar if executable('pydoc') 124b1332080SBram Moolenaar let g:pydoc_executable = 1 125b1332080SBram Moolenaar else 126b1332080SBram Moolenaar let g:pydoc_executable = 0 127b1332080SBram Moolenaar endif 128b1332080SBram Moolenaarendif 129*63b74a83SBram Moolenaar 130*63b74a83SBram Moolenaar" Windows-specific pydoc setup 131*63b74a83SBram Moolenaarif has('win32') || has('win64') 132*63b74a83SBram Moolenaar if executable('python') 133*63b74a83SBram Moolenaar " available as Tools\scripts\pydoc.py 134*63b74a83SBram Moolenaar let g:pydoc_executable = 1 135*63b74a83SBram Moolenaar else 136*63b74a83SBram Moolenaar let g:pydoc_executable = 0 137*63b74a83SBram Moolenaar endif 138*63b74a83SBram Moolenaarendif 139*63b74a83SBram Moolenaar 140b1332080SBram Moolenaar" If "pydoc" was found use it for keywordprg. 141b1332080SBram Moolenaarif g:pydoc_executable 142*63b74a83SBram Moolenaar if has('win32') || has('win64') 143*63b74a83SBram Moolenaar setlocal keywordprg=python\ -m\ pydoc\ 144*63b74a83SBram Moolenaar else 145b1332080SBram Moolenaar setlocal keywordprg=pydoc 146b1332080SBram Moolenaar endif 147*63b74a83SBram Moolenaarendif 148*63b74a83SBram Moolenaar 149*63b74a83SBram Moolenaar" Script for filetype switching to undo the local stuff we may have changed 150*63b74a83SBram Moolenaarlet b:undo_ftplugin = 'setlocal cinkeys<' 151*63b74a83SBram Moolenaar \ . '|setlocal comments<' 152*63b74a83SBram Moolenaar \ . '|setlocal commentstring<' 153*63b74a83SBram Moolenaar \ . '|setlocal expandtab<' 154*63b74a83SBram Moolenaar \ . '|setlocal include<' 155*63b74a83SBram Moolenaar \ . '|setlocal includeexpr<' 156*63b74a83SBram Moolenaar \ . '|setlocal indentkeys<' 157*63b74a83SBram Moolenaar \ . '|setlocal keywordprg<' 158*63b74a83SBram Moolenaar \ . '|setlocal omnifunc<' 159*63b74a83SBram Moolenaar \ . '|setlocal shiftwidth<' 160*63b74a83SBram Moolenaar \ . '|setlocal softtabstop<' 161*63b74a83SBram Moolenaar \ . '|setlocal suffixesadd<' 162*63b74a83SBram Moolenaar \ . '|setlocal tabstop<' 163*63b74a83SBram Moolenaar \ . '|silent! nunmap <buffer> [M' 164*63b74a83SBram Moolenaar \ . '|silent! nunmap <buffer> [[' 165*63b74a83SBram Moolenaar \ . '|silent! nunmap <buffer> []' 166*63b74a83SBram Moolenaar \ . '|silent! nunmap <buffer> [m' 167*63b74a83SBram Moolenaar \ . '|silent! nunmap <buffer> ]M' 168*63b74a83SBram Moolenaar \ . '|silent! nunmap <buffer> ][' 169*63b74a83SBram Moolenaar \ . '|silent! nunmap <buffer> ]]' 170*63b74a83SBram Moolenaar \ . '|silent! nunmap <buffer> ]m' 171*63b74a83SBram Moolenaar \ . '|silent! ounmap <buffer> [M' 172*63b74a83SBram Moolenaar \ . '|silent! ounmap <buffer> [[' 173*63b74a83SBram Moolenaar \ . '|silent! ounmap <buffer> []' 174*63b74a83SBram Moolenaar \ . '|silent! ounmap <buffer> [m' 175*63b74a83SBram Moolenaar \ . '|silent! ounmap <buffer> ]M' 176*63b74a83SBram Moolenaar \ . '|silent! ounmap <buffer> ][' 177*63b74a83SBram Moolenaar \ . '|silent! ounmap <buffer> ]]' 178*63b74a83SBram Moolenaar \ . '|silent! ounmap <buffer> ]m' 179*63b74a83SBram Moolenaar \ . '|silent! xunmap <buffer> [M' 180*63b74a83SBram Moolenaar \ . '|silent! xunmap <buffer> [[' 181*63b74a83SBram Moolenaar \ . '|silent! xunmap <buffer> []' 182*63b74a83SBram Moolenaar \ . '|silent! xunmap <buffer> [m' 183*63b74a83SBram Moolenaar \ . '|silent! xunmap <buffer> ]M' 184*63b74a83SBram Moolenaar \ . '|silent! xunmap <buffer> ][' 185*63b74a83SBram Moolenaar \ . '|silent! xunmap <buffer> ]]' 186*63b74a83SBram Moolenaar \ . '|silent! xunmap <buffer> ]m' 187*63b74a83SBram Moolenaar \ . '|unlet! b:browsefilter' 188*63b74a83SBram Moolenaar \ . '|unlet! b:child_match' 189*63b74a83SBram Moolenaar \ . '|unlet! b:child_sub' 190*63b74a83SBram Moolenaar \ . '|unlet! b:grandparent_match' 191*63b74a83SBram Moolenaar \ . '|unlet! b:grandparent_sub' 192*63b74a83SBram Moolenaar \ . '|unlet! b:next' 193*63b74a83SBram Moolenaar \ . '|unlet! b:next_end' 194*63b74a83SBram Moolenaar \ . '|unlet! b:next_endtoplevel' 195*63b74a83SBram Moolenaar \ . '|unlet! b:next_toplevel' 196*63b74a83SBram Moolenaar \ . '|unlet! b:parent_match' 197*63b74a83SBram Moolenaar \ . '|unlet! b:parent_sub' 198*63b74a83SBram Moolenaar \ . '|unlet! b:prev' 199*63b74a83SBram Moolenaar \ . '|unlet! b:prev_end' 200*63b74a83SBram Moolenaar \ . '|unlet! b:prev_endtoplevel' 201*63b74a83SBram Moolenaar \ . '|unlet! b:prev_toplevel' 202*63b74a83SBram Moolenaar \ . '|unlet! b:undo_ftplugin' 203b1332080SBram Moolenaar 2049a7224b5SBram Moolenaarlet &cpo = s:keepcpo 2059a7224b5SBram Moolenaarunlet s:keepcpo 206