Ad blocker interference detected!
Wikia is a free-to-use site that makes money from advertising. We have a modified experience for viewers using ad blockers
Wikia is not accessible if you’ve made further modifications. Remove the custom ad blocker rule(s) and the page will load as expected.
created 2006 · complexity intermediate · author Daniel Harding · version 6.0
If a file on disk is read-only, I would prefer that Vim prevent me from modifying it, rather than giving an error message when I try to write out my changes. The modifiable option does exactly this - when off, it prevents changes from being made to the buffer. However, the modifiable option is on by default. Thus I use the following function to keep a buffer's modifiable state in sync with the underlying file's readonly state. It works especially well when the autoread option is enabled.
function UpdateModifiable() if !exists("b:setmodifiable") let b:setmodifiable = 0 endif if &readonly if &modifiable setlocal nomodifiable let b:setmodifiable = 1 endif else if b:setmodifiable setlocal modifiable endif endif endfunction autocmd BufReadPost * call UpdateModifiable()
Why is the
b:setmodifiable variable needed?
autocmd BufReadPost * if &modifiable | setlocal nomodifiable | else | setlocal modifiable | endif
Did you mean:
autocmd BufReadPost * if &readonly | setlocal nomodifiable | else | setlocal modifiable | endif
I think b:setmodifiable is there to set &modifiable only if the &readonly previously triggered the script to set &nomodifiable . So, it will skip files that are &nomodifiable but not &readonly. Is that correct? I don't think that case happens much.
You are right about b:setmodifiable. It is to prevent setting &modifiable when reloading a file that is not &readonly, but which had &nomodifiable set manually. It may be overkill, but it still works correctly.