mirror of
https://github.com/neovim/neovim.git
synced 2024-12-26 14:11:15 -07:00
b73a829837
Problem: Platform-specific UI providers should live in `vim.ui.*`. #24164 Solution: - Move `vim.clipboard.osc52` module to `vim.ui.clipboard.osc52`. - TODO: move all of `clipboard.vim` to `vim.ui.clipboard`. ref #25872
61 lines
1.4 KiB
Lua
61 lines
1.4 KiB
Lua
local M = {}
|
|
|
|
function M.copy(lines)
|
|
local s = table.concat(lines, '\n')
|
|
io.stdout:write(string.format('\027]52;;%s\027\\', vim.base64.encode(s)))
|
|
end
|
|
|
|
function M.paste()
|
|
local contents = nil
|
|
local id = vim.api.nvim_create_autocmd('TermResponse', {
|
|
callback = function(args)
|
|
local resp = args.data ---@type string
|
|
local encoded = resp:match('\027%]52;%w?;([A-Za-z0-9+/=]*)')
|
|
if encoded then
|
|
contents = vim.base64.decode(encoded)
|
|
return true
|
|
end
|
|
end,
|
|
})
|
|
|
|
io.stdout:write('\027]52;;?\027\\')
|
|
|
|
local ok, res
|
|
|
|
-- Wait 1s first for terminals that respond quickly
|
|
ok, res = vim.wait(1000, function()
|
|
return contents ~= nil
|
|
end)
|
|
|
|
if res == -1 then
|
|
-- If no response was received after 1s, print a message and keep waiting
|
|
vim.api.nvim_echo(
|
|
{ { 'Waiting for OSC 52 response from the terminal. Press Ctrl-C to interrupt...' } },
|
|
false,
|
|
{}
|
|
)
|
|
ok, res = vim.wait(9000, function()
|
|
return contents ~= nil
|
|
end)
|
|
end
|
|
|
|
if not ok then
|
|
vim.api.nvim_del_autocmd(id)
|
|
if res == -1 then
|
|
vim.notify(
|
|
'Timed out waiting for a clipboard response from the terminal',
|
|
vim.log.levels.WARN
|
|
)
|
|
elseif res == -2 then
|
|
-- Clear message area
|
|
vim.api.nvim_echo({ { '' } }, false, {})
|
|
end
|
|
return 0
|
|
end
|
|
|
|
-- If we get here, contents should be non-nil
|
|
return vim.split(assert(contents), '\n')
|
|
end
|
|
|
|
return M
|