aboutsummaryrefslogtreecommitdiff
path: root/runtime/filetype.lua
blob: f1885a8b95d2607a2ccb84a86e8bff91c924885c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
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({ 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_cmd({ cmd = 'setf', args = { 'FALLBACK', ft } }, {})
      end
    else
      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