xref: /vim-8.2.3635/runtime/ftplugin/python.vim (revision 7dda86f2)
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