mirror of
https://github.com/inkarkat/vim-ingo-library.git
synced 2026-05-29 11:18:51 +02:00
111 lines
3.8 KiB
VimL
111 lines
3.8 KiB
VimL
" ingo/window/dimensions.vim: Functions for querying aspects of window dimensions.
|
|
"
|
|
" DEPENDENCIES:
|
|
" - ingo/folds.vim autoload script
|
|
"
|
|
" Copyright: (C) 2008-2013 Ingo Karkat
|
|
" The VIM LICENSE applies to this script; see ':help copyright'.
|
|
"
|
|
" Maintainer: Ingo Karkat <ingo@karkat.de>
|
|
"
|
|
" REVISION DATE REMARKS
|
|
" 1.004.001 08-Apr-2013 file creation from autoload/ingowindow.vim
|
|
|
|
" Determine the number of lines in the passed range that aren't folded away;
|
|
" folded ranges count only as one line. Visible doesn't mean "currently
|
|
" displayed in the window"; for that, you could create the difference of the
|
|
" start and end winline(), or use ingo#window#dimensions#DisplayedLines().
|
|
function! ingo#window#dimensions#NetVisibleLines( startLine, endLine )
|
|
return a:endLine - a:startLine + 1 - ingo#folds#FoldedLines(a:startLine, a:endLine)[1]
|
|
endfunction
|
|
|
|
" Determine the range of lines that are currently displayed in the window.
|
|
function! ingo#window#dimensions#DisplayedLines()
|
|
let l:startLine = winsaveview().topline
|
|
let l:endLine = l:startLine
|
|
let l:screenLineCnt = 0
|
|
while l:screenLineCnt < winheight(0)
|
|
let l:lastFoldedLine = foldclosedend(l:endLine)
|
|
if l:lastFoldedLine == -1
|
|
let l:endLine += 1
|
|
else
|
|
let l:endLine = l:lastFoldedLine + 1
|
|
endif
|
|
|
|
let l:screenLineCnt += 1
|
|
endwhile
|
|
|
|
return [l:startLine, l:endLine - 1]
|
|
endfunction
|
|
|
|
|
|
|
|
function! ingo#window#dimensions#GetNumberWidth( isGetAbsoluteNumberWidth )
|
|
"******************************************************************************
|
|
"* PURPOSE:
|
|
" Get the width of the number column for the current window.
|
|
"* ASSUMPTIONS / PRECONDITIONS:
|
|
" None.
|
|
"* EFFECTS / POSTCONDITIONS:
|
|
" None.
|
|
"* INPUTS:
|
|
" a:isGetAbsoluteNumberWidth If true, assumes absolute number are requested.
|
|
" Otherwise, determines whether 'number' or
|
|
" 'relativenumber' are actually set and calculates
|
|
" based on the actual window settings.
|
|
"* RETURN VALUES:
|
|
" Width for displaying numbers. To use the result for printf()-style
|
|
" formatting of numbers, subtract 1:
|
|
" printf('%' . (ingo#window#dimensions#GetNumberWidth(1) - 1) . 'd', l:lnum)
|
|
"******************************************************************************
|
|
let l:maxNumber = 0
|
|
" Note: 'numberwidth' is only the minimal width, can be more if...
|
|
if &l:number || a:isGetAbsoluteNumberWidth
|
|
" ...the buffer has many lines.
|
|
let l:maxNumber = line('$')
|
|
elseif exists('+relativenumber') && &l:relativenumber
|
|
" ...the window width has more digits.
|
|
let l:maxNumber = winheight(0)
|
|
endif
|
|
if l:maxNumber > 0
|
|
let l:actualNumberWidth = strlen(string(l:maxNumber)) + 1
|
|
return (l:actualNumberWidth > &l:numberwidth ? l:actualNumberWidth : &l:numberwidth)
|
|
else
|
|
return 0
|
|
endif
|
|
endfunction
|
|
|
|
" Determine the number of virtual columns of the current window that are not
|
|
" used for displaying buffer contents, but contain window decoration like line
|
|
" numbers, fold column and signs.
|
|
function! ingo#window#dimensions#WindowDecorationColumns()
|
|
let l:decorationColumns = 0
|
|
let l:decorationColumns += ingo#window#dimensions#GetNumberWidth(0)
|
|
|
|
if has('folding')
|
|
let l:decorationColumns += &l:foldcolumn
|
|
endif
|
|
|
|
if has('signs')
|
|
redir => l:signsOutput
|
|
silent execute 'sign place buffer=' . bufnr('')
|
|
redir END
|
|
|
|
" The ':sign place' output contains two header lines.
|
|
" The sign column is fixed at two columns.
|
|
if len(split(l:signsOutput, "\n")) > 2
|
|
let l:decorationColumns += 2
|
|
endif
|
|
endif
|
|
|
|
return l:decorationColumns
|
|
endfunction
|
|
|
|
" Determine the number of virtual columns of the current window that are
|
|
" available for displaying buffer contents.
|
|
function! ingo#window#dimensions#NetWindowWidth()
|
|
return winwidth(0) - ingo#window#dimensions#WindowDecorationColumns()
|
|
endfunction
|
|
|
|
" vim: set ts=8 sts=4 sw=4 noexpandtab ff=unix fdm=syntax :
|