86

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.

1
  • 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. Aug 2, 2016 at 23:00

10 Answers 10

52

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)'
}
4
  • 11
    I wish I could downvote emacs for this. Aug 29, 2014 at 15:11
  • 2
    To open more than one file, the "-eval ..." has to be repeated after every filename, otherwise only the last file in the list is opened read-only.
    – stafusa
    Jul 19, 2020 at 0:09
  • 1
    Quick n dirty hack to work with multiple files opened on the command line: emacs --eval "(add-hook 'find-file-hook (defun make-read-only () (setq buffer-read-only t)))" file1 file2 ...
    – Winny
    Mar 1, 2021 at 15:22
  • 3
    See also emacs FILE -f view-mode answer.
    – Y. E.
    Aug 3, 2021 at 20:30
147

vim -R filename

3
  • 5
    Works great but I accepted Trey's answer because I prefer emacs over vim
    – Nifle
    Oct 29, 2010 at 6:35
  • 33
    And all vim users take revenge by upvoting it to more than the "accepted answer" :D
    – Xosofox
    Nov 11, 2015 at 9:33
  • 1
    Note: some boxes seem to have 'view' command maybe aliases to 'vi -R'. Aug 10, 2017 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)
3
  • 1
    No syntax highlighting though.
    – Nifle
    Oct 28, 2010 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, 2010 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. Aug 2, 2016 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
  • +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, 2015 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

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

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
  • 4
    Thanks for the v suggestion. Nifty.
    – tshepang
    Apr 4, 2014 at 9:08
  • 2
    +1, but no need for cat. Just use <FILENAME less.
    – Sparhawk
    Oct 9, 2014 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, 2015 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. Aug 2, 2016 at 22:45
6

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

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .