summary refs log tree commit diff
path: root/.vim/lua/internal/syncbg.lua
diff options
context:
space:
mode:
Diffstat (limited to '.vim/lua/internal/syncbg.lua')
-rw-r--r--.vim/lua/internal/syncbg.lua46
1 files changed, 46 insertions, 0 deletions
diff --git a/.vim/lua/internal/syncbg.lua b/.vim/lua/internal/syncbg.lua
new file mode 100644
index 0000000..418e17e
--- /dev/null
+++ b/.vim/lua/internal/syncbg.lua
@@ -0,0 +1,46 @@
+local M = {}
+
+M.init = function()
+  -- get tty
+  local tty_handle = io.popen('tty')
+  if tty_handle == nil then return end
+  local tty = tty_handle:read('*a')
+  tty_handle:close()
+  if tty:find("not a tty") then error('not a tty') end
+
+  M.tty = tty
+end
+
+M.update = function()
+  if M.tty == nil then return end
+
+  if not M.normal then
+    -- get colorscheme Normal highlight
+    local normal = vim.api.nvim_get_hl(0, { name = 'Normal', create = false })
+    if (normal.bg == nil) then return end
+    -- cache old value for use with VimResume
+    M.normal = normal
+  end
+
+  -- emit CSI to change terminal background to Normal.bg
+  os.execute('printf "\\033]11;' .. string.format('#%06x', M.normal.bg) .. '\\007" > ' .. M.tty)
+
+  -- set colorscheme Normal.bg to NONE, making it transparent
+  vim.cmd [[hi Normal ctermbg=NONE guibg=NONE]]
+end
+
+M.reset = function()
+  if M.tty == nil then return end
+
+  os.execute('printf "\\033]111\\007" > ' .. M.tty)
+end
+
+M.setup = function(opts)
+  opts = opts or {}
+
+  M.init()
+  vim.api.nvim_create_autocmd({ 'ColorScheme', 'UIEnter', 'VimResume' }, { callback = M.update })
+  vim.api.nvim_create_autocmd({ 'UILeave' }, { callback = M.reset })
+end
+
+return M