50 lines
1.8 KiB
VimL
50 lines
1.8 KiB
VimL
|
""" indentation seek functions
|
||
|
|
||
|
" Jump to the next or previous line that has the same level or a lower
|
||
|
" level of indentation than the current line.
|
||
|
"
|
||
|
" exclusive (bool): true: Motion is exclusive
|
||
|
" false: Motion is inclusive
|
||
|
" fwd (bool): true: Go to next line
|
||
|
" false: Go to previous line
|
||
|
" lowerlevel (bool): true: Go to line with lower indentation level
|
||
|
" false: Go to line with the same indentation level
|
||
|
" skipblanks (bool): true: Skip blank lines
|
||
|
" false: Don't skip blank lines
|
||
|
function! NextIndent(exclusive, fwd, lowerlevel, skipblanks)
|
||
|
let line = line('.')
|
||
|
let column = col('.')
|
||
|
let lastline = line('$')
|
||
|
let indent = indent(line)
|
||
|
let stepvalue = a:fwd ? 1 : -1
|
||
|
while (line > 0 && line <= lastline)
|
||
|
let line = line + stepvalue
|
||
|
if ( ! a:lowerlevel && indent(line) == indent ||
|
||
|
\ a:lowerlevel && indent(line) < indent)
|
||
|
if (! a:skipblanks || strlen(getline(line)) > 0)
|
||
|
if (a:exclusive)
|
||
|
let line = line - stepvalue
|
||
|
endif
|
||
|
exe line
|
||
|
exe "normal " column . "|"
|
||
|
return
|
||
|
endif
|
||
|
endif
|
||
|
endwhile
|
||
|
endfunction
|
||
|
|
||
|
" Moving back and forth between lines of same or lower indentation.
|
||
|
nnoremap <silent> [l :call NextIndent(0, 0, 0, 1)<CR>
|
||
|
nnoremap <silent> ]l :call NextIndent(0, 1, 0, 1)<CR>
|
||
|
nnoremap <silent> [L :call NextIndent(0, 0, 1, 1)<CR>
|
||
|
nnoremap <silent> ]L :call NextIndent(0, 1, 1, 1)<CR>
|
||
|
vnoremap <silent> [l <Esc>:call NextIndent(0, 0, 0, 1)<CR>m'gv''
|
||
|
vnoremap <silent> ]l <Esc>:call NextIndent(0, 1, 0, 1)<CR>m'gv''
|
||
|
vnoremap <silent> [L <Esc>:call NextIndent(0, 0, 1, 1)<CR>m'gv''
|
||
|
vnoremap <silent> ]L <Esc>:call NextIndent(0, 1, 1, 1)<CR>m'gv''
|
||
|
onoremap <silent> [l :call NextIndent(0, 0, 0, 1)<CR>
|
||
|
onoremap <silent> ]l :call NextIndent(0, 1, 0, 1)<CR>
|
||
|
onoremap <silent> [L :call NextIndent(1, 0, 1, 1)<CR>
|
||
|
onoremap <silent> ]L :call NextIndent(1, 1, 1, 1)<CR>
|
||
|
|