Dane Sabo 43d6abad48 Split markdown_and_tex into per-language modules; add cadquery autorun
- Split lua/custom/language_specific_commands/markdown_and_tex.lua into
  markdown.lua, tex.lua, and a shared nabla_setup.lua
- Add cadquery.lua: auto-render on save for ~/Documents/cad scripts via
  the project venv, with notifications and a <leader>cr manual trigger
- tex.lua: add \textcolor{blue|red|green}{...} operator + visual maps
  (<leader>t{b,r,g}, <leader>tx to remove); set textwidth=80, spell on
- markdown.lua: spell on, textwidth=60, nabla setup hook
- vimtex: switch to latexmk + lualatex with continuous compile and
  synctex; PDF viewer = skim with sync/activate
- lspconfig: enable julia_ls and texlab; add julialsp + texlab to Mason
  ensure_installed
- chadrc: theme -> ayu_dark
- init.lua: ghcup PATH to macOS location; load cadquery module;
  comment out taskwarrior (replaced by openclaw agent); add updatetime
  and sessionoptions for CursorHold + auto-session
2026-05-20 10:59:08 -04:00

154 lines
5.2 KiB
Lua

-- ~/.config/nvim/lua/custom/language_specific_commands/tex.lua
local GRP = vim.api.nvim_create_augroup("TeXWithNabla", { clear = true })
local nabla_setup = require "custom.language_specific_commands.nabla_setup"
-- Textcolor highlight operator: wraps motions/selections in \textcolor{color}{...}
local function make_textcolor_op(color)
return function(type)
local s = vim.api.nvim_buf_get_mark(0, "[")
local e = vim.api.nvim_buf_get_mark(0, "]")
local lines = vim.api.nvim_buf_get_lines(0, s[1] - 1, e[1], false)
if #lines == 0 then return end
if type == "char" then
lines[#lines] = lines[#lines]:sub(1, e[2] + 1)
lines[1] = lines[1]:sub(s[2] + 1)
local text = table.concat(lines, "\n")
local wrapped = string.format("\\textcolor{%s}{%s}", color, text)
vim.api.nvim_buf_set_text(0, s[1] - 1, s[2], e[1] - 1, e[2] + 1, vim.split(wrapped, "\n"))
elseif type == "line" then
local text = table.concat(lines, "\n")
local wrapped = string.format("\\textcolor{%s}{%s}", color, text)
vim.api.nvim_buf_set_lines(0, s[1] - 1, e[1], false, vim.split(wrapped, "\n"))
end
end
end
local textcolor_colors = {
b = "blue",
r = "red",
g = "green",
}
-- Register global functions so operatorfunc can reference them via v:lua
for key, color in pairs(textcolor_colors) do
_G["_textcolor_" .. color] = make_textcolor_op(color)
end
-- Check if cursor is currently inside a \textcolor{...}{...} block
local function cursor_in_textcolor()
local save = vim.fn.winsaveview()
if vim.fn.search("\\\\textcolor{", "bcW") == 0 then
vim.fn.winrestview(save)
return false
end
-- Navigate through both brace pairs to find the end of the block
vim.fn.search("{", "cW")
vim.cmd("normal! %")
vim.fn.search("{", "W")
vim.cmd("normal! %")
local end_pos = vim.api.nvim_win_get_cursor(0)
vim.fn.winrestview(save)
-- Original cursor must be at or before the closing }
if save.lnum < end_pos[1] or (save.lnum == end_pos[1] and save.col <= end_pos[2]) then
return true
end
return false
end
-- Change color of surrounding \textcolor{old}{...} to a new color
local function change_textcolor(new_color)
local save = vim.fn.winsaveview()
vim.fn.search("\\\\textcolor{", "bcW")
vim.fn.search("{", "cW")
local bpos = vim.api.nvim_win_get_cursor(0)
local color_row, color_col = bpos[1] - 1, bpos[2] + 1
vim.cmd("normal! %")
local epos = vim.api.nvim_win_get_cursor(0)
local end_row, end_col = epos[1] - 1, epos[2]
vim.api.nvim_buf_set_text(0, color_row, color_col, end_row, end_col, { new_color })
vim.fn.winrestview(save)
end
-- Remove \textcolor{...}{content} wrapper, keeping content
local function remove_textcolor()
if not cursor_in_textcolor() then
vim.notify("No \\textcolor found", vim.log.levels.WARN)
return
end
local save = vim.fn.winsaveview()
vim.fn.search("\\\\textcolor{", "bcW")
local pos = vim.api.nvim_win_get_cursor(0)
local start_row, start_col = pos[1] - 1, pos[2]
vim.fn.search("{", "cW")
vim.cmd("normal! %")
vim.fn.search("{", "W")
local cpos = vim.api.nvim_win_get_cursor(0)
local content_row, content_col = cpos[1] - 1, cpos[2]
vim.cmd("normal! %")
local epos = vim.api.nvim_win_get_cursor(0)
local end_row, end_col = epos[1] - 1, epos[2]
local content = vim.api.nvim_buf_get_text(0, content_row, content_col + 1, end_row, end_col, {})
vim.api.nvim_buf_set_text(0, start_row, start_col, end_row, end_col + 1, content)
vim.fn.winrestview(save)
end
-- Buffer-local settings for TeX
vim.api.nvim_create_autocmd("FileType", {
group = GRP,
pattern = { "tex" },
callback = function(args)
local buf = args.buf
-- Buffer-local basics
vim.opt_local.spell = true
vim.opt_local.spelllang = "en_us"
vim.opt_local.formatoptions:append "t"
vim.opt_local.textwidth = 80
-- Textcolor keymaps: <leader>t{b,r,g}
-- Normal: if inside a \textcolor, switch color; otherwise operator + motion
-- Visual: always wrap selection
for key, color in pairs(textcolor_colors) do
local fname = "v:lua._textcolor_" .. color
vim.keymap.set("n", "<leader>t" .. key, function()
if cursor_in_textcolor() then
change_textcolor(color)
else
vim.o.operatorfunc = fname
vim.api.nvim_feedkeys("g@", "n", false)
end
end, { buffer = buf, desc = "\\textcolor{" .. color .. "} (or switch)" })
vim.keymap.set("x", "<leader>t" .. key, function()
vim.o.operatorfunc = fname
return "g@"
end, { expr = true, buffer = buf, desc = "\\textcolor{" .. color .. "}" })
end
-- Remove textcolor wrapper entirely
vim.keymap.set("n", "<leader>tx", remove_textcolor, { buffer = buf, desc = "Remove \\textcolor wrapper" })
-- Setup Nabla (conceal settings + keymaps)
nabla_setup.setup(buf)
end,
})
-- Re-enable Nabla virtual text after writes (if cleared)
vim.api.nvim_create_autocmd("BufWritePost", {
group = GRP,
pattern = { "*.tex", "*.ltx" },
callback = function(args)
local ft = vim.bo[args.buf].filetype
if ft ~= "tex" or not vim.b[args.buf].nabla_enabled then
return
end
local ok_nabla, nabla = pcall(require, "nabla")
if ok_nabla then
nabla.enable_virt()
end
end,
})