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*7dda86f2SBram Moolenaar" Last Change: Sun, 15 April 2018 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 4018144c84SBram Moolenaarsetlocal omnifunc=pythoncomplete#Complete 4140962ec9SBram Moolenaarif has('python3') 4240962ec9SBram Moolenaar setlocal omnifunc=python3complete#Complete 4340962ec9SBram Moolenaarendif 44a40ceaf8SBram Moolenaar 45071d4279SBram Moolenaarset wildignore+=*.pyc 46071d4279SBram Moolenaar 47dc083288SBram Moolenaarlet b:next_toplevel='\v%$\|^(class\|def\|async def)>' 48dc083288SBram Moolenaarlet b:prev_toplevel='\v^(class\|def\|async def)>' 4901164a65SBram Moolenaarlet b:next_endtoplevel='\v%$\|\S.*\n+(def\|class)' 5001164a65SBram Moolenaarlet b:prev_endtoplevel='\v\S.*\n+(def\|class)' 51dc083288SBram Moolenaarlet b:next='\v%$\|^\s*(class\|def\|async def)>' 52dc083288SBram Moolenaarlet b:prev='\v^\s*(class\|def\|async def)>' 537f2e9d7cSBram Moolenaarlet b:next_end='\v\S\n*(%$\|^(\s*\n*)*(class\|def\|async def)\|^\S)' 547f2e9d7cSBram Moolenaarlet b:prev_end='\v\S\n*(^(\s*\n*)*(class\|def\|async def)\|^\S)' 55e18dbe86SBram Moolenaar 56*7dda86f2SBram Moolenaarexecute "nnoremap <silent> <buffer> ]] :call <SID>Python_jump('n', '". b:next_toplevel."', 'W', v:count1)<cr>" 57*7dda86f2SBram Moolenaarexecute "nnoremap <silent> <buffer> [[ :call <SID>Python_jump('n', '". b:prev_toplevel."', 'Wb', v:count1)<cr>" 58*7dda86f2SBram Moolenaarexecute "nnoremap <silent> <buffer> ][ :call <SID>Python_jump('n', '". b:next_endtoplevel."', 'W', 0, v:count1)<cr>" 59*7dda86f2SBram Moolenaarexecute "nnoremap <silent> <buffer> [] :call <SID>Python_jump('n', '". b:prev_endtoplevel."', 'Wb', 0, v:count1)<cr>" 60*7dda86f2SBram Moolenaarexecute "nnoremap <silent> <buffer> ]m :call <SID>Python_jump('n', '". b:next."', 'W', v:count1)<cr>" 61*7dda86f2SBram Moolenaarexecute "nnoremap <silent> <buffer> [m :call <SID>Python_jump('n', '". b:prev."', 'Wb', v:count1)<cr>" 62*7dda86f2SBram Moolenaarexecute "nnoremap <silent> <buffer> ]M :call <SID>Python_jump('n', '". b:next_end."', 'W', 0, v:count1)<cr>" 63*7dda86f2SBram Moolenaarexecute "nnoremap <silent> <buffer> [M :call <SID>Python_jump('n', '". b:prev_end."', 'Wb', 0, v:count1)<cr>" 64abd468edSBram Moolenaar 65*7dda86f2SBram Moolenaarexecute "onoremap <silent> <buffer> ]] :call <SID>Python_jump('o', '". b:next_toplevel."', 'W', v:count1)<cr>" 66*7dda86f2SBram Moolenaarexecute "onoremap <silent> <buffer> [[ :call <SID>Python_jump('o', '". b:prev_toplevel."', 'Wb', v:count1)<cr>" 67*7dda86f2SBram Moolenaarexecute "onoremap <silent> <buffer> ][ :call <SID>Python_jump('o', '". b:next_endtoplevel."', 'W', 0, v:count1)<cr>" 68*7dda86f2SBram Moolenaarexecute "onoremap <silent> <buffer> [] :call <SID>Python_jump('o', '". b:prev_endtoplevel."', 'Wb', 0, v:count1)<cr>" 69*7dda86f2SBram Moolenaarexecute "onoremap <silent> <buffer> ]m :call <SID>Python_jump('o', '". b:next."', 'W', v:count1)<cr>" 70*7dda86f2SBram Moolenaarexecute "onoremap <silent> <buffer> [m :call <SID>Python_jump('o', '". b:prev."', 'Wb', v:count1)<cr>" 71*7dda86f2SBram Moolenaarexecute "onoremap <silent> <buffer> ]M :call <SID>Python_jump('o', '". b:next_end."', 'W', 0, v:count1)<cr>" 72*7dda86f2SBram Moolenaarexecute "onoremap <silent> <buffer> [M :call <SID>Python_jump('o', '". b:prev_end."', 'Wb', 0, v:count1)<cr>" 73abd468edSBram Moolenaar 74*7dda86f2SBram Moolenaarexecute "xnoremap <silent> <buffer> ]] :call <SID>Python_jump('x', '". b:next_toplevel."', 'W', v:count1)<cr>" 75*7dda86f2SBram Moolenaarexecute "xnoremap <silent> <buffer> [[ :call <SID>Python_jump('x', '". b:prev_toplevel."', 'Wb', v:count1)<cr>" 76*7dda86f2SBram Moolenaarexecute "xnoremap <silent> <buffer> ][ :call <SID>Python_jump('x', '". b:next_endtoplevel."', 'W', 0, v:count1)<cr>" 77*7dda86f2SBram Moolenaarexecute "xnoremap <silent> <buffer> [] :call <SID>Python_jump('x', '". b:prev_endtoplevel."', 'Wb', 0, v:count1)<cr>" 78*7dda86f2SBram Moolenaarexecute "xnoremap <silent> <buffer> ]m :call <SID>Python_jump('x', '". b:next."', 'W', v:count1)<cr>" 79*7dda86f2SBram Moolenaarexecute "xnoremap <silent> <buffer> [m :call <SID>Python_jump('x', '". b:prev."', 'Wb', v:count1)<cr>" 80*7dda86f2SBram Moolenaarexecute "xnoremap <silent> <buffer> ]M :call <SID>Python_jump('x', '". b:next_end."', 'W', 0, v:count1)<cr>" 81*7dda86f2SBram Moolenaarexecute "xnoremap <silent> <buffer> [M :call <SID>Python_jump('x', '". b:prev_end."', 'Wb', 0, v:count1)<cr>" 82071d4279SBram Moolenaar 8336782084SBram Moolenaarif !exists('*<SID>Python_jump') 84*7dda86f2SBram Moolenaar fun! <SID>Python_jump(mode, motion, flags, count, ...) range 8501164a65SBram Moolenaar let l:startofline = (a:0 >= 1) ? a:1 : 1 8601164a65SBram Moolenaar 87e18dbe86SBram Moolenaar if a:mode == 'x' 88e18dbe86SBram Moolenaar normal! gv 89e18dbe86SBram Moolenaar endif 90e18dbe86SBram Moolenaar 9101164a65SBram Moolenaar if l:startofline == 1 92e18dbe86SBram Moolenaar normal! 0 9301164a65SBram Moolenaar endif 94e18dbe86SBram Moolenaar 95*7dda86f2SBram Moolenaar let cnt = a:count 96071d4279SBram Moolenaar mark ' 97071d4279SBram Moolenaar while cnt > 0 98e18dbe86SBram Moolenaar call search(a:motion, a:flags) 99071d4279SBram Moolenaar let cnt = cnt - 1 100071d4279SBram Moolenaar endwhile 101e18dbe86SBram Moolenaar 10201164a65SBram Moolenaar if l:startofline == 1 103e18dbe86SBram Moolenaar normal! ^ 10401164a65SBram Moolenaar endif 105071d4279SBram Moolenaar endfun 10636782084SBram Moolenaarendif 107071d4279SBram Moolenaar 10836782084SBram Moolenaarif has("browsefilter") && !exists("b:browsefilter") 109071d4279SBram Moolenaar let b:browsefilter = "Python Files (*.py)\t*.py\n" . 110071d4279SBram Moolenaar \ "All Files (*.*)\t*.*\n" 111071d4279SBram Moolenaarendif 1129a7224b5SBram Moolenaar 113abd468edSBram Moolenaarif !exists("g:python_recommended_style") || g:python_recommended_style != 0 114b1332080SBram Moolenaar " As suggested by PEP8. 115b1332080SBram Moolenaar setlocal expandtab shiftwidth=4 softtabstop=4 tabstop=8 116abd468edSBram Moolenaarendif 117b1332080SBram Moolenaar 118b1332080SBram Moolenaar" First time: try finding "pydoc". 119b1332080SBram Moolenaarif !exists('g:pydoc_executable') 120b1332080SBram Moolenaar if executable('pydoc') 121b1332080SBram Moolenaar let g:pydoc_executable = 1 122b1332080SBram Moolenaar else 123b1332080SBram Moolenaar let g:pydoc_executable = 0 124b1332080SBram Moolenaar endif 125b1332080SBram Moolenaarendif 126b1332080SBram Moolenaar" If "pydoc" was found use it for keywordprg. 127b1332080SBram Moolenaarif g:pydoc_executable 128b1332080SBram Moolenaar setlocal keywordprg=pydoc 129b1332080SBram Moolenaarendif 130b1332080SBram Moolenaar 1319a7224b5SBram Moolenaarlet &cpo = s:keepcpo 1329a7224b5SBram Moolenaarunlet s:keepcpo 133