-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathinit.lua
More file actions
166 lines (150 loc) · 7.09 KB
/
Copy pathinit.lua
File metadata and controls
166 lines (150 loc) · 7.09 KB
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
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
-- ═════════════════════════════════════════════════════════════════════
-- Neovim 0.12 · vim.pack · Built-in LSP / Treesitter / Completion
-- Performance-tuned for large codebases — see lua/config/ for settings
-- Pure black & white — engineered for focus
-- ═════════════════════════════════════════════════════════════════════
-- Bytecode cache (must be absolute first)
vim.loader.enable()
-- Hard minimum — bail early on anything below 0.12
if vim.fn.has('nvim-0.12') == 0 then
vim.api.nvim_echo({ { 'This config requires Neovim 0.12+', 'ErrorMsg' } }, true, {})
return
end
-- Providers off before anything loads
vim.g.loaded_node_provider = 0
vim.g.loaded_perl_provider = 0
vim.g.loaded_python3_provider = 0
vim.g.loaded_ruby_provider = 0
-- Skip menus (never used in terminal)
vim.g.did_install_default_menus = 1
vim.g.did_install_syntax_menu = 1
-- Kill runtime plugins we never use (including system fzf.vim)
for _, p in ipairs({
'gzip', 'tar', 'tarPlugin', 'zip', 'zipPlugin',
'getscript', 'getscriptPlugin', 'vimball', 'vimballPlugin',
'2html_plugin', 'tohtml', 'logiPat', 'rrhelper',
'matchit', 'spec',
'tutor_mode_plugin', 'rplugin', 'spellfile_plugin',
'remote_plugins', 'shada_plugin', 'fzf',
'man', 'osc52',
'netrw', 'netrwPlugin', 'netrwSettings', 'netrwFileHandlers',
}) do
vim.g['loaded_' .. p] = 1
end
-- Feedback helper — defined before modules so keymaps/autocmds/statusline can use it
function _G._toggle_msg(text)
vim.api.nvim_echo({ { tostring(text), 'ModeMsg' } }, false, {})
end
-- ── Immediate (blocks first frame — must be fast) ───────────────────
local cfg = require('config')
for _, mod in ipairs({ 'options', 'keymaps', 'autopairs', 'autocmds', 'statusline' }) do
local ok, err = pcall(require, mod)
if not ok then vim.notify('Failed to load ' .. mod .. ': ' .. tostring(err), vim.log.levels.ERROR) end
end
local ok_cs, err_cs = pcall(vim.cmd.colorscheme, cfg.colorscheme)
if not ok_cs then vim.notify('Colorscheme failed: ' .. tostring(err_cs), vim.log.levels.WARN) end
-- ── Post-render (truly deferred — runs AFTER first frame) ───────────
-- vim.schedule alone doesn't guarantee post-render; VimEnter + defer_fn(0)
-- fires after the UI draws its first frame, keeping startup time clean.
vim.api.nvim_create_autocmd('VimEnter', {
once = true,
callback = function()
-- Phase 1: LSP (highest priority) + undodir ensure
vim.defer_fn(function()
vim.fn.mkdir(vim.o.undodir, 'p')
require('lsp')
end, 0)
-- Phase 2: finder + git + oil + sessions + fff (needed soon, not for first frame)
vim.defer_fn(function()
require('finder')
require('plugins.fff')
require('terminal')
require('git').setup()
require('plugins.oil').setup()
require('plugins.resession')
end, 10)
-- Phase 3: gitsigns + diffview (heaviest — spawns git processes per buffer)
vim.defer_fn(function()
require('plugins.gitsigns')
require('plugins.diffview')
end, 50)
end,
})
-- ── Lazy FileType loaders (zero cost until first relevant buffer) ────
vim.api.nvim_create_autocmd('FileType', {
pattern = 'http',
once = true,
callback = function(ev)
local ok, rest = pcall(require, 'plugins.rest')
if ok and rest.attach then rest.attach(ev.buf) end
end,
})
-- Opencode: lazy-load on first keypress (stub pattern)
local _opencode_loaded = false
local function _load_opencode(lhs)
if _opencode_loaded then return end
_opencode_loaded = true
local ok, err = pcall(require, 'plugins.opencode')
if not ok then
vim.notify('Opencode error: ' .. tostring(err), vim.log.levels.ERROR)
return
end
if lhs then
local keys = vim.api.nvim_replace_termcodes(lhs, true, false, true)
vim.api.nvim_feedkeys(keys, 'm', false)
end
end
for _, lhs in ipairs({ '<C-.>', '<leader>oa', '<leader>os', '<leader>oo', '<leader>oe', '<leader>or', '<leader>of', '<leader>ot', '<leader>od', '<leader>oi' }) do
vim.keymap.set({ 'n', 'x' }, lhs, function() _load_opencode(lhs) end, { desc = 'Loading opencode...' })
end
vim.keymap.set('t', '<C-.>', function() _load_opencode('<C-.>') end, { desc = 'Loading opencode...' })
-- ── Startup profiling (zero-cost until invoked) ─────────────────────
vim.api.nvim_create_user_command('PerfReport', function()
local modules = vim.tbl_count(package.loaded)
local bufs = 0
for _, buf in ipairs(vim.api.nvim_list_bufs()) do
if vim.bo[buf].buflisted then bufs = bufs + 1 end
end
collectgarbage('collect')
local mem = collectgarbage('count')
local stats = vim.loader.stats and vim.loader.stats() or nil
print('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━')
print(' NEOVIM PERFORMANCE REPORT')
print('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━')
print(string.format(' Loaded Modules: %d', modules))
print(string.format(' Active Buffers: %d', bufs))
print(string.format(' Memory (KB): %.0f', mem))
if stats then
print(string.format(' Loader stats: %s', vim.inspect(stats, { newline = ' ', indent = '' })))
end
print(string.format(' Loader enabled: %s', vim.loader.enabled and 'yes' or 'no'))
print('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━')
end, { desc = 'Startup performance report' })
-- ── Config edit / reload ────────────────────────────────────────────
vim.api.nvim_create_user_command('ConfigEdit', function()
vim.cmd('edit ' .. vim.fn.stdpath('config') .. '/init.lua')
end, { desc = 'Edit init.lua' })
vim.api.nvim_create_user_command('ConfigReload', function()
local reload_modules = {
config = true,
options = true, keymaps = true, autocmds = true, statusline = true,
lsp = true, finder = true, terminal = true, git = true,
plugins = true, text_objects = true, utils = true, format = true,
}
for name in pairs(package.loaded) do
local prefix = name:match('^([^%.]+)')
if prefix and reload_modules[prefix] then
package.loaded[name] = nil
end
end
dofile(vim.fn.stdpath('config') .. '/init.lua')
pcall(function() require('git').setup() end)
-- Re-init deferred plugins (VimEnter once=true won't re-fire)
pcall(require, 'plugins.fff')
pcall(require, 'plugins.gitsigns')
pcall(require, 'plugins.diffview')
pcall(require, 'plugins.resession')
if package.loaded['plugins.rest'] then pcall(require, 'plugins.rest') end
if package.loaded['plugins.opencode'] then pcall(require, 'plugins.opencode') end
vim.notify('Config reloaded', vim.log.levels.INFO)
end, { desc = 'Reload config' })