Skip to content
This repository was archived by the owner on Aug 12, 2025. It is now read-only.

Commit 9914dc7

Browse files
feat(#5): add copying to clipboard
feat: added copy action
1 parent 8512ceb commit 9914dc7

File tree

1 file changed

+95
-1
lines changed

1 file changed

+95
-1
lines changed

lua/freeze/init.lua

Lines changed: 95 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ local freeze = {
88
theme = "default",
99
config = "base",
1010
open = false,
11+
copy = false,
1112
},
1213
output = nil,
1314
}
@@ -27,6 +28,10 @@ local function onReadStdOut(err, data)
2728
freeze.open(freeze.output)
2829
freeze.output = nil
2930
end
31+
if freeze.opts.copy and freeze.output ~= nil then
32+
freeze.copy(freeze.output)
33+
freeze.output = nil
34+
end
3035
end
3136

3237
---The callback for reading stderr.
@@ -48,7 +53,7 @@ end
4853
local function onExit(stdout, stderr)
4954
return vim.schedule_wrap(function(code, _)
5055
if code == 0 then
51-
vim.notify("Successfully frozen 🍦", vim.log.levels.INFO, { title = "Freeze" })
56+
vim.notify("Successfully frozen 🍦 " .. freeze.opts.output, vim.log.levels.INFO, { title = "Freeze" })
5257
else
5358
vim.notify(stdio.stdout, vim.log.levels.ERROR, { title = "Freeze" })
5459
end
@@ -145,6 +150,95 @@ function freeze.open(filename)
145150
end
146151
end
147152

153+
---Copy command for Windows OS
154+
---@param filename string
155+
local function copy_windows(filename)
156+
local cmd = {
157+
"Add-Type",
158+
"-AssemblyName",
159+
"System.Windows.Forms;",
160+
'[Windows.Forms.Clipboard]::SetImage($([System.Drawing.Image]::FromFile("'
161+
.. loop.cwd()
162+
.. "/"
163+
.. filename
164+
.. '")))',
165+
}
166+
local callback = {
167+
on_sterr = vim.schedule_wrap(function(_, data, _)
168+
local out = table.concat(data, "\n")
169+
onReadStdErr(out)
170+
end),
171+
on_exit = vim.schedule_wrap(function()
172+
vim.notify("frozen frame has been copied to the clipboard", vim.log.levels.INFO, { title = "Freeze" })
173+
end),
174+
}
175+
local job = vim.fn.jobstart(cmd, callback)
176+
vim.fn.jobstop(job)
177+
end
178+
179+
---Copy command for Mac OS
180+
---@param filename string
181+
local function copy_macos(filename)
182+
local cmd = {
183+
"osascript",
184+
"-e",
185+
"'set the clipboad to (read (POSIX file \"" .. loop.cwd() .. "/" .. filename .. "\") as JPEG picture)'",
186+
}
187+
local callback = {
188+
on_sterr = vim.schedule_wrap(function(_, data, _)
189+
local out = table.concat(data, "\n")
190+
onReadStdErr(out)
191+
end),
192+
on_exit = vim.schedule_wrap(function()
193+
vim.notify("frozen frame has been copied to the clipboard", vim.log.levels.INFO, { title = "Freeze" })
194+
end),
195+
}
196+
local job = vim.fn.jobstart(cmd, callback)
197+
vim.fn.jobstop(job)
198+
end
199+
200+
---Copy command for Unix OS
201+
---@param filename string
202+
local function copy_unix(filename)
203+
if vim.fn.exepath("xclip") == "" then
204+
vim.notify("`xclip` is not installed", vim.log.level.ERROR, { title = "Freeze" })
205+
return
206+
end
207+
local cmd = {
208+
"xclip",
209+
"-selection",
210+
"clipboard",
211+
"-t",
212+
"image/png",
213+
"-i",
214+
loop.cwd() .. "/" .. filename,
215+
}
216+
local callback = {
217+
on_sterr = vim.schedule_wrap(function(_, data, _)
218+
local out = table.concat(data, "\n")
219+
onReadStdErr(out)
220+
end),
221+
on_exit = vim.schedule_wrap(function()
222+
vim.notify("frozen frame has been copied to the clipboard", vim.log.levels.INFO, { title = "Freeze" })
223+
end),
224+
}
225+
local job = vim.fn.jobstart(cmd, callback)
226+
vim.fn.jobstop(job)
227+
end
228+
229+
---Copy the frozen frame to the clipboard
230+
---@param filename string
231+
function freeze.copy(filename)
232+
local os = vim.loop.os_uname().sysname
233+
234+
if os == "Windows" or os == "Window_NT" then
235+
copy_windows(filename)
236+
elseif os == "Darwin" then
237+
copy_macos(filename)
238+
end
239+
copy_unix(filename)
240+
end
241+
148242
--- Setup function for enabling both user commands.
149243
--- Sets up :Freeze for freezing a selection and :FreezeLine
150244
--- to freeze a single line.

0 commit comments

Comments
 (0)