vim / format sql on save
In laptop.sh
:
# https://github.com/croaky/laptop/blob/main/laptop.sh
brew install pgformatter
In init.lua
:
-- https://github.com/croaky/laptop/blob/main/vim/init.lua
-- Helper functions
local function filetype_autocmd(ft, callback)
vim.api.nvim_create_autocmd("FileType", {
pattern = ft,
callback = callback,
})
end
local function format_on_save(cmd_template)
vim.api.nvim_create_autocmd("BufWritePre", {
buffer = 0,
callback = function()
local cmd = cmd_template:gsub("%%", vim.fn.expand("%:p"))
local buf = vim.api.nvim_get_current_buf()
vim.fn.jobstart(cmd, {
stdout_buffered = true,
on_stdout = function(_, data)
if not data then
return
end
local fmt = table.concat(data, "\n")
if #fmt == 0 then
return
end
local pos = vim.api.nvim_win_get_cursor(0)
local lines = vim.split(fmt, "\n")
if lines[#lines] == "" then
table.remove(lines, #lines)
end
vim.api.nvim_buf_set_lines(buf, 0, -1, false, lines)
local line_count = vim.api.nvim_buf_line_count(buf)
if pos[1] > line_count then
pos[1] = line_count
end
vim.api.nvim_win_set_cursor(0, pos)
vim.api.nvim_buf_call(buf, function()
vim.cmd("noautocmd write")
end)
end,
on_stderr = function(_, data)
if data then
print(table.concat(data, "\n"))
end
end,
})
end,
})
end
-- SQL
filetype_autocmd("sql", function()
format_on_save("pg_format --function-case 1 --keyword-case 2 --spaces 2 --no-extra-line %")
end)