Skip to content

Commit b361af5

Browse files
authored
Merge pull request #25 from mhiro2/refactor/config-persist-api-popup
refactor(core): Split config, persist, api, and popup layers
2 parents 577f08c + d5a3e27 commit b361af5

25 files changed

Lines changed: 2198 additions & 1540 deletions

lua/peekstack/config.lua

Lines changed: 4 additions & 613 deletions
Large diffs are not rendered by default.

lua/peekstack/config/defaults.lua

Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
local DEFAULT_CLOSE_EVENTS = { "CursorMoved", "InsertEnter", "BufLeave", "WinLeave" }
2+
3+
---@type PeekstackConfig
4+
return {
5+
ui = {
6+
layout = {
7+
style = "stack",
8+
offset = { row = 1, col = 4 },
9+
shrink = { w = 4, h = 2 },
10+
min_size = { w = 60, h = 12 },
11+
max_ratio = 0.65,
12+
zindex_base = 50,
13+
},
14+
title = {
15+
enabled = true,
16+
format = "{icon}{kind}{provider} {path}:{line}{context}",
17+
icons = {
18+
enabled = true,
19+
map = {
20+
lsp = "",
21+
diagnostics = "",
22+
grep = "",
23+
file = "",
24+
marks = "",
25+
},
26+
},
27+
context = {
28+
enabled = false,
29+
max_depth = 5,
30+
separator = "",
31+
node_types = {},
32+
},
33+
},
34+
path = {
35+
base = "repo",
36+
max_width = 80,
37+
},
38+
stack_view = {
39+
position = "right",
40+
},
41+
inline_preview = {
42+
enabled = true,
43+
max_lines = 10,
44+
hl_group = "PeekstackInlinePreview",
45+
close_events = DEFAULT_CLOSE_EVENTS,
46+
},
47+
quick_peek = {
48+
close_events = DEFAULT_CLOSE_EVENTS,
49+
},
50+
popup = {
51+
editable = false,
52+
buffer_mode = "copy",
53+
source = {
54+
prevent_auto_close_if_modified = true,
55+
confirm_on_close = true,
56+
},
57+
history = {
58+
max_items = 50,
59+
restore_position = "top",
60+
},
61+
auto_close = {
62+
enabled = false,
63+
idle_ms = 300000,
64+
check_interval_ms = 60000,
65+
ignore_pinned = true,
66+
},
67+
},
68+
feedback = {
69+
highlight_origin_on_close = true,
70+
},
71+
promote = {
72+
close_popup = true,
73+
},
74+
keys = {
75+
close = "q",
76+
focus_next = "<C-j>",
77+
focus_prev = "<C-k>",
78+
promote_split = "<C-x>",
79+
promote_vsplit = "<C-v>",
80+
promote_tab = "<C-t>",
81+
toggle_stack_view = "<leader>os",
82+
zoom = "<C-z>",
83+
},
84+
},
85+
picker = {
86+
backend = "builtin",
87+
builtin = {
88+
preview_lines = 1,
89+
},
90+
},
91+
providers = {
92+
lsp = { enable = true },
93+
diagnostics = { enable = true },
94+
file = { enable = true },
95+
marks = {
96+
enable = false,
97+
include = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ",
98+
include_special = false,
99+
},
100+
},
101+
persist = {
102+
enabled = false,
103+
max_items = 200,
104+
session = {
105+
default_name = "default",
106+
prompt_if_missing = true,
107+
},
108+
auto = {
109+
enabled = false,
110+
session_name = "auto",
111+
restore = true,
112+
save = true,
113+
restore_if_empty = true,
114+
debounce_ms = 1000,
115+
save_on_leave = true,
116+
},
117+
},
118+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
local ui = require("peekstack.config.validate.rules.ui")
2+
local picker = require("peekstack.config.validate.rules.picker")
3+
local providers = require("peekstack.config.validate.rules.providers")
4+
local persist = require("peekstack.config.validate.rules.persist")
5+
6+
local M = {}
7+
8+
---@param cfg table
9+
---@param defaults PeekstackConfig
10+
function M.run(cfg, defaults)
11+
ui.validate(cfg, defaults)
12+
picker.validate(cfg, defaults)
13+
providers.validate(cfg, defaults)
14+
persist.validate(cfg, defaults)
15+
end
16+
17+
return M
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
local shared = require("peekstack.config.validate.shared")
2+
3+
local M = {}
4+
5+
---@type PeekstackConfigFieldRule[]
6+
local PERSIST_RULES = {
7+
{ key = "max_items", validate = shared.field_number_range({ min = 1 }) },
8+
}
9+
10+
---@type PeekstackConfigFieldRule[]
11+
local PERSIST_SESSION_RULES = {
12+
{ key = "default_name", validate = shared.field_type("string") },
13+
{ key = "prompt_if_missing", validate = shared.field_type("boolean") },
14+
}
15+
16+
---@type PeekstackConfigFieldRule[]
17+
local PERSIST_AUTO_RULES = {
18+
{ key = "enabled", validate = shared.field_type("boolean") },
19+
{ key = "session_name", validate = shared.field_type("string") },
20+
{ key = "restore", validate = shared.field_type("boolean") },
21+
{ key = "save", validate = shared.field_type("boolean") },
22+
{ key = "restore_if_empty", validate = shared.field_type("boolean") },
23+
{ key = "debounce_ms", validate = shared.field_type("number") },
24+
{ key = "save_on_leave", validate = shared.field_type("boolean") },
25+
}
26+
27+
---@param cfg table
28+
---@param defaults PeekstackConfig
29+
function M.validate(cfg, defaults)
30+
local persist = shared.as_table(cfg.persist)
31+
if not persist then
32+
return
33+
end
34+
35+
shared.apply_rules(persist, "persist", defaults.persist, PERSIST_RULES)
36+
37+
local session = shared.as_table(persist.session)
38+
if session then
39+
shared.apply_rules(session, "persist.session", defaults.persist.session, PERSIST_SESSION_RULES)
40+
end
41+
42+
if persist.auto ~= nil then
43+
local auto = shared.ensure_table_field(
44+
persist,
45+
"auto",
46+
"persist.auto",
47+
defaults.persist.auto,
48+
{ fallback = false, message = "persist.auto must be a table" }
49+
)
50+
if auto then
51+
shared.apply_rules(auto, "persist.auto", defaults.persist.auto, PERSIST_AUTO_RULES)
52+
end
53+
end
54+
end
55+
56+
return M
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
local shared = require("peekstack.config.validate.shared")
2+
3+
local M = {}
4+
5+
---@type string[]
6+
local KNOWN_BACKENDS = { "builtin", "telescope", "fzf-lua", "snacks" }
7+
8+
---@type PeekstackConfigFieldRule[]
9+
local PICKER_RULES = {
10+
{ key = "backend", validate = shared.field_enum(KNOWN_BACKENDS), require_truthy = true },
11+
}
12+
13+
---@param cfg table
14+
---@param defaults PeekstackConfig
15+
function M.validate(cfg, defaults)
16+
local picker = shared.as_table(cfg.picker)
17+
if picker then
18+
shared.apply_rules(picker, "picker", defaults.picker, PICKER_RULES)
19+
end
20+
end
21+
22+
return M
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
local shared = require("peekstack.config.validate.shared")
2+
3+
local M = {}
4+
5+
---@type PeekstackConfigFieldRule[]
6+
local MARKS_RULES = {
7+
{ key = "include", validate = shared.field_type("string") },
8+
{ key = "include_special", validate = shared.field_type("boolean") },
9+
}
10+
11+
---@param cfg table
12+
---@param defaults PeekstackConfig
13+
function M.validate(cfg, defaults)
14+
local providers = shared.as_table(cfg.providers)
15+
if not providers then
16+
return
17+
end
18+
19+
local marks = shared.as_table(providers.marks)
20+
if marks then
21+
shared.apply_rules(marks, "providers.marks", defaults.providers.marks, MARKS_RULES)
22+
end
23+
end
24+
25+
return M

0 commit comments

Comments
 (0)