1
0
mirror of https://github.com/SpaceVim/SpaceVim.git synced 2025-01-24 02:10:05 +08:00
SpaceVim/lua/spacevim/plugin/pastebin.lua

121 lines
2.8 KiB
Lua

--=============================================================================
-- pastebin.lua
-- Copyright (c) 2016-2022 Wang Shidong & Contributors
-- Author: Wang Shidong < wsdjeg@outlook.com >
-- URL: https://spacevim.org
-- License: GPLv3
--=============================================================================
local job = require('spacevim.api.job')
local log = require('spacevim.logger').derive('pastebin')
local M = {}
local job_id = -1
local url = ''
local function eval(f)
return f()
end
local function get_visual_selection()
local pos_start = vim.fn.getpos("'<")
local pos_end = vim.fn.getpos("'>")
local line_start = pos_start[2]
local column_start = pos_start[3]
local line_end = pos_end[2]
local column_end = pos_end[3]
local lines = vim.fn.getline(line_start, line_end)
if #lines == 0 then
return ''
end
local v_mode = vim.fn.visualmode()
if v_mode == 'v' or v_mode == 'V' then
lines[#lines] = string.sub(
lines[#lines],
1,
column_end - eval(function()
if vim.o.selection == 'inclusive' then
return 0
else
return 1
end
end)
)
lines[1] = string.sub(lines[1], column_start, #lines[1])
else
for i = 1, #lines, 1 do
lines[i] = string.sub(
lines[i],
1,
column_end - eval(function()
if vim.o.selection == 'inclusive' then
return 0
else
return 1
end
end)
)
lines[i] = string.sub(lines[i], column_start - 1, #lines[i])
end
end
return table.concat(lines, '\n')
end
local function on_stdout(_, data)
for _, v in ipairs(data) do
log.info(v)
if #v > 0 then
url = v
end
end
end
local function on_stderr(_, data)
for _, v in ipairs(data) do
log.warn(v)
end
end
local function on_exit(_, code, single)
job_id = -1
if code == 0 and single == 0 and url ~= '' then
vim.fn.setreg('+', url .. '.txt')
vim.api.nvim_echo({ { 'Pastebin:' .. url .. '.txt', 'Normal' } }, false, {})
else
log.warn('url:' .. url)
log.warn('exit code:' .. code)
log.warn('single code:' .. single)
end
end
function M.paste()
url = ''
local context = get_visual_selection()
log.debug('context is:\n' .. context)
if context == '' then
log.info('no selection text, skipped.')
return
end
if job_id ~= -1 then
log.info('previous job has not been finished, killed!')
job.stop(job_id)
end
local cmd = { 'curl', '-s', '-F', 'content=<-', 'http://dpaste.com/api/v2/' }
job_id = job.start(cmd, {
on_stdout = on_stdout,
on_stderr = on_stderr,
on_exit = on_exit,
})
log.info('job id:' .. job_id)
job.send(job_id, vim.split(context, '\n'))
job.chanclose(job_id, 'stdin')
job.stop(job_id)
end
return M