| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145 | local M = {}local api = vim.apifunction M.print_profile(profile)  if not profile then    print "Error: profiling was not enabled"    return  end  local total_resolve = 0  local total_load = 0  local name_pad = 0  local modules = {}  local plugins = {}  for module, p in pairs(profile) do    p.resolve = p.resolve / 1000000    p.load = p.load / 1000000    p.total = p.resolve + p.load    p.module = module:gsub("/", ".")    local plugin = p.module:match "([^.]+)"    if plugin then      if not plugins[plugin] then        plugins[plugin] = {          module = plugin,          resolve = 0,          load = 0,          total = 0,        }      end      local r = plugins[plugin]      r.resolve = r.resolve + p.resolve      r.load = r.load + p.load      r.total = r.total + p.total      if not r.loader then        r.loader = p.loader      elseif r.loader ~= p.loader then        r.loader = "mixed"      end    end    total_resolve = total_resolve + p.resolve    total_load = total_load + p.load    if #module > name_pad then      name_pad = #module    end    modules[#modules + 1] = p  end  table.sort(modules, function(a, b)    return a.module > b.module  end)  do    local plugins_a = {}    for _, v in pairs(plugins) do      plugins_a[#plugins_a + 1] = v    end    plugins = plugins_a  end  table.sort(plugins, function(a, b)    return a.total > b.total  end)  local lines = {}  local function add(...)    lines[#lines + 1] = string.format(...)  end  local l = string.rep("─", name_pad + 1)  add(    "%s┬───────────┬────────────┬────────────┬────────────┐",    l  )  add("%-" .. name_pad .. "s │ Loader    │ Resolve    │ Load       │ Total      │", "")  add(    "%s┼───────────┼────────────┼────────────┼────────────┤",    l  )  add(    "%-" .. name_pad .. "s │           │ %8.4fms │ %8.4fms │ %8.4fms │",    "Total",    total_resolve,    total_load,    total_resolve + total_load  )  add(    "%s┴───────────┴────────────┴────────────┴────────────┤",    l  )  add("%-" .. name_pad .. "s                                                    │", "By Plugin")  add(    "%s┬───────────┬────────────┬────────────┬────────────┤",    l  )  for _, p in ipairs(plugins) do    add(      "%-" .. name_pad .. "s │ %9s │ %8.4fms │ %8.4fms │ %8.4fms │",      p.module,      p.loader,      p.resolve,      p.load,      p.total    )  end  add(    "%s┴───────────┴────────────┴────────────┴────────────┤",    l  )  add("%-" .. name_pad .. "s                                                    │", "By Module")  add(    "%s┬───────────┬────────────┬────────────┬────────────┤",    l  )  for _, p in pairs(modules) do    add(      "%-" .. name_pad .. "s │ %9s │ %8.4fms │ %8.4fms │ %8.4fms │",      p.module,      p.loader,      p.resolve,      p.load,      p.total    )  end  add(    "%s┴───────────┴────────────┴────────────┴────────────┘",    l  )  local bufnr = api.nvim_create_buf(false, false)  api.nvim_buf_set_lines(bufnr, 0, 0, false, lines)  api.nvim_buf_set_option(bufnr, "buftype", "nofile")  api.nvim_buf_set_name(bufnr, "Impatient Profile Report")  api.nvim_set_current_buf(bufnr)endreturn M
 |