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 if not vim.api.nvim_buf_is_valid(args.buf) then
return return
end 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 if not ft then
-- Generic configuration file used as fallback -- Generic configuration file used as fallback
ft = require('vim.filetype.detect').conf(args.file, args.buf) 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 clear = helpers.clear
local pathroot = helpers.pathroot local pathroot = helpers.pathroot
local command = helpers.command 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() local root = pathroot()
@ -161,10 +165,30 @@ describe('vim.filetype', function()
end) end)
describe('filetype.lua', function() 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() it('does not override user autocommands that set filetype #20333', function()
clear({ clear({
args = { '--clean', '--cmd', 'autocmd BufRead *.md set filetype=notmarkdown', 'README.md' }, args = { '--clean', '--cmd', 'autocmd BufRead *.md set filetype=notmarkdown', 'README.md' },
}) })
eq('notmarkdown', api.nvim_get_option_value('filetype', {})) eq('notmarkdown', api.nvim_get_option_value('filetype', {}))
end) 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) end)