aboutsummaryrefslogtreecommitdiff
path: root/autoload/squeeze_repeat_blanks.vim
blob: 1429fcf07dbb5b23bd0036c9ac4ec52ac59077b3 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
" Reduce all groups of blank lines within range to the last line in that
" group, deleting the others.
function! squeeze_repeat_blanks#Squeeze(start, end) abort

  " List of line numbers to delete
  let l:deletions = []

  " Flag for whether we've encountered a blank line group
  let l:group = 0

  " Pattern for what constitutes a 'blank'; configurable per-buffer
  let l:pattern = get(b:, 'squeeze_repeat_blanks_blank', '^$')

  " Iterate through the lines, collecting numbers to delete
  for l:num in range(a:start, a:end)

    " End a blank group if the current line doesn't match the pattern
    if getline(l:num) !~# l:pattern
      let l:group = 0

    " If we've found a repeated blank line, flag the one before it for
    " deletion; this way we end up with the last line of the group
    elseif l:group
      let l:deletions += [l:num - 1]

    " If this is the first blank line, start a group
    else
      let l:group = 1
    endif

  endfor

  " Delete each flagged line, in reverse order so that renumbering doesn't
  " bite us
  for l:num in reverse(l:deletions)
    silent execute l:num . 'delete'
  endfor

  " Report how many lines were deleted
  echomsg len(l:deletions) . ' deleted'

endfunction