79

Is there a way to tell emacs/vi/vim (from the command line) that I want to view the file in view-mode or read-only.

I know how to open a file as read only if emacs/vi/vim is already running.

  • Note: if you don't have the write permission to the file, Vim will by default open it in read-only mode. Actually, I think it is easier to control the file permission than to provide a "read-only" way. – Franklin Yu Aug 2 '16 at 23:00

10 Answers 10

45

For emacs:

emacs FILE --eval '(setq buffer-read-only t)'

There's no startup option to force read only.

Edit:
If you put this small function in your shell startup script (.bashrc for example) you can open a file read-only by typing ev file_to_view

ev() {
  emacs "$1" --eval '(setq buffer-read-only t)'
}
  • 11
    I wish I could downvote emacs for this. – Robert Calhoun Aug 29 '14 at 15:11
145

vim -R filename

  • 3
    Works great but I accepted Trey's answer because I prefer emacs over vim – Nifle Oct 29 '10 at 6:35
  • 32
    And all vim users take revenge by upvoting it to more than the "accepted answer" :D – Xosofox Nov 11 '15 at 9:33
  • 1
    Note: some boxes seem to have 'view' command maybe aliases to 'vi -R'. – armyofda12mnkeys Aug 10 '17 at 19:31
26

view filename

Basically vim in read-only mode; simples!

As hinted by comment, in case view is linked to plain vi, here are bash commands to first inspect situation and then fix it:

# non-destructive inspection
which vim
which view
ls -l $(which view)

# overwrite current view with symlink to vim, requires root
ln -sfv $(which vim) $(which view)
  • 1
    No syntax highlighting though. – Nifle Oct 28 '10 at 11:59
  • 7
    @Nifle: There shouldn't be any difference in syntax highlighting. If your vim has syntax highlighting but your view doesn't, perhaps your view is a link to a minimal version of vim that doesn't have syntax highlighting compiled in. Compare the outputs of the :version command. – garyjohn Oct 28 '10 at 15:33
  • 1
    Reason why it "just works": Vim will actually read argv[0] to decide its behavior. It's a common trick; AFAIK sometimes GCC and Bash does this as well. – Franklin Yu Aug 2 '16 at 22:57
10
vim -R <file>

allows writing with :w!

vim -c ":set nomodifiable"  <file>

Prevents the user from making any changes to the file in the buffer. But the user could make the buffer modifiable with :set modifiable

You could use

vim -c ":noremap q :q<cr>" -c ":map : <Esc>" -c ":set nomodifiable" <file>

to prevent the user from turning off the "nomodifiable", and allow the user to quit by pressing q. But, then the user can't enter command mode at all, which may or may not be what you want.

You could also open the file with the less command:

less <file>

To view the file in a vim-like environment but without the ability to change the file.

  • +1 for using less, although as @nxdrvr points out you can press the v key to open the file in editiable mode in vi – Sheharyar Jan 19 '15 at 2:11
9

Small follow-up to the accepted answer: You can alias this in your shell to reduce it to a single command. For example in bash you can put the following in your .bashrc:

emacsro() {
  emacs $1 --eval '(setq buffer-read-only t)'
}

(different shells will have different formats for doing this, but you get the idea)

I would have added this as a comment in reply to the accepted answer, but it didn't seem possible to have a multi-line "code" block in a comment, and (in bash anyway) the above code really does need to be on 3 separate lines.

6

To just view file without ability to edit:

cat <file> | less

In less you can go to "edit file mode" by pressing the v key. But you cannot edit standard input, so piping the output of cat <file> to less, stops less from going to 'edit' mode on pressing 'v'.

For vim the same approach

cat <file> | vim -
  • 4
    Thanks for the v suggestion. Nifty. – Tshepang Apr 4 '14 at 9:08
  • 2
    +1, but no need for cat. Just use <FILENAME less. – Sparhawk Oct 9 '14 at 5:07
  • @Sparkhawk, <file> less would give an error, I'm assuming you meant less <file>, but as explained in the answer, when using less directly, the user could press v key and go into edit-mode. Piping cat to less stops this from happening. – Sheharyar Jan 19 '15 at 2:30
  • @Sheharyar He meant output redirection. Maybe you are more familiar with less < FILENAME, which gives you "Cannot edit standard input" when you press V. Similarly with Vim: vim - < FILENAME. – Franklin Yu Aug 2 '16 at 22:45
4

For emacs you can also use the view-mode.

emacsclient --create-frame --eval '(view-file "/tmp/EXAMPLE")'

or alternative inside a terminal:

emacsclient --nw --eval '(view-file "/tmp/EXAMPLE")'

Or you can use my wrapper script

1

In emacs you can do

emacs FILE -f view-mode

Syntax highlighting is applied. It doesn't just open the file as a read only buffer. Some commands, such as I-search, are accessible without the control key in this mode.

0

sending a file to std out, may be acceptable given the size of the file

cat <file>  # dump whole file to stdout
head <file> # view the first few lines
tail <file> # view the last n lines
0

I am not going to discrad to anyone user answer here, but i would like to aadd some more info about Read-only Mode file. As per oreilly documentation Read-only Mode There will be times when you want to look at a file but want to protect that file from inadvertent keystrokes and changes. (You might want to call in a lengthy file to practice vi movements, or you might want to scroll through a command file or program). You can enter a file in read-only mode and use all the vi movement commands, but you won't be able to change the file.

To look at a file in read-only mode, enter either:

$ vi -R file

or:

$ view file

(The view command, like the vi command, can use any of the command-line options for advancing to a specific place in the file.) If you do decide to make some edits to the file, you can override read-only mode by adding an exclamation point to the write command:

:w!
or:

:wq!

If you have a problem writing out the file.

For further ref here

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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