summary refs log tree commit diff
path: root/.vim/plugin/syncbg.lua
blob: d9243f00d6ef99aeba37b7a3afdbb2a0a2ad9231 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
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,
})