aboutsummaryrefslogtreecommitdiff
path: root/autoload/big_file_options.vim
blob: 21ab0a09fc77872cb2f8b20037bac895ec96ba02 (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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
" If we can use filesize to detect the big file early, we should
function! big_file_options#CheckPre(filename) abort

  " Try and get filesize, bail out if we can't
  let size = getfsize(a:filename)
  if size == -1
    return
  endif

  " Set the buffer's big flag to whether the file is verifiably outsize
  let b:big_file_options_big = size == -2 || size > s:Limit()

  " If we found it's a big file, call the early options set
  if b:big_file_options_big
    call s:SetPre()
  endif

endfunction

" If it's still indeterminate (stdin read?), try to check the buffer size
" itself
function! big_file_options#CheckPost() abort

  " The BufReadPre hook couldn't tell how big the file was; we'll examine it
  " now it's loaded into the buffer instead
  if !exists('b:big_file_options_big')

    " Test buffer size, bail if that doesn't work either
    let size = line2byte(line('$') + 1)
    if size == -1
      return
    endif

    " Flag the buffer's oversize status, if it's positive, we'll catch up and
    " run the early options set now
    let b:big_file_options_big = size > s:Limit()
    if b:big_file_options_big
      call s:SetPre()
    endif

  endif

  " If the buffer size is verifiably over the threshold, run the late options
  " set
  if b:big_file_options_big
    call s:SetPost()
  endif

endfunction

" Wrapper function to get the configured size limit, default to 10 MiB
function! s:Limit() abort
  let limit = get(g:, 'big_file_options_limit', 10 * 1024 * 1024)
  return limit
endfunction

" These options can and should be set as early as possible
function! s:SetPre() abort

  " These are always set
  setlocal noswapfile
  setlocal undolevels=-1
  if has('persistent_undo')
    setlocal noundofile
  endif

  " Decide whether to set readonly options
  let readonly = get(g:, 'big_file_options_readonly', 1)
  if readonly
    setlocal buftype=nowrite
    setlocal nomodifiable
    setlocal readonly
  endif
endfunction

" These options need to be set later, after the buffer has loaded
function! s:SetPost() abort

  " Force filetype off
  setlocal filetype=NONE

  " Disable syntax highlighting if configured
  let syntax = get(g:, 'big_file_options_syntax', 0)
  if !syntax
    setlocal syntax=OFF
  endif

  " Force maximum syntax columns down if configured
  let synmaxcol = get(g:, 'big_file_options_synmaxcol', 256)
  if &synmaxcol > synmaxcol
    let &l:synmaxcol = synmaxcol
  endif

  " Tell the user what we've done
  echomsg 'Big file detected, set appropriate options'

endfunction