Skip to content

Instantly share code, notes, and snippets.

@haolian9
Last active February 22, 2022 12:26
Show Gist options
  • Save haolian9/6c800a48b408fdd164b3c05e11328d99 to your computer and use it in GitHub Desktop.
Save haolian9/6c800a48b408fdd164b3c05e11328d99 to your computer and use it in GitHub Desktop.
a wrapper of asyncrun that respects modeline-like setting in file
-- inlinecmd
-- b:asyncrun_plaincmd
local M = {}
local inlinecmd_magic = "# asyncrun: "
local plaincmd_varname = "asyncrun_plaincmd"
local find_inlinecmd = function(bufnr)
local _reversed_lines = function(high)
local start = high + 1
return function()
-- high, high+1 -> 0, 1
start = start - 1
if start >= 0 then
local lines = vim.api.nvim_buf_get_lines(bufnr, start, start + 1, true)
return lines[1]
end
end
end
local _find = function(line)
local pos = string.find(line, inlinecmd_magic)
if pos ~= nil then
return string.sub(line, pos + string.len(inlinecmd_magic))
end
end
local high = vim.api.nvim_buf_line_count(bufnr) - 1
for line in _reversed_lines(high) do
local cmd = _find(line)
if cmd ~= nil then
return cmd
end
end
end
local finalcmd = function(bufnr)
local inlinecmd = find_inlinecmd(bufnr)
if inlinecmd ~= nil then
return inlinecmd
end
if vim.fn.exists("b:" .. plaincmd_varname) == 1 then
local plaincmd = vim.api.nvim_buf_get_var(bufnr, plaincmd_varname)
if plaincmd ~= nil then
return plaincmd
end
end
end
M.main = function()
local bufnr = 0
local cmd = finalcmd(bufnr)
if cmd == nil then
print("no cmd available")
return
end
vim.cmd("AsyncRun " .. cmd .. " %:p")
end
return M
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment