mirror of
https://github.com/SpaceVim/SpaceVim.git
synced 2025-02-03 19:00:06 +08:00
121 lines
4.6 KiB
VimL
121 lines
4.6 KiB
VimL
|
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
|