aboutsummaryrefslogtreecommitdiff
path: root/autoload/big_file_options.vim
blob: 07d047eeae7c3ca0c0c560eef6828f54ebde4bfa (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
" If we can use filesize to detect the big file early, we should
function! big_file_options#() abort

  " Try and get filesize; if we can't, defer another check attempt until after
  " everything's been loaded
  let size = getfsize(bufname('%'))
  if size == -1
    autocmd big_file_options BufReadPost,StdinReadPost <buffer>
          \ call s:CheckPost()
          \|autocmd! big_file_options BufReadPost,StdinReadPost <buffer>
    return
  endif

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

  " If we found it's a big file, call the early options set
  if b:big_file_options_big
    call s:SetPre()
    autocmd big_file_options BufReadPost,StdinReadPost <buffer>
          \ call s:SetPost()
          \|autocmd! big_file_options BufReadPost,StdinReadPost <buffer>
  endif

endfunction

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

  " 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()
    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