auto up 11:48:23 up 3:25, 2 users, load average: 0.17, 0.26, 0.17

This commit is contained in:
2025-11-14 11:48:23 +01:00
parent b467a414c4
commit ea0b19b71a
2 changed files with 93 additions and 63 deletions

View File

@@ -7,74 +7,96 @@ local watch_buf_id = nil
local watch_tab_id = nil local watch_tab_id = nil
function M.watch_and_open() function M.watch_and_open()
-- Parse the current file and check for typst -- Parse the current file and check for typst
vim.notify("INIT", vim.log.levels.WARN) vim.notify("INIT", vim.log.levels.WARN)
local input = vim.fn.expand("%:p") local input = vim.fn.expand("%:p")
if not input:match("%.typ$") then if not input:match("%.typ$") then
vim.notify("Not a Typst file", vim.log.levels.WARN) vim.notify("Not a Typst file", vim.log.levels.WARN)
return return
end end
local dir = vim.fn.fnamemodify(input, ":h") -- directory of the Typst file local dir = vim.fn.fnamemodify(input, ":h") -- directory of the Typst file
local filename = vim.fn.expand("%:t:r") .. ".pdf" -- filename without extension + .pdf local filename = vim.fn.expand("%:t:r") .. ".pdf" -- filename without extension + .pdf
-- Check if a watcher is already running for this file -- Check if a watcher is already running for this file
if watch_job_id then if watch_job_id then
vim.notify("Typst watcher already running - please close zathura", vim.log.levels.INFO) vim.notify("Typst watcher already running - please close zathura", vim.log.levels.INFO)
return return
end end
local output = dir .. "/" .. filename local output = dir .. "/" .. filename
-- Start typst watch -- Start typst watch
local cwd = vim.fn.getcwd() -- set the starting directory local cwd = vim.fn.getcwd() -- set the starting directory
-- TODO: root setting does not work -- TODO: root setting does not work
local watch_cmd = { "typst", "watch", "--root", cwd, input, output } local watch_cmd = { "typst", "watch", "--root", cwd, input, output }
watch_job_id = vim.fn.jobstart(watch_cmd, { watch_job_id = vim.fn.jobstart(watch_cmd, {
stdout_buffered = false, stdout_buffered = false,
stderr_buffered = false, -- Ensure stderr is unbuffered for real-time error output stderr_buffered = false, -- Ensure stderr is unbuffered for real-time error output
on_stderr = function(_, data) on_stderr = function(_, data)
if data then if data then
if not watch_tab_id then if not watch_tab_id then
local pre_tab = vim.api.nvim_get_current_tabpage() -- Get the current tab ID local pre_tab = vim.api.nvim_get_current_tabpage() -- Get the current tab ID
vim.cmd('tabnew') -- Open a new tab vim.cmd('tabnew') -- Open a new tab
watch_tab_id = vim.api.nvim_get_current_tabpage() -- Get the current tab ID watch_tab_id = vim.api.nvim_get_current_tabpage() -- Get the current tab ID
watch_buf_id = vim.api.nvim_get_current_buf() -- Get the buffer ID of the new tab watch_buf_id = vim.api.nvim_get_current_buf() -- Get the buffer ID of the new tab
vim.api.nvim_buf_set_option(watch_buf_id, "swapfile", false) vim.api.nvim_buf_set_option(watch_buf_id, "swapfile", false)
vim.api.nvim_buf_set_name(watch_buf_id, "/tmp/TypstLog") vim.api.nvim_buf_set_name(watch_buf_id, "/tmp/TypstLog")
vim.api.nvim_buf_set_lines(watch_buf_id, 0, 0, false, { "Watching: " .. input }) -- Insert at the top vim.api.nvim_buf_set_lines(watch_buf_id, 0, 0, false, { "Watching: " .. input }) -- Insert at the top
vim.cmd('write!') vim.cmd('write!')
vim.api.nvim_set_current_tabpage(pre_tab) vim.api.nvim_set_current_tabpage(pre_tab)
end end
-- Write stdout data to the same buffer -- Write stdout data to the same buffer
for _, line in ipairs(data) do for _, line in ipairs(data) do
if line ~= "" then if line ~= "" then
vim.api.nvim_buf_set_lines(watch_buf_id, -1, -1, false, { "[LOG] " .. line }) vim.api.nvim_buf_set_lines(watch_buf_id, -1, -1, false, { "[LOG] " .. line })
end end
end end
end end
end, end,
on_exit = function(_, exit_code) on_exit = function(_, exit_code)
if exit_code == 0 then if exit_code == 0 then
vim.notify("Typst watch stopped successfully", vim.log.levels.INFO) vim.notify("Typst watch stopped successfully", vim.log.levels.INFO)
else else
vim.notify("Typst watch stopped with errors", vim.log.levels.ERROR) vim.notify("Typst watch stopped with errors", vim.log.levels.ERROR)
end end
watch_job_id = nil watch_job_id = nil
end, end,
}) })
vim.notify("Started Typst watch", vim.log.levels.INFO) vim.notify("Started Typst watch", vim.log.levels.INFO)
vim.fn.system("killall .zathura-wrapped") vim.fn.system("killall .zathura-wrapped")
functions.sleep(0.5) functions.sleep(0.5)
vim.fn.jobstart({ "zathura", output }, { vim.fn.jobstart({ "zathura", output }, {
on_exit = function() on_exit = function()
if watch_job_id then if watch_job_id then
vim.fn.jobstop(watch_job_id) vim.fn.jobstop(watch_job_id)
end end
watch_job_id = nil watch_job_id = nil
end, end,
}) })
end
function M.just_open()
-- Parse the current file and check for typst
local input = vim.fn.expand("%:p")
if not input:match("%.typ$") then
vim.notify("Not a Typst file", vim.log.levels.WARN)
return
end
local dir = vim.fn.fnamemodify(input, ":h") -- directory of the Typst file
local filename = vim.fn.expand("%:t:r") .. ".pdf" -- filename without extension + .pdf
local output = dir .. "/" .. filename
-- Start typst watch
local cwd = vim.fn.getcwd() -- set the starting directory
-- TODO: root setting does not work
local watch_cmd = { "typst", "compile", "--root", cwd, input, output }
vim.fn.jobstart(watch_cmd)
functions.sleep(0.5)
vim.fn.jobstart({ "sioyek", output })
end end
return M return M

View File

@@ -25,6 +25,14 @@ return {
{ "<leader>tw", function() require("custom.typst").watch_and_open() end, desc = "Watch Typst" }, { "<leader>tw", function() require("custom.typst").watch_and_open() end, desc = "Watch Typst" },
}, },
}, },
{
dir = get_custom_dir("typst"),
name = "typst",
dependencies = { "nvim-lua/plenary.nvim", "nvim-telescope/telescope.nvim" },
keys = {
{ "<leader>tu", function() require("custom.typst").just_open() end, desc = "Open Typst" },
},
},
{ {
dir = get_custom_dir("journal"), dir = get_custom_dir("journal"),
name = "journal", name = "journal",