diff --git a/data/plugins/exec.lua b/data/plugins/exec.lua index a11ac90..e3decfd 100644 --- a/data/plugins/exec.lua +++ b/data/plugins/exec.lua @@ -2,11 +2,21 @@ local core = require "core" local command = require "core.command" -local function exec(cmd) +local function exec(cmd, keep_newline) local fp = io.popen(cmd, "r") local res = fp:read("*a") fp:close() - return res:gsub("%\n$", "") + return keep_newline and res or res:gsub("%\n$", "") +end + + +local function printfb_quote(str) + local sub = { + ["\\"] = "\\\\", + [string.char(0)] = "\\0000", + ["'"] = "'\\''", + } + return "'" .. str:gsub(".", sub) .. "'" end @@ -20,7 +30,10 @@ command.add("core.docview", { ["exec:replace"] = function() core.command_view:enter("Replace With Result Of Command", function(cmd) core.active_view.doc:replace(function(str) - return exec(string.format("echo %q | %s", str, cmd)) + return exec( + "printf %b " .. printfb_quote(str:gsub("%\n$", "") .. "\n") .. " | " .. cmd, + str:find("%\n$") + ) end) end) end,