Skip to content

Commit fb4ae10

Browse files
committed
📦 build(clink): update custom clink scripts
1 parent f7d68aa commit fb4ae10

File tree

5 files changed

+348
-253
lines changed

5 files changed

+348
-253
lines changed

clink/clink-custom/oh-my-posh.lua

Lines changed: 0 additions & 14 deletions
This file was deleted.

clink/clink-custom/prompt.lua

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
-- Only one of the following should be set to `true`, otherwise `false`
2+
local starship_enabled = true
3+
local ohmyposh_enabled = false
4+
5+
6+
7+
-- Ensure only one of the options is enabled
8+
if starship_enabled and ohmyposh_enabled then
9+
error("Only one of 'starship_enabled' or 'ohmyposh_enabled' can be set to true.")
10+
return
11+
end
12+
13+
-- Load the appropriate prompt based on the enabled option
14+
if starship_enabled then
15+
-- Initialize Starship prompt
16+
local starship_init = io.popen("starship init cmd")
17+
if not starship_init then
18+
error("Failed to initialize Starship prompt.")
19+
return
20+
end
21+
load(starship_init:read("*a"))()
22+
starship_init:close()
23+
24+
elseif ohmyposh_enabled then
25+
-- Ensure POSH_THEMES_PATH is set
26+
local posh_themes_path = os.getenv("POSH_THEMES_PATH")
27+
if not posh_themes_path then
28+
error("Environment variable 'POSH_THEMES_PATH' is not set.")
29+
return
30+
end
31+
32+
-- Construct the full path to the Oh My Posh theme file
33+
local ohmyposh_theme_file = posh_themes_path .. "/catppuccin_mocha.omp.json"
34+
local ohmyposh_theme = string.gsub(ohmyposh_theme_file, "\\", "/")
35+
36+
-- Initialize Oh My Posh prompt
37+
local ohmyposh_init = io.popen("oh-my-posh init cmd --config " .. ohmyposh_theme)
38+
if not ohmyposh_init then
39+
error("Failed to initialize Oh My Posh prompt.")
40+
return
41+
end
42+
load(ohmyposh_init:read("*a"))()
43+
ohmyposh_init:close()
44+
else
45+
-- Return if no `oh-my-posh` or `starship` prompt is enabled
46+
return
47+
end

clink/clink-custom/starship.lua

Lines changed: 0 additions & 1 deletion
This file was deleted.

clink/clink-custom/vfox.lua

