@@ -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
3035end
3136
3237--- The callback for reading stderr.
4853local 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
146151end
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