[voikko] Oikoluku Vim-editoriin

Teemu Likonen tlikonen at iki.fi
Mon Aug 11 09:45:08 EEST 2008


Teemu Likonen kirjoitti (10.8.2008 klo 21.50):

> Tunnistamattomat sanat maalataan Vimin värikoodilla 
> SpellErrors - sama, mitä sisäänrakennettu oikolukukin käyttää.

Tässä olin väärässä. Vimin sisäisen oikoluvun väritunniste on SpellBad, 
joten käytänpä itsekin samaa. Oletusvärit näyttävät olevan punainen 
aaltomainen alleviivaus graafisessa versiossa ja punainen tausta 
terminaaliversiossa.

> Todennäköisesti hion tätä Vim-laajennosta vielä jonkin verran mutta
> ajattelin jo mainostaa ensimmäistä prototyyppiä tällä listalla. Tässä
> vaiheessa ihmeempiä virhetilanteiden tarkistuksia ei ole.

Lisäsin virhetilanteiden tarkistuksia ja muuta logiikkaa, jotta 
oikolukulaajennos toimii paremmin yhteen muiden Vimissä olevien 
ikkunoiden ja puskureiden kanssa. Nyt tätä ehkä uskaltaa tarjota 
tavallisillekin ihmisille. :)

Uusi versio liitteenä.
-------------- next part --------------
" Enchant-pohjainen oikoluku Vim-editoriin
"
" Version:	0.0.0.0.2
" Maintainer:	Teemu Likonen <tlikonen at iki.fi>
" License:	Public domain

" {{{1 Vakiot
if &compatible || v:version < 700 || !executable('enchant') || exists('g:loaded_enchant_spellcheck')
	finish
endif
let s:save_cpo = &cpo
set cpo&vim

let s:spellcheck_prg = 'enchant -l'

let s:match_group = 'SpellBad'
if !hlexists(s:match_group)
	execute 'highlight '.s:match_group.' term=reverse ctermbg=1 gui=undercurl guisp=Red'
endif

function! s:SpellCheckSwitch(switch) "{{{1
	if a:switch
		if !exists('b:enchant_spellcheck_save_isk')
			let b:enchant_spellcheck_save_isk = &l:isk
		endif
		if !exists('w:enchant_spellcheck_matches')
			let w:enchant_spellcheck_matches = getmatches()
		endif
		setlocal isk&vim
		call s:CheckSpelling()
		augroup EnchantSpellCheck
			autocmd!
			autocmd CursorHold,CursorHoldI <buffer> call s:CheckSpelling()
			autocmd BufWinLeave <buffer> call s:SpellCheckSwitch(0)
		augroup END
		echo 'Spell-checking turned on'
	else
		augroup EnchantSpellCheck
			autocmd!
		augroup END
		if exists('b:enchant_spellcheck_save_isk')
			let &l:isk = b:enchant_spellcheck_save_isk
			unlet b:enchant_spellcheck_save_isk
		endif
		if exists('w:enchant_spellcheck_matches')
			call clearmatches()
			call setmatches(w:enchant_spellcheck_matches)
			unlet w:enchant_spellcheck_matches
		endif
		if &term != 'builtin_gui'
			redraw!
		endif
		echo 'Spell-checking turned off'
	endif
endfunction

function! s:CheckSpelling() "{{{1
	call clearmatches()

	let line = winsaveview()['topline']
	let lines = winheight(0)
	let content_string = ''
	while lines > 0 && line <= line('$')
		let fold_end = foldclosedend(line)
		if fold_end > 0
			let line = fold_end
		else
			let content_string .= getline(line).' '
		endif
		let line += 1
		let lines -= 1
	endwhile

	let spelling_errors = split(system(s:spellcheck_prg,content_string))
	for word in spelling_errors
		call matchadd(s:match_group,'\V\C\<'.word.'\>')
	endfor
	if &term != 'builtin_gui'
		redraw!
	endif
endfunction

" {{{1 Komennot

if !exists(':EnchantSpellCheckOn') && !exists(':EnchantSpellCheckOff')
	command EnchantSpellCheckOn  call s:SpellCheckSwitch(1)
	command EnchantSpellCheckOff call s:SpellCheckSwitch(0)
endif

nnoremap <silent> <Plug>EnchantSpellCheckOn  :call <SID>SpellCheckSwitch(1)<CR>
nnoremap <silent> <Plug>EnchantSpellCheckOff :call <SID>SpellCheckSwitch(0)<CR>

function! s:Add_Mapping(mode, lhs, rhs)
	if maparg(a:lhs, a:mode) == '' && !hasmapto(a:rhs, a:mode)
		execute a:mode.'map '.a:lhs.' '.a:rhs
	endif
endfunction

call s:Add_Mapping('n','<Leader>s1','<Plug>EnchantSpellCheckOn')
call s:Add_Mapping('n','<Leader>s0','<Plug>EnchantSpellCheckOff')
delfunction s:Add_Mapping

" {{{1 Loppujutut
let g:loaded_enchant_spellcheck = 1
let &cpo = s:save_cpo
" vim600: fdm=marker


More information about the voikko mailing list