How to fix my gf command on lua files

Let’s say I have this in my init.lua

-- vim.cmd([[colo monokai]])
vim.cmd([[colo gruvbox]])

require('options')
require('utils')
require('plugins')
require('mappings')
require('autocmd')

When I press gf over “plugins” for example it does not open the correct file. I have also tried something like this on my after/ftplugin/lua.vim:

nnoremap <silent><buffer> gf :execute 'drop' expand('<cfile>').'.lua'<CR>

It adds the extension but does not solves the path issue.

I also have this on my options.lua:

opt.path = vim.opt.path + ".,**"

I have found the solution:

You can just add it to ftplugin/lua.lua or after/ftplugin/lua.lua : Properly open lua and fennel required files via gf · GitHub

local fmt = string.format

-- Iterator that splits a string o a given delimiter
local function split(str, delim)
  delim = delim or "%s"
  return string.gmatch(str, fmt('[^%s]+', delim))
end

-- Find the proper directory separator depending
-- on lua installation or OS.
local function dir_separator()
  -- Look at package.config for directory separator string (it's the first line)
  if package.config then
    return string.match(package.config, '^[^\n]')
  elseif vim.fn.has('win32') == 1 then
    return '\\'
  else
    return '/'
  end
end

-- Search for lua traditional include paths.
-- This mimics how require internally works.
local function include_paths(fname, ext)
  ext = ext or "lua"
  local sep = dir_separator()
  local paths = string.gsub(package.path, '%?', fname)
  for path in split(paths, "%;") do
    if vim.fn.filereadable(path) == 1 then
      return path
    end
  end
end

-- Search for nvim lua include paths
local function include_rtpaths(fname, ext)
  ext = ext or "lua"
  local sep = dir_separator()
  local rtpaths = vim.api.nvim_list_runtime_paths()
  local modfile, initfile = fmt('%s.%s', fname, ext), fmt('init.%s', ext)
  for _, path in ipairs(rtpaths) do
    -- Look on runtime path for 'lua/*.lua' files
    local path1 = table.concat({path, ext, modfile}, sep)
    if     vim.fn.filereadable(path1) == 1 then
      return path1
    end
    -- Look on runtime path for 'lua/*/init.lua' files
    local path2 = table.concat({path, ext, fname, initfile}, sep)
    if vim.fn.filereadable(path2) == 1 then
      return path2
    end
  end
end

-- Global function that searches the path for the required file
function find_required_path(module)
  -- Look at package.config for directory separator string (it's the first line)
  local sep = string.match(package.config, '^[^\n]')
  -- Properly change '.' to separator (probably '/' on *nix and '\' on Windows)
  local fname = vim.fn.substitute(module, "\\.", sep, "g")
  local f
  ---- First search for lua modules
  f = include_paths(fname, 'lua')
  if f then return f end
  -- This part is just for nvim modules
  f = include_rtpaths(fname, 'lua')
  if f then return f end
  ---- Now search for Fennel modules
  f = include_paths(fname, 'fnl')
  if f then return f end
  -- This part is just for nvim modules
  f = include_rtpaths(fname, 'fnl')
  if f then return f end
end


-- Set options to open require with gf
vim.opt_local.include = [=[\v<((do|load)file|require)\s*\(?['"]\zs[^'"]+\ze['"]]=]
vim.opt_local.includeexpr = "v:lua.find_required_path(v:fname)"

It seems like at the same reddit page solution exists a simpler way of solving the issue:

vim.opt_local.suffixesadd:prepend('.lua')
vim.opt_local.suffixesadd:prepend('init.lua')
vim.opt_local.path:prepend(vim.fn.stdpath('config')..'/lua')