aboutsummaryrefslogtreecommitdiff
path: root/autoload
diff options
context:
space:
mode:
authorTom Ryder <tom@sanctum.geek.nz>2019-05-25 17:16:09 +1200
committerTom Ryder <tom@sanctum.geek.nz>2019-05-25 17:16:09 +1200
commit19ddf67199fd5a6b0b3111230598c0b2567f792e (patch)
tree903d21c4631c161d5ae35c9ad74bcc017866943a /autoload
parentMerge branch 'release/v1.1.0' into develop (diff)
downloadvim-big-file-options-19ddf67199fd5a6b0b3111230598c0b2567f792e.tar.gz
vim-big-file-options-19ddf67199fd5a6b0b3111230598c0b2567f792e.zip
Move functions into autoload
This means we require Vim 7.0.
Diffstat (limited to 'autoload')
-rw-r--r--autoload/big_file_options.vim112
1 files changed, 112 insertions, 0 deletions
diff --git a/autoload/big_file_options.vim b/autoload/big_file_options.vim
new file mode 100644
index 0000000..5c57343
--- /dev/null
+++ b/autoload/big_file_options.vim
@@ -0,0 +1,112 @@
+" 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! big_file_options#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! big_file_options#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