Это работает для всех 3 ваших дел для меня:
function InsertIfEmpty()
if @% == ""
" No filename for current buffer
startinsert
elseif filereadable(@%) == 0
" File doesn't exist yet
startinsert
elseif line('$') == 1 && col('$') == 1
" File is empty
startinsert
endif
endfunction
au VimEnter * call InsertIfEmpty()
Вероятно, они могут быть сведены к последней проверке наличия пустого файла, поскольку ни одно имя файла или несуществующий файл обычно не начинаются как пустые буферы. Тем не менее, возможно, что какой-то другой плагин предварительно заполняет некоторые вещи в одном из первых двух случаев (например, некоторые плагины шаблонов), поэтому лучше проверить все три.
Первый тест у вас уже был.
Второй тест должен проверить filereadable
на значение ноль (не существует), чтобы определить, является ли он новым (в отличие от того, что у вас было).
Последний тест проверяет, что номер последней строки в файле равен 1 (что также является первой строкой, что означает, что есть только одна строка), и что номер столбца конца строки (столбец после последнего символа в строка) равно 1, что означает, что есть 0 символов. Если в нем только 1 строка с 0 символами, то файл должен быть пустым.
Последнее замечание: то, как вы сформулировали свои утверждения в вопросе, может привести к неожиданным результатам. А именно, вы настраиваете BufRead
и BufNewFile
только если условия выполняются при запуске, но тогда эти автокоманды существуют до конца вашего сеанса. Таким образом, если бы вы начали с пустого файла, который устанавливает эти команды, каждый последующий открытый файл (новый или нет, пустой или нет) запустился бы в режиме вставки.
Автокоманда VimEnter
запускается в конце запуска Vim и только один раз для всего сеанса. Таким образом, ваши тесты запускаются только при запуске Vim, а не в любой другой раз.