mirror of
https://github.com/neovim/neovim.git
synced 2024-12-29 14:41:06 -07:00
020d1f626a
The on_detect functions returned by filetype.lua set buffer local variables which are often used by filetype plugins. For example, the on_detect function for shell buffers sets variables such as b:is_bash or b:is_sh, which are used by the sh ftplugin. When called after setting the buffer's filetype, these variables cannot be used by the ftplugin (because they are not yet defined). Instead, call on_detect before setting the buffer filetype so that any buffer variables set by on_detect can be used in the ftplugin.
57 lines
1.7 KiB
Lua
57 lines
1.7 KiB
Lua
if vim.g.did_load_filetypes then
|
|
return
|
|
end
|
|
vim.g.did_load_filetypes = 1
|
|
|
|
vim.api.nvim_create_augroup('filetypedetect', { clear = false })
|
|
|
|
vim.api.nvim_create_autocmd({ 'BufRead', 'BufNewFile', 'StdinReadPost' }, {
|
|
group = 'filetypedetect',
|
|
callback = function(args)
|
|
local ft, on_detect = vim.filetype.match({ filename = args.match, buf = args.buf })
|
|
if not ft then
|
|
-- Generic configuration file used as fallback
|
|
ft = require('vim.filetype.detect').conf(args.file, args.buf)
|
|
if ft then
|
|
vim.api.nvim_buf_call(args.buf, function()
|
|
vim.api.nvim_cmd({ cmd = 'setf', args = { 'FALLBACK', ft } }, {})
|
|
end)
|
|
end
|
|
else
|
|
-- on_detect is called before setting the filetype so that it can set any buffer local
|
|
-- variables that may be used the filetype's ftplugin
|
|
if on_detect then
|
|
on_detect(args.buf)
|
|
end
|
|
|
|
vim.api.nvim_buf_call(args.buf, function()
|
|
vim.api.nvim_cmd({ cmd = 'setf', args = { ft } }, {})
|
|
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,lua}
|
|
augroup END
|
|
]])
|
|
end
|
|
|
|
-- Set up the autocmd for user scripts.vim
|
|
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',
|
|
})
|
|
|
|
if not vim.g.ft_ignore_pat then
|
|
vim.g.ft_ignore_pat = '\\.\\(Z\\|gz\\|bz2\\|zip\\|tgz\\)$'
|
|
end
|