56 lines
1.2 KiB
Lua
56 lines
1.2 KiB
Lua
|
local function split_ext(path)
|
||
|
return path:match('^(.+)(%..+)$')
|
||
|
end
|
||
|
|
||
|
local function file_exists(path)
|
||
|
return vim.loop.fs_stat(path) ~= nil
|
||
|
end
|
||
|
|
||
|
local function locate_flip_path(name, exts)
|
||
|
for key, _ in pairs(exts) do
|
||
|
local path = name .. key
|
||
|
if file_exists(path) then
|
||
|
return path
|
||
|
end
|
||
|
|
||
|
local path_upper = name .. key:upper()
|
||
|
if file_exists(path_upper) then
|
||
|
return path_upper
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
local function hflip()
|
||
|
local header_exts = {
|
||
|
['.h'] = true,
|
||
|
['.hpp'] = true,
|
||
|
['.lua'] = true,
|
||
|
}
|
||
|
|
||
|
local source_exts = {
|
||
|
['.c'] = true,
|
||
|
['.cpp'] = true
|
||
|
}
|
||
|
|
||
|
local index = vim.api.nvim_get_current_buf()
|
||
|
local path = vim.api.nvim_buf_get_name(index)
|
||
|
local name, ext = split_ext(path)
|
||
|
|
||
|
ext = ext:lower()
|
||
|
|
||
|
local flip_path
|
||
|
if header_exts[ext] then
|
||
|
flip_path = locate_flip_path(name, source_exts)
|
||
|
elseif source_exts[ext] then
|
||
|
flip_path = locate_flip_path(name, header_exts)
|
||
|
end
|
||
|
|
||
|
if flip_path then
|
||
|
vim.api.nvim_exec(string.format('e %s', flip_path), false)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
return {
|
||
|
hflip = hflip
|
||
|
}
|