74 lines
2.4 KiB
VimL
74 lines
2.4 KiB
VimL
" Set up tabs
|
|
setlocal expandtab
|
|
setlocal tabstop=8
|
|
setlocal shiftwidth=4
|
|
setlocal softtabstop=4
|
|
|
|
" Set up text width
|
|
setlocal textwidth=0
|
|
|
|
" Set up format options
|
|
" c - Auto-wrap comments using textwidth
|
|
" r - Automatically insert the current comment leader after hitting <Enter>
|
|
" in Insert mode
|
|
" o - Automatically insert the current comment leader after hitting 'o' or
|
|
" 'O' in Normal mode.
|
|
setlocal formatoptions+=cro
|
|
|
|
" Highlight erroneous tabs
|
|
syn match pythonTabError '\t\+'
|
|
hi pythonTabError ctermbg=red guibg=red
|
|
|
|
" Set up file encoding
|
|
setlocal encoding=utf-8
|
|
|
|
" Set up file format
|
|
setlocal fileformat=unix
|
|
let g:python_highlight_all=1
|
|
|
|
" Mappings
|
|
nnoremap K :YcmCompleter GetDoc<CR>
|
|
|
|
" Set custom fold expression
|
|
setlocal foldmethod=expr
|
|
setlocal foldexpr=PythonFold(v:lnum)
|
|
|
|
" Custom fold function greedyily matches following blank lines
|
|
function! PythonFold(lnum)
|
|
let l:line = getline(a:lnum)
|
|
|
|
" Blank lines, comments, and docstrings use previous fold level
|
|
if l:line =~ '^\(\s*\|#.*\|"\(""\)\=.*\)$'
|
|
return '='
|
|
" Keywords beginning indented blocks start a fold
|
|
elseif l:line =~ '^\s*class\s\+\w*(\w*)\s*:\s*$'
|
|
\ || l:line =~ '^\s*def\s\+\w\+\s*(.*)\s*:\s*$'
|
|
\ || l:line =~ '^\s*if\s\+.*:\s*$'
|
|
\ || l:line =~ '^\s*elif\s\+.*:\s*$'
|
|
\ || l:line =~ '^\s*else\s*:\s*$'
|
|
\ || l:line =~ '^\s*for\s\+.*:\s*$'
|
|
\ || l:line =~ '^\s*while\s\+.*:\s*$'
|
|
\ || l:line =~ '^\s*try\s*:\s*$'
|
|
\ || l:line =~ '^\s*except\s*.*:\s*$'
|
|
return '>'.string((indent(a:lnum) / &shiftwidth) + 1)
|
|
" Opening curly braces, not in a string, add a fold level
|
|
elseif l:line =~ '{' && l:line !~ '}' && l:line !~ "'.*{.*'" && l:line !~ '".*{.*"'
|
|
return 'a1'
|
|
" Closing curly braces, not in a string, substract a fold level
|
|
elseif l:line =~ '}' && l:line !~ '{' && l:line !~ "'.*}.*'" && l:line !~ '".*}.*"'
|
|
return 's1'
|
|
" Opening square braces, not in a string, add a fold level
|
|
elseif l:line =~ '[' && l:line !~ ']' && l:line !~ "'.*[.*'" && l:line !~ '".*].*"'
|
|
return 'a1'
|
|
" Closing square braces, not in a string, substract a fold level
|
|
elseif l:line =~ ']' && l:line !~ '[' && l:line !~ "'.*].*'" && l:line !~ '".*[.*"'
|
|
return 's1'
|
|
" Calculate lines with a lower indent than the previous line
|
|
elseif indent(a:lnum) < indent(a:lnum - 1)
|
|
return string((indent(a:lnum) / &shiftwidth))
|
|
endif
|
|
|
|
" Finally all unmatched lines use fold level from previous line
|
|
return '='
|
|
endfunction
|