mirror of
https://github.com/neovim/neovim
synced 2025-07-16 01:01:49 +00:00
Many filetypes from filetype.vim set buffer-local variables, meaning vim.filetype.match cannot be used without side effects. Instead of setting these buffer-local variables in the filetype detection functions themselves, have vim.filetype.match return an optional function value that, when called, sets these variables. This allows vim.filetype.match to work without side effects.
54 lines
1.4 KiB
Lua
54 lines
1.4 KiB
Lua
if vim.g.did_load_filetypes and vim.g.did_load_filetypes ~= 0 then
|
|
return
|
|
end
|
|
|
|
-- For now, make this opt-in with a global variable
|
|
if vim.g.do_filetype_lua ~= 1 then
|
|
return
|
|
end
|
|
|
|
vim.api.nvim_create_augroup('filetypedetect', { clear = false })
|
|
|
|
vim.api.nvim_create_autocmd({ 'BufRead', 'BufNewFile' }, {
|
|
group = 'filetypedetect',
|
|
callback = function(args)
|
|
local ft, on_detect = vim.filetype.match(args.file, args.buf)
|
|
if ft then
|
|
vim.api.nvim_buf_set_option(args.buf, 'filetype', ft)
|
|
if on_detect then
|
|
on_detect(args.buf)
|
|
end
|
|
end
|
|
end,
|
|
})
|
|
|
|
-- These *must* be sourced after the autocommand above is created
|
|
if not vim.g.did_load_ftdetect then
|
|
vim.cmd([[
|
|
augroup filetypedetect
|
|
runtime! ftdetect/*.vim
|
|
runtime! ftdetect/*.lua
|
|
augroup END
|
|
]])
|
|
end
|
|
|
|
-- Set a marker so that the ftdetect scripts are not sourced a second time by filetype.vim
|
|
vim.g.did_load_ftdetect = 1
|
|
|
|
-- If filetype.vim is disabled, set up the autocmd to use scripts.vim
|
|
if vim.g.did_load_filetypes then
|
|
vim.api.nvim_create_autocmd({ 'BufRead', 'BufNewFile' }, {
|
|
group = 'filetypedetect',
|
|
command = "if !did_filetype() && expand('<amatch>') !~ g:ft_ignore_pat | runtime! scripts.vim | endif",
|
|
})
|
|
|
|
vim.api.nvim_create_autocmd('StdinReadPost', {
|
|
group = 'filetypedetect',
|
|
command = 'if !did_filetype() | runtime! scripts.vim | endif',
|
|
})
|
|
end
|
|
|
|
if not vim.g.ft_ignore_pat then
|
|
vim.g.ft_ignore_pat = '\\.\\(Z\\|gz\\|bz2\\|zip\\|tgz\\)$'
|
|
end
|