feat(vim): add go to spec plugin
This will find the spec file that is associated to the current source file.
This commit is contained in:
parent
77575fc2a7
commit
1f8b491825
1 changed files with 82 additions and 0 deletions
82
site-modules/core/files/vim/plugin/spec.lua
Normal file
82
site-modules/core/files/vim/plugin/spec.lua
Normal file
|
|
@ -0,0 +1,82 @@
|
|||
local alternate_type = {
|
||||
SPEC = "spec",
|
||||
}
|
||||
|
||||
local alternates = {
|
||||
-- Market dojo spec files for components. We need to remove the component
|
||||
-- directory to map them to the correct folder map.
|
||||
["app/javascript/components/(.*)%.(jsx?)$"] = {
|
||||
{ type = alternate_type.SPEC, file = "spec/react/%1.spec.%2", default = true },
|
||||
},
|
||||
-- Market dojo spec files for other javascript stuff
|
||||
["app/javascript/(.*)%.(jsx?)$"] = {
|
||||
{ type = alternate_type.SPEC, file = "spec/react/%1.spec.%2", default = true },
|
||||
},
|
||||
-- Map js/ts files to spec files from the application dir
|
||||
["app/(.*)%.([jt]sx?)$"] = {
|
||||
{ type = alternate_type.SPEC, file = "spec/%1.test.%2" },
|
||||
{ type = alternate_type.SPEC, file = "test/%1.test.%2" },
|
||||
{ type = alternate_type.SPEC, file = "tests/%1.test.%2" },
|
||||
{ type = alternate_type.SPEC, file = "spec/%1.spec.%2" },
|
||||
{ type = alternate_type.SPEC, file = "tests/%1.spec.%2", default = true },
|
||||
},
|
||||
-- Map js/ts files to spec files from the source dir
|
||||
["src/(.*)%.([jt]sx?)$"] = {
|
||||
{ type = alternate_type.SPEC, file = "spec/%1.test.%2" },
|
||||
{ type = alternate_type.SPEC, file = "test/%1.test.%2" },
|
||||
{ type = alternate_type.SPEC, file = "tests/%1.test.%2" },
|
||||
{ type = alternate_type.SPEC, file = "spec/%1.spec.%2" },
|
||||
{ type = alternate_type.SPEC, file = "tests/%1.spec.%2", default = true },
|
||||
},
|
||||
}
|
||||
|
||||
local function file_exists(filename)
|
||||
local file = io.open(filename, "r")
|
||||
if file then
|
||||
io.close(file)
|
||||
return true
|
||||
else
|
||||
return false
|
||||
end
|
||||
end
|
||||
|
||||
local function find_alt(
|
||||
_, --[[ type ]]
|
||||
file_name
|
||||
)
|
||||
local default_alternate = nil
|
||||
|
||||
for key, match_list in pairs(alternates) do
|
||||
for _, match in ipairs(match_list) do
|
||||
local alternate, found = string.gsub(file_name, key, match.file)
|
||||
if found > 0 then
|
||||
if file_exists(alternate) then
|
||||
return alternate
|
||||
elseif match.default then
|
||||
default_alternate = alternate
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- Return the first default match we find.
|
||||
if default_alternate ~= nil then
|
||||
return default_alternate
|
||||
end
|
||||
end
|
||||
|
||||
-- Not alternative found
|
||||
return nil
|
||||
end
|
||||
|
||||
vim.api.nvim_create_user_command("GoToSpec", function()
|
||||
local buffer_name = vim.fn.fnamemodify(vim.fn.expand "%", ":p:~:.")
|
||||
local spec = find_alt(nil, buffer_name)
|
||||
if spec ~= nil then
|
||||
vim.cmd("edit " .. spec)
|
||||
return
|
||||
end
|
||||
|
||||
print("ERR: No alternate file found for " .. buffer_name)
|
||||
end, { bang = true, desc = "Go to the spec file for the current buffer" })
|
||||
|
||||
vim.keymap.set("n", "gs", ":GoToSpec<CR>", { silent = true })
|
||||
Loading…
Reference in a new issue