summary refs log tree commit diff
path: root/.vim/plugin/syncbg.lua
diff options
context:
space:
mode:
Diffstat (limited to '.vim/plugin/syncbg.lua')
-rw-r--r--.vim/plugin/syncbg.lua53
1 files changed, 53 insertions, 0 deletions
diff --git a/.vim/plugin/syncbg.lua b/.vim/plugin/syncbg.lua
new file mode 100644
index 0000000..d9243f0
--- /dev/null
+++ b/.vim/plugin/syncbg.lua
@@ -0,0 +1,53 @@
+-- this plugin registers two autocmds that trigger when openeing and closing vim, setting the
+-- background of the terminal to the color used by our colorscheme using CSI control codes.
+
+local state = {}
+
+-- 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
+state.tty = tty
+
+-- register update hook
+vim.api.nvim_create_autocmd({ 'ColorScheme', 'UIEnter', 'VimResume' }, {
+  callback = function()
+    if state.tty == nil then
+      return
+    end
+
+    if not state.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
+      state.normal = normal
+    end
+
+    -- emit CSI to change terminal background to Normal.bg
+    os.execute(
+      'printf "\\033]11;' .. string.format('#%06x', state.normal.bg) .. '\\007" > ' .. state.tty
+    )
+
+    -- set colorscheme Normal.bg to NONE, making it transparent
+    vim.cmd([[hi Normal ctermbg=NONE guibg=NONE]])
+  end,
+})
+
+-- register reset hook
+vim.api.nvim_create_autocmd({ 'UILeave' }, {
+  callback = function()
+    if state.tty == nil then
+      return
+    end
+    os.execute('printf "\\033]111\\007" > ' .. state.tty)
+  end,
+})