From 116e1386723a69982b1211e74b3dafd3f51fb150 Mon Sep 17 00:00:00 2001 From: Kristijan Husak Date: Mon, 19 Feb 2024 21:59:40 +0100 Subject: [PATCH] feat(highlights)!: Use treesitter highlights 1. Leverage default syntax highlights from treesitter, like @markup.bold, @markup.italic, etc. 2. Require treesitter highlights to be enabled and remove legacy Vim syntax --- DOCS.md | 122 ++++++----- lua/orgmode/agenda/views/agenda.lua | 2 +- lua/orgmode/clock/report.lua | 4 +- lua/orgmode/colors/highlighter/init.lua | 4 - .../colors/highlighter/markup/dates.lua | 2 +- .../colors/highlighter/markup/emphasis.lua | 33 +-- .../colors/highlighter/markup/latex.lua | 7 +- .../colors/highlighter/markup/link.lua | 2 +- lua/orgmode/colors/highlighter/stars.lua | 2 +- lua/orgmode/colors/highlighter/todos.lua | 4 +- lua/orgmode/colors/highlights.lua | 195 +++++++----------- lua/orgmode/config/init.lua | 23 --- lua/orgmode/init.lua | 1 + queries/org/highlights.scm | 72 ++++--- queries/org/injections.scm | 1 + syntax/org.vim | 9 - syntax/org_legacy.vim | 162 --------------- syntax/orgagenda.vim | 13 +- syntax/orghelp.vim | 2 +- tests/plenary/colors/colors_spec.lua | 150 +++++++------- tests/plenary/colors/highlighter_spec.lua | 144 ++++++------- tests/plenary/object/todo_state_spec.lua | 36 ++-- 22 files changed, 378 insertions(+), 612 deletions(-) delete mode 100644 syntax/org_legacy.vim diff --git a/DOCS.md b/DOCS.md index cb93198ae..65be6a5fd 100644 --- a/DOCS.md +++ b/DOCS.md @@ -224,7 +224,7 @@ Enabled: If this highlight group does not suit you, you can apply different highlight group to it: ```lua -vim.cmd[[autocmd ColorScheme * hi link OrgHideLeadingStars MyCustomHlGroup]] +vim.cmd[[autocmd ColorScheme * hi link @org.leading.stars MyCustomHlGroup]] ``` #### **org_hide_emphasis_markers** @@ -1315,67 +1315,91 @@ Currently, these things are formatted: ## User interface ### Colors +Most of the highlight groups are linked to treesitter highlights where applicable (see `:h treesitter-highlight`). + +The following highlight groups are used: + + * `@org.headline.level.1`: Headline at level 1 - `linked to Title` + * `@org.headline.level.2`: Headline at level 2 - `linked to Constant` + * `@org.headline.level.3`: Headline at level 3 - `linked to Identifier` + * `@org.headline.level.4`: Headline at level 4 - `linked to Statement` + * `@org.headline.level.5`: Headline at level 5 - `linked to PreProc` + * `@org.headline.level.6`: Headline at level 6 - `linked to Type` + * `@org.headline.level.7`: Headline at level 7 - `linked to Special` + * `@org.headline.level.8`: Headline at level 8 - `linked to String` + * `@org.timestamp.active`: An active timestamp - linked to `@keyword` + * `@org.timestamp.inactive`: An inactive timestamp - linked to `@comment` + * `@org.keyword.todo`: TODO keywords color - Parsed from `Error` (see note below) + * `@org.keyword.done`: DONE keywords color - Parsed from `DiffAdd` (see note below) + * `@org.bullet`: A normal bullet under a header item - linked to `@markup.list` + * `@org.properties`: Property drawer start/end delimiters - linked to `@property` + * `@org.drawer`: Drawer start/end delimiters - linked to `@property` + * `@org.tag`: A tag for a headline item, shown on the righthand side like `:foo:` - linked to `@tag.attribute` + * `@org.plan`: `SCHEDULED`, `DEADLINE`, `CLOSED`, etc. keywords - linked to `Constant` + * `@org.comment`: A comment block - linked to `@comment` + * `@org.latex_env`: LaTeX block - linked to `@markup.environment` + * `@org.directive`: Blocks starting with `#+` - linked to `@comment` + * `@org.checkbox`: The default checkbox highlight, including square brackets - linked to `@markup.list.unchecked` + * `@org.checkbox.halfchecked`: A checkbox status (marker between `[]`) checked with `[-]` - linked to `@markup.list.unchecked` + * `@org.checkbox.checked`: A checkbox status (marker between `[]`) checked with either `[x]` or `[X]` - linked to `@markup.list.checked` + * `@org.bold`: **bold** text - linked to `@markup.strong`, + * `@org.bold.delimiter`: bold text delimiter `*` - linked to `@markup.strong`, + * `@org.italic`: *italic* text - linked to `@markup.italic`, + * `@org.italic.delimiter`: italic text delimiter `/` - linked to `@markup.italic`, + * `@org.strikethrough`: ~strikethrough~ text - linked to `@markup.strikethrough`, + * `@org.strikethrough.delimiter`: strikethrough text delimiter `+` - linked to `@markup.strikethrough`, + * `@org.underline`: underline text - linked to `@markup.underline`, + * `@org.underline.delimiter`: underline text delimiter `_` - linked to `@markup.underline`, + * `@org.code`: `code` text - linked to `@markup.raw`, + * `@org.code.delimiter`: code text delimiter `~` - linked to `@markup.raw`, + * `@org.verbatim`: `verbatim` text - linked to `@markup.raw`, + * `@org.verbatim.delimiter`: verbatim text delimiter `=` - linked to `@markup.raw`, + * `@org.hyperlink`: [link](link) text - linked to `@markup.link.url`, + * `@org.latex`: Inline latex - linked to `@markup.math`, + * `@org.table.delimiter` - `|` and `-` delimiters in tables - linked to `@punctuation.special`, + * `@org.table.heading` - Table headings - linked to `@markup.heading`, + * `@org.edit_src` - The highlight for the source content in an _Org_ buffer while it is being edited in an edit special buffer - linked to `Visual`, + * `@org.agenda.deadline`: A item deadline in the agenda view - Parsed from `Error` (see note below) + * `@org.agenda.scheduled`: A scheduled item in the agenda view - Parsed from `DiffAdd` (see note dbelow) + * `@org.agenda.scheduled_past`: A item past its scheduled date in the agenda view - Parsed from `WarningMsg` (see note below) + +Note: + Colors used for todo keywords and agenda states (deadline, schedule ok, schedule warning) -are parsed from the current colorsheme from several highlight groups (Error, WarningMsg, DiffAdd, etc.). -If those colors are not suitable you can override them like this: +are parsed from the current colorscheme from several highlight groups (Error, WarningMsg, DiffAdd, etc.). -```vim -autocmd ColorScheme * call s:setup_org_colors() -function! s:setup_org_colors() abort - hi OrgAgendaDeadline guifg=#FFAAAA - hi OrgAgendaScheduled guifg=#AAFFAA - hi OrgAgendaScheduledPast guifg=Orange -endfunction +#### Overriding colors +All colors can be overridden by either setting new values or linking to another highlight group: +```lua +vim.api.nvim_create_autocmd('ColorScheme', { + pattern = '*', + callback = function() + -- Define own colors + vim.api.nvim_set_hl(0, '@org.agenda.deadline', { fg = '#FFAAAA' }) + vim.api.nvim_set_hl(0, '@org.agenda.scheduled', { fg = '#AAFFAA' }) + -- Link to another highlight group + vim.api.nvim_set_hl(0, '@org.agenda.scheduled_past', { link = 'Statement' }) + end +}) ``` -or you can link it to another highlight group: +Or in Vimscript: ```vim +autocmd ColorScheme * call s:setup_org_colors() + function! s:setup_org_colors() abort - hi link OrgAgendaDeadline Error - hi link OrgAgendaScheduled DiffAdd - hi link OrgAgendaScheduledPast Statement + " Define own colors + hi @org.agenda.deadline guifg=#FFAAAA + hi @org.agenda.scheduled guifg=#AAFFAA + " Link to another highlight group + hi link @org.agenda.scheduled_past Statement endfunction ``` For adding/changing TODO keyword colors see [org-todo-keyword-faces](#org_todo_keyword_faces) -#### Highlight Groups - -* The following highlight groups are based on _Treesitter_ query results, hence when setting up _Orgmode_ these - highlights must be enabled by removing `disable = {'org'}` from the default recommended _Treesitter_ configuration. - - * `OrgTSTimestampActive`: An active timestamp - * `OrgTSTimestampInactive`: An inactive timestamp - * `OrgTSBullet`: A normal bullet under a header item - * `OrgTSPropertyDrawer`: Property drawer start/end delimiters - * `OrgTSDrawer`: Drawer start/end delimiters - * `OrgTSTag`: A tag for a headline item, shown on the righthand side like `:foo:` - * `OrgTSPlan`: `SCHEDULED`, `DEADLINE`, `CLOSED`, etc. keywords - * `OrgTSComment`: A comment block - * `OrgTSLatex`: LaTeX block - * `OrgTSDirective`: Blocks starting with `#+` - * `OrgTSCheckbox`: The default checkbox highlight, overridden if any of the below groups are specified - * `OrgTSCheckboxChecked`: A checkbox checked with either `[x]` or `[X]` - * `OrgTSCheckboxHalfChecked`: A checkbox checked with `[-]` - * `OrgTSCheckboxUnchecked`: A empty checkbox - * `OrgTSHeadlineLevel1`: Headline at level 1 - * `OrgTSHeadlineLevel2`: Headline at level 2 - * `OrgTSHeadlineLevel3`: Headline at level 3 - * `OrgTSHeadlineLevel4`: Headline at level 4 - * `OrgTSHeadlineLevel5`: Headline at level 5 - * `OrgTSHeadlineLevel6`: Headline at level 6 - * `OrgTSHeadlineLevel7`: Headline at level 7 - * `OrgTSHeadlineLevel8`: Headline at level 8 - -* The following use vanilla _Vim_ syntax matching, and will work without _Treesitter_ highlighting enabled. - - * `OrgEditSrcHighlight`: The highlight for the source content in an _Org_ buffer while it is being edited in an edit special buffer - * `OrgAgendaDeadline`: A item deadline in the agenda view - * `OrgAgendaScheduled`: A scheduled item in the agenda view - * `OrgAgendaScheduledPast`: A item past its scheduled date in the agenda view - ### Menu The menu is used when selecting further actions in `agenda`, `capture` and `export`. Here is an example of the menu you see when opening `agenda`: diff --git a/lua/orgmode/agenda/views/agenda.lua b/lua/orgmode/agenda/views/agenda.lua index f729eb327..afd649957 100644 --- a/lua/orgmode/agenda/views/agenda.lua +++ b/lua/orgmode/agenda/views/agenda.lua @@ -180,7 +180,7 @@ function AgendaView:build() if is_today or is_weekend then table.insert(highlights, { - hlgroup = 'OrgBold', + hlgroup = '@org.bold', range = Range:new({ start_line = #content + 1, end_line = #content + 1, diff --git a/lua/orgmode/clock/report.lua b/lua/orgmode/clock/report.lua index 084d82977..d22cadc0f 100644 --- a/lua/orgmode/clock/report.lua +++ b/lua/orgmode/clock/report.lua @@ -56,7 +56,7 @@ function ClockReport:draw_for_agenda(start_line) range.start_col = range.start_col + 1 range.end_col = range.end_col + 2 table.insert(highlights, { - hlgroup = 'OrgBold', + hlgroup = '@org.bold', range = range, }) end @@ -67,7 +67,7 @@ function ClockReport:draw_for_agenda(start_line) range.start_col = range.start_col + 1 range.end_col = range.end_col + 2 table.insert(highlights, { - hlgroup = 'OrgUnderline', + hlgroup = '@org.hyperlink', range = range, }) end diff --git a/lua/orgmode/colors/highlighter/init.lua b/lua/orgmode/colors/highlighter/init.lua index c3a671760..4e7442863 100644 --- a/lua/orgmode/colors/highlighter/init.lua +++ b/lua/orgmode/colors/highlighter/init.lua @@ -24,10 +24,6 @@ end ---@private function OrgHighlighter:_setup() - local ts_highlights_enabled = config:ts_highlights_enabled() - if not ts_highlights_enabled then - return - end self.stars = require('orgmode.colors.highlighter.stars'):new({ highlighter = self }) self.markup = require('orgmode.colors.highlighter.markup'):new({ highlighter = self }) self.todos = require('orgmode.colors.highlighter.todos'):new() diff --git a/lua/orgmode/colors/highlighter/markup/dates.lua b/lua/orgmode/colors/highlighter/markup/dates.lua index 1b632c7b1..6e13b4afe 100644 --- a/lua/orgmode/colors/highlighter/markup/dates.lua +++ b/lua/orgmode/colors/highlighter/markup/dates.lua @@ -135,7 +135,7 @@ function OrgDates:highlight(highlights, bufnr) vim.api.nvim_buf_set_extmark(bufnr, namespace, entry.from.line, entry.from.start_col, { ephemeral = ephemeral, end_col = entry.to.end_col, - hl_group = entry.char == '>' and 'OrgTSTimestampActive' or 'OrgTSTimestampInactive', + hl_group = entry.char == '>' and '@org.timestamp.active' or '@org.timestamp.inactive', priority = 110, }) end diff --git a/lua/orgmode/colors/highlighter/markup/emphasis.lua b/lua/orgmode/colors/highlighter/markup/emphasis.lua index dbd5feee1..242dc2f2a 100644 --- a/lua/orgmode/colors/highlighter/markup/emphasis.lua +++ b/lua/orgmode/colors/highlighter/markup/emphasis.lua @@ -11,34 +11,28 @@ local valid_post_marker_chars = local markers = { ['*'] = { - hl_name = 'org_bold', - hl_cmd = 'hi def %s term=bold cterm=bold gui=bold', + hl_name = '@org.bold', nestable = true, }, ['/'] = { - hl_name = 'org_italic', - hl_cmd = 'hi def %s term=italic cterm=italic gui=italic', + hl_name = '@org.italic', nestable = true, }, ['_'] = { - hl_name = 'org_underline', - hl_cmd = 'hi def %s term=underline cterm=underline gui=underline', + hl_name = '@org.underline', nestable = true, }, ['+'] = { - hl_name = 'org_strikethrough', - hl_cmd = 'hi def %s term=strikethrough cterm=strikethrough gui=strikethrough', + hl_name = '@org.strikethrough', nestable = true, }, ['~'] = { - hl_name = 'org_code', - hl_cmd = 'hi def link %s String', + hl_name = '@org.code', nestable = false, spell = false, }, ['='] = { - hl_name = 'org_verbatim', - hl_cmd = 'hi def link %s String', + hl_name = '@org.verbatim', nestable = false, spell = false, }, @@ -51,7 +45,6 @@ function OrgEmphasis:new(opts) } setmetatable(data, self) self.__index = self - data:_add_hl_groups() return data end @@ -68,7 +61,7 @@ function OrgEmphasis:highlight(highlights, bufnr) vim.api.nvim_buf_set_extmark(bufnr, namespace, entry.from.line, entry.from.start_col, { ephemeral = ephemeral, end_col = entry.from.end_col, - hl_group = markers[entry.char].hl_name .. '_delimiter', + hl_group = markers[entry.char].hl_name .. '.delimiter', spell = markers[entry.char].spell, priority = 110 + entry.from.start_col, conceal = conceal, @@ -78,7 +71,7 @@ function OrgEmphasis:highlight(highlights, bufnr) vim.api.nvim_buf_set_extmark(bufnr, namespace, entry.from.line, entry.to.start_col, { ephemeral = ephemeral, end_col = entry.to.end_col, - hl_group = markers[entry.char].hl_name .. '_delimiter', + hl_group = markers[entry.char].hl_name .. '.delimiter', spell = markers[entry.char].spell, priority = 110 + entry.from.start_col, conceal = conceal, @@ -136,14 +129,4 @@ function OrgEmphasis:is_valid_end_node(entry, bufnr) and end_text:sub(1, 1) ~= ' ' end -function OrgEmphasis:_add_hl_groups() - for _, marker in pairs(markers) do - vim.cmd(string.format(marker.hl_cmd, marker.hl_name)) - if marker.delimiter_hl then - vim.cmd(string.format(marker.hl_cmd, marker.hl_name .. '_delimiter')) - end - end - vim.cmd('hi def link org_hyperlink Underlined') -end - return OrgEmphasis diff --git a/lua/orgmode/colors/highlighter/markup/latex.lua b/lua/orgmode/colors/highlighter/markup/latex.lua index 1bd7edafc..68bbc2d4e 100644 --- a/lua/orgmode/colors/highlighter/markup/latex.lua +++ b/lua/orgmode/colors/highlighter/markup/latex.lua @@ -33,7 +33,6 @@ function OrgLatex:new(opts) } setmetatable(data, self) self.__index = self - data:_add_hl_groups() return data end @@ -89,10 +88,6 @@ function OrgLatex:parse_node(node) return info end -function OrgLatex:_add_hl_groups() - vim.cmd('hi def link org_latex OrgTSLatex') -end - ---@param highlights OrgMarkupHighlight[] ---@param bufnr number function OrgLatex:highlight(highlights, bufnr) @@ -102,7 +97,7 @@ function OrgLatex:highlight(highlights, bufnr) vim.api.nvim_buf_set_extmark(bufnr, namespace, entry.from.line, entry.from.start_col - 1, { ephemeral = ephemeral, end_col = entry.to.end_col, - hl_group = 'org_latex', + hl_group = '@org.latex', spell = false, priority = 110 + entry.from.start_col, }) diff --git a/lua/orgmode/colors/highlighter/markup/link.lua b/lua/orgmode/colors/highlighter/markup/link.lua index 088493c97..df512ca6f 100644 --- a/lua/orgmode/colors/highlighter/markup/link.lua +++ b/lua/orgmode/colors/highlighter/markup/link.lua @@ -103,7 +103,7 @@ function OrgLink:highlight(highlights, bufnr) vim.api.nvim_buf_set_extmark(bufnr, namespace, entry.from.line, entry.from.start_col, { ephemeral = ephemeral, end_col = entry.to.end_col, - hl_group = 'org_hyperlink', + hl_group = '@org.hyperlink', priority = 110, }) diff --git a/lua/orgmode/colors/highlighter/stars.lua b/lua/orgmode/colors/highlighter/stars.lua index 0460d01c1..44d208d53 100644 --- a/lua/orgmode/colors/highlighter/stars.lua +++ b/lua/orgmode/colors/highlighter/stars.lua @@ -33,7 +33,7 @@ function OrgStars:on_line(bufnr, line) vim.api.nvim_buf_set_extmark(bufnr, self.highlighter.namespace, line, 0, { end_line = line, end_col = end_col - 1, - hl_group = 'OrgHideLeadingStars', + hl_group = '@org.leading_stars', ephemeral = true, }) end diff --git a/lua/orgmode/colors/highlighter/todos.lua b/lua/orgmode/colors/highlighter/todos.lua index 82211388b..84050c991 100644 --- a/lua/orgmode/colors/highlighter/todos.lua +++ b/lua/orgmode/colors/highlighter/todos.lua @@ -19,7 +19,7 @@ function OrgTodos:_add_highlights() if not query_files or #query_files == 0 then return end - local faces = highlights.parse_todo_keyword_faces() + local faces = highlights.define_todo_keyword_faces() if not faces or vim.tbl_isempty(faces) then return end @@ -35,7 +35,7 @@ function OrgTodos:_add_highlights() for face_name, face_hl in pairs(faces) do table.insert( lines, - string.format([[(item . (expr) @%s @nospell (#eq? @%s %s))]], face_hl, face_hl, face_name) + string.format([[(item . (expr) %s @nospell (#eq? %s %s))]], face_hl, face_hl, face_name) ) end return lines diff --git a/lua/orgmode/colors/highlights.lua b/lua/orgmode/colors/highlights.lua index 618095eda..91e67a6d7 100644 --- a/lua/orgmode/colors/highlights.lua +++ b/lua/orgmode/colors/highlights.lua @@ -2,42 +2,69 @@ local config = require('orgmode.config') local colors = require('orgmode.colors') local M = {} -function M.link_ts_highlights() - local links = { - OrgTSTimestampActive = 'PreProc', - OrgTSTimestampInactive = 'Comment', - OrgTSHeadlineLevel1 = 'OrgHeadlineLevel1', - OrgTSHeadlineLevel2 = 'OrgHeadlineLevel2', - OrgTSHeadlineLevel3 = 'OrgHeadlineLevel3', - OrgTSHeadlineLevel4 = 'OrgHeadlineLevel4', - OrgTSHeadlineLevel5 = 'OrgHeadlineLevel5', - OrgTSHeadlineLevel6 = 'OrgHeadlineLevel6', - OrgTSHeadlineLevel7 = 'OrgHeadlineLevel7', - OrgTSHeadlineLevel8 = 'OrgHeadlineLevel8', - OrgTSBullet = 'Identifier', - OrgTSCheckbox = 'PreProc', - OrgTSCheckboxHalfChecked = 'OrgTSCheckbox', - OrgTSCheckboxUnchecked = 'OrgTSCheckbox', - OrgTSCheckboxChecked = 'OrgTSCheckbox', - OrgTSPropertyDrawer = 'Constant', - OrgTSDrawer = 'Constant', - OrgTSTag = 'Function', - OrgTSPlan = 'Constant', - OrgTSComment = 'Comment', - OrgTSDirective = 'Comment', - OrgTSBlock = 'Comment', - OrgTSLatex = 'Statement', - } - - for src, def in pairs(links) do - vim.cmd(string.format([[hi link @%s %s]], src, src)) - vim.cmd(string.format([[hi def link %s %s]], src, def)) - end +function M.define_highlights() + M.link_highlights() + M.define_agenda_colors() + M.define_org_todo_keyword_colors() + M.define_todo_keyword_faces() end function M.link_highlights() local links = { - OrgEditSrcHighlight = 'Visual', + -- Headlines + ['@org.headline.level1'] = 'Title', + ['@org.headline.level2'] = 'Constant', + ['@org.headline.level3'] = 'Identifier', + ['@org.headline.level4'] = 'Statement', + ['@org.headline.level5'] = 'PreProc', + ['@org.headline.level6'] = 'Type', + ['@org.headline.level7'] = 'Special', + ['@org.headline.level8'] = 'String', + + -- Headline tags + ['@org.tag'] = '@tag.attribute', + + -- Headline plan + ['@org.plan'] = 'Constant', + + -- Timestamps + ['@org.timestamp.active'] = '@keyword', + ['@org.timestamp.inactive'] = '@comment', + -- Lists/Checkboxes + ['@org.bullet'] = '@markup.list', + ['@org.checkbox'] = '@markup.list.unchecked', + ['@org.checkbox.halfchecked'] = '@markup.list.unchecked', + ['@org.checkbox.checked'] = '@markup.list.checked', + + -- Drawers + ['@org.properties'] = '@property', + ['@org.properties.name'] = '@property', + ['@org.drawer'] = '@property', + + ['@org.comment'] = '@comment', + ['@org.directive'] = '@comment', + ['@org.block'] = '@comment', + + -- Markup + ['@org.bold'] = '@markup.strong', + ['@org.bold.delimiter'] = '@markup.strong', + ['@org.italic'] = '@markup.italic', + ['@org.italic.delimiter'] = '@markup.italic', + ['@org.strikethrough'] = '@markup.strikethrough', + ['@org.strikethrough.delimiter'] = '@markup.strikethrough', + ['@org.underline'] = '@markup.underline', + ['@org.underline.delimiter'] = '@markup.underline', + ['@org.code'] = '@markup.raw', + ['@org.code.delimiter'] = '@markup.raw', + ['@org.verbatim'] = '@markup.raw', + ['@org.verbatim.delimiter'] = '@markup.raw', + ['@org.hyperlink'] = '@markup.link.url', + ['@org.latex'] = '@markup.math', + ['@org.latex_env'] = '@markup.environment', + -- Other + ['@org.table.delimiter'] = '@punctuation.special', + ['@org.table.heading'] = '@markup.heading', + ['@org.edit_src'] = 'Visual', } for src, def in pairs(links) do @@ -48,98 +75,38 @@ end function M.define_agenda_colors() local keyword_colors = colors.get_todo_keywords_colors() local c = { - deadline = 'OrgAgendaDeadline', - ok = 'OrgAgendaScheduled', - warning = 'OrgAgendaScheduledPast', + deadline = '@org.agenda.deadline', + ok = '@org.agenda.scheduled', + warning = '@org.agenda.scheduled_past', } for type, hlname in pairs(c) do vim.cmd( - string.format('hi %s_builtin guifg=%s ctermfg=%s', hlname, keyword_colors[type].gui, keyword_colors[type].cterm) + string.format('hi default %s guifg=%s ctermfg=%s', hlname, keyword_colors[type].gui, keyword_colors[type].cterm) ) - vim.cmd(string.format('hi default link %s %s_builtin', hlname, hlname)) end + M.define_org_todo_keyword_colors() end -function M.define_org_todo_keyword_colors(do_syn_match) +function M.define_org_todo_keyword_colors() local keyword_colors = colors.get_todo_keywords_colors() - local ts_highlights_enabled = config:ts_highlights_enabled() - if not ts_highlights_enabled and do_syn_match then - local todo_keywords = config:get_todo_keywords() - vim.cmd(string.format([[syn match OrgTODO "\<\(%s\)\>" contained]], table.concat(todo_keywords.TODO, [[\|]]))) - vim.cmd(string.format([[syn match OrgDONE "\<\(%s\)\>" contained]], table.concat(todo_keywords.DONE, [[\|]]))) - end vim.cmd( - string.format( - 'hi OrgTODO_builtin guifg=%s ctermfg=%s gui=bold cterm=bold', + ('hi default @org.keyword.todo guifg=%s ctermfg=%s gui=bold cterm=bold'):format( keyword_colors.TODO.gui, keyword_colors.TODO.cterm ) ) - vim.cmd('hi default link OrgTODO OrgTODO_builtin') - vim.cmd('hi link @OrgTODO OrgTODO') + vim.cmd( - string.format( - 'hi OrgDONE_builtin guifg=%s ctermfg=%s gui=bold cterm=bold', + ('hi default @org.keyword.done guifg=%s ctermfg=%s gui=bold cterm=bold'):format( keyword_colors.DONE.gui, keyword_colors.DONE.cterm ) ) - vim.cmd('hi default link OrgDONE OrgDONE_builtin') - vim.cmd('hi link @OrgDONE OrgDONE') - return M.parse_todo_keyword_faces(do_syn_match) -end - -function M.define_org_headline_colors(faces) - local headline_colors = { 'Title', 'Constant', 'Identifier', 'Statement', 'PreProc', 'Type', 'Special', 'String' } - local ts_highlights_enabled = config:ts_highlights_enabled() - local all_keywords = '' - if not ts_highlights_enabled then - local todo_keywords = config:get_todo_keywords() - all_keywords = table.concat(todo_keywords.ALL, [[\|]]) - end - local contains = { 'OrgTODO', 'OrgDONE' } - for _, face in pairs(faces) do - table.insert(contains, face) - end - if not ts_highlights_enabled then - vim.cmd([[syn match OrgHideLeadingStars /^\*\{2,\}/me=e-1 contained]]) - end - vim.cmd([[hi default OrgHideLeadingStars ctermfg=0 guifg=bg]]) - table.insert(contains, 'OrgHideLeadingStars') - for i, color in ipairs(headline_colors) do - local j = i - while j < 40 do - if not ts_highlights_enabled then - vim.cmd( - string.format( - [[syn match OrgHeadlineLevel%d "^\*\{%d}\s\+\(\<\(%s\)\>\)\?.*$" contains=%s]], - j, - j, - all_keywords, - table.concat(contains, ',') - ) - ) - end - vim.cmd(string.format('hi default link OrgHeadlineLevel%d %s', j, color)) - j = j + 8 - end - end -end - -function M.define_highlights() - if config:ts_highlights_enabled() then - M.link_ts_highlights() - end - - M.link_highlights() - - local faces = M.define_org_todo_keyword_colors(true) - return M.define_org_headline_colors(faces) + vim.cmd([[hi default @org.leading_stars ctermfg=0 guifg=bg]]) end -function M.parse_todo_keyword_faces(do_syn_match) - local ts_highlights_enabled = config:ts_highlights_enabled() +function M.define_todo_keyword_faces() local opts = { underline = { type = vim.o.termguicolors and 'gui' or 'cterm', @@ -165,7 +132,7 @@ function M.parse_todo_keyword_faces(do_syn_match) local result = {} for name, values in pairs(config.org_todo_keyword_faces) do - local parts = vim.split(values, ':', true) + local parts = vim.split(values, ':', { plain = true }) local hl_opts = {} for _, part in ipairs(parts) do local faces = vim.split(vim.trim(part), ' ') @@ -183,16 +150,12 @@ function M.parse_todo_keyword_faces(do_syn_match) end end if not vim.tbl_isempty(hl_opts) then - local hl_name = 'OrgKeywordFace' .. name:gsub('%-', '') + local hl_name = '@org.keyword.face.' .. name:gsub('%-', '') local hl = '' for hl_item, hl_values in pairs(hl_opts) do hl = hl .. ' ' .. hl_item .. '=' .. table.concat(hl_values, ',') end - if not ts_highlights_enabled and do_syn_match then - vim.cmd(string.format([[syn match %s "\<%s\>" contained]], hl_name, name)) - end - vim.cmd(string.format('hi %s %s', hl_name, hl)) - vim.cmd(string.format([[hi link @%s %s]], hl_name, hl_name)) + vim.cmd(string.format('hi default %s %s', hl_name, hl)) result[name] = hl_name end end @@ -202,13 +165,13 @@ end ---@return table function M.get_agenda_hl_map() - local faces = M.parse_todo_keyword_faces() + local faces = M.define_todo_keyword_faces() return vim.tbl_extend('force', { - TODO = 'OrgTODO', - DONE = 'OrgDONE', - deadline = 'OrgAgendaDeadline', - ok = 'OrgAgendaScheduled', - warning = 'OrgAgendaScheduledPast', + TODO = '@org.keyword.todo', + DONE = '@org.keyword.done', + deadline = '@org.agenda.deadline', + ok = '@org.agenda.scheduled', + warning = '@org.agenda.scheduled_past', }, faces) end diff --git a/lua/orgmode/config/init.lua b/lua/orgmode/config/init.lua index f927631b5..548d39615 100644 --- a/lua/orgmode/config/init.lua +++ b/lua/orgmode/config/init.lua @@ -380,29 +380,6 @@ function Config:setup_ts_predicates() end, true) end -function Config:ts_highlights_enabled() - if self.ts_hl_enabled ~= nil then - return self.ts_hl_enabled - end - self.ts_hl_enabled = false - local hl_module = require('nvim-treesitter.configs').get_module('highlight') - if not hl_module or not hl_module.enable then - return false - end - if hl_module.disable then - if type(hl_module.disable) == 'function' and hl_module.disable('org', vim.api.nvim_get_current_buf()) then - return false - end - - ---@diagnostic disable-next-line: param-type-mismatch - if type(hl_module.disable) == 'table' and vim.tbl_contains(hl_module.disable, 'org') then - return false - end - end - self.ts_hl_enabled = true - return self.ts_hl_enabled -end - ---@param content table ---@param option? string ---@param prepend_content? any diff --git a/lua/orgmode/init.lua b/lua/orgmode/init.lua index 402b7fcc2..fbd43a19d 100644 --- a/lua/orgmode/init.lua +++ b/lua/orgmode/init.lua @@ -44,6 +44,7 @@ function Org:init() end require('orgmode.events').init() self.highlighter = require('orgmode.colors.highlighter'):new() + require('orgmode.colors.highlights').define_highlights() self.files = require('orgmode.files'):new({ paths = require('orgmode.config').org_agenda_files, }) diff --git a/queries/org/highlights.scm b/queries/org/highlights.scm index 4a3ea434c..57b3395c1 100644 --- a/queries/org/highlights.scm +++ b/queries/org/highlights.scm @@ -1,41 +1,39 @@ -(timestamp "<") @OrgTSTimestampActive -(timestamp "[") @OrgTSTimestampInactive -(headline (stars) @stars (#eq? @stars "*")) @OrgTSHeadlineLevel1 -(headline (stars) @stars (#eq? @stars "**")) @OrgTSHeadlineLevel2 -(headline (stars) @stars (#eq? @stars "***")) @OrgTSHeadlineLevel3 -(headline (stars) @stars (#eq? @stars "****")) @OrgTSHeadlineLevel4 -(headline (stars) @stars (#eq? @stars "*****")) @OrgTSHeadlineLevel5 -(headline (stars) @stars (#eq? @stars "******")) @OrgTSHeadlineLevel6 -(headline (stars) @stars (#eq? @stars "*******")) @OrgTSHeadlineLevel7 -(headline (stars) @stars (#eq? @stars "********")) @OrgTSHeadlineLevel8 +(timestamp "<") @org.timestamp.active +(timestamp "[") @org.timestamp.inactive +(headline (stars) @stars (#eq? @stars "*")) @org.headline.level1 +(headline (stars) @stars (#eq? @stars "**")) @org.headline.level2 +(headline (stars) @stars (#eq? @stars "***")) @org.headline.level3 +(headline (stars) @stars (#eq? @stars "****")) @org.headline.level4 +(headline (stars) @stars (#eq? @stars "*****")) @org.headline.level5 +(headline (stars) @stars (#eq? @stars "******")) @org.headline.level6 +(headline (stars) @stars (#eq? @stars "*******")) @org.headline.level7 +(headline (stars) @stars (#eq? @stars "********")) @org.headline.level8 (headline (item) @spell) -(item . (expr) @OrgTODO @nospell (#org-is-todo-keyword? @OrgTODO "TODO")) -(item . (expr) @OrgDONE @nospell (#org-is-todo-keyword? @OrgDONE "DONE")) +(item . (expr) @org.keyword.todo @nospell (#org-is-todo-keyword? @org.keyword.todo "TODO")) +(item . (expr) @org.keyword.done @nospell (#org-is-todo-keyword? @org.keyword.done "DONE")) (list (listitem (paragraph) @spell)) (body (paragraph) @spell) -(bullet) @OrgTSBullet -(checkbox) @OrgTSCheckbox -(checkbox status: (expr "-") @OrgTSCheckboxHalfChecked) -(checkbox status: (expr "str") @OrgTSCheckboxChecked (#any-of? @OrgTSCheckboxChecked "x" "X")) -(block "#+begin_" @OrgTSBlock "#+end_" @OrgTSBlock) -(block name: (expr) @OrgTSBlock) -(block end_name: (expr) @OrgTSBlock) -(block parameter: (expr) @OrgTSBlock) -(dynamic_block name: (expr) @OrgTSBlock) -(dynamic_block end_name: (expr) @OrgTSBlock) -(dynamic_block parameter: (expr) @OrgTSBlock) -(property_drawer) @OrgTSPropertyDrawer -(latex_env) @OrgTSLatex -(drawer) @OrgTSDrawer -(tag_list) @OrgTSTag -(plan) @OrgTSPlan -(comment) @OrgTSComment @spell -(directive) @OrgTSDirective -(row - "|" @punctuation.special) -(cell - "|" @punctuation.special) +(bullet) @org.bullet +(checkbox) @org.checkbox +(checkbox status: (expr "-") @org.checkbox.halfchecked) +(checkbox status: (expr "str") @org.checkbox.checked (#any-of? @org.checkbox.checked "x" "X")) +(block "#+begin_" @org.block "#+end_" @org.block) +(block name: (expr) @org.block) +(block end_name: (expr) @org.block) +(block parameter: (expr) @org.block) +(dynamic_block name: (expr) @org.block) +(dynamic_block end_name: (expr) @org.block) +(dynamic_block parameter: (expr) @org.block) +(property_drawer (property name: (expr) @org.properties.name)) @org.properties +(latex_env) @org.latex_env +(drawer) @org.drawer +(tag_list) @org.tag +(plan) @org.plan +(comment) @org.comment @spell +(directive) @org.directive +(row "|" @org.table.delimiter) +(cell "|" @org.table.delimiter) (table - (row - (cell (contents) @markup.heading)) - (hr) @punctuation.special) + (row (cell (contents) @org.table.heading)) + (hr) @org.table.delimiter +) diff --git a/queries/org/injections.scm b/queries/org/injections.scm index 0802af960..2a64075ab 100644 --- a/queries/org/injections.scm +++ b/queries/org/injections.scm @@ -1 +1,2 @@ (block parameter: (expr) @_lang (contents) @injection.content (#set! injection.include-children) (#org-set-block-language! @_lang)) + (latex_env (contents) @injection.content (#set! injection.include-children) (#set! injection.language "tex")) diff --git a/syntax/org.vim b/syntax/org.vim index df3642141..8dc72b48c 100644 --- a/syntax/org.vim +++ b/syntax/org.vim @@ -1,16 +1,7 @@ -" Bigger part of syntax borrowed from https://github.com/jceb/vim-orgmode - if exists('b:current_syntax') finish endif -lua require('orgmode.colors.highlights').define_highlights() -let s:ts_highlight = luaeval('require("orgmode.config"):ts_highlights_enabled()') -if !s:ts_highlight - lua require('orgmode.org.syntax').add_todo_keywords_to_spellgood() - runtime syntax/org_legacy.vim -endif - let s:highlight_latex = luaeval('require("orgmode.config").org_highlight_latex_and_related') if s:highlight_latex == 'native' diff --git a/syntax/org_legacy.vim b/syntax/org_legacy.vim deleted file mode 100644 index 4cda5e18f..000000000 --- a/syntax/org_legacy.vim +++ /dev/null @@ -1,162 +0,0 @@ -let s:concealends = '' -let s:conceal = luaeval('require("orgmode.config").org_hide_emphasis_markers') -if s:conceal - let s:concealends = ' concealends' -endif - -function s:markup_start(marker, ...) abort - let items = ['\s', '(', '-', "'", '"', '{'] - let alternative = get(a:, 1, '') - if a:0 == 0 - let items += [a:marker, '^'] - endif - return '#\('.join(items, '\|').'\)\zs'.a:marker.alternative.'#' -endfunction - -function s:markup_end(marker) abort - let items = ['$', '\s', ')', '-', '\}', "'", '"', ':', ';', '!', '\\', '\[', ',', '\.', '?'] + [a:marker] - return '#'.a:marker.'\ze\('.join(items, '\|').'\)#' -endfunction - -exe 'syntax region org_bold matchgroup=org_bold_delimiter start='.s:markup_start('\*', '\|^\*\ze[^ \*]').' end='.s:markup_end('\*').' keepend oneline contains=@Spell' . s:concealends -exe 'syntax region org_italic matchgroup=org_italic_delimiter start='.s:markup_start('\/').' end='.s:markup_end('\/').' keepend oneline contains=@Spell' . s:concealends -exe 'syntax region org_underline matchgroup=org_underline_delimiter start='.s:markup_start('_').' end='.s:markup_end('_').' keepend oneline contains=@Spell' . s:concealends -exe 'syntax region org_code matchgroup=org_code_delimiter start='.s:markup_start('\~').' end='.s:markup_end('\~').' keepend oneline contains=@Spell' . s:concealends -exe 'syntax region org_verbatim matchgroup=org_verbatim_delimiter start='.s:markup_start('=').' end='.s:markup_end('=').' keepend oneline contains=@Spell' . s:concealends -exe 'syntax region org_strike matchgroup=org_strike_delimiter start='.s:markup_start('+').' end='.s:markup_end('+').' keepend oneline contains=@Spell' . s:concealends - -hi link org_bold_delimiter org_bold -hi link org_italic_delimiter org_italic -hi link org_underline_delimiter org_underline -hi link org_code_delimiter org_code -hi link org_verbatim_delimiter org_verbatim -hi link org_strike_delimiter org_strike - -hi def org_bold term=bold cterm=bold gui=bold -hi def org_italic term=italic cterm=italic gui=italic -hi def org_underline term=underline cterm=underline gui=underline -hi def org_strike term=strikethrough cterm=strikethrough gui=strikethrough -hi def link org_code String -hi def link org_verbatim String - -syntax match org_hyperlink "\[\{2}[^][]*\(\]\[[^][]*\)\?\]\{2}" contains=org_hyperlinkBracketsLeft,org_hyperlinkURL,org_hyperlinkBracketsRight -syntax match org_hyperlinkBracketsLeft contained "\[\{2}" conceal -syntax match org_hyperlinkURL contained "[^][]*\]\[" conceal -syntax match org_hyperlinkBracketsRight contained "\]\{2}" conceal -hi def link org_hyperlink Underlined - -" Deadline And Schedule: {{{1 -syn match org_deadline_scheduled /\<\(DEADLINE\|SCHEDULED\|CLOSED\)\>:/ -hi def link org_deadline_scheduled PreProc - -" Comments: {{{1 -syntax match org_comment /^\s*#\s.*/ contains=@Spell -hi def link org_comment Comment - -" Bullet Lists: {{{1 -" Ordered Lists: -" 1. list item -" 1) list item -" a. list item -" a) list item -syn match org_list_ordered "^\s*\(\a\|\d\+\)[.)]\ze\(\s\|$\)" nextgroup=org_list_item -hi def link org_list_ordered Identifier - -" Unordered Lists: -" - list item -" * list item -" + list item -" + and - don't need a whitespace prefix -syn match org_list_unordered "^\(\s*[-+]\|\s\+\*\)\ze\(\s\|$\)" nextgroup=org_list_item -hi def link org_list_unordered Identifier - -" Definition Lists: -" - Term :: expl. -" 1) Term :: expl. -syntax match org_list_def /.*\s\+::/ contained -hi def link org_list_def PreProc - -syntax match org_list_item /.*$/ contained contains=org_bold,org_italic,org_underline,org_code,org_verbatim,org_strike,@Spell - -" Block Delimiters: {{{1 -syntax case ignore -syntax match org_block_delimiter /^\s*#+\(BEGIN_\|begin_\).*/ -syntax match org_block_delimiter /^\s*#+\(END_\|end_\).*/ -syntax match org_key_identifier /^#+[^ ]*:/ -syntax match org_title /^#+\(TITLE\|title\):.*/ contains=org_key_identifier -hi def link org_block_delimiter Comment -hi def link org_key_identifier Comment -hi def link org_title Title - -" Block Markup: {{{1 -" we consider all BEGIN/END sections as 'verbatim' blocks (inc. 'quote', 'verse', 'center') -" except 'example' and 'src' which are treated as 'code' blocks. -" Note: the non-standard '>' prefix is supported for quotation lines. -" Note: the '^:.*" rule must be defined before the ':PROPERTIES:' one below. -" TODO: http://vim.wikia.com/wiki/Different_syntax_highlighting_within_regions_of_a_file -syntax match org_verbatim /^\s*>.*/ -syntax match org_code /^\s*:.*/ - -syntax region org_verbatim start="^\s*#+\(BEGIN_\|begin_\).*" end="^\s*#+\(END_\|end_\).*" keepend contains=org_block_delimiter -syntax region org_code start="^\s*#+\(BEGIN_SRC\|begin_src\)" end="^\s*#+\(END_SRC\|end_src\)" keepend contains=org_block_delimiter -syntax region org_code start="^\s*#+\(BEGIN_EXAMPLE\|begin_example\)" end="^\s*#+\(END_EXAMPLE\|end_example\)" keepend contains=org_block_delimiter - -" Properties: {{{1 -syn region Error matchgroup=org_properties_delimiter start=/^\s*:PROPERTIES:\s*$/ end=/^\s*:END:\s*$/ contains=org_property keepend -syn match org_property /^\s*:[^\t :]\+:\s\+[^\t ]/ contained contains=org_property_value -syn match org_property_value /:\s\zs.*/ contained -hi def link org_properties_delimiter PreProc -hi def link org_property Statement -hi def link org_property_value Constant -" Break down subtasks -syntax match org_subtask_number /\[\d*\/\d*]/ contained -syntax match org_subtask_percent /\[\d*%\]/ contained -syntax match org_subtask_number_all /\[\(\d\+\)\/\1\]/ contained -syntax match org_subtask_percent_100 /\[100%\]/ contained - -hi def link org_subtask_number String -hi def link org_subtask_percent String -hi def link org_subtask_percent_100 Identifier -hi def link org_subtask_number_all Identifier - - -" Timestamps: {{{1 -"<2003-09-16> -syn match org_timestamp /\(<\d\d\d\d-\d\d-\d\d\(\s\+[+\-\.]\?[+\-]\d\+[hdmwy]\)\?\(\s\+[+\-\.]\?[+\-]\d\+[hdmwy]\)\?>\)/ -"<2003-09-16 12:00> -syn match org_timestamp /\(<\d\d\d\d-\d\d-\d\d \d\d:\d\d\(\s\+[+\-\.]\?[+\-]\d\+[hdmwy]\)\?\(\s\+[+\-\.]\?[+\-]\d\+[hdmwy]\)\?>\)/ -"<2003-09-16 Tue> -"<2003-09-16 Sáb> -syn match org_timestamp /\(<\d\d\d\d-\d\d-\d\d \k\k\k\(\s\+[+\-\.]\?[+\-]\d\+[hdmwy]\)\?\(\s\+[+\-\.]\?[+\-]\d\+[hdmwy]\)\?>\)/ -"<2003-09-16 Tue 12:00> -syn match org_timestamp /\(<\d\d\d\d-\d\d-\d\d \k\k\k \d\d:\d\d\(\s\+[+\-\.]\?[+\-]\d\+[hdmwy]\)\?\(\s\+[+\-\.]\?[+\-]\d\+[hdmwy]\)\?>\)/ -"<2003-09-16 Tue 12:00-12:30> -syn match org_timestamp /\(<\d\d\d\d-\d\d-\d\d \k\k\k \d\d:\d\d-\d\d:\d\d\(\s\+[+\-\.]\?[+\-]\d\+[hdmwy]\)\?\(\s\+[+\-\.]\?[+\-]\d\+[hdmwy]\)\?>\)/ - -"<2003-09-16 Tue>--<2003-09-16 Tue> -syn match org_timestamp /\(<\d\d\d\d-\d\d-\d\d \k\k\k>--<\d\d\d\d-\d\d-\d\d \k\k\k>\)/ -"<2003-09-16 Tue 12:00>--<2003-09-16 Tue 12:00> -syn match org_timestamp /\(<\d\d\d\d-\d\d-\d\d \k\k\k \d\d:\d\d>--<\d\d\d\d-\d\d-\d\d \k\k\k \d\d:\d\d>\)/ - -syn match org_timestamp /\(<%%(diary-float.\+>\)/ - -"[2003-09-16] -syn match org_timestamp_inactive /\(\[\d\d\d\d-\d\d-\d\d\(\s\+[+\-\.]\?[+\-]\d\+[hdmwy]\)\?\(\s\+[+\-\.]\?[+\-]\d\+[hdmwy]\)\?]\)/ -"[2003-09-16 Tue] -syn match org_timestamp_inactive /\(\[\d\d\d\d-\d\d-\d\d \k\k\k\(\s\+[+\-\.]\?[+\-]\d\+[hdmwy]\)\?\(\s\+[+\-\.]\?[+\-]\d\+[hdmwy]\)\?\]\)/ -"[2003-09-16 Tue 12:00] -syn match org_timestamp_inactive /\(\[\d\d\d\d-\d\d-\d\d \k\k\k \d\d:\d\d\(\s\+[+\-\.]\?[+\-]\d\+[hdmwy]\)\?\(\s\+[+\-\.]\?[+\-]\d\+[hdmwy]\)\?\]\)/ - -"[2003-09-16 Tue]--[2003-09-16 Tue] -syn match org_timestamp_inactive /\(\[\d\d\d\d-\d\d-\d\d \k\k\k\]--\[\d\d\d\d-\d\d-\d\d \k\k\k\]\)/ -"[2003-09-16 Tue 12:00]--[2003-09-16 Tue 12:00] -syn match org_timestamp_inactive /\(\[\d\d\d\d-\d\d-\d\d \k\k\k \d\d:\d\d\]--\[\d\d\d\d-\d\d-\d\d \k\k\k \d\d:\d\d\]\)/ - -syn match org_timestamp_inactive /\(\[%%(diary-float.\+\]\)/ - -hi def link org_timestamp PreProc -hi def link org_timestamp_inactive Comment - -syntax spell toplevel - -" vi: ft=vim:tw=80:sw=4:ts=4:fdm=marker diff --git a/syntax/orgagenda.vim b/syntax/orgagenda.vim index 3b51224b3..7362afcc7 100644 --- a/syntax/orgagenda.vim +++ b/syntax/orgagenda.vim @@ -1,14 +1,11 @@ -lua require('orgmode.colors.highlights').define_agenda_colors() -syn match OrgAgendaDay /^\S\+\s\+\d\+\s\S\+\s\d\d\d\d$/ -syn match OrgAgendaTags /:[^ ]*:$/ +syn match @org.agenda.day /^\S\+\s\+\d\+\s\S\+\s\d\d\d\d$/ +syn match @org.agenda.tag /:[^ ]*:$/ syn match org_hyperlink "\[\{2}[^][]*\(\]\[[^][]*\)\?\]\{2}" contains=org_hyperlinkBracketsLeft,org_hyperlinkURL,org_hyperlinkBracketsRight syn match org_hyperlinkBracketsLeft contained "\[\{2}" conceal syn match org_hyperlinkURL contained "[^][]*\]\[" conceal syn match org_hyperlinkBracketsRight contained "\]\{2}" conceal -hi OrgBold gui=bold cterm=bold -hi OrgUnderline gui=underline cterm=underline -hi default link OrgAgendaDay Statement -hi default link OrgAgendaTags OrgBold +hi default link @org.agenda.day Statement +hi default @org.agenda.tag gui=bold cterm=bold -hi default link org_hyperlink Underlined +hi default link org_hyperlink @org.hyperlink diff --git a/syntax/orghelp.vim b/syntax/orghelp.vim index fe73f789a..349ab6b17 100644 --- a/syntax/orghelp.vim +++ b/syntax/orghelp.vim @@ -5,6 +5,6 @@ syntax match orghelp_backtick /`/ cchar= conceal contained syntax match orghelp_asterisk /\*\*/ cchar= conceal contained syntax match orghelp_underscore /__/ cchar= conceal contained -hi def orghelp_bold gui=bold cterm=bold term=bold +hi def orghelp_bold gui=bold cterm=bold hi def orghelp_bold_italic gui=bold,italic cterm=bold,italic term=bold,italic hi def link orghelp_key Identifier diff --git a/tests/plenary/colors/colors_spec.lua b/tests/plenary/colors/colors_spec.lua index 8c4ff3d2a..81bed915a 100644 --- a/tests/plenary/colors/colors_spec.lua +++ b/tests/plenary/colors/colors_spec.lua @@ -62,93 +62,93 @@ describe('Colors', function() }, }) - local result = highlights.parse_todo_keyword_faces() + local result = highlights.define_todo_keyword_faces() assert.are.same({ - NEXT = 'OrgKeywordFaceNEXT', - CANCELED = 'OrgKeywordFaceCANCELED', - ['IN-PROGRESS'] = 'OrgKeywordFaceINPROGRESS', + NEXT = '@org.keyword.face.NEXT', + CANCELED = '@org.keyword.face.CANCELED', + ['IN-PROGRESS'] = '@org.keyword.face.INPROGRESS', }, result) - assert.are.same('red', get_color_opt('OrgKeywordFaceNEXT', 'bg', 'gui')) - assert.are.same('', get_color_opt('OrgKeywordFaceNEXT', 'bg', 'cterm')) - assert.are.same('blue', get_color_opt('OrgKeywordFaceNEXT', 'fg', 'gui')) - assert.are.same('', get_color_opt('OrgKeywordFaceNEXT', 'fg', 'cterm')) - assert.are.same('1', get_color_opt('OrgKeywordFaceNEXT', 'bold', 'gui')) - assert.are.same('', get_color_opt('OrgKeywordFaceNEXT', 'bold', 'cterm')) - assert.are.same('1', get_color_opt('OrgKeywordFaceNEXT', 'italic', 'gui')) - assert.are.same('', get_color_opt('OrgKeywordFaceNEXT', 'italic', 'cterm')) - assert.are.same('1', get_color_opt('OrgKeywordFaceNEXT', 'underline', 'gui')) - assert.are.same('', get_color_opt('OrgKeywordFaceNEXT', 'underline', 'cterm')) - - assert.are.same('green', get_color_opt('OrgKeywordFaceCANCELED', 'fg', 'gui')) - assert.are.same('', get_color_opt('OrgKeywordFaceCANCELED', 'fg', 'cterm')) - assert.are.same('1', get_color_opt('OrgKeywordFaceCANCELED', 'italic', 'gui')) - assert.are.same('', get_color_opt('OrgKeywordFaceCANCELED', 'italic', 'cterm')) - assert.are.same('', get_color_opt('OrgKeywordFaceCANCELED', 'bg', 'gui')) - assert.are.same('', get_color_opt('OrgKeywordFaceCANCELED', 'bg', 'cterm')) - assert.are.same('', get_color_opt('OrgKeywordFaceCANCELED', 'bold', 'gui')) - assert.are.same('', get_color_opt('OrgKeywordFaceCANCELED', 'bold', 'cterm')) - assert.are.same('', get_color_opt('OrgKeywordFaceCANCELED', 'underline', 'gui')) - assert.are.same('', get_color_opt('OrgKeywordFaceCANCELED', 'underline', 'cterm')) - - assert.are.same('', get_color_opt('OrgKeywordFaceINPROGRESS', 'bg', 'gui')) - assert.are.same('', get_color_opt('OrgKeywordFaceINPROGRESS', 'bg', 'cterm')) - assert.are.same('red', get_color_opt('OrgKeywordFaceINPROGRESS', 'fg', 'gui')) - assert.are.same('', get_color_opt('OrgKeywordFaceINPROGRESS', 'fg', 'cterm')) - assert.are.same('1', get_color_opt('OrgKeywordFaceINPROGRESS', 'bold', 'gui')) - assert.are.same('', get_color_opt('OrgKeywordFaceINPROGRESS', 'bold', 'cterm')) - assert.are.same('', get_color_opt('OrgKeywordFaceINPROGRESS', 'italic', 'gui')) - assert.are.same('', get_color_opt('OrgKeywordFaceINPROGRESS', 'italic', 'cterm')) - assert.are.same('', get_color_opt('OrgKeywordFaceINPROGRESS', 'underline', 'gui')) - assert.are.same('', get_color_opt('OrgKeywordFaceINPROGRESS', 'underline', 'cterm')) + assert.are.same('red', get_color_opt('@org.keyword.face.NEXT', 'bg', 'gui')) + assert.are.same('', get_color_opt('@org.keyword.face.NEXT', 'bg', 'cterm')) + assert.are.same('blue', get_color_opt('@org.keyword.face.NEXT', 'fg', 'gui')) + assert.are.same('', get_color_opt('@org.keyword.face.NEXT', 'fg', 'cterm')) + assert.are.same('1', get_color_opt('@org.keyword.face.NEXT', 'bold', 'gui')) + assert.are.same('', get_color_opt('@org.keyword.face.NEXT', 'bold', 'cterm')) + assert.are.same('1', get_color_opt('@org.keyword.face.NEXT', 'italic', 'gui')) + assert.are.same('', get_color_opt('@org.keyword.face.NEXT', 'italic', 'cterm')) + assert.are.same('1', get_color_opt('@org.keyword.face.NEXT', 'underline', 'gui')) + assert.are.same('', get_color_opt('@org.keyword.face.NEXT', 'underline', 'cterm')) + + assert.are.same('green', get_color_opt('@org.keyword.face.CANCELED', 'fg', 'gui')) + assert.are.same('', get_color_opt('@org.keyword.face.CANCELED', 'fg', 'cterm')) + assert.are.same('1', get_color_opt('@org.keyword.face.CANCELED', 'italic', 'gui')) + assert.are.same('', get_color_opt('@org.keyword.face.CANCELED', 'italic', 'cterm')) + assert.are.same('', get_color_opt('@org.keyword.face.CANCELED', 'bg', 'gui')) + assert.are.same('', get_color_opt('@org.keyword.face.CANCELED', 'bg', 'cterm')) + assert.are.same('', get_color_opt('@org.keyword.face.CANCELED', 'bold', 'gui')) + assert.are.same('', get_color_opt('@org.keyword.face.CANCELED', 'bold', 'cterm')) + assert.are.same('', get_color_opt('@org.keyword.face.CANCELED', 'underline', 'gui')) + assert.are.same('', get_color_opt('@org.keyword.face.CANCELED', 'underline', 'cterm')) + + assert.are.same('', get_color_opt('@org.keyword.face.INPROGRESS', 'bg', 'gui')) + assert.are.same('', get_color_opt('@org.keyword.face.INPROGRESS', 'bg', 'cterm')) + assert.are.same('red', get_color_opt('@org.keyword.face.INPROGRESS', 'fg', 'gui')) + assert.are.same('', get_color_opt('@org.keyword.face.INPROGRESS', 'fg', 'cterm')) + assert.are.same('1', get_color_opt('@org.keyword.face.INPROGRESS', 'bold', 'gui')) + assert.are.same('', get_color_opt('@org.keyword.face.INPROGRESS', 'bold', 'cterm')) + assert.are.same('', get_color_opt('@org.keyword.face.INPROGRESS', 'italic', 'gui')) + assert.are.same('', get_color_opt('@org.keyword.face.INPROGRESS', 'italic', 'cterm')) + assert.are.same('', get_color_opt('@org.keyword.face.INPROGRESS', 'underline', 'gui')) + assert.are.same('', get_color_opt('@org.keyword.face.INPROGRESS', 'underline', 'cterm')) vim.cmd([[ - hi clear OrgKeywordFaceNEXT - hi clear OrgKeywordFaceCANCELED - hi clear OrgKeywordFaceINPROGRESS + hi clear @org.keyword.face.NEXT + hi clear @org.keyword.face.CANCELED + hi clear @org.keyword.face.INPROGRESS ]]) vim.o.termguicolors = false - result = highlights.parse_todo_keyword_faces() + result = highlights.define_todo_keyword_faces() assert.are.same({ - NEXT = 'OrgKeywordFaceNEXT', - CANCELED = 'OrgKeywordFaceCANCELED', - ['IN-PROGRESS'] = 'OrgKeywordFaceINPROGRESS', + NEXT = '@org.keyword.face.NEXT', + CANCELED = '@org.keyword.face.CANCELED', + ['IN-PROGRESS'] = '@org.keyword.face.INPROGRESS', }, result) - assert.are.same('9', get_color_opt('OrgKeywordFaceNEXT', 'bg', 'cterm')) - assert.are.same('', get_color_opt('OrgKeywordFaceNEXT', 'bg', 'gui')) - assert.are.same('12', get_color_opt('OrgKeywordFaceNEXT', 'fg', 'cterm')) - assert.are.same('', get_color_opt('OrgKeywordFaceNEXT', 'fg', 'gui')) - assert.are.same('1', get_color_opt('OrgKeywordFaceNEXT', 'bold', 'cterm')) - assert.are.same('', get_color_opt('OrgKeywordFaceNEXT', 'bold', 'gui')) - assert.are.same('1', get_color_opt('OrgKeywordFaceNEXT', 'italic', 'cterm')) - assert.are.same('', get_color_opt('OrgKeywordFaceNEXT', 'italic', 'gui')) - assert.are.same('1', get_color_opt('OrgKeywordFaceNEXT', 'underline', 'cterm')) - assert.are.same('', get_color_opt('OrgKeywordFaceNEXT', 'underline', 'gui')) - - assert.are.same('10', get_color_opt('OrgKeywordFaceCANCELED', 'fg', 'cterm')) - assert.are.same('', get_color_opt('OrgKeywordFaceCANCELED', 'fg', 'gui')) - assert.are.same('1', get_color_opt('OrgKeywordFaceCANCELED', 'italic', 'cterm')) - assert.are.same('', get_color_opt('OrgKeywordFaceCANCELED', 'italic', 'gui')) - assert.are.same('', get_color_opt('OrgKeywordFaceCANCELED', 'bg', 'gui')) - assert.are.same('', get_color_opt('OrgKeywordFaceCANCELED', 'bg', 'cterm')) - assert.are.same('', get_color_opt('OrgKeywordFaceCANCELED', 'bold', 'gui')) - assert.are.same('', get_color_opt('OrgKeywordFaceCANCELED', 'bold', 'cterm')) - assert.are.same('', get_color_opt('OrgKeywordFaceCANCELED', 'underline', 'gui')) - assert.are.same('', get_color_opt('OrgKeywordFaceCANCELED', 'underline', 'cterm')) - - assert.are.same('', get_color_opt('OrgKeywordFaceINPROGRESS', 'bg', 'cterm')) - assert.are.same('', get_color_opt('OrgKeywordFaceINPROGRESS', 'bg', 'gui')) - assert.are.same('9', get_color_opt('OrgKeywordFaceINPROGRESS', 'fg', 'cterm')) - assert.are.same('', get_color_opt('OrgKeywordFaceINPROGRESS', 'fg', 'gui')) - assert.are.same('1', get_color_opt('OrgKeywordFaceINPROGRESS', 'bold', 'cterm')) - assert.are.same('', get_color_opt('OrgKeywordFaceINPROGRESS', 'bold', 'gui')) - assert.are.same('', get_color_opt('OrgKeywordFaceINPROGRESS', 'italic', 'cterm')) - assert.are.same('', get_color_opt('OrgKeywordFaceINPROGRESS', 'italic', 'gui')) - assert.are.same('', get_color_opt('OrgKeywordFaceINPROGRESS', 'underline', 'cterm')) - assert.are.same('', get_color_opt('OrgKeywordFaceINPROGRESS', 'underline', 'gui')) + assert.are.same('9', get_color_opt('@org.keyword.face.NEXT', 'bg', 'cterm')) + assert.are.same('', get_color_opt('@org.keyword.face.NEXT', 'bg', 'gui')) + assert.are.same('12', get_color_opt('@org.keyword.face.NEXT', 'fg', 'cterm')) + assert.are.same('', get_color_opt('@org.keyword.face.NEXT', 'fg', 'gui')) + assert.are.same('1', get_color_opt('@org.keyword.face.NEXT', 'bold', 'cterm')) + assert.are.same('', get_color_opt('@org.keyword.face.NEXT', 'bold', 'gui')) + assert.are.same('1', get_color_opt('@org.keyword.face.NEXT', 'italic', 'cterm')) + assert.are.same('', get_color_opt('@org.keyword.face.NEXT', 'italic', 'gui')) + assert.are.same('1', get_color_opt('@org.keyword.face.NEXT', 'underline', 'cterm')) + assert.are.same('', get_color_opt('@org.keyword.face.NEXT', 'underline', 'gui')) + + assert.are.same('10', get_color_opt('@org.keyword.face.CANCELED', 'fg', 'cterm')) + assert.are.same('', get_color_opt('@org.keyword.face.CANCELED', 'fg', 'gui')) + assert.are.same('1', get_color_opt('@org.keyword.face.CANCELED', 'italic', 'cterm')) + assert.are.same('', get_color_opt('@org.keyword.face.CANCELED', 'italic', 'gui')) + assert.are.same('', get_color_opt('@org.keyword.face.CANCELED', 'bg', 'gui')) + assert.are.same('', get_color_opt('@org.keyword.face.CANCELED', 'bg', 'cterm')) + assert.are.same('', get_color_opt('@org.keyword.face.CANCELED', 'bold', 'gui')) + assert.are.same('', get_color_opt('@org.keyword.face.CANCELED', 'bold', 'cterm')) + assert.are.same('', get_color_opt('@org.keyword.face.CANCELED', 'underline', 'gui')) + assert.are.same('', get_color_opt('@org.keyword.face.CANCELED', 'underline', 'cterm')) + + assert.are.same('', get_color_opt('@org.keyword.face.INPROGRESS', 'bg', 'cterm')) + assert.are.same('', get_color_opt('@org.keyword.face.INPROGRESS', 'bg', 'gui')) + assert.are.same('9', get_color_opt('@org.keyword.face.INPROGRESS', 'fg', 'cterm')) + assert.are.same('', get_color_opt('@org.keyword.face.INPROGRESS', 'fg', 'gui')) + assert.are.same('1', get_color_opt('@org.keyword.face.INPROGRESS', 'bold', 'cterm')) + assert.are.same('', get_color_opt('@org.keyword.face.INPROGRESS', 'bold', 'gui')) + assert.are.same('', get_color_opt('@org.keyword.face.INPROGRESS', 'italic', 'cterm')) + assert.are.same('', get_color_opt('@org.keyword.face.INPROGRESS', 'italic', 'gui')) + assert.are.same('', get_color_opt('@org.keyword.face.INPROGRESS', 'underline', 'cterm')) + assert.are.same('', get_color_opt('@org.keyword.face.INPROGRESS', 'underline', 'gui')) end) end) diff --git a/tests/plenary/colors/highlighter_spec.lua b/tests/plenary/colors/highlighter_spec.lua index 1eac92734..461acc21b 100644 --- a/tests/plenary/colors/highlighter_spec.lua +++ b/tests/plenary/colors/highlighter_spec.lua @@ -6,6 +6,7 @@ local api = vim.api describe('highlighter', function() local ns_id = api.nvim_create_namespace('org_custom_highlighter') local get_extmarks = function(content) + ---@diagnostic disable-next-line: inject-field config.ts_hl_enabled = true helpers.create_file(content) ---@diagnostic disable-next-line: invisible @@ -36,6 +37,7 @@ describe('highlighter', function() after_each(function() vim.cmd([[%bw!]]) + ---@diagnostic disable-next-line: inject-field config.ts_hl_enabled = false ---@diagnostic disable-next-line: invisible org.highlighter._ephemeral = true @@ -47,9 +49,9 @@ describe('highlighter', function() 'I am *bold* text', }) assert.are.same(3, #extmarks) - assert_extmark(extmarks[1], { line = 0, start_col = 5, end_col = 6, hl_group = 'org_bold_delimiter' }) - assert_extmark(extmarks[2], { line = 0, start_col = 6, end_col = 10, hl_group = 'org_bold' }) - assert_extmark(extmarks[3], { line = 0, start_col = 10, end_col = 11, hl_group = 'org_bold_delimiter' }) + assert_extmark(extmarks[1], { line = 0, start_col = 5, end_col = 6, hl_group = '@org.bold.delimiter' }) + assert_extmark(extmarks[2], { line = 0, start_col = 6, end_col = 10, hl_group = '@org.bold' }) + assert_extmark(extmarks[3], { line = 0, start_col = 10, end_col = 11, hl_group = '@org.bold.delimiter' }) end) it('should highlight italic', function() @@ -57,9 +59,9 @@ describe('highlighter', function() 'I am /italic/ text', }) assert.are.same(3, #extmarks) - assert_extmark(extmarks[1], { line = 0, start_col = 5, end_col = 6, hl_group = 'org_italic_delimiter' }) - assert_extmark(extmarks[2], { line = 0, start_col = 6, end_col = 12, hl_group = 'org_italic' }) - assert_extmark(extmarks[3], { line = 0, start_col = 12, end_col = 13, hl_group = 'org_italic_delimiter' }) + assert_extmark(extmarks[1], { line = 0, start_col = 5, end_col = 6, hl_group = '@org.italic.delimiter' }) + assert_extmark(extmarks[2], { line = 0, start_col = 6, end_col = 12, hl_group = '@org.italic' }) + assert_extmark(extmarks[3], { line = 0, start_col = 12, end_col = 13, hl_group = '@org.italic.delimiter' }) end) it('should highlight underline', function() @@ -67,9 +69,9 @@ describe('highlighter', function() 'I am _underline_ text', }) assert.are.same(3, #extmarks) - assert_extmark(extmarks[1], { line = 0, start_col = 5, end_col = 6, hl_group = 'org_underline_delimiter' }) - assert_extmark(extmarks[2], { line = 0, start_col = 6, end_col = 15, hl_group = 'org_underline' }) - assert_extmark(extmarks[3], { line = 0, start_col = 15, end_col = 16, hl_group = 'org_underline_delimiter' }) + assert_extmark(extmarks[1], { line = 0, start_col = 5, end_col = 6, hl_group = '@org.underline.delimiter' }) + assert_extmark(extmarks[2], { line = 0, start_col = 6, end_col = 15, hl_group = '@org.underline' }) + assert_extmark(extmarks[3], { line = 0, start_col = 15, end_col = 16, hl_group = '@org.underline.delimiter' }) end) it('should highlight strikethrough', function() @@ -77,9 +79,9 @@ describe('highlighter', function() 'I am +strikethrough+ text', }) assert.are.same(3, #extmarks) - assert_extmark(extmarks[1], { line = 0, start_col = 5, end_col = 6, hl_group = 'org_strikethrough_delimiter' }) - assert_extmark(extmarks[2], { line = 0, start_col = 6, end_col = 19, hl_group = 'org_strikethrough' }) - assert_extmark(extmarks[3], { line = 0, start_col = 19, end_col = 20, hl_group = 'org_strikethrough_delimiter' }) + assert_extmark(extmarks[1], { line = 0, start_col = 5, end_col = 6, hl_group = '@org.strikethrough.delimiter' }) + assert_extmark(extmarks[2], { line = 0, start_col = 6, end_col = 19, hl_group = '@org.strikethrough' }) + assert_extmark(extmarks[3], { line = 0, start_col = 19, end_col = 20, hl_group = '@org.strikethrough.delimiter' }) end) it('should highlight dode', function() @@ -87,9 +89,9 @@ describe('highlighter', function() 'I am ~code~ text', }) assert.are.same(3, #extmarks) - assert_extmark(extmarks[1], { line = 0, start_col = 5, end_col = 6, hl_group = 'org_code_delimiter' }) - assert_extmark(extmarks[2], { line = 0, start_col = 6, end_col = 10, hl_group = 'org_code' }) - assert_extmark(extmarks[3], { line = 0, start_col = 10, end_col = 11, hl_group = 'org_code_delimiter' }) + assert_extmark(extmarks[1], { line = 0, start_col = 5, end_col = 6, hl_group = '@org.code.delimiter' }) + assert_extmark(extmarks[2], { line = 0, start_col = 6, end_col = 10, hl_group = '@org.code' }) + assert_extmark(extmarks[3], { line = 0, start_col = 10, end_col = 11, hl_group = '@org.code.delimiter' }) end) it('should highlight verbatim', function() @@ -97,9 +99,9 @@ describe('highlighter', function() 'I am =verbatim= text', }) assert.are.same(3, #extmarks) - assert_extmark(extmarks[1], { line = 0, start_col = 5, end_col = 6, hl_group = 'org_verbatim_delimiter' }) - assert_extmark(extmarks[2], { line = 0, start_col = 6, end_col = 14, hl_group = 'org_verbatim' }) - assert_extmark(extmarks[3], { line = 0, start_col = 14, end_col = 15, hl_group = 'org_verbatim_delimiter' }) + assert_extmark(extmarks[1], { line = 0, start_col = 5, end_col = 6, hl_group = '@org.verbatim.delimiter' }) + assert_extmark(extmarks[2], { line = 0, start_col = 6, end_col = 14, hl_group = '@org.verbatim' }) + assert_extmark(extmarks[3], { line = 0, start_col = 14, end_col = 15, hl_group = '@org.verbatim.delimiter' }) end) it('should highlight mix of emphasis that is nestable', function() @@ -107,15 +109,15 @@ describe('highlighter', function() 'I am *bold /italic and _underline_/* text', }) assert.are.same(9, #extmarks) - assert_extmark(extmarks[1], { line = 0, start_col = 5, end_col = 6, hl_group = 'org_bold_delimiter' }) - assert_extmark(extmarks[2], { line = 0, start_col = 6, end_col = 35, hl_group = 'org_bold' }) - assert_extmark(extmarks[3], { line = 0, start_col = 11, end_col = 12, hl_group = 'org_italic_delimiter' }) - assert_extmark(extmarks[4], { line = 0, start_col = 12, end_col = 34, hl_group = 'org_italic' }) - assert_extmark(extmarks[5], { line = 0, start_col = 23, end_col = 24, hl_group = 'org_underline_delimiter' }) - assert_extmark(extmarks[6], { line = 0, start_col = 24, end_col = 33, hl_group = 'org_underline' }) - assert_extmark(extmarks[7], { line = 0, start_col = 33, end_col = 34, hl_group = 'org_underline_delimiter' }) - assert_extmark(extmarks[8], { line = 0, start_col = 34, end_col = 35, hl_group = 'org_italic_delimiter' }) - assert_extmark(extmarks[9], { line = 0, start_col = 35, end_col = 36, hl_group = 'org_bold_delimiter' }) + assert_extmark(extmarks[1], { line = 0, start_col = 5, end_col = 6, hl_group = '@org.bold.delimiter' }) + assert_extmark(extmarks[2], { line = 0, start_col = 6, end_col = 35, hl_group = '@org.bold' }) + assert_extmark(extmarks[3], { line = 0, start_col = 11, end_col = 12, hl_group = '@org.italic.delimiter' }) + assert_extmark(extmarks[4], { line = 0, start_col = 12, end_col = 34, hl_group = '@org.italic' }) + assert_extmark(extmarks[5], { line = 0, start_col = 23, end_col = 24, hl_group = '@org.underline.delimiter' }) + assert_extmark(extmarks[6], { line = 0, start_col = 24, end_col = 33, hl_group = '@org.underline' }) + assert_extmark(extmarks[7], { line = 0, start_col = 33, end_col = 34, hl_group = '@org.underline.delimiter' }) + assert_extmark(extmarks[8], { line = 0, start_col = 34, end_col = 35, hl_group = '@org.italic.delimiter' }) + assert_extmark(extmarks[9], { line = 0, start_col = 35, end_col = 36, hl_group = '@org.bold.delimiter' }) end) it('should conceal markers if org_hide_emphasis_markers is true', function() @@ -127,21 +129,21 @@ describe('highlighter', function() assert.are.same(6, #extmarks) assert_extmark( extmarks[1], - { line = 0, start_col = 10, end_col = 11, hl_group = 'org_bold_delimiter', conceal = '' } + { line = 0, start_col = 10, end_col = 11, hl_group = '@org.bold.delimiter', conceal = '' } ) - assert_extmark(extmarks[2], { line = 0, start_col = 11, end_col = 24, hl_group = 'org_bold' }) + assert_extmark(extmarks[2], { line = 0, start_col = 11, end_col = 24, hl_group = '@org.bold' }) assert_extmark( extmarks[3], - { line = 0, start_col = 16, end_col = 17, hl_group = 'org_italic_delimiter', conceal = '' } + { line = 0, start_col = 16, end_col = 17, hl_group = '@org.italic.delimiter', conceal = '' } ) - assert_extmark(extmarks[4], { line = 0, start_col = 17, end_col = 23, hl_group = 'org_italic' }) + assert_extmark(extmarks[4], { line = 0, start_col = 17, end_col = 23, hl_group = '@org.italic' }) assert_extmark( extmarks[5], - { line = 0, start_col = 23, end_col = 24, hl_group = 'org_italic_delimiter', conceal = '' } + { line = 0, start_col = 23, end_col = 24, hl_group = '@org.italic.delimiter', conceal = '' } ) assert_extmark( extmarks[6], - { line = 0, start_col = 24, end_col = 25, hl_group = 'org_bold_delimiter', conceal = '' } + { line = 0, start_col = 24, end_col = 25, hl_group = '@org.bold.delimiter', conceal = '' } ) config.opts.org_hide_emphasis_markers = false end) @@ -153,12 +155,12 @@ describe('highlighter', function() '- list item', }) assert.are.same(6, #extmarks) - assert_extmark(extmarks[1], { line = 0, start_col = 16, end_col = 17, hl_group = 'org_bold_delimiter' }) - assert_extmark(extmarks[2], { line = 0, start_col = 17, end_col = 30, hl_group = 'org_bold' }) - assert_extmark(extmarks[3], { line = 0, start_col = 22, end_col = 23, hl_group = 'org_italic_delimiter' }) - assert_extmark(extmarks[4], { line = 0, start_col = 23, end_col = 29, hl_group = 'org_italic' }) - assert_extmark(extmarks[5], { line = 0, start_col = 29, end_col = 30, hl_group = 'org_italic_delimiter' }) - assert_extmark(extmarks[6], { line = 0, start_col = 30, end_col = 31, hl_group = 'org_bold_delimiter' }) + assert_extmark(extmarks[1], { line = 0, start_col = 16, end_col = 17, hl_group = '@org.bold.delimiter' }) + assert_extmark(extmarks[2], { line = 0, start_col = 17, end_col = 30, hl_group = '@org.bold' }) + assert_extmark(extmarks[3], { line = 0, start_col = 22, end_col = 23, hl_group = '@org.italic.delimiter' }) + assert_extmark(extmarks[4], { line = 0, start_col = 23, end_col = 29, hl_group = '@org.italic' }) + assert_extmark(extmarks[5], { line = 0, start_col = 29, end_col = 30, hl_group = '@org.italic.delimiter' }) + assert_extmark(extmarks[6], { line = 0, start_col = 30, end_col = 31, hl_group = '@org.bold.delimiter' }) end) it('should highlight emphasis in list item', function() @@ -168,12 +170,12 @@ describe('highlighter', function() '- list item', }) assert.are.same(6, #extmarks) - assert_extmark(extmarks[1], { line = 1, start_col = 12, end_col = 13, hl_group = 'org_bold_delimiter' }) - assert_extmark(extmarks[2], { line = 1, start_col = 13, end_col = 26, hl_group = 'org_bold' }) - assert_extmark(extmarks[3], { line = 1, start_col = 18, end_col = 19, hl_group = 'org_italic_delimiter' }) - assert_extmark(extmarks[4], { line = 1, start_col = 19, end_col = 25, hl_group = 'org_italic' }) - assert_extmark(extmarks[5], { line = 1, start_col = 25, end_col = 26, hl_group = 'org_italic_delimiter' }) - assert_extmark(extmarks[6], { line = 1, start_col = 26, end_col = 27, hl_group = 'org_bold_delimiter' }) + assert_extmark(extmarks[1], { line = 1, start_col = 12, end_col = 13, hl_group = '@org.bold.delimiter' }) + assert_extmark(extmarks[2], { line = 1, start_col = 13, end_col = 26, hl_group = '@org.bold' }) + assert_extmark(extmarks[3], { line = 1, start_col = 18, end_col = 19, hl_group = '@org.italic.delimiter' }) + assert_extmark(extmarks[4], { line = 1, start_col = 19, end_col = 25, hl_group = '@org.italic' }) + assert_extmark(extmarks[5], { line = 1, start_col = 25, end_col = 26, hl_group = '@org.italic.delimiter' }) + assert_extmark(extmarks[6], { line = 1, start_col = 26, end_col = 27, hl_group = '@org.bold.delimiter' }) end) it('should not render emphasis that is nested in non-nestable emphasis', function() @@ -181,9 +183,9 @@ describe('highlighter', function() 'I am =verbatim and *not bold* part= of text', }) assert.are.same(3, #extmarks) - assert_extmark(extmarks[1], { line = 0, start_col = 5, end_col = 6, hl_group = 'org_verbatim_delimiter' }) - assert_extmark(extmarks[2], { line = 0, start_col = 6, end_col = 34, hl_group = 'org_verbatim' }) - assert_extmark(extmarks[3], { line = 0, start_col = 34, end_col = 35, hl_group = 'org_verbatim_delimiter' }) + assert_extmark(extmarks[1], { line = 0, start_col = 5, end_col = 6, hl_group = '@org.verbatim.delimiter' }) + assert_extmark(extmarks[2], { line = 0, start_col = 6, end_col = 34, hl_group = '@org.verbatim' }) + assert_extmark(extmarks[3], { line = 0, start_col = 34, end_col = 35, hl_group = '@org.verbatim.delimiter' }) end) it('should not render emphasis if pre-chars are not valid', function() @@ -207,7 +209,7 @@ describe('highlighter', function() 'I have [[https://google.com]] link', }) assert.are.same(4, #extmarks) - assert_extmark(extmarks[1], { line = 0, start_col = 7, end_col = 29, hl_group = 'org_hyperlink' }) + assert_extmark(extmarks[1], { line = 0, start_col = 7, end_col = 29, hl_group = '@org.hyperlink' }) assert_extmark(extmarks[2], { line = 0, start_col = 7, end_col = 9, conceal = '' }) assert_extmark(extmarks[3], { line = 0, start_col = 9, end_col = 27, spell = false }) assert_extmark(extmarks[4], { line = 0, start_col = 27, end_col = 29, conceal = '' }) @@ -218,7 +220,7 @@ describe('highlighter', function() 'I have [[https://google.com][google]] link', }) assert.are.same(4, #extmarks) - assert_extmark(extmarks[1], { line = 0, start_col = 7, end_col = 37, hl_group = 'org_hyperlink' }) + assert_extmark(extmarks[1], { line = 0, start_col = 7, end_col = 37, hl_group = '@org.hyperlink' }) assert_extmark(extmarks[2], { line = 0, start_col = 7, end_col = 29, conceal = '' }) assert_extmark(extmarks[3], { line = 0, start_col = 9, end_col = 27, spell = false }) assert_extmark(extmarks[4], { line = 0, start_col = 35, end_col = 37, conceal = '' }) @@ -229,7 +231,7 @@ describe('highlighter', function() 'I have [[https://google.com][google I am *not bold*]] link', }) assert.are.same(4, #extmarks) - assert_extmark(extmarks[1], { line = 0, start_col = 7, end_col = 53, hl_group = 'org_hyperlink' }) + assert_extmark(extmarks[1], { line = 0, start_col = 7, end_col = 53, hl_group = '@org.hyperlink' }) assert_extmark(extmarks[2], { line = 0, start_col = 7, end_col = 29, conceal = '' }) assert_extmark(extmarks[3], { line = 0, start_col = 9, end_col = 27, spell = false }) assert_extmark(extmarks[4], { line = 0, start_col = 51, end_col = 53, conceal = '' }) @@ -255,13 +257,13 @@ describe('highlighter', function() [[this is \latex(inside) text]], }) assert.are.same(7, #extmarks) - assert_extmark(extmarks[1], { line = 0, start_col = 8, end_col = 14, hl_group = 'org_latex' }) - assert_extmark(extmarks[2], { line = 1, start_col = 8, end_col = 16, hl_group = 'org_latex' }) - assert_extmark(extmarks[3], { line = 2, start_col = 8, end_col = 15, hl_group = 'org_latex' }) - assert_extmark(extmarks[4], { line = 3, start_col = 8, end_col = 16, hl_group = 'org_latex' }) - assert_extmark(extmarks[5], { line = 4, start_col = 8, end_col = 15, hl_group = 'org_latex' }) - assert_extmark(extmarks[6], { line = 5, start_col = 8, end_col = 16, hl_group = 'org_latex' }) - assert_extmark(extmarks[7], { line = 6, start_col = 8, end_col = 15, hl_group = 'org_latex' }) + assert_extmark(extmarks[1], { line = 0, start_col = 8, end_col = 14, hl_group = '@org.latex' }) + assert_extmark(extmarks[2], { line = 1, start_col = 8, end_col = 16, hl_group = '@org.latex' }) + assert_extmark(extmarks[3], { line = 2, start_col = 8, end_col = 15, hl_group = '@org.latex' }) + assert_extmark(extmarks[4], { line = 3, start_col = 8, end_col = 16, hl_group = '@org.latex' }) + assert_extmark(extmarks[5], { line = 4, start_col = 8, end_col = 15, hl_group = '@org.latex' }) + assert_extmark(extmarks[6], { line = 5, start_col = 8, end_col = 16, hl_group = '@org.latex' }) + assert_extmark(extmarks[7], { line = 6, start_col = 8, end_col = 15, hl_group = '@org.latex' }) end) it('should highlight latex with backslash brackets', function() @@ -271,9 +273,9 @@ describe('highlighter', function() [[this is \{1 + 1\} math]], }) assert.are.same(3, #extmarks) - assert_extmark(extmarks[1], { line = 0, start_col = 8, end_col = 17, hl_group = 'org_latex' }) - assert_extmark(extmarks[2], { line = 1, start_col = 8, end_col = 17, hl_group = 'org_latex' }) - assert_extmark(extmarks[3], { line = 2, start_col = 8, end_col = 17, hl_group = 'org_latex' }) + assert_extmark(extmarks[1], { line = 0, start_col = 8, end_col = 17, hl_group = '@org.latex' }) + assert_extmark(extmarks[2], { line = 1, start_col = 8, end_col = 17, hl_group = '@org.latex' }) + assert_extmark(extmarks[3], { line = 2, start_col = 8, end_col = 17, hl_group = '@org.latex' }) end) end) @@ -287,11 +289,11 @@ describe('highlighter', function() 'the date <2024-02-16 Fri 12:30 +1m -1d>', }) assert.are.same(5, #extmarks) - assert_extmark(extmarks[1], { line = 0, start_col = 9, end_col = 21, hl_group = 'OrgTSTimestampActive' }) - assert_extmark(extmarks[2], { line = 1, start_col = 9, end_col = 25, hl_group = 'OrgTSTimestampActive' }) - assert_extmark(extmarks[3], { line = 2, start_col = 9, end_col = 31, hl_group = 'OrgTSTimestampActive' }) - assert_extmark(extmarks[4], { line = 3, start_col = 9, end_col = 35, hl_group = 'OrgTSTimestampActive' }) - assert_extmark(extmarks[5], { line = 4, start_col = 9, end_col = 39, hl_group = 'OrgTSTimestampActive' }) + assert_extmark(extmarks[1], { line = 0, start_col = 9, end_col = 21, hl_group = '@org.timestamp.active' }) + assert_extmark(extmarks[2], { line = 1, start_col = 9, end_col = 25, hl_group = '@org.timestamp.active' }) + assert_extmark(extmarks[3], { line = 2, start_col = 9, end_col = 31, hl_group = '@org.timestamp.active' }) + assert_extmark(extmarks[4], { line = 3, start_col = 9, end_col = 35, hl_group = '@org.timestamp.active' }) + assert_extmark(extmarks[5], { line = 4, start_col = 9, end_col = 39, hl_group = '@org.timestamp.active' }) end) it('should highlight inactive dates', function() @@ -303,11 +305,11 @@ describe('highlighter', function() 'the date [2024-02-16 Fri 12:30 +1m -1d]', }) assert.are.same(5, #extmarks) - assert_extmark(extmarks[1], { line = 0, start_col = 9, end_col = 21, hl_group = 'OrgTSTimestampInactive' }) - assert_extmark(extmarks[2], { line = 1, start_col = 9, end_col = 25, hl_group = 'OrgTSTimestampInactive' }) - assert_extmark(extmarks[3], { line = 2, start_col = 9, end_col = 31, hl_group = 'OrgTSTimestampInactive' }) - assert_extmark(extmarks[4], { line = 3, start_col = 9, end_col = 35, hl_group = 'OrgTSTimestampInactive' }) - assert_extmark(extmarks[5], { line = 4, start_col = 9, end_col = 39, hl_group = 'OrgTSTimestampInactive' }) + assert_extmark(extmarks[1], { line = 0, start_col = 9, end_col = 21, hl_group = '@org.timestamp.inactive' }) + assert_extmark(extmarks[2], { line = 1, start_col = 9, end_col = 25, hl_group = '@org.timestamp.inactive' }) + assert_extmark(extmarks[3], { line = 2, start_col = 9, end_col = 31, hl_group = '@org.timestamp.inactive' }) + assert_extmark(extmarks[4], { line = 3, start_col = 9, end_col = 35, hl_group = '@org.timestamp.inactive' }) + assert_extmark(extmarks[5], { line = 4, start_col = 9, end_col = 39, hl_group = '@org.timestamp.inactive' }) end) it('should not highlight invalid dates', function() diff --git a/tests/plenary/object/todo_state_spec.lua b/tests/plenary/object/todo_state_spec.lua index f0aafd874..03237ec06 100644 --- a/tests/plenary/object/todo_state_spec.lua +++ b/tests/plenary/object/todo_state_spec.lua @@ -4,16 +4,16 @@ local TodoState = require('orgmode.objects.todo_state') describe('Todo state', function() it('should switch to next state', function() local state = TodoState:new({ current_state = 'TODO' }) - assert.are.same({ value = 'DONE', type = 'DONE', hl = 'OrgDONE' }, state:get_next()) + assert.are.same({ value = 'DONE', type = 'DONE', hl = '@org.keyword.done' }, state:get_next()) assert.are.same({ value = '', type = '' }, state:get_next()) - assert.are.same({ value = 'TODO', type = 'TODO', hl = 'OrgTODO' }, state:get_next()) + assert.are.same({ value = 'TODO', type = 'TODO', hl = '@org.keyword.todo' }, state:get_next()) end) it('should switch to prev state', function() local state = TodoState:new({ current_state = 'TODO' }) assert.are.same({ value = '', type = '' }, state:get_prev()) - assert.are.same({ value = 'DONE', type = 'DONE', hl = 'OrgDONE' }, state:get_prev()) - assert.are.same({ value = 'TODO', type = 'TODO', hl = 'OrgTODO' }, state:get_prev()) + assert.are.same({ value = 'DONE', type = 'DONE', hl = '@org.keyword.done' }, state:get_prev()) + assert.are.same({ value = 'TODO', type = 'TODO', hl = '@org.keyword.todo' }, state:get_prev()) end) it('should properly cycle through all defined custom states', function() @@ -30,23 +30,23 @@ describe('Todo state', function() }, }) local next_state = TodoState:new({ current_state = 'TODO' }) - assert.are.same({ value = 'WAITING', type = 'TODO', hl = 'OrgTODO' }, next_state:get_next()) - assert.are.same({ value = 'PROCESSING', type = 'TODO', hl = 'OrgTODO' }, next_state:get_next()) - assert.are.same({ value = 'HYPHEN-KEYWORD', type = 'TODO', hl = 'OrgTODO' }, next_state:get_next()) - assert.are.same({ value = 'MULTI-HYPHEN-KEYWORD', type = 'TODO', hl = 'OrgTODO' }, next_state:get_next()) - assert.are.same({ value = 'CONFIRM', type = 'DONE', hl = 'OrgDONE' }, next_state:get_next()) - assert.are.same({ value = 'DONE', type = 'DONE', hl = 'OrgDONE' }, next_state:get_next()) + assert.are.same({ value = 'WAITING', type = 'TODO', hl = '@org.keyword.todo' }, next_state:get_next()) + assert.are.same({ value = 'PROCESSING', type = 'TODO', hl = '@org.keyword.todo' }, next_state:get_next()) + assert.are.same({ value = 'HYPHEN-KEYWORD', type = 'TODO', hl = '@org.keyword.todo' }, next_state:get_next()) + assert.are.same({ value = 'MULTI-HYPHEN-KEYWORD', type = 'TODO', hl = '@org.keyword.todo' }, next_state:get_next()) + assert.are.same({ value = 'CONFIRM', type = 'DONE', hl = '@org.keyword.done' }, next_state:get_next()) + assert.are.same({ value = 'DONE', type = 'DONE', hl = '@org.keyword.done' }, next_state:get_next()) assert.are.same({ value = '', type = '' }, next_state:get_next()) local prev_state = TodoState:new({ current_state = 'WAITING' }) - assert.are.same({ value = 'TODO', type = 'TODO', hl = 'OrgTODO' }, prev_state:get_prev()) + assert.are.same({ value = 'TODO', type = 'TODO', hl = '@org.keyword.todo' }, prev_state:get_prev()) assert.are.same({ value = '', type = '' }, prev_state:get_prev()) - assert.are.same({ value = 'DONE', type = 'DONE', hl = 'OrgDONE' }, prev_state:get_prev()) - assert.are.same({ value = 'CONFIRM', type = 'DONE', hl = 'OrgDONE' }, prev_state:get_prev()) - assert.are.same({ value = 'MULTI-HYPHEN-KEYWORD', type = 'TODO', hl = 'OrgTODO' }, prev_state:get_prev()) - assert.are.same({ value = 'HYPHEN-KEYWORD', type = 'TODO', hl = 'OrgTODO' }, prev_state:get_prev()) - assert.are.same({ value = 'PROCESSING', type = 'TODO', hl = 'OrgTODO' }, prev_state:get_prev()) - assert.are.same({ value = 'WAITING', type = 'TODO', hl = 'OrgTODO' }, prev_state:get_prev()) - assert.are.same({ value = 'TODO', type = 'TODO', hl = 'OrgTODO' }, prev_state:get_prev()) + assert.are.same({ value = 'DONE', type = 'DONE', hl = '@org.keyword.done' }, prev_state:get_prev()) + assert.are.same({ value = 'CONFIRM', type = 'DONE', hl = '@org.keyword.done' }, prev_state:get_prev()) + assert.are.same({ value = 'MULTI-HYPHEN-KEYWORD', type = 'TODO', hl = '@org.keyword.todo' }, prev_state:get_prev()) + assert.are.same({ value = 'HYPHEN-KEYWORD', type = 'TODO', hl = '@org.keyword.todo' }, prev_state:get_prev()) + assert.are.same({ value = 'PROCESSING', type = 'TODO', hl = '@org.keyword.todo' }, prev_state:get_prev()) + assert.are.same({ value = 'WAITING', type = 'TODO', hl = '@org.keyword.todo' }, prev_state:get_prev()) + assert.are.same({ value = 'TODO', type = 'TODO', hl = '@org.keyword.todo' }, prev_state:get_prev()) end) end)