Правила оценки Vim отличаются от большинства языков программирования. Вам необходимо использовать :execute для оценки переменной (или выражения); в противном случае это воспринимается буквально; т.е. Vim использует само имя переменной в качестве аргумента.
let type = expand('%:e')
execute 'au BufNewFile *.' . type 'so ~/.vim/' . type . '_header.txt'
Я бы, вероятно, использовал printf() вместо конкатенации для улучшения читабельности.
execute printf('au BufNewFile *.%s so ~/.vim/%s_header.txt', type, type)
Обратите внимание, что при вашем подходе вы в основном дублируете встроенное определение типов файлов, которое уже обеспечивает сопоставление расширений файлов с типами. Я бы лучше определил общий хук в BufNewFile , а затем оценил &filetype . Вам просто нужно убедиться, что ваше событие определено после события для определения типа файла, например, путем перемещения определения из ~/.vimrc в ~/.vim/plugin/ script.