mirror of
https://github.com/neovim/neovim.git
synced 2025-09-23 03:28:33 +00:00
feat(extmarks,ts,spell): full support for spelling
- Added 'spell' option to extmarks: Extmarks with this set will have the region spellchecked. - Added 'noplainbuffer' option to 'spelloptions': This is used to tell Neovim not to spellcheck the buffer. The old behaviour was to spell check the whole buffer unless :syntax was set. - Added spelling support to the treesitter highlighter: @spell captures in highlights.scm are used to define regions which should be spell checked. - Added support for navigating spell errors for extmarks: Works for both ephemeral and static extmarks - Added '_on_spell_nav' callback for decoration providers: Since ephemeral callbacks are only drawn for the visible screen, providers must implement this callback to instruct Neovim which regions in the buffer need can be spell checked. The callback takes a start position and an end position. Note: this callback is subject to change hence the _ prefix. - Added spell captures for built-in support languages Co-authored-by: Lewis Russell <lewis6991@gmail.com> Co-authored-by: Björn Linse <bjorn.linse@gmail.com>
This commit is contained in:

committed by
Lewis Russell

parent
05893aea39
commit
75adfefc85
@@ -2646,6 +2646,8 @@ nvim_buf_set_extmark({buffer}, {ns_id}, {line}, {col}, {*opts})
|
||||
When a character is supplied it is used as |:syn-cchar|.
|
||||
"hl_group" is used as highlight for the cchar if provided,
|
||||
otherwise it defaults to |hl-Conceal|.
|
||||
• spell: boolean indicating that spell checking should be
|
||||
performed within this extmark
|
||||
• ui_watched: boolean that indicates the mark should be
|
||||
drawn by a UI. When set, the UI will receive win_extmark
|
||||
events. Note: the mark is positioned by virt_text
|
||||
@@ -2677,7 +2679,7 @@ nvim_get_namespaces() *nvim_get_namespaces()*
|
||||
dict that maps from names to namespace ids.
|
||||
|
||||
*nvim_set_decoration_provider()*
|
||||
nvim_set_decoration_provider({ns_id}, {opts})
|
||||
nvim_set_decoration_provider({ns_id}, {*opts})
|
||||
Set or change decoration provider for a namespace
|
||||
|
||||
This is a very general purpose interface for having lua callbacks being
|
||||
@@ -2709,7 +2711,7 @@ nvim_set_decoration_provider({ns_id}, {opts})
|
||||
|
||||
Parameters: ~
|
||||
{ns_id} Namespace id from |nvim_create_namespace()|
|
||||
{opts} Callbacks invoked during redraw:
|
||||
{opts} Table of callbacks:
|
||||
• on_start: called first on each screen redraw ["start",
|
||||
tick]
|
||||
• on_buf: called for each buffer being redrawn (before window
|
||||
|
@@ -5871,10 +5871,14 @@ A jump table for the options with a short description can be found at |Q_op|.
|
||||
'spelloptions' 'spo' string (default "")
|
||||
local to buffer
|
||||
A comma-separated list of options for spell checking:
|
||||
camel When a word is CamelCased, assume "Cased" is a
|
||||
camel When a word is CamelCased, assume "Cased" is a
|
||||
separate word: every upper-case character in a word
|
||||
that comes after a lower case character indicates the
|
||||
start of a new word.
|
||||
noplainbuffer Only spellcheck a buffer when 'syntax' is enabled, or
|
||||
or when extmarks are set within the buffer. Only
|
||||
designated regions of the buffer are spellchecked in
|
||||
this case.
|
||||
|
||||
*'spellsuggest'* *'sps'*
|
||||
'spellsuggest' 'sps' string (default "best")
|
||||
|
@@ -97,6 +97,7 @@ function TSHighlighter.new(tree, opts)
|
||||
if vim.g.syntax_on ~= 1 then
|
||||
vim.api.nvim_command('runtime! syntax/synload.vim')
|
||||
end
|
||||
vim.bo[self.bufnr].spelloptions = 'noplainbuffer'
|
||||
|
||||
self.tree:parse()
|
||||
|
||||
@@ -156,7 +157,7 @@ function TSHighlighter:get_query(lang)
|
||||
end
|
||||
|
||||
---@private
|
||||
local function on_line_impl(self, buf, line)
|
||||
local function on_line_impl(self, buf, line, spell)
|
||||
self.tree:for_each_tree(function(tstree, tree)
|
||||
if not tstree then
|
||||
return
|
||||
@@ -193,7 +194,9 @@ local function on_line_impl(self, buf, line)
|
||||
local start_row, start_col, end_row, end_col = node:range()
|
||||
local hl = highlighter_query.hl_cache[capture]
|
||||
|
||||
if hl and end_row >= line then
|
||||
local is_spell = highlighter_query:query().captures[capture] == 'spell'
|
||||
|
||||
if hl and end_row >= line and (not spell or is_spell) then
|
||||
a.nvim_buf_set_extmark(buf, ns, start_row, start_col, {
|
||||
end_line = end_row,
|
||||
end_col = end_col,
|
||||
@@ -201,6 +204,7 @@ local function on_line_impl(self, buf, line)
|
||||
ephemeral = true,
|
||||
priority = tonumber(metadata.priority) or 100, -- Low but leaves room below
|
||||
conceal = metadata.conceal,
|
||||
spell = is_spell,
|
||||
})
|
||||
end
|
||||
if start_row > line then
|
||||
@@ -217,7 +221,21 @@ function TSHighlighter._on_line(_, _win, buf, line, _)
|
||||
return
|
||||
end
|
||||
|
||||
on_line_impl(self, buf, line)
|
||||
on_line_impl(self, buf, line, false)
|
||||
end
|
||||
|
||||
---@private
|
||||
function TSHighlighter._on_spell_nav(_, _, buf, srow, _, erow, _)
|
||||
local self = TSHighlighter.active[buf]
|
||||
if not self then
|
||||
return
|
||||
end
|
||||
|
||||
self:reset_highlight_state()
|
||||
|
||||
for row = srow, erow do
|
||||
on_line_impl(self, buf, row, true)
|
||||
end
|
||||
end
|
||||
|
||||
---@private
|
||||
@@ -244,6 +262,7 @@ a.nvim_set_decoration_provider(ns, {
|
||||
on_buf = TSHighlighter._on_buf,
|
||||
on_win = TSHighlighter._on_win,
|
||||
on_line = TSHighlighter._on_line,
|
||||
_on_spell_nav = TSHighlighter._on_spell_nav,
|
||||
})
|
||||
|
||||
return TSHighlighter
|
||||
|
@@ -101,6 +101,7 @@
|
||||
[ "(" ")" "[" "]" "{" "}"] @punctuation.bracket
|
||||
|
||||
(string_literal) @string
|
||||
(string_literal) @spell
|
||||
(system_lib_string) @string
|
||||
|
||||
(null) @constant.builtin
|
||||
@@ -148,6 +149,7 @@
|
||||
|
||||
|
||||
(comment) @comment
|
||||
(comment) @spell
|
||||
|
||||
;; Parameters
|
||||
(parameter_declaration
|
||||
|
@@ -181,12 +181,14 @@
|
||||
;; Others
|
||||
|
||||
(comment) @comment
|
||||
(comment) @spell
|
||||
|
||||
(hash_bang_line) @comment
|
||||
|
||||
(number) @number
|
||||
|
||||
(string) @string
|
||||
(string) @spell
|
||||
|
||||
;; Error
|
||||
(ERROR) @error
|
||||
|
@@ -162,9 +162,11 @@
|
||||
;; Literals
|
||||
|
||||
(string_literal) @string
|
||||
(string_literal) @spell
|
||||
(integer_literal) @number
|
||||
(float_literal) @float
|
||||
(comment) @comment
|
||||
(comment) @spell
|
||||
(pattern) @string.special
|
||||
(pattern_multi) @string.regex
|
||||
(filename) @string
|
||||
|
Reference in New Issue
Block a user