Lines changed: 154 additions & 143 deletions
Original file line numberDiff line numberDiff line change
@@ -1,161 +1,172 @@
1+
-- Check if `vfox` command exists
2+
local function is_vfox_available()
3+
local check = os.execute("vfox --version >nul 2>&1")
4+
return check == 0
5+
end
6+
7+
if not is_vfox_available() then
8+
return
9+
end
10+
111
-- https://chrisant996.github.io/clink/clink.html#extending-clink
12+
-- https://github.com/version-fox/vfox/blob/main/internal/shell/clink_vfox.lua
213
local vfox_sdk_table = {}
14+
315
clink.argmatcher('vfox'):nofiles():setdelayinit(function(vfox)
4-
if #vfox_sdk_table ~= 0 then
5-
return
6-
end
16+
if #vfox_sdk_table ~= 0 then
17+
return
18+
end
719

8-
local current_timestamp = os.time()
9-
local file_name = os.getenv('USERPROFILE') .. '\\vfox_available.txt'
10-
local file_available = io.open(file_name, 'r')
11-
if file_available then
12-
local file_timestamp = tonumber(file_available:read('*l'))
13-
if current_timestamp - file_timestamp <= 24 * 60 * 60 then
14-
for line in file_available:lines() do
15-
table.insert(vfox_sdk_table, line)
16-
end
17-
end
18-
file_available:close()
19-
end
20+
local current_timestamp = os.time()
21+
local file_name = os.getenv('USERPROFILE') .. '\\vfox_available.txt'
22+
local file_available = io.open(file_name, 'r')
23+
if file_available then
24+
local file_timestamp = tonumber(file_available:read('*l'))
25+
if current_timestamp - file_timestamp <= 24 * 60 * 60 then
26+
for line in file_available:lines() do
27+
table.insert(vfox_sdk_table, line)
28+
end
29+
end
30+
file_available:close()
31+
end
2032

21-
if #vfox_sdk_table == 0 then
22-
file_available = io.open(file_name, 'w')
23-
file_available:write(current_timestamp .. '\n')
24-
local vfox_available = io.popen('vfox available')
25-
for line in vfox_available:lines() do
26-
local trim = line:gsub('%c%[%d+m', '')
27-
local name = trim:match('^(%S+)')
28-
if name and (trim:find('YES') or trim:find('NO')) then
29-
table.insert(vfox_sdk_table, name)
30-
file_available:write(name .. '\n')
31-
end
32-
end
33-
vfox_available:close()
34-
file_available:close()
35-
end
33+
if #vfox_sdk_table == 0 then
34+
file_available = io.open(file_name, 'w')
35+
file_available:write(current_timestamp .. '\n')
36+
local vfox_available = io.popen('vfox available')
37+
for line in vfox_available:lines() do
38+
local trim = line:gsub('%c%[%d+m', '')
39+
local name = trim:match('^(%S+)')
40+
if name and (trim:find('YES') or trim:find('NO')) then
41+
table.insert(vfox_sdk_table, name)
42+
file_available:write(name .. '\n')
43+
end
44+
end
45+
vfox_available:close()
46+
file_available:close()
47+
end
3648

37-
local function vfox_ls_func()
38-
local pre, ls = '', {}
39-
local vfox_ls = io.popen('vfox ls')
40-
for line in vfox_ls:lines() do
41-
local txt = line:gsub('%c%[%d+m', ''):match('^%A+(%a.+)')
42-
if txt then
43-
if txt:find('v') == 1 then
44-
ls[pre] = true
45-
table.insert(ls, pre .. '@' .. txt:sub(2))
46-
else
47-
pre = txt
48-
ls[pre] = false
49-
end
50-
end
51-
end
52-
vfox_ls:close()
53-
return ls
54-
end
55-
local function vfox_sdk_func()
56-
local ls, res = vfox_ls_func(), {}
57-
for k, v in pairs(ls) do
58-
if type(v) == 'boolean' then
59-
table.insert(res, k)
60-
end
61-
end
62-
return res
63-
end
49+
local function vfox_ls_func()
50+
local pre, ls = '', {}
51+
local vfox_ls = io.popen('vfox ls')
52+
for line in vfox_ls:lines() do
53+
local txt = line:gsub('%c%[%d+m', ''):match('^%A+(%a.+)')
54+
if txt then
55+
if txt:find('v') == 1 then
56+
ls[pre] = true
57+
table.insert(ls, pre .. '@' .. txt:sub(2))
58+
else
59+
pre = txt
60+
ls[pre] = false
61+
end
62+
end
63+
end
64+
vfox_ls:close()
65+
return ls
66+
end
67+
local function vfox_sdk_func()
68+
local ls, res = vfox_ls_func(), {}
69+
for k, v in pairs(ls) do
70+
if type(v) == 'boolean' then
71+
table.insert(res, k)
72+
end
73+
end
74+
return res
75+
end
6476

65-
local vfox_sdk = clink.argmatcher():nofiles():addarg(vfox_sdk_func):addflags('--help', '-h')
66-
local vfox_use = clink.argmatcher():nofiles():addarg(function()
67-
local ls, res = vfox_ls_func(), {}
68-
for k, v in pairs(ls) do
69-
if v then
70-
table.insert(res, v == true and k or v)
71-
end
72-
end
73-
return res
74-
end):addflags('--global', '-g', '--session', '-s', '--project', '-p', '--help', '-h')
75-
local vfox_help = clink.argmatcher():nofiles():addflags('--help', '-h')
76-
local vfox_shell = clink.argmatcher():nofiles():addarg('bash', 'zsh', 'pwsh', 'fish', 'clink')
77-
local vfox_uninstall = clink.argmatcher():nofiles():addarg(vfox_ls_func):addflags('--help', '-h')
78-
local vfox_install = clink.argmatcher():nofiles():addarg({
79-
onadvance = function() return 0 end,
80-
vfox_sdk_func,
81-
}):addflags('--all', '-a', '--help', '-h')
77+
local vfox_sdk = clink.argmatcher():nofiles():addarg(vfox_sdk_func):addflags('--help', '-h')
78+
local vfox_use = clink.argmatcher():nofiles():addarg(function()
79+
local ls, res = vfox_ls_func(), {}
80+
for k, v in pairs(ls) do
81+
if v then
82+
table.insert(res, v == true and k or v)
83+
end
84+
end
85+
return res
86+
end):addflags('--global', '-g', '--session', '-s', '--project', '-p', '--help', '-h')
87+
local vfox_help = clink.argmatcher():nofiles():addflags('--help', '-h')
88+
local vfox_shell = clink.argmatcher():nofiles():addarg('bash', 'zsh', 'pwsh', 'fish', 'clink')
89+
local vfox_uninstall = clink.argmatcher():nofiles():addarg(vfox_ls_func):addflags('--help', '-h')
90+
local vfox_install = clink.argmatcher():nofiles():addarg({
91+
onadvance = function() return 0 end,
92+
vfox_sdk_func,
93+
}):addflags('--all', '-a', '--help', '-h')
8294

83-
vfox:addarg(
84-
'add' .. clink.argmatcher():nofiles():addarg({
85-
onadvance = function() return 0 end,
86-
function(word, word_index, line_state)
87-
local res, line = {}, line_state:getline()
88-
for _, v in ipairs(vfox_sdk_table) do
89-
if not line:find(v) then
90-
table.insert(res, v)
91-
end
92-
end
93-
return res
94-
end
95-
}):addflags('--source', '-s', '--alias', '--help', '-h'),
96-
'use' .. vfox_use, 'u' .. vfox_use,
97-
'info' .. vfox_sdk,
98-
'remove' .. vfox_sdk,
99-
'search' .. vfox_sdk,
100-
'update' .. clink.argmatcher():nofiles():addarg(vfox_sdk_func):addflags('--all', '-a', '--help', '-h'),
101-
'available' .. vfox_help,
102-
'upgrade' .. vfox_help,
103-
'current' .. vfox_sdk, 'c' .. vfox_sdk,
104-
'list' .. vfox_sdk, 'ls' .. vfox_sdk,
105-
'uninstall' .. vfox_uninstall, 'un' .. vfox_uninstall,
106-
'install' .. vfox_install, 'i' .. vfox_install,
107-
'env' .. clink.argmatcher():nofiles():addflags(
108-
'--shell' .. vfox_shell, '-s' .. vfox_shell,
109-
'--cleanup', '-c',
110-
'--json', '-j',
111-
'--help', '-h'
112-
),
113-
'activate' .. vfox_shell,
114-
'config' .. clink.argmatcher():nofiles():addarg(function()
115-
local res, vfox_config = {}, io.popen('vfox config -l')
116-
for line in vfox_config:lines() do
117-
local txt = line:gsub('%c%[%d+m', ''):match('^(%S+)')
118-
if txt then
119-
table.insert(res, txt)
120-
end
121-
end
122-
vfox_config:close()
123-
return res
124-
end):addflags('--list', '-l', '--unset', '-un', '--help', '-h'),
125-
'cd' .. clink.argmatcher():nofiles():addarg(vfox_sdk_func):addflags('--plugin', '-p', '--help', '-h'),
126-
'help', 'h'
127-
):addflags('--debug', '--help', '-h', '--version', '-v', '-V')
95+
vfox:addarg(
96+
'add' .. clink.argmatcher():nofiles():addarg({
97+
onadvance = function() return 0 end,
98+
function(word, word_index, line_state)
99+
local res, line = {}, line_state:getline()
100+
for _, v in ipairs(vfox_sdk_table) do
101+
if not line:find(v) then
102+
table.insert(res, v)
103+
end
104+
end
105+
return res
106+
end
107+
}):addflags('--source', '-s', '--alias', '--help', '-h'),
108+
'use' .. vfox_use, 'u' .. vfox_use,
109+
'info' .. vfox_sdk,
110+
'remove' .. vfox_sdk,
111+
'search' .. vfox_sdk,
112+
'update' .. clink.argmatcher():nofiles():addarg(vfox_sdk_func):addflags('--all', '-a', '--help', '-h'),
113+
'available' .. vfox_help,
114+
'upgrade' .. vfox_help,
115+
'current' .. vfox_sdk, 'c' .. vfox_sdk,
116+
'list' .. vfox_sdk, 'ls' .. vfox_sdk,
117+
'uninstall' .. vfox_uninstall, 'un' .. vfox_uninstall,
118+
'install' .. vfox_install, 'i' .. vfox_install,
119+
'env' .. clink.argmatcher():nofiles():addflags(
120+
'--shell' .. vfox_shell, '-s' .. vfox_shell,
121+
'--cleanup', '-c',
122+
'--json', '-j',
123+
'--help', '-h'
124+
),
125+
'activate' .. vfox_shell,
126+
'config' .. clink.argmatcher():nofiles():addarg(function()
127+
local res, vfox_config = {}, io.popen('vfox config -l')
128+
for line in vfox_config:lines() do
129+
local txt = line:gsub('%c%[%d+m', ''):match('^(%S+)')
130+
if txt then
131+
table.insert(res, txt)
132+
end
133+
end
134+
vfox_config:close()
135+
return res
136+
end):addflags('--list', '-l', '--unset', '-un', '--help', '-h'),
137+
'cd' .. clink.argmatcher():nofiles():addarg(vfox_sdk_func):addflags('--plugin', '-p', '--help', '-h'),
138+
'help', 'h'
139+
):addflags('--debug', '--help', '-h', '--version', '-v', '-V')
128140
end)
129141

130142
local vfox_setenv = function(str)
131-
local key, val = str:match('^set "(.+)=(.*)"')
132-
if key and val then
133-
return os.setenv(key, val ~= '' and val or nil)
134-
end
143+
local key, val = str:match('^set "(.+)=(.*)"')
144+
if key and val then
145+
return os.setenv(key, val ~= '' and val or nil)
146+
end
135147
end
136148

149+
local vfox_filter = function() end
137150
local vfox_task = coroutine.create(function()
138-
os.setenv('__VFOX_PID', os.getpid())
139-
local vfox_activate = io.popen('vfox activate clink')
140-
for line in vfox_activate:lines() do
141-
vfox_setenv(line)
142-
end
143-
vfox_activate:close()
144-
145-
local cleanup = coroutine.create(function()
146-
os.execute('vfox env -c')
147-
end)
148-
coroutine.resume(cleanup)
151+
os.setenv('__VFOX_PID', os.getpid())
152+
os.setenv('__VFOX_CURTMPPATH', nil)
153+
local vfox_activate = io.popen('vfox activate clink')
154+
for line in vfox_activate:lines() do
155+
vfox_setenv(line)
156+
end
157+
vfox_activate:close()
158+
os.execute('vfox env -c')
159+
vfox_filter = function()
160+
local env = io.popen('vfox env -s clink')
161+
for line in env:lines() do
162+
vfox_setenv(line)
163+
end
164+
env:close()
165+
end
149166
end)
150-
coroutine.resume(vfox_task)
167+
clink.runcoroutineuntilcomplete(vfox_task)
151168

152169
local vfox_prompt = clink.promptfilter(30)
153-
function vfox_prompt:filter(prompt)
154-
clink.promptcoroutine(function()
155-
local env = io.popen('vfox env -s clink')
156-
for line in env:lines() do
157-
vfox_setenv(line)
158-
end
159-
env:close()
160-
end)
170+
function vfox_prompt:filter()
171+
clink.promptcoroutine(vfox_filter)
161172
end

0 commit comments

Comments
 (0)