blob: bc69e44950ff9e427802ca882b0af3fd9dc4b98e (
plain) (
tree)
|
|
"
" big_file_options.vim: When opening a large file, take some measures to keep
" things loading quickly.
"
" Author: Tom Ryder <tom@sanctum.geek.nz>
" License: Same as Vim itself
"
if exists('loaded_big_file_options') || &compatible
finish
endif
if !has('autocmd') || v:version < 600
finish
endif
let loaded_big_file_options = 1
" Wrapper function to get the configured size limit, default to 10 MiB
function! s:Limit()
let limit = exists('g:big_file_options_limit')
\ ? g:big_file_options_limit
\ : 10 * 1024 * 1024
return limit
endfunction
" If we can use filesize to detect the big file early, we should
function! s:CheckPre(filename)
" 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! s:CheckPost()
" 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
" These options can and should be set as early as possible
function! s:SetPre()
" These are always set
setlocal noswapfile
setlocal undolevels=-1
if has('persistent_undo')
setlocal noundofile
endif
" Decide whether to set readonly options
let readonly = exists('g:big_file_options_readonly')
\ ? 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()
" Force filetype off
setlocal filetype=NONE
" Syntax features
if has('syntax')
" Disable syntax highlighting if configured
let syntax = exists('g:big_file_options_syntax')
\ ? g:big_file_options_syntax
\ : 0
if !syntax
setlocal syntax=OFF
endif
" Force maximum syntax columns down if configured
if exists('+synmaxcol')
let synmaxcol = exists('g:big_file_options_synmaxcol')
\ ? g:big_file_options_synmaxcol
\ : 256
if exists('+synmaxcol') && &synmaxcol > synmaxcol
let &l:synmaxcol = synmaxcol
endif
endif
endif
" Tell the user what we've done
echomsg 'Big file detected, set appropriate options'
endfunction
" Define autocmd for calling to check filesize
augroup big_file_options
autocmd!
autocmd BufReadPre,StdinReadPre
\ *
\ call s:CheckPre(expand('<afile>'))
autocmd BufReadPost,StdinReadPost
\ *
\ call s:CheckPost()
augroup end
|