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