mirror of
https://github.com/inkarkat/vim-ingo-library.git
synced 2026-05-29 11:18:51 +02:00
d223acfa69
For all existing clients, this would be an undesired side effect. We cannot simply use the compat function, as the fallback implementation is not meant for use inside a function. Instead, copy the check from ingo#range#lines#Get() and remove the last search history item if the search pattern got changed.
82 lines
2.9 KiB
VimL
82 lines
2.9 KiB
VimL
" ingo/range.vim: Functions for dealing with ranges and their contents.
|
|
"
|
|
" DEPENDENCIES:
|
|
"
|
|
" Copyright: (C) 2012-2022 Ingo Karkat
|
|
" The VIM LICENSE applies to this script; see ':help copyright'.
|
|
"
|
|
" Maintainer: Ingo Karkat <ingo@karkat.de>
|
|
|
|
function! ingo#range#Get( range )
|
|
"******************************************************************************
|
|
"* PURPOSE:
|
|
" Retrieve the contents of the passed range without clobbering any register.
|
|
"* ASSUMPTIONS / PRECONDITIONS:
|
|
" None.
|
|
"* EFFECTS / POSTCONDITIONS:
|
|
" None.
|
|
"* INPUTS:
|
|
" a:range A valid |:range|; when empty, the current line is used.
|
|
"* RETURN VALUES:
|
|
" Text of the range on lines. Each line ends with a newline character.
|
|
" Throws Vim error "E486: Pattern not found" when the range does not match.
|
|
"******************************************************************************
|
|
let l:save_clipboard = &clipboard
|
|
set clipboard= " Avoid clobbering the selection and clipboard registers.
|
|
let l:save_reg = getreg('"')
|
|
let l:save_regmode = getregtype('"')
|
|
let l:save_search = @/
|
|
let l:keeppatterns = matchstr(ingo#compat#commands#keeppatterns(), '^keeppatterns$')
|
|
try
|
|
silent execute l:keeppatterns a:range . 'yank'
|
|
let l:contents = @"
|
|
finally
|
|
if empty(l:keeppatterns) && @/ !=# l:save_search
|
|
call histdel('search', -1)
|
|
endif
|
|
call setreg('"', l:save_reg, l:save_regmode)
|
|
let &clipboard = l:save_clipboard
|
|
endtry
|
|
|
|
return l:contents
|
|
endfunction
|
|
|
|
function! ingo#range#NetStart( ... )
|
|
"******************************************************************************
|
|
"* PURPOSE:
|
|
" Vim accounts for closed folds and adapts <line1>,<line2> when passed a
|
|
" :{from},{to} range, but not with a single :{lnum} range! As long as the
|
|
" range is forwarded to Ex commands, that's fine. But if you do line
|
|
" arithmethic or use low-level functions like |getline()|, you need to convert
|
|
" via this function.
|
|
"* ASSUMPTIONS / PRECONDITIONS:
|
|
" None.
|
|
"* EFFECTS / POSTCONDITIONS:
|
|
" None.
|
|
"* INPUTS:
|
|
" a:lnum Optional line number; defaults to the current one.
|
|
"* RETURN VALUES:
|
|
" Start line number of the fold covering the line, or the current / passed
|
|
" line number itself.
|
|
"******************************************************************************
|
|
let l:lnum = (a:0 ? a:1 : line('.'))
|
|
return foldclosed(l:lnum) == -1 ? l:lnum : foldclosed(l:lnum)
|
|
endfunction
|
|
function! ingo#range#NetEnd( ... )
|
|
let l:lnum = (a:0 ? a:1 : line('.'))
|
|
return foldclosedend(l:lnum) == -1 ? l:lnum : foldclosedend(l:lnum)
|
|
endfunction
|
|
|
|
function! ingo#range#IsEntireBuffer( startLnum, endLnum )
|
|
return (a:startLnum <= 1 && a:endLnum == line('$'))
|
|
endfunction
|
|
|
|
function! ingo#range#IsOutside( lnum, startLnum, endLnum )
|
|
return (a:lnum < a:startLnum || a:lnum > a:endLnum)
|
|
endfunction
|
|
function! ingo#range#IsInside( lnum, startLnum, endLnum )
|
|
return ! ingo#range#IsOutside(a:lnum, a:startLnum, a:endLnum)
|
|
endfunction
|
|
|
|
" vim: set ts=8 sts=4 sw=4 noexpandtab ff=unix fdm=syntax :
|