Як я можу запустити autocmd при запуску Vim без файлу, неіснуючого файлу чи порожнього файлу (але не при запуску з наявного файлу)?


11

Коли я запускаю Vim, я хотів би запустити autocmd у наступних сценаріях:

  • Не вказується ім’я файлу.
  • Коли файл новий.
  • Коли файл існує, але він повністю порожній.

У всіх вищезазначених трьох випадках я хотів би запустити autocmd; В Зокрема, я хотів би почати режим вставки автоматично для тільки вищевказаних сценаріїв (а не тоді , коли я відкриваю файл , який вже існує і не є порожнім).


ОНОВЛЕННЯ:

Я спробував розмістити наступне у своєму _vimrc, але не пощастило (плюс я не впевнений, чи є функція vim, яка підраховує кількість символів у файлі (щоб побачити, чи немає нуля) перед відкриттям:

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

Ні, це не дублікат. Я хочу, щоб vi почав у режимі вставки ТОЛЬКО ДЛЯ ТРИХ СЦЕНАРІЙ, Я МЕНЮВАНИМ.
Джон Сондерсон

3
ОКЕЙ, Я ЖОРУЮ, АЛЕ ДУЖЕ ВИГОТОВЛЯЄТЬСЯ, МУЖЕ ДУПЛІКАТ. ;-) Я трохи відредагував ваше запитання, щоб зрозуміти відмінності.
Мартін Турноїй


2
@JohnSonderson перше посилання розповідає, як знайти, якщо не вказано ім'я файлу, друге можна адаптувати за допомогою, normalа не exec.
муру

1
Файл vimrc читається лише один раз : при запуску Vim. Вміст autocmd запускається кожного разу, коли він запускається. Таким чином, ifоператор не повинен бути навколо autocmd, якщо він повинен знаходитися всередині autocmd, тому він буде виконуватися кожного разу, коли autocmd запускається.
Мартін Турноїй

Відповіді:


10

Це працює для всіх 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, а не інший раз.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.