如何检查我是否在vimrc中以只读模式(-R)运行

jma*_*agh 7 vim

在我的.vimrc,我希望能够检查,如果我一直在运行或者通过vim -Rview.如果是这样,我计划禁用或延迟某些插件加载,以加快我很快想要查看文件的时间.

:args并且argv()似乎只显示我想编辑哪些文件,而不是所有命令行标志.

检查if &readonly几乎工作.如果我有这个:

if &readonly
    echo "read only"
else
    echo "not read only"
endif
Run Code Online (Sandbox Code Playgroud)

接着,我会read only当我执行呼应viewvim -R,但如果我这样做要么view ~/.vimrcvim -R ~/.vimrc然后我得到not read only.很奇怪.

谢谢!

dav*_*djb 6

Vim 的程序名称(例如view)可以通过该变量来检测v:progname。这并不能解决 的检查问题vim -R,但它确实允许您在您的条件中使用此变量.vimrc,并可能提高配置的效率。例如:

if v:progname ==? 'view'
  " Do something
endif
Run Code Online (Sandbox Code Playgroud)


Mar*_*oij 5

&readonly设置是缓冲区本地的,并且在加载缓冲区之前不会设置。在加载任何缓冲区之前会解析您的 vimrc 文件。

考虑一下如果您输入 会发生什么vim -o /etc/passwd ~/readable。一个缓冲区将是只读的,而另一个则不是。该设置应该打开还是关闭?

因此,您需要挂钩BufReadPost自动命令,该命令在将文件读入缓冲区后执行:

autocmd BufReadPost *
    \  if &readonly
    \|  echo "read only"
    \| else
    \|  echo "not read only"
    \| endif
Run Code Online (Sandbox Code Playgroud)

这应该给出预期的结果。

请注意,每次加载缓冲区时都会运行它。如果您只想显示一次,则需要在运行时删除此自动命令。这可以通过自动命令组来完成;autocommand! <group_name>将删除组中的所有自动命令。

augroup readonly
    autocmd!
    autocmd BufReadPost *
        \  if &readonly
        \|  echom "read only"
        \| else
        \|  echom "not read only"
        \| endif
        \| autocmd! readonly
augroup end
Run Code Online (Sandbox Code Playgroud)