如何使用emacs / vi / vim从命令行打开只读文件


79

有没有办法告诉emacs / vi / vim(从命令行)我要在view-mode或中查看文件read-only

我知道如何在emacs / vi / vim已经运行的情况下以只读方式打开文件。


注意:如果您没有对该文件的写入权限,Vim默认会以只读模式打开它。实际上,我认为控制文件权限比提供“只读”方式容易。
富兰克林于

Answers:


45

对于emacs:

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

没有强制选择只读的启动选项。

编辑:
如果将此小功能放在外壳启动脚本(例如.bashrc)中,则可以通过键入以下内容打开文件只读ev file_to_view

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

11
我希望我可以为此放弃emacs。
罗伯特·卡尔洪

145

vim -R文件名


4
效果很好,但是我接受了Trey的回答,因为我更喜欢emacs而不是vim
Nifle 2010年

32
并且所有vim用户都通过将其提高到“可以接受的答案”之外来报仇:D
Xosofox

1
注意:有些盒子似乎带有“ view”命令,也许是“ vi -R”的别名。
Armyofda12mnkeys

26

查看文件名

vim基本上是只读模式;简单!

正如评论所暗示的,万一view链接到plain vi,这里是bash命令,它首先检查情况,然后进行修复:

# 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
虽然没有突出显示语法。
Nifle

7
@Nifle:语法高亮应该没有任何区别。如果您vim有语法突出显示但view没有语法突出显示,则可能是您view的链接的最低版本vim没有编译语法突出显示。比较:version命令的输出。
garyjohn

1
它“有效”的原因:Vim会实际阅读argv[0]以决定其行为。这是一个常见的把戏。AFAIK有时GCC和Bash也会这样做。
富兰克林·于

10
vim -R <file>

允许与 :w!

vim -c ":set nomodifiable"  <file>

防止用户对缓冲区中的文件进行任何更改。但是用户可以通过以下方式修改缓冲区:set modifiable

你可以用

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

以防止用户关闭“ nomodifiable”,并允许用户通过按退出q。但是,那么用户根本无法进入命令模式,这可能是或可能不是您想要的。

您也可以使用less命令打开文件:

less <file>

在类似于vim的环境中查看文件,但无法更改文件。


使用+1 less,尽管@nxdrvr指出您可以按v键在vi
Sheharyar 2015年

9

对已接受的答案进行小规模的后续操作:您可以在shell中对此设置别名,以将其简化为单个命令。例如,在bash中,您可以将以下内容放入.bashrc中:

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

(不同的shell将具有不同的格式来执行此操作,但您会明白的)

我本来将其添加为评论,以回答已接受的答案,但似乎不可能在评论中包含多行“代码”块,并且(无论如何,bash中)上述代码确实确实需要在3条单独的线上。


6

要仅查看文件而不能编辑:

cat <file> | less

在其中,less您可以通过按键进入“编辑文件模式” v。但是您不能编辑标准输入,因此在按“ v” cat <file>键时,将输出传递到less会停止less进入“编辑”模式。

对于vim同样的方法

cat <file> | vim -

4
谢谢你的v建议。好漂亮
tshepang 2014年

2
+1,但不需要cat。只需使用<FILENAME less
Sparhawk

@Sparkhawk,<file> less将给出一个错误,我假设是您的意思less <file>,但是如答案中所述,当less直接使用时,用户可以按v键进入编辑模式。用管道catless阻止这种情况的发生。
Sheharyar

@Sheharyar他的意思是输出重定向。也许您比较熟悉less < FILENAME,当您按下V时,它会为您提供“无法编辑标准输入” 。同样用Vim: vim - < FILENAME
富兰克林·于

4

对于emacs,您还可以使用view-mode

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

或终端内的替代方案:

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

或者您可以使用我的包装器脚本


1

在emacs中你可以做

emacs FILE -f view-mode

语法突出显示。它不只是将文件作为只读缓冲区打开。在此模式下,无需控制键即可访问某些命令,例如I-search。


0

发送文件到标准输出,考虑到文件的大小,可以接受

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

0

我不会在这里向任何用户答复,但我想添加一些有关Read-only Mode文件的更多信息。根据oreilly文档的只读模式,有时您会想要查看文件,但又想保护该文件免受意外的击键和更改。(您可能需要调用一个长文件来练习vi的移动,或者您可能想滚动浏览命令文件或程序)。您可以以只读模式输入文件并使用所有vi Movement命令,但将无法更改该文件。

要以只读模式查看文件,请输入:

$ vi -R file

要么:

$ view file

(view命令和vi命令一样,可以使用任何命令行选项前进到文件中的特定位置。)如果您决定对文件进行一些编辑,则可以通过以下方式覆盖只读模式:在写命令中添加一个感叹号:

:w!
or:

:wq!

如果您在写文件时遇到问题。

这里进一步参考

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.