Files
vim-wordy/autoload/wordy.vim
Suraj N. Kurapati 210dd1077d GH-15: flag words as rare instead of bad in NeoVim
This change marks all words in all dictionaries as rare words so that
NeoVim highlights them as SpellRare instead of SpellBad.  This lets you
distinguish between wordy writing and normal misspellings, respectively.

In order for this to work, your NeoVim needs to be patched as follows:

  https://github.com/neovim/neovim/pull/2456

  https://groups.google.com/forum/#!topic/vim_dev/rPWOoR3ZgSA

See `:help spell-wordlist-format` for details about dictionary markings.
2015-04-26 17:43:29 -07:00

120 lines
3.7 KiB
VimL

" ============================================================================
" File: autoload/wordy.vim
" Description: autoload script for vim-wordy plugin
" Maintainer: Reed Esau <github.com/reedes>
" Last Change: January 14, 2014
" License: The MIT License (MIT)
" ============================================================================
if exists("autoloaded_wordy") | finish | endif
let autoloaded_wordy = 1
function! wordy#init(...) abort
let l:args = a:0 ? a:1 : {}
" start by restoring original state
if exists('b:original_spl')
if len(b:original_spl) > 0
exe 'setlocal spelllang=' . b:original_spl
unlet b:original_spl
setlocal spell< nospell<
endif
endif
" switch to usage dictionaries, building if needed
let l:d = get(l:args, 'd', []) " may be string or list
let l:dicts = (type(l:d) == type([])) ? l:d : [l:d]
let l:dst_paths = []
" TODO &spelllang)
let l:lang = get(l:args, 'lang', 'en')
" TODO &encoding)
let l:encoding = get(l:args, 'encoding', 'utf-8')
for l:dict in l:dicts
let l:data_dir = g:wordy_dir . '/data'
if has('nvim')
let l:data_dir = l:data_dir . '-neovim'
endif
let l:src_path = l:data_dir . '/' . l:lang . '/' . l:dict . '.dic'
if filereadable(l:src_path)
let l:spell_dir = g:wordy_dir . '/spell'
if !isdirectory(l:spell_dir)
call mkdir(expand(l:spell_dir), "p")
endif
let l:dst_path = l:spell_dir . '/' . l:dict . '.' . l:lang . '.' . l:encoding . '.spl'
if get(l:args, 'force', 0) ||
\ !filereadable(l:dst_path) ||
\ getftime(l:dst_path) < getftime(l:src_path)
" attempt to (re)build the spell file
exe 'mkspell! ' . l:dst_path . ' ' . l:src_path
endif
if filereadable(l:dst_path)
call add(l:dst_paths, l:dst_path)
else
let l:msg = 'Unable to read target: ' . l:dst_path
endif
else
let l:msg = 'Unable to read source: ' . l:src_path
endif
endfor
let l:prefix = 'wordy: '
if len(l:dst_paths) > 0
let b:original_spl = &spelllang
exe 'setlocal spelllang=' . l:lang . ',' . join(l:dst_paths, ',')
setlocal spell
" the magic numbers derived empirically with MacVim
" docs for rulerformat say 'The default ruler width is 17 characters'
let l:msg = l:prefix . join(l:dicts, ', ')
let l:max_len = &columns - strlen(l:prefix) - 5 - (&ruler ? 18 : 0)
if strlen(l:msg) > l:max_len
let l:msg = strpart(l:msg, 0, l:max_len-3) . '...'
endif
else
let l:msg = l:prefix . 'off'
endif
echohl ModeMsg | echo l:msg | echohl NONE
endfunction
function! wordy#jump(mode)
" mode=1 next in ring
" mode=-1 prev in ring
let l:avail_count = len(g:wordy#ring)
if l:avail_count == 0 | return | endif
" if -1, ring navigation not initialized; start at begin or end
" Example with avail_count=3
" ((-1 + 3 + 1 + 2) % 4) - 1 => 0
" (( 0 + 3 + 1 + 2) % 4) - 1 => 1
" (( 1 + 3 + 1 + 2) % 4) - 1 => 2
" (( 2 + 3 + 1 + 2) % 4) - 1 => -1 NoWordy
" ((-1 + 3 - 1 + 2) % 4) - 1 => 2
" (( 0 + 3 - 1 + 2) % 4) - 1 => -1 NoWordy
" (( 1 + 3 - 1 + 2) % 4) - 1 => 0
" (( 2 + 3 - 1 + 2) % 4) - 1 => 1
let g:wordy_ring_index =
\ ((g:wordy_ring_index + l:avail_count + a:mode + 2)
\ % (l:avail_count + 1)) - 1
if g:wordy_ring_index == -1
call wordy#init({}) " NoWordy
else
call wordy#init({ 'd': g:wordy#ring[ g:wordy_ring_index ]})
endif
endfunction
" Code from bairui@#vim.freenode
" https://gist.github.com/3322468
function! wordy#flatten(list)
let val = []
for elem in a:list
if type(elem) == type([])
call extend(val, wordy#flatten(elem))
else
call add(val, elem)
endif
unlet elem
endfor
return val
endfunction
" vim:ts=2:sw=2:sts=2