fix(filetype): use unexpanded file name (#27931)

When the edited file is a symlink, the unexpanded file name is needed to
to achieve the same behavior as the autocommand pattern matching in Vim.
Neither args.file nor args.match are guaranteed to be unexpanded, so use
bufname() instead.
This commit is contained in:
zeertzjq 2024-03-23 11:46:23 +08:00 committed by GitHub
parent a629888427
commit 2955c921ce
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 30 additions and 1 deletions

View File

@ -11,7 +11,12 @@ vim.api.nvim_create_autocmd({ 'BufRead', 'BufNewFile', 'StdinReadPost' }, {
if not vim.api.nvim_buf_is_valid(args.buf) then
return
end
local ft, on_detect = vim.filetype.match({ filename = args.match, buf = args.buf })
local ft, on_detect = vim.filetype.match({
-- The unexpanded file name is needed here. #27914
-- Neither args.file nor args.match are guaranteed to be unexpanded.
filename = vim.fn.bufname(args.buf),
buf = args.buf,
})
if not ft then
-- Generic configuration file used as fallback
ft = require('vim.filetype.detect').conf(args.file, args.buf)

View File

@ -5,6 +5,10 @@ local api = helpers.api
local clear = helpers.clear
local pathroot = helpers.pathroot
local command = helpers.command
local mkdir = helpers.mkdir
local rmdir = helpers.rmdir
local write_file = helpers.write_file
local uv = vim.uv
local root = pathroot()
@ -161,10 +165,30 @@ describe('vim.filetype', function()
end)
describe('filetype.lua', function()
before_each(function()
mkdir('Xfiletype')
end)
after_each(function()
rmdir('Xfiletype')
end)
it('does not override user autocommands that set filetype #20333', function()
clear({
args = { '--clean', '--cmd', 'autocmd BufRead *.md set filetype=notmarkdown', 'README.md' },
})
eq('notmarkdown', api.nvim_get_option_value('filetype', {}))
end)
it('uses unexpanded path for matching when editing a symlink #27914', function()
mkdir('Xfiletype/.config')
mkdir('Xfiletype/actual')
write_file('Xfiletype/actual/config', '')
uv.fs_symlink(assert(uv.fs_realpath('Xfiletype/actual')), 'Xfiletype/.config/git')
finally(function()
uv.fs_unlink('Xfiletype/.config/git')
end)
clear({ args = { '--clean', 'Xfiletype/.config/git/config' } })
eq('gitconfig', api.nvim_get_option_value('filetype', {}))
end)
end)