Skip to content

Commit

Permalink
fix: handle cross platform line splits
Browse files Browse the repository at this point in the history
  • Loading branch information
xudyang1 committed May 21, 2024
1 parent 0d9a17d commit 4d4e91f
Show file tree
Hide file tree
Showing 9 changed files with 86 additions and 10 deletions.
2 changes: 2 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
lua/tests/fixtures/split_lines/carriage_newline.txt text eol=crlf
lua/tests/fixtures/split_lines/newline.txt text eol=lf
12 changes: 6 additions & 6 deletions lua/telescope/builtin/__internal.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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, {
Expand Down
3 changes: 2 additions & 1 deletion lua/telescope/init.lua
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
local _extensions = require "telescope._extensions"
local utils = require "telescope.utils"

local telescope = {}

Expand Down Expand Up @@ -164,7 +165,7 @@ telescope.__format_setup_keys = function()
table.insert(result, "")
table.insert(result, string.format("%s*telescope.defaults.%s*", string.rep(" ", 70 - 20 - #name), name))
table.insert(result, string.format("%s: ~", name))
for _, line in ipairs(vim.split(desc, "\n")) do
for _, line in ipairs(utils.split_lines(desc)) do
table.insert(result, string.format(" %s", line))
end
end
Expand Down
2 changes: 1 addition & 1 deletion lua/telescope/previewers/buffer_previewer.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
6 changes: 4 additions & 2 deletions lua/telescope/previewers/utils.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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])
Expand Down
12 changes: 12 additions & 0 deletions lua/telescope/utils.lua
Original file line number Diff line number Diff line change
Expand Up @@ -741,4 +741,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
43 changes: 43 additions & 0 deletions lua/tests/automated/utils_spec.lua
Original file line number Diff line number Diff line change
Expand Up @@ -353,3 +353,46 @@ describe("path_tail", function()
end)
end
end)

describe("split_lines", function()
local function read_file(path)
local file = io.open(path, "rb")
if not file then
return nil
end
local content = file:read "*a"
file:close()
return content
end

local newline = [[./lua/tests/fixtures/split_lines/newline.txt]]
local carriage_newline = [[./lua/tests/fixtures/split_lines/carriage_newline.txt]]
local expect = {
"",
"",
"line3 of the file",
"",
"line5 of the file",
"",
"",
"line8 of the file, last line of file",
"",
}

if jit and jit.os:lower() == "windows" then
describe("handles files on Windows", function()
it("reads file with newline only", function()
assert.are.same(expect, utils.split_lines(read_file(newline)))
end)
it("reads file with carriage return and newline", function()
assert.are.same(expect, utils.split_lines(read_file(carriage_newline)))
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(read_file(newline)))
end)
end)
end
end)
8 changes: 8 additions & 0 deletions lua/tests/fixtures/split_lines/carriage_newline.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@


line3 of the file

line5 of the file


line8 of the file, last line of file
8 changes: 8 additions & 0 deletions lua/tests/fixtures/split_lines/newline.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@


line3 of the file

line5 of the file


line8 of the file, last line of file

0 comments on commit 4d4e91f

Please sign in to comment.