在启动Vim时,我想在以下情况下运行autocmd:


而未指定文件名。

在以上三种情况下,我都想运行一个autocmd;具体来说,我只想针对上述情况自动启动插入模式(而不是在我打开一个已经存在且不为空的文件时)。

我尝试将以下内容放入我的_vimrc中,但没有运气(另外,我不确定vim中是否有一个函数可以计算文件中的字符数(看是否是零),然后再打开它:

if @% == "" || filereadable(@%)
  autocmd BufRead,BufNewFile * startinsert
endif


评论

不,这不是重复的。我希望vi仅在我提到的三个场景下以插入模式启动。

好的,很抱歉,但确实看起来像是重复的。 ;-)我已对您的问题进行了一些编辑,以使差异更清楚。

相关:vi.stackexchange.com/questions/239/…,vi.stackexchange.com/questions/258/…

@JohnSonderson,第一个链接告诉您如何查找是否未提供文件名,第二个链接可以通过使用normal而不是exec进行调整。

vimrc文件只读一次:Vim启动时。 autocmd的内容在每次触发时运行。因此,if语句不应位于autocmd周围,if不应位于autocmd内部,因此它将在每次触发autocmd时运行。

#1 楼

这对您的所有3种情况都有效:通常不存在的缓冲区从空缓冲区开始。但是,在前两种情况之一(例如某些模板插件)中,可能有一些其他插件会预先填充一些东西,因此最好检查这三种情况。

第一个测试您

第二项测试需要对照零值(不存在)检查filereadable以确定它是否是新值(与所拥有的相反)。 >最后一个测试检查文件中最后一行的编号为1(这也是第一行,也就是只有一行),以及行尾的列号(最后一个字符之后的列)在行中)为1,这意味着有0个字符。如果只有1行包含0个字符,则该文件必须为空。

最后一点:在问题中使用语句的方式可能会导致一些令人惊讶的结果。即,仅在启动时满足条件的情况下设置BufReadBufNewFile,但是在其余会话中都存在这些自动命令。因此,如果要从设置这些命令的空文件开始,则随后打开的每个文件(无论是否新建,为空)都将以插入模式启动。 Vim的启动结束,并且整个会话只有一次。这样,您的测试仅在启动Vim时运行,而不会在其他时间运行。