Hack to get dadbod auto-complete in sqmeow scratch buffers
This commit is contained in:
@@ -1,3 +1,46 @@
|
|||||||
|
-- sqmeow has no completion in scratchpads, so point vim-dadbod-completion (the blink "dadbod"
|
||||||
|
-- source from the LazyVim sql extra) at the buffer's sqmeow connection by setting b:db.
|
||||||
|
local dadbod_schemes = { postgres = true, mysql = true }
|
||||||
|
|
||||||
|
-- The dadbod URL for a sqmeow connection, or nil when dadbod can't use it.
|
||||||
|
local function dadbod_url(conn)
|
||||||
|
if conn.state ~= "connected" or conn.ssh or conn.url:find("{{", 1, true) then
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
local prefix, rest = conn.url:match("^%a[%w+.-]*(://[^/?#]*)(.*)$")
|
||||||
|
if not prefix or not dadbod_schemes[conn.dialect] then
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
local path, query = rest:match("^([^?#]*)(.*)$")
|
||||||
|
-- A database opened from the drawer's database list shares its parent's URL.
|
||||||
|
if conn.database then
|
||||||
|
path = "/" .. conn.database
|
||||||
|
end
|
||||||
|
return conn.dialect .. prefix .. path .. query
|
||||||
|
end
|
||||||
|
|
||||||
|
local function sync_dadbod(buf)
|
||||||
|
-- Don't load sqmeow just for this, and leave b:db alone in buffers sqmeow doesn't own.
|
||||||
|
if not package.loaded["sqmeow.state"] or vim.bo[buf].filetype ~= "sql" then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
local b = vim.b[buf]
|
||||||
|
if not (b.sqmeow_editor or b.sqmeow_connection) or (b.db and b.db ~= b.sqmeow_dadbod_url) then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
local conn = require("sqmeow.api").target(buf)
|
||||||
|
local url = conn and dadbod_url(conn)
|
||||||
|
if url == b.sqmeow_dadbod_url then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
b.db = url
|
||||||
|
b.sqmeow_dadbod_url = url
|
||||||
|
if url and vim.fn.exists("*vim_dadbod_completion#fetch") == 1 then
|
||||||
|
vim.fn["vim_dadbod_completion#fetch"](buf)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
return {
|
return {
|
||||||
"2giosangmitom/sqmeow.nvim",
|
"2giosangmitom/sqmeow.nvim",
|
||||||
dependencies = { "MunifTanjim/nui.nvim" },
|
dependencies = { "MunifTanjim/nui.nvim" },
|
||||||
@@ -14,4 +57,13 @@ return {
|
|||||||
{ "<leader>Da", "<cmd>Sqmeow add<cr>", desc = "Add Connection" },
|
{ "<leader>Da", "<cmd>Sqmeow add<cr>", desc = "Add Connection" },
|
||||||
{ "<leader>Ds", "<cmd>Sqmeow scratch<cr>", desc = "New Scratchpad" },
|
{ "<leader>Ds", "<cmd>Sqmeow scratch<cr>", desc = "New Scratchpad" },
|
||||||
},
|
},
|
||||||
|
init = function()
|
||||||
|
-- InsertEnter catches connecting, or switching connections with `u`, after the buffer opened.
|
||||||
|
vim.api.nvim_create_autocmd({ "BufEnter", "InsertEnter" }, {
|
||||||
|
group = vim.api.nvim_create_augroup("sqmeow_dadbod", { clear = true }),
|
||||||
|
callback = function(ev)
|
||||||
|
sync_dadbod(ev.buf)
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
end,
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user