mirror of
https://github.com/inkarkat/vim-ingo-library.git
synced 2026-05-29 11:18:51 +02:00
51 lines
1.7 KiB
VimL
51 lines
1.7 KiB
VimL
" ingo/range/invert.vim: Functions for inverting ranges.
|
|
"
|
|
" DEPENDENCIES:
|
|
"
|
|
" Copyright: (C) 2016 Ingo Karkat
|
|
" The VIM LICENSE applies to this script; see ':help copyright'.
|
|
"
|
|
" Maintainer: Ingo Karkat <ingo@karkat.de>
|
|
"
|
|
" REVISION DATE REMARKS
|
|
" 1.029.001 21-Dec-2016 file creation
|
|
|
|
function! ingo#range#invert#Invert( startLnum, endLnum, ranges )
|
|
"******************************************************************************
|
|
"* PURPOSE:
|
|
" Invert the ranges in a:ranges. Lines within a:startLnum, a:endLnum that were
|
|
" contained in the ranges will be out, and all other lines will be in.
|
|
"* ASSUMPTIONS / PRECONDITIONS:
|
|
" None.
|
|
"* EFFECTS / POSTCONDITIONS:
|
|
" None.
|
|
"* INPUTS:
|
|
" a:startLnum First line number to be considered.
|
|
" a:endLnum Last line number to be considered.
|
|
" a:ranges List of [start, end] pairs in ascending, non-overlapping order.
|
|
" Invoke ingo#range#merge#Merge() first if necessary.
|
|
"* RETURN VALUES:
|
|
" List of [start, end] pairs in ascending order.
|
|
"******************************************************************************
|
|
let l:result = []
|
|
|
|
let l:lastIncludedLnum = a:startLnum - 1
|
|
for [l:fromLnum, l:toLnum] in a:ranges
|
|
call s:Add(l:result, a:startLnum, a:endLnum, l:lastIncludedLnum + 1, l:fromLnum - 1)
|
|
let l:lastIncludedLnum = l:toLnum
|
|
endfor
|
|
call s:Add(l:result, a:startLnum, a:endLnum, l:lastIncludedLnum + 1, a:endLnum)
|
|
return l:result
|
|
endfunction
|
|
function! s:Add( target, startLnum, endLnum, fromLnum, toLnum )
|
|
let l:fromLnum = max([a:startLnum, a:fromLnum])
|
|
let l:toLnum = min([a:endLnum, a:toLnum])
|
|
|
|
if l:fromLnum > l:toLnum
|
|
return
|
|
endif
|
|
call add(a:target, [l:fromLnum, l:toLnum])
|
|
endfunction
|
|
|
|
" vim: set ts=8 sts=4 sw=4 noexpandtab ff=unix fdm=syntax :
|