19

When using Vim to edit a read only file it will just provide a warning the first time it is edited but allow any changes to take place. I can understand this behaviour could be useful for someone intending on saving the file under another name; but I sometimes open files that I don't have write access to, then forget and make changes.

Is it possible to enter a mode where Vim will allow the file to be viewed but block any option that makes changes?

0

3 Answers 3

16

I found a solution. Setting nomodifiable prevents the file being edited (as used in help windows). I created a simple function to set or unset modifiable depending on if readonly is set and attached it to an autocmd.

" Don't allow editing of read only files
autocmd BufRead * call RONoEdit()

function! RONoEdit()
  if &readonly == 1
    set nomodifiable
  else
    set modifiable
  endif
endfunction
5
  • 5
    You can make it shorter by doing: let &modifiable = !&readonly May 29, 2015 at 9:10
  • @Carpetsmoker Much better as a one liner, thanks! However it would still have to be: autocmd BufRead * let &modifiable = !&readonly May 29, 2015 at 15:11
  • With this, after opening a readonly file and then creating a new buffer the new buffer ends up nomodifiable. Jul 24, 2015 at 5:13
  • Thanks for pointing that out, I hadn't noticed. I'm not sure how to test for a new buffer. Jul 24, 2015 at 7:22
  • 2
    @Praxeolitic: I just posted an answer which should address this, let me know if it works.
    – s4y
    Nov 11, 2016 at 22:16
13

Add this to your .vimrc:

augroup NoModWhenReadOnly
    autocmd!
    autocmd BufRead * let &l:modifiable = !&readonly
augroup END
1
  • This builds on @ZeroKelvinKeyboard's answer to only affect the current buffer.
    – s4y
    Nov 11, 2016 at 21:58
0

As much as the answers above are correct, there is another thing to take into account: as long as the file is "read-only", there should be no way of changing the file's content unless you're the owner of the file or have the right to make that file writable. And even then vim doesn't write changes to the file unless you explicitly override the "read-only" state by ":w!".

If you can in fact edit a file which is supposed to be read-only, you may want to recheck the rights, there may be a security misconfiguration. If you only make vim unable to edit the file, other ways of editing will still be in place so if the file is not to be changed, it should have the rights set properly. In windows, you can force the file to be read-only by explicitly denying the change right to everyone, in Linux you can use the "immutable" extended attribute (chattr +i).

3
  • 2
    Sorry if I was not very clear. This question was not about accidentally changing a read only file; I wanted to stop myself from being able to edit the buffer of a file that I did not have write access for. Sometimes I accidentally open system configuration files as a regular user rather than the root user. In this case I don't have write access to the file, so the buffer appears as read only but Vim will still allow me to edit the buffer. When I try to save I cannot because I don't have write access. I wanted Vim to block changes to the buffer in this case. Jun 1, 2015 at 13:52
  • Ah, I see. I got the idea that you wanted this as a failsafe. Disregard my answer then :)
    – jficz
    Jun 1, 2015 at 18:34
  • OP means that when one opens a not-read-only file in the OS, but he/she currently doesn't want to (or consider appropriate to) make change, and wants to restrict himself not to. I am thinking exactly the same, thus going here from Google! Dec 27, 2016 at 9:44

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.