From ee61a5a333939dc21f508a1caf1235f2c1ba16cf Mon Sep 17 00:00:00 2001 From: xudyang1 <61672396+xudyang1@users.noreply.github.com> Date: Tue, 21 May 2024 17:33:53 -0400 Subject: [PATCH] fix: handle cross platform line splits --- lua/telescope/builtin/__internal.lua | 12 +++--- lua/telescope/previewers/buffer_previewer.lua | 2 +- lua/telescope/previewers/utils.lua | 6 ++- lua/telescope/utils.lua | 14 ++++++- lua/tests/automated/utils_spec.lua | 38 +++++++++++++++++++ 5 files changed, 61 insertions(+), 11 deletions(-) diff --git a/lua/telescope/builtin/__internal.lua b/lua/telescope/builtin/__internal.lua index 9149ecb4db..faad006272 100644 --- a/lua/telescope/builtin/__internal.lua +++ b/lua/telescope/builtin/__internal.lua @@ -531,7 +531,7 @@ internal.oldfiles = function(opts) local results = {} if opts.include_current_session then - for _, buffer in ipairs(vim.split(vim.fn.execute ":buffers! t", "\n")) do + for _, buffer in ipairs(utils.split_lines(vim.fn.execute ":buffers! t")) do local match = tonumber(string.match(buffer, "%s*(%d+)")) local open_by_lsp = string.match(buffer, "line 0$") if match and not open_by_lsp then @@ -574,7 +574,7 @@ end internal.command_history = function(opts) local history_string = vim.fn.execute "history cmd" - local history_list = vim.split(history_string, "\n") + local history_list = utils.split_lines(history_string) local results = {} local filter_fn = opts.filter_fn @@ -614,7 +614,7 @@ end internal.search_history = function(opts) local search_string = vim.fn.execute "history search" - local search_list = vim.split(search_string, "\n") + local search_list = utils.split_lines(search_string) local results = {} for i = #search_list, 3, -1 do @@ -690,7 +690,7 @@ internal.help_tags = function(opts) opts.fallback = vim.F.if_nil(opts.fallback, true) opts.file_ignore_patterns = {} - local langs = vim.split(opts.lang, ",", true) + local langs = vim.split(opts.lang, ",", { trimempty = true }) if opts.fallback and not vim.tbl_contains(langs, "en") then table.insert(langs, "en") end @@ -729,11 +729,11 @@ internal.help_tags = function(opts) local delimiter = string.char(9) for _, lang in ipairs(langs) do for _, file in ipairs(tag_files[lang] or {}) do - local lines = vim.split(Path:new(file):read(), "\r?\n", { trimempty = true }) + local lines = utils.split_lines(Path:new(file):read(), { trimempty = true }) for _, line in ipairs(lines) do -- TODO: also ignore tagComment starting with ';' if not line:match "^!_TAG_" then - local fields = vim.split(line, delimiter, true) + local fields = vim.split(line, delimiter, { trimempty = true }) if #fields == 3 and not tags_map[fields[1]] then if fields[1] ~= "help-tags" or fields[2] ~= "tags" then table.insert(tags, { diff --git a/lua/telescope/previewers/buffer_previewer.lua b/lua/telescope/previewers/buffer_previewer.lua index a404c14cd7..72854e41a0 100644 --- a/lua/telescope/previewers/buffer_previewer.lua +++ b/lua/telescope/previewers/buffer_previewer.lua @@ -1090,7 +1090,7 @@ previewers.highlights = defaulter(function(_) define_preview = function(self, entry) if not self.state.bufname then - local output = vim.split(vim.fn.execute "highlight", "\n") + local output = utils.split_lines(vim.fn.execute "highlight") local hl_groups = {} for _, v in ipairs(output) do if v ~= "" then diff --git a/lua/telescope/previewers/utils.lua b/lua/telescope/previewers/utils.lua index 076bab4362..b430e5a509 100644 --- a/lua/telescope/previewers/utils.lua +++ b/lua/telescope/previewers/utils.lua @@ -5,12 +5,14 @@ local conf = require("telescope.config").values local Job = require "plenary.job" local Path = require "plenary.path" +local telescope_utils = require "telescope.utils" + local utils = {} local detect_from_shebang = function(p) local s = p:readbyterange(0, 256) if s then - local lines = vim.split(s, "\n") + local lines = telescope_utils.split_lines(s) return vim.filetype.match { contents = lines } end end @@ -24,7 +26,7 @@ end local detect_from_modeline = function(p) local s = p:readbyterange(-256, 256) if s then - local lines = vim.split(s, "\n") + local lines = telescope_utils.split_lines(s) local idx = lines[#lines] ~= "" and #lines or #lines - 1 if idx >= 1 then return parse_modeline(lines[idx]) diff --git a/lua/telescope/utils.lua b/lua/telescope/utils.lua index 55d93698d3..ff13132d4b 100644 --- a/lua/telescope/utils.lua +++ b/lua/telescope/utils.lua @@ -213,8 +213,6 @@ utils.path_smart = (function() end end)() --- vim.fn.fnamemodify(path, ":p:t") may replace util.path_tail(path), --- but the former may be slower and has dependency on neovim utils.path_tail = (function() local os_sep = utils.get_separator() @@ -741,4 +739,16 @@ utils.reverse_table = function(input_table) return temp_table end +utils.split_lines = (function() + if utils.iswin then + return function(s, opts) + return vim.split(s, "\r?\n", opts) + end + else + return function(s, opts) + return vim.split(s, "\n", opts) + end + end +end)() + return utils diff --git a/lua/tests/automated/utils_spec.lua b/lua/tests/automated/utils_spec.lua index 490ce3e251..b99a665cd3 100644 --- a/lua/tests/automated/utils_spec.lua +++ b/lua/tests/automated/utils_spec.lua @@ -353,3 +353,41 @@ describe("path_tail", function() end) end end) + +describe("split_lines", function() + local expect = { + "", + "", + "line3 of the file", + "", + "line5 of the file", + "", + "", + "line8 of the file, last line of file", + "", + } + + local function get_fake_file(line_ending) + return table.concat(expect, line_ending) + end + + local newline_file = get_fake_file "\n" + local carriage_newline_file = get_fake_file "\r\n" + + if utils.iswin then + describe("handles files on Windows", function() + it("reads file with newline only", function() + assert.are.same(expect, utils.split_lines(newline_file)) + end) + it("reads file with carriage return and newline", function() + assert.are.same(expect, utils.split_lines(carriage_newline_file)) + end) + end) + else + describe("handles files on non Windows environment", function() + it("reads file with newline only", function() + assert.are.same(expect, utils.split_lines(newline_file)) + end) + end) + end +end)