1
0
mirror of https://github.com/SpaceVim/SpaceVim.git synced 2025-02-03 10:10:04 +08:00
SpaceVim/bundle/vim-grammarous/autoload/unite/sources/grammarous.vim
2023-03-28 23:43:55 +08:00

121 lines
4.6 KiB
VimL
Vendored

let s:save_cpo = &cpo
set cpo&vim
let g:unite#sources#grammarous#one_line = get(g:, 'unite#sources#grammarous#one_line', 0)
let s:source = {
\ 'name' : 'grammarous',
\ 'description' : 'Show result of grammar check by vim-grammarous',
\ 'default_kind' : 'jump_list',
\ 'default_action' : 'open',
\ 'hooks' : {},
\ 'action_table' : {},
\ 'syntax' : 'uniteSource__Grammarous',
\ }
function! unite#sources#grammarous#define()
return s:source
endfunction
function! s:source.hooks.on_init(args, context)
if exists('b:unite') && has_key(b:unite, 'prev_bufnr')
let a:context.source__checked_bufnr = b:unite.prev_bufnr
else
let a:context.source__checked_bufnr = bufnr('%')
endif
let a:context.source__checked_bufnr
\ = getbufvar(
\ a:context.source__checked_bufnr,
\ 'grammarous_preview_original_bufnr',
\ a:context.source__checked_bufnr
\ )
if type(getbufvar(a:context.source__checked_bufnr, 'grammarous_result', 0)) == type(0)
let should_check_current_buf = a:context.source__checked_bufnr == bufnr('%')
if should_check_current_buf
execute 'GrammarousCheck' join(a:args, ' ')
else
let w = bufwinnr(a:context.source__checked_bufnr)
execute w . 'wincmd w'
execute 'GrammarousCheck' join(a:args, ' ')
wincmd p
endif
endif
call grammarous#info_win#close()
endfunction
function! s:source.hooks.on_syntax(args, context)
if g:unite#sources#grammarous#one_line
syntax region uniteSource__GrammarousError start="'" end="'" oneline contained containedin=uniteSource__Grammarous
syntax match uniteSource__GrammarousArrow "->" contained containedin=uniteSource__Grammarous
highlight default link uniteSource__GrammarousArrow Keyword
highlight default link uniteSource__GrammarousError ErrorMsg
else
syntax match uniteSource__GrammarousKeyword "\%(Context\|Correct\):" contained containedin=uniteSource__Grammarous
syntax keyword uniteSource__GrammarousError Error contained containedin=uniteSource__Grammarous
highlight default link uniteSource__GrammarousKeyword Keyword
highlight default link uniteSource__GrammarousError ErrorMsg
for err in getbufvar(a:context.source__checked_bufnr, 'grammarous_result', [])
call matchadd('GrammarousError', grammarous#generate_highlight_pattern(err), 999)
endfor
endif
endfunction
function! s:make_word(e)
if g:unite#sources#grammarous#one_line
return printf("'%s' -> %s", a:e.context[a:e.contextoffset : a:e.contextoffset+a:e.errorlength-1], a:e.msg)
else
let word = printf('Error: %s\nContext: %s', a:e.msg, a:e.context)
if a:e.replacements !=# ''
let word .= '\nCorrect: ' . split(a:e.replacements, '#', 1)[0]
endif
return word
endif
endfunction
function! s:source.change_candidates(args, context)
return map(copy(getbufvar(a:context.source__checked_bufnr, 'grammarous_result', [])), '{
\ "word" : s:make_word(v:val),
\ "action__buffer_nr" : a:context.source__checked_bufnr,
\ "action__line" : str2nr(v:val.fromy)+1,
\ "action__col" : str2nr(v:val.fromx)+1,
\ "action__grammar_error" : v:val,
\ "is_multiline" : 1,
\}')
endfunction
function! s:prepare_bufvar(c)
let b:grammarous_preview_error = a:c.action__grammar_error
let b:grammarous_preview_original_bufnr = a:c.action__buffer_nr
endfunction
let s:source.action_table.fixit = {
\ 'description' : 'Fix the error automatically',
\ }
function! s:source.action_table.fixit.func(candidate)
call s:prepare_bufvar(a:candidate)
call grammarous#info_win#action_fixit()
endfunction
let s:source.action_table.remove_error = {
\ 'description' : 'Remove the error without fix'
\ }
function! s:source.action_table.remove_error.func(candidate)
call s:prepare_bufvar(a:candidate)
call grammarous#info_win#action_remove_error()
endfunction
let s:source.action_table.disable_rule = {
\ 'description' : 'Disable the grammar rule in the checked buffer'
\ }
function! s:source.action_table.disable_rule.func(candidate)
call s:prepare_bufvar(a:candidate)
call grammarous#info_win#action_disable_rule()
endfunction
let &cpo = s:save_cpo
unlet s:save_cpo