xref: /vim-8.2.3635/runtime/ftplugin/python.vim (revision 98ef233e)
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*98ef233eSBram Moolenaar" Last Change:	Sun, 18 March 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\\)
17*98ef233eSBram Moolenaar
18*98ef233eSBram Moolenaar" For imports with leading .., append / and replace additional .s with ../
19*98ef233eSBram Moolenaarlet b:grandparent_match = '^\(.\.\)\(\.*\)'
20*98ef233eSBram Moolenaarlet b:grandparent_sub = '\=submatch(1)."/".repeat("../",strlen(submatch(2)))'
21*98ef233eSBram Moolenaar
22*98ef233eSBram Moolenaar" For imports with a single leading ., replace it with ./
23*98ef233eSBram Moolenaarlet b:parent_match = '^\.\(\.\)\@!'
24*98ef233eSBram Moolenaarlet b:parent_sub = './'
25*98ef233eSBram Moolenaar
26*98ef233eSBram Moolenaar" Replace any . sandwiched between word characters with /
27*98ef233eSBram Moolenaarlet b:child_match = '\(\w\)\.\(\w\)'
28*98ef233eSBram Moolenaarlet b:child_sub = '\1/\2'
29*98ef233eSBram Moolenaar
30*98ef233eSBram Moolenaarsetlocal includeexpr=substitute(substitute(substitute(
31*98ef233eSBram Moolenaar      \v:fname,
32*98ef233eSBram Moolenaar      \b:grandparent_match,b:grandparent_sub,''),
33*98ef233eSBram Moolenaar      \b:parent_match,b:parent_sub,''),
34*98ef233eSBram Moolenaar      \b:child_match,b:child_sub,'g')
35*98ef233eSBram 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
56abd468edSBram Moolenaarexecute "nnoremap <silent> <buffer> ]] :call <SID>Python_jump('n', '". b:next_toplevel."', 'W')<cr>"
57abd468edSBram Moolenaarexecute "nnoremap <silent> <buffer> [[ :call <SID>Python_jump('n', '". b:prev_toplevel."', 'Wb')<cr>"
5801164a65SBram Moolenaarexecute "nnoremap <silent> <buffer> ][ :call <SID>Python_jump('n', '". b:next_endtoplevel."', 'W', 0)<cr>"
5901164a65SBram Moolenaarexecute "nnoremap <silent> <buffer> [] :call <SID>Python_jump('n', '". b:prev_endtoplevel."', 'Wb', 0)<cr>"
60abd468edSBram Moolenaarexecute "nnoremap <silent> <buffer> ]m :call <SID>Python_jump('n', '". b:next."', 'W')<cr>"
61abd468edSBram Moolenaarexecute "nnoremap <silent> <buffer> [m :call <SID>Python_jump('n', '". b:prev."', 'Wb')<cr>"
6201164a65SBram Moolenaarexecute "nnoremap <silent> <buffer> ]M :call <SID>Python_jump('n', '". b:next_end."', 'W', 0)<cr>"
6301164a65SBram Moolenaarexecute "nnoremap <silent> <buffer> [M :call <SID>Python_jump('n', '". b:prev_end."', 'Wb', 0)<cr>"
64abd468edSBram Moolenaar
65abd468edSBram Moolenaarexecute "onoremap <silent> <buffer> ]] :call <SID>Python_jump('o', '". b:next_toplevel."', 'W')<cr>"
66abd468edSBram Moolenaarexecute "onoremap <silent> <buffer> [[ :call <SID>Python_jump('o', '". b:prev_toplevel."', 'Wb')<cr>"
677f2e9d7cSBram Moolenaarexecute "onoremap <silent> <buffer> ][ :call <SID>Python_jump('o', '". b:next_endtoplevel."', 'W', 0)<cr>"
687f2e9d7cSBram Moolenaarexecute "onoremap <silent> <buffer> [] :call <SID>Python_jump('o', '". b:prev_endtoplevel."', 'Wb', 0)<cr>"
69abd468edSBram Moolenaarexecute "onoremap <silent> <buffer> ]m :call <SID>Python_jump('o', '". b:next."', 'W')<cr>"
70abd468edSBram Moolenaarexecute "onoremap <silent> <buffer> [m :call <SID>Python_jump('o', '". b:prev."', 'Wb')<cr>"
7101164a65SBram Moolenaarexecute "onoremap <silent> <buffer> ]M :call <SID>Python_jump('o', '". b:next_end."', 'W', 0)<cr>"
7201164a65SBram Moolenaarexecute "onoremap <silent> <buffer> [M :call <SID>Python_jump('o', '". b:prev_end."', 'Wb', 0)<cr>"
73abd468edSBram Moolenaar
74abd468edSBram Moolenaarexecute "xnoremap <silent> <buffer> ]] :call <SID>Python_jump('x', '". b:next_toplevel."', 'W')<cr>"
75abd468edSBram Moolenaarexecute "xnoremap <silent> <buffer> [[ :call <SID>Python_jump('x', '". b:prev_toplevel."', 'Wb')<cr>"
767f2e9d7cSBram Moolenaarexecute "xnoremap <silent> <buffer> ][ :call <SID>Python_jump('x', '". b:next_endtoplevel."', 'W', 0)<cr>"
777f2e9d7cSBram Moolenaarexecute "xnoremap <silent> <buffer> [] :call <SID>Python_jump('x', '". b:prev_endtoplevel."', 'Wb', 0)<cr>"
78abd468edSBram Moolenaarexecute "xnoremap <silent> <buffer> ]m :call <SID>Python_jump('x', '". b:next."', 'W')<cr>"
79abd468edSBram Moolenaarexecute "xnoremap <silent> <buffer> [m :call <SID>Python_jump('x', '". b:prev."', 'Wb')<cr>"
8001164a65SBram Moolenaarexecute "xnoremap <silent> <buffer> ]M :call <SID>Python_jump('x', '". b:next_end."', 'W', 0)<cr>"
8101164a65SBram Moolenaarexecute "xnoremap <silent> <buffer> [M :call <SID>Python_jump('x', '". b:prev_end."', 'Wb', 0)<cr>"
82071d4279SBram Moolenaar
8336782084SBram Moolenaarif !exists('*<SID>Python_jump')
8401164a65SBram Moolenaar  fun! <SID>Python_jump(mode, motion, flags, ...) 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
95071d4279SBram Moolenaar      let cnt = v:count1
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