diff --git a/lua/ivy/utils.lua b/lua/ivy/utils.lua index 92f74e0..910e57f 100644 --- a/lua/ivy/utils.lua +++ b/lua/ivy/utils.lua @@ -1,110 +1,111 @@ local utils = {} -- A list of all of the actions defined by ivy. The callback function can -- implement as many of them as necessary. As a minimum it should implement the -- "EDIT" action that is called on the default complete. utils.actions = { EDIT = "EDIT", CHECKPOINT = "CHECKPOINT", VSPLIT = "VSPLIT", SPLIT = "SPLIT", } utils.command_map = { [utils.actions.EDIT] = "edit", [utils.actions.CHECKPOINT] = "edit", [utils.actions.VSPLIT] = "vsplit", [utils.actions.SPLIT] = "split", } utils.existing_command_map = { [utils.actions.EDIT] = "buffer", [utils.actions.CHECKPOINT] = "buffer", [utils.actions.VSPLIT] = "vsplit | buffer", [utils.actions.SPLIT] = "split | buffer", } utils.command_finder = function(command, min) if min == nil then min = 3 end return function(input) -- Dont run the commands unless we have somting to search that wont -- return a ton of results or on some commands the command files with -- no search term if #input < min then return "-- Please type more than " .. min .. " chars --" end -- TODO(ade): Think if we want to start escaping the command here. I -- dont know if its causing issues while trying to use regex especially -- with word boundaries `input:gsub("'", "\\'"):gsub('"', '\\"')` local handle = io.popen(command .. " " .. input .. " 2>&1 || true") if handle == nil then return {} end local results = {} for line in handle:lines() do table.insert(results, { content = line }) end handle:close() return results end end utils.vimgrep_action = function() return function(item, action) -- Match file and line form vimgrep style commands local file = item:match "([^:]+):" local line = item:match ":(%d+):" -- Cant do anything if we cant find a file to go to if file == nil then return end utils.file_action()(file, action) if line ~= nil then vim.cmd(line) end end end utils.file_action = function() return function(file, action) if file == nil then return end local buffer_number = vim.fn.bufnr(file) local command if buffer_number > -1 then command = utils.existing_command_map[action] else command = utils.command_map[action] end if command == nil then vim.api.nvim_err_writeln("[IVY] The file action is unable the handel the action " .. action) return end vim.cmd(command .. " " .. utils.escape_file_name(file)) end end utils.line_action = function() return function(item) local line = item:match "^%s+(%d+):" vim.cmd(line) end end utils.escape_file_name = function(input) - return string.gsub(input, "([$])", "\\%1") + local file, _ = string.gsub(input, "([$%]\\[])", "\\%1") + return file end return utils diff --git a/lua/ivy/utils_escape_test.lua b/lua/ivy/utils_escape_test.lua new file mode 100644 index 0000000..ebe41d2 --- /dev/null +++ b/lua/ivy/utils_escape_test.lua @@ -0,0 +1,11 @@ +local utils = require "ivy.utils" + +it("will escape a dollar in the file name", function(t) + local result = utils.escape_file_name "/path/to/$file/$name.lua" + t.assert_equal(result, "/path/to/\\$file/\\$name.lua") +end) + +it("will escape a brackets in the file name", function(t) + local result = utils.escape_file_name "/path/to/[file]/[name].lua" + t.assert_equal(result, "/path/to/\\[file\\]/\\[name\\].lua") +end)