terminal: swap priority of terminal, editor highlights

closes #9964
This commit is contained in:
Justin M. Keyes
2019-05-02 09:56:22 +02:00
parent 49c51f839b
commit fd0fd752c8
6 changed files with 90 additions and 34 deletions

View File

@ -7,8 +7,8 @@
Terminal emulator *terminal* *terminal-emulator* Terminal emulator *terminal* *terminal-emulator*
Nvim embeds a VT220/xterm terminal emulator based on libvterm. The terminal is Nvim embeds a VT220/xterm terminal emulator based on libvterm. The terminal is
presented as a special buffer type, asynchronously updated from the virtual presented as a special 'buftype', asynchronously updated as data is received
terminal as data is received from the program connected to it. from the connected program.
Terminal buffers behave like normal buffers, except: Terminal buffers behave like normal buffers, except:
- With 'modifiable', lines can be edited but not deleted. - With 'modifiable', lines can be edited but not deleted.
@ -23,11 +23,11 @@ Terminal buffers behave like normal buffers, except:
============================================================================== ==============================================================================
Start *terminal-start* Start *terminal-start*
There are 3 ways to create a terminal buffer: There are several ways to create a terminal buffer:
- By invoking the |:terminal| ex command. - Invoke the |:terminal| command.
- By calling the |termopen()| function. - Call the |termopen()| function.
- By editing a file with a name matching `term://(.{-}//(\d+:)?)?\zs.*`. - Edit a file with a name matching `term://(.{-}//(\d+:)?)?\zs.*`.
For example: For example:
> >
:edit term://bash :edit term://bash
@ -98,14 +98,21 @@ global configuration.
- 'wrap' is disabled - 'wrap' is disabled
You can change the defaults with a TermOpen autocommand: > You can change the defaults with a TermOpen autocommand: >
au TermOpen * setlocal list au TermOpen * setlocal list
TERMINAL COLORS ~ TERMINAL COLORS ~
The `{g,b}:terminal_color_$NUM` variables control the terminal color palette, The `{g,b}:terminal_color_x` variables control the terminal color palette,
where `$NUM` is the color index between 0 and 255 inclusive. This setting only where `x` is the color index between 0 and 255 inclusive. The variables are
affects UIs with RGB capabilities; for normal terminals the color index is read during |TermOpen|. The value must be a color name or hexadecimal string.
just forwarded. The variables are read only during |TermOpen|. Example: >
let g:terminal_color_4 = '#ff0000'
let g:terminal_color_5 = 'green'
Only works for RGB UIs (see 'termguicolors'); for 256-color terminals the
color index is just forwarded.
Editor highlighting (|syntax-highlighting|, |highlight-groups|, etc.) has
higher precedence: it is applied after terminal colors are resolved.
============================================================================== ==============================================================================
Status Variables *terminal-status* Status Variables *terminal-status*

View File

@ -6131,9 +6131,9 @@ A jump table for the options with a short description can be found at |Q_op|.
*'termguicolors'* *'tgc'* *'termguicolors'* *'tgc'*
'termguicolors' 'tgc' boolean (default off) 'termguicolors' 'tgc' boolean (default off)
global global
When on, uses |highlight-guifg| and |highlight-guibg| attributes in Enables 24-bit RGB color in the |TUI|. Uses "gui" |:highlight|
the terminal (thus using 24-bit color). Requires a ISO-8613-3 attributes instead of "cterm" attributes. |highlight-guifg|
compatible terminal. Requires an ISO-8613-3 compatible terminal.
*'terse'* *'noterse'* *'terse'* *'noterse'*
'terse' boolean (default off) 'terse' boolean (default off)

View File

@ -3275,16 +3275,18 @@ win_line (
line = ml_get_buf(wp->w_buffer, lnum, FALSE); line = ml_get_buf(wp->w_buffer, lnum, FALSE);
ptr = line + v; ptr = line + v;
if (!attr_pri) if (!attr_pri) {
char_attr = syntax_attr; char_attr = syntax_attr;
else } else {
char_attr = hl_combine_attr(syntax_attr, char_attr); char_attr = hl_combine_attr(syntax_attr, char_attr);
/* no concealing past the end of the line, it interferes }
* with line highlighting */ // no concealing past the end of the line, it interferes
if (c == NUL) // with line highlighting.
if (c == NUL) {
syntax_flags = 0; syntax_flags = 0;
else } else {
syntax_flags = get_syntax_info(&syntax_seqnr); syntax_flags = get_syntax_info(&syntax_seqnr);
}
} else if (!attr_pri) { } else if (!attr_pri) {
char_attr = 0; char_attr = 0;
} }
@ -3376,7 +3378,7 @@ win_line (
} }
if (wp->w_buffer->terminal) { if (wp->w_buffer->terminal) {
char_attr = hl_combine_attr(char_attr, term_attrs[vcol]); char_attr = hl_combine_attr(term_attrs[vcol], char_attr);
} }
// Found last space before word: check for line break. // Found last space before word: check for line break.

View File

@ -7,19 +7,9 @@ local feed = helpers.feed
local eval = helpers.eval local eval = helpers.eval
local clear = helpers.clear local clear = helpers.clear
local funcs = helpers.funcs local funcs = helpers.funcs
local nvim_prog = helpers.nvim_prog local nvim_prog_abs = helpers.nvim_prog_abs
local write_file = helpers.write_file local write_file = helpers.write_file
local function nvim_prog_abs()
-- system(['build/bin/nvim']) does not work for whatever reason. It needs to
-- either be executable searched in $PATH or something starting with / or ./.
if nvim_prog:match('[/\\]') then
return funcs.fnamemodify(nvim_prog, ':p')
else
return nvim_prog
end
end
describe('Command-line option', function() describe('Command-line option', function()
describe('-s', function() describe('-s', function()
local fname = 'Xtest-functional-core-main-s' local fname = 'Xtest-functional-core-main-s'

View File

@ -238,6 +238,16 @@ local function stop()
session:stop() session:stop()
end end
local function nvim_prog_abs()
-- system(['build/bin/nvim']) does not work for whatever reason. It must
-- be executable searched in $PATH or something starting with / or ./.
if nvim_prog:match('[/\\]') then
return request('nvim_call_function', 'fnamemodify', {nvim_prog, ':p'})
else
return nvim_prog
end
end
-- Executes an ex-command. VimL errors manifest as client (lua) errors, but -- Executes an ex-command. VimL errors manifest as client (lua) errors, but
-- v:errmsg will not be updated. -- v:errmsg will not be updated.
local function nvim_command(cmd) local function nvim_command(cmd)
@ -826,6 +836,7 @@ local module = {
nvim_async = nvim_async, nvim_async = nvim_async,
nvim_dir = nvim_dir, nvim_dir = nvim_dir,
nvim_prog = nvim_prog, nvim_prog = nvim_prog,
nvim_prog_abs = nvim_prog_abs,
nvim_set = nvim_set, nvim_set = nvim_set,
ok = ok, ok = ok,
os_name = os_name, os_name = os_name,

View File

@ -3,9 +3,12 @@ local Screen = require('test.functional.ui.screen')
local thelpers = require('test.functional.terminal.helpers') local thelpers = require('test.functional.terminal.helpers')
local feed, clear, nvim = helpers.feed, helpers.clear, helpers.nvim local feed, clear, nvim = helpers.feed, helpers.clear, helpers.nvim
local nvim_dir, command = helpers.nvim_dir, helpers.command local nvim_dir, command = helpers.nvim_dir, helpers.command
local nvim_prog_abs = helpers.nvim_prog_abs
local eq, eval = helpers.eq, helpers.eval local eq, eval = helpers.eq, helpers.eval
local funcs = helpers.funcs
local nvim_set = helpers.nvim_set
describe(':terminal window highlighting', function() describe(':terminal highlight', function()
local screen local screen
before_each(function() before_each(function()
@ -112,8 +115,51 @@ describe(':terminal window highlighting', function()
end) end)
end) end)
it(':terminal highlight has lower precedence than editor #9964', function()
clear()
local screen = Screen.new(30, 4)
screen:set_default_attr_ids({
-- "Normal" highlight emitted by the child nvim process.
N_child = {foreground = tonumber('0x4040ff'), background = tonumber('0xffff40')},
-- "Search" highlight emitted by the child nvim process.
S_child = {background = tonumber('0xffff40'), italic = true, foreground = tonumber('0x4040ff')},
-- "Search" highlight in the parent nvim process.
S = {background = Screen.colors.Green, italic = true, foreground = Screen.colors.Red},
-- "Question" highlight in the parent nvim process.
Q = {background = tonumber('0xffff40'), bold = true, foreground = Screen.colors.SeaGreen4},
})
screen:attach({rgb=true})
-- Child nvim process in :terminal (with cterm colors).
funcs.termopen({
nvim_prog_abs(), '-n', '-u', 'NORC', '-i', 'NONE', '--cmd', nvim_set,
'+hi Normal ctermfg=Blue ctermbg=Yellow',
'+norm! ichild nvim',
'+norm! oline 2',
})
screen:expect([[
{N_child:^child nvim }|
{N_child:line 2 }|
{N_child: }|
|
]])
command('hi Search gui=italic guifg=Red guibg=Green cterm=italic ctermfg=Red ctermbg=Green')
feed('/nvim<cr>')
screen:expect([[
{N_child:child }{S:^nvim}{N_child: }|
{N_child:line 2 }|
{N_child: }|
/nvim |
]])
command('syntax keyword Question line')
screen:expect([[
{N_child:child }{S:^nvim}{N_child: }|
{Q:line}{N_child: 2 }|
{N_child: }|
/nvim |
]])
end)
describe('terminal window highlighting with custom palette', function() describe(':terminal highlight with custom palette', function()
local screen local screen
before_each(function() before_each(function()