diff options
Diffstat (limited to 'autoload/big_file_options.vim')
-rw-r--r-- | autoload/big_file_options.vim | 147 |
1 files changed, 147 insertions, 0 deletions
diff --git a/autoload/big_file_options.vim b/autoload/big_file_options.vim new file mode 100644 index 0000000..4d65bd4 --- /dev/null +++ b/autoload/big_file_options.vim @@ -0,0 +1,147 @@ +" 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 + +" 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 |