| 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
 | local M = {}
local api = vim.api
function 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)
end
return M
 |