feat(terminal): respond to OSC background and foreground request (#17197)

The motivation for this update is Issue #15365, where background=light
is not properly set for Nvim running from an Nvim :terminal. This can be
encountered when e.g., opening a terminal to make git commits, which
opens EDITOR=nvim in the nested terminal.

Under the implementation of this commit, the OSC response always
indicates a black or white foreground/background. While this may not
reflect the actual foreground/background color, it permits 'background'
to be retained for a nested Nvim instance running in the terminal
emulator. The behaviour matches Vim.
This commit is contained in:
Daniel Steinberg
2024-01-15 11:12:07 -05:00
committed by GitHub
parent 9c202b9392
commit 7589336120
5 changed files with 137 additions and 106 deletions

View File

@@ -155,6 +155,30 @@ do
end,
})
vim.api.nvim_create_autocmd('TermRequest', {
group = nvim_terminal_augroup,
desc = 'Respond to OSC foreground/background color requests',
callback = function(args)
local fg_request = args.data == '\027]10;?'
local bg_request = args.data == '\027]11;?'
if fg_request or bg_request then
-- WARN: This does not return the actual foreground/background color,
-- but rather returns:
-- - fg=white/bg=black when Nvim option 'background' is 'dark'
-- - fg=black/bg=white when Nvim option 'background' is 'light'
local red, green, blue = 0, 0, 0
local bg_option_dark = vim.o.background == 'dark'
if (fg_request and bg_option_dark) or (bg_request and not bg_option_dark) then
red, green, blue = 65535, 65535, 65535
end
local command = fg_request and 10 or 11
local data = string.format('\027]%d;rgb:%04x/%04x/%04x\007', command, red, green, blue)
local channel = vim.bo[args.buf].channel
vim.api.nvim_chan_send(channel, data)
end
end,
})
vim.api.nvim_create_autocmd('CmdwinEnter', {
pattern = '[:>]',
desc = 'Limit syntax sync to maxlines=1 in the command window',