From abb8c2c453d1e084f8ab3e9bbaa8b27515c81a9f Mon Sep 17 00:00:00 2001 From: Lewis Russell Date: Fri, 25 Aug 2023 12:23:05 +0100 Subject: [PATCH] fix(editorconfig): do not set 'endofline' Problem: 'endofline' can be used to detect if a file ends of , however editorconfig can break this. Solution: Set 'endofline' during BufWritePre Fixes: #24869 --- runtime/lua/editorconfig.lua | 15 ++++++++++++++- test/functional/plugin/editorconfig_spec.lua | 4 ++-- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/runtime/lua/editorconfig.lua b/runtime/lua/editorconfig.lua index 48faa54d97..49d63807a6 100644 --- a/runtime/lua/editorconfig.lua +++ b/runtime/lua/editorconfig.lua @@ -112,7 +112,20 @@ end function M.properties.insert_final_newline(bufnr, val) assert(val == 'true' or val == 'false', 'insert_final_newline must be either "true" or "false"') vim.bo[bufnr].fixendofline = val == 'true' - vim.bo[bufnr].endofline = val == 'true' + + -- 'endofline' can be read to detect if the file contains a final newline, + -- so only change 'endofline' right before writing the file + local endofline = val == 'true' + if vim.bo[bufnr].endofline ~= endofline then + vim.api.nvim_create_autocmd('BufWritePre', { + group = 'editorconfig', + buffer = bufnr, + once = true, + callback = function() + vim.bo[bufnr].endofline = endofline + end, + }) + end end --- Modified version of |glob2regpat()| that does not match path separators on *. diff --git a/test/functional/plugin/editorconfig_spec.lua b/test/functional/plugin/editorconfig_spec.lua index 5e38c03b56..ac78003a8c 100644 --- a/test/functional/plugin/editorconfig_spec.lua +++ b/test/functional/plugin/editorconfig_spec.lua @@ -160,8 +160,8 @@ describe('editorconfig', function() end) it('sets newline options', function() - test_case('with_newline.txt', { fixendofline = true, endofline = true }) - test_case('without_newline.txt', { fixendofline = false, endofline = false }) + test_case('with_newline.txt', { fixendofline = true }) + test_case('without_newline.txt', { fixendofline = false }) end) it('respects trim_trailing_whitespace', function()