1
0
forked from aniani/vim

updated for version 7.0138

This commit is contained in:
Bram Moolenaar 2005-08-29 22:25:38 +00:00
parent 81f1ecbc4d
commit ac6e65f88d
30 changed files with 954 additions and 381 deletions

View File

@ -155,6 +155,17 @@ argument behavior differs from that for defining and removing autocommands.
In order to list buffer-local autocommands, use a pattern in the form <buffer> In order to list buffer-local autocommands, use a pattern in the form <buffer>
or <buffer=N>. See |autocmd-buflocal|. or <buffer=N>. See |autocmd-buflocal|.
*:autocmd-verbose*
When 'verbose' is non-zero, listing an autocommand will also display where it
was last defined. Example: >
:verbose autocmd BufEnter
FileExplorer BufEnter
* call s:LocalBrowse(expand("<amatch>"))
Last set from /usr/share/vim/vim-7.0/plugin/NetrwPlugin.vim
<
See |:verbose-cmd| for more information.
============================================================================== ==============================================================================
5. Events *autocmd-events* *E215* *E216* 5. Events *autocmd-events* *E215* *E216*

View File

@ -1,4 +1,4 @@
*options.txt* For Vim version 7.0aa. Last change: 2005 Aug 23 *options.txt* For Vim version 7.0aa. Last change: 2005 Aug 27
VIM REFERENCE MANUAL by Bram Moolenaar VIM REFERENCE MANUAL by Bram Moolenaar
@ -1100,7 +1100,8 @@ A jump table for the options with a short description can be found at |Q_op|.
{not available when compiled without the |+linebreak| {not available when compiled without the |+linebreak|
feature} feature}
This option lets you choose which characters might cause a line This option lets you choose which characters might cause a line
break if 'linebreak' is on. break if 'linebreak' is on. Only works for ASCII and also for 8-bit
characters when 'encoding' is an 8-bit encoding.
*'browsedir'* *'bsdir'* *'browsedir'* *'bsdir'*
'browsedir' 'bsdir' string (default: "last") 'browsedir' 'bsdir' string (default: "last")
@ -7282,7 +7283,8 @@ A jump table for the options with a short description can be found at |Q_op|.
*'wrapscan'* *'ws'* *'nowrapscan'* *'nows'* *'wrapscan'* *'ws'* *'nowrapscan'* *'nows'*
'wrapscan' 'ws' boolean (default on) *E384* *E385* 'wrapscan' 'ws' boolean (default on) *E384* *E385*
global global
Searches wrap around the end of the file. Searches wrap around the end of the file. Also applies to |]s| and
|[s|, searching for spelling mistakes.
*'write'* *'nowrite'* *'write'* *'nowrite'*
'write' boolean (default on) 'write' boolean (default on)

View File

@ -1,4 +1,4 @@
*quickref.txt* For Vim version 7.0aa. Last change: 2005 Jul 27 *quickref.txt* For Vim version 7.0aa. Last change: 2005 Aug 29
VIM REFERENCE MANUAL by Bram Moolenaar VIM REFERENCE MANUAL by Bram Moolenaar
@ -756,6 +756,7 @@ Short explanation of each option: *option-list*
|'maxmempattern'| |'mmp'| maximum memory (in Kbyte) used for pattern search |'maxmempattern'| |'mmp'| maximum memory (in Kbyte) used for pattern search
|'maxmemtot'| |'mmt'| maximum memory (in Kbyte) used for all buffers |'maxmemtot'| |'mmt'| maximum memory (in Kbyte) used for all buffers
|'menuitems'| |'mis'| maximum number of items in a menu |'menuitems'| |'mis'| maximum number of items in a menu
|'mkspellmem'| |'msm'| memory used before |:mkspell| compresses the tree
|'modeline'| |'ml'| recognize modelines at start or end of file |'modeline'| |'ml'| recognize modelines at start or end of file
|'modelines'| |'mls'| number of lines checked for modelines |'modelines'| |'mls'| number of lines checked for modelines
|'modifiable'| |'ma'| changes to the text are not possible |'modifiable'| |'ma'| changes to the text are not possible

View File

@ -1,4 +1,4 @@
*spell.txt* For Vim version 7.0aa. Last change: 2005 Aug 25 *spell.txt* For Vim version 7.0aa. Last change: 2005 Aug 29
VIM REFERENCE MANUAL by Bram Moolenaar VIM REFERENCE MANUAL by Bram Moolenaar
@ -43,6 +43,7 @@ To search for the next misspelled word:
*]s* *E756* *]s* *E756*
]s Move to next misspelled word after the cursor. ]s Move to next misspelled word after the cursor.
A count before the command can be used to repeat. A count before the command can be used to repeat.
'wrapscan' applies.
*[s* *[s*
[s Like "]s" but search backwards, find the misspelled [s Like "]s" but search backwards, find the misspelled
@ -514,7 +515,7 @@ used spelling files, use this command:
*:spelldump* *:spelld* *:spelldump* *:spelld*
:spelld[ump] Open a new window and fill it with all currently valid :spelld[ump] Open a new window and fill it with all currently valid
words. words. Compound words are not included.
Note: For some languages the result may be enormous, Note: For some languages the result may be enormous,
causing Vim to run out of memory. causing Vim to run out of memory.
@ -915,6 +916,12 @@ word itself is not a good word. Example:
NEEDAFFIX + ~ NEEDAFFIX + ~
*spell-NEEDCOMPOUND*
The NEEDCOMPOUND flag is used to require that a word is used as part of a
compound word The word itself is not a good word. Example:
NEEDCOMPOUND & ~
COMPOUND WORDS *spell-compound* COMPOUND WORDS *spell-compound*
@ -988,13 +995,13 @@ A specific example: Allow a compound to be made of two words and a dash:
This allows for the word "start-end", but not "startend". This allows for the word "start-end", but not "startend".
*spell-COMPOUNDMIN* *spell-COMPOUNDMIN*
The minimal byte length of a word used for concatenation is specified with The minimal character length of a word used for compounding is specified with
COMPOUNDMIN. Example: COMPOUNDMIN. Example:
COMPOUNDMIN 5 ~ COMPOUNDMIN 5 ~
When omitted a minimal length of 3 bytes is used. Obviously you could just When omitted there is no minimal length. Obviously you could just leave out
leave out the compound flag from short words instead, this feature is present the compound flag from short words instead, this feature is present for
for compatibility with Myspell. compatibility with Myspell.
*spell-COMPOUNDMAX* *spell-COMPOUNDMAX*
The maximum number of words that can be concatenated into a compound word is The maximum number of words that can be concatenated into a compound word is

View File

@ -4226,6 +4226,7 @@ autocmd-patterns autocmd.txt /*autocmd-patterns*
autocmd-remove autocmd.txt /*autocmd-remove* autocmd-remove autocmd.txt /*autocmd-remove*
autocmd-searchpat autocmd.txt /*autocmd-searchpat* autocmd-searchpat autocmd.txt /*autocmd-searchpat*
autocmd-use autocmd.txt /*autocmd-use* autocmd-use autocmd.txt /*autocmd-use*
autocmd-verbose autocmd.txt /*autocmd-verbose*
autocmd.txt autocmd.txt /*autocmd.txt* autocmd.txt autocmd.txt /*autocmd.txt*
autocmds-kept version5.txt /*autocmds-kept* autocmds-kept version5.txt /*autocmds-kept*
autocommand autocmd.txt /*autocommand* autocommand autocmd.txt /*autocommand*

View File

@ -1,4 +1,4 @@
*term.txt* For Vim version 7.0aa. Last change: 2005 Jun 06 *term.txt* For Vim version 7.0aa. Last change: 2005 Aug 27
VIM REFERENCE MANUAL by Bram Moolenaar VIM REFERENCE MANUAL by Bram Moolenaar
@ -291,6 +291,7 @@ Added by Vim (there are no standard codes for these):
t_WS set window size (height, width) in characters *t_WS* *'t_WS'* t_WS set window size (height, width) in characters *t_WS* *'t_WS'*
t_SI start insert mode (bar cursor shape) *t_SI* *'t_SI'* t_SI start insert mode (bar cursor shape) *t_SI* *'t_SI'*
t_EI end insert mode (block cursor shape) *t_EI* *'t_EI'* t_EI end insert mode (block cursor shape) *t_EI* *'t_EI'*
|termcap-cursor-shape|
t_RV request terminal version string (for xterm) *t_RV* *'t_RV'* t_RV request terminal version string (for xterm) *t_RV* *'t_RV'*
|xterm-8bit| |v:termresponse| |'ttymouse'| |xterm-codes| |xterm-8bit| |v:termresponse| |'ttymouse'| |xterm-codes|
@ -427,6 +428,7 @@ Example for an xterm, this changes the color of the cursor: >
endif endif
NOTE: When Vim exits the shape for Normal mode will remain. The shape from NOTE: When Vim exits the shape for Normal mode will remain. The shape from
before Vim started will not be restored. before Vim started will not be restored.
{not available when compiled without the +cursorshape feature}
*termcap-title* *termcap-title*
The 't_ts' and 't_fs' options are used to set the window title if the terminal The 't_ts' and 't_fs' options are used to set the window title if the terminal

View File

@ -1,4 +1,4 @@
*todo.txt* For Vim version 7.0aa. Last change: 2005 Aug 25 *todo.txt* For Vim version 7.0aa. Last change: 2005 Aug 29
VIM REFERENCE MANUAL by Bram Moolenaar VIM REFERENCE MANUAL by Bram Moolenaar
@ -31,21 +31,14 @@ be worked on, but only if you sponsor Vim development. See |sponsor|.
-------------------- Known bugs and current work ----------------------- -------------------- Known bugs and current work -----------------------
Spelling: Spelling:
- Use 'wrapscan' for "[s" and "]s"?
- Is there a way to avoid compound IDs taking two utf-8 bytes?
- Make COMPOUNDMIN 3 characters instead of 3 bytes.
- Check support of flags of two characters, numbers (comma separated) and HUH. - Check support of flags of two characters, numbers (comma separated) and HUH.
When using many compound flags, does regexp still work? When using many compound flags, does regexp still work?
- "zg" doesn't work for Thai?
- Compound word is accepted if nr of words is <= COMPOUNDMAX OR nr of - Compound word is accepted if nr of words is <= COMPOUNDMAX OR nr of
syllables <= COMPOUNDSYLMAX. Specify AND in the affix file? syllables <= COMPOUNDSYLMAX. Specify AND in the affix file?
- ONLYINCOMPOUND -> NEEDCOMPOUND (also used for affix? or use "needcomp"
after affix)
- COMPOUNDMAX -> COMPOUNDWORDMAX? - COMPOUNDMAX -> COMPOUNDWORDMAX?
- Support flags on a suffix. Used for second level affixes. - Support flags on a suffix. Used for second level affixes.
@ -54,6 +47,8 @@ Spelling:
flags of the word are not used. flags of the word are not used.
Instead of "SFX a 0 add/FLAGS ." we could use "SFX a 0 add . /FLAGS". Instead of "SFX a 0 add/FLAGS ." we could use "SFX a 0 add . /FLAGS".
- NEEDCOMPOUND also used for affix? Or use "needcomp" after affix?
- Do we need a flag for the rule that when compounding is done the following - Do we need a flag for the rule that when compounding is done the following
word doesn't have a capital after a word character, even for Onecap words? word doesn't have a capital after a word character, even for Onecap words?
@ -1482,6 +1477,10 @@ Multi-byte characters:
7 In "-- INSERT (lang) --" show the name of the keymap used instead of 7 In "-- INSERT (lang) --" show the name of the keymap used instead of
"lang". (Ilya Dogolazky) "lang". (Ilya Dogolazky)
- Make 'langmap' accept multi-byte characters. - Make 'langmap' accept multi-byte characters.
- Make 'breakat' accept multi-byte characters. Problem: can't use a lookup
table anymore (breakat_flags[]).
Simplistic solution: when 'formatoptions' contains "m" also break a line
at a multi-byte character >= 0x100.
- Do we need the reverse of 'keymap', like 'langmap' but with files and - Do we need the reverse of 'keymap', like 'langmap' but with files and
multi-byte characters? E.g., when using a Russian keyboard. multi-byte characters? E.g., when using a Russian keyboard.
- Add the possibility to enter mappings which are used whenever normal text - Add the possibility to enter mappings which are used whenever normal text

View File

@ -1,4 +1,4 @@
*various.txt* For Vim version 7.0aa. Last change: 2005 Jun 22 *various.txt* For Vim version 7.0aa. Last change: 2005 Aug 27
VIM REFERENCE MANUAL by Bram Moolenaar VIM REFERENCE MANUAL by Bram Moolenaar
@ -268,6 +268,8 @@ N *+cmdline_info* |'showcmd'| and |'ruler'|
N *+comments* |'comments'| support N *+comments* |'comments'| support
N *+cryptv* encryption support |encryption| N *+cryptv* encryption support |encryption|
B *+cscope* |cscope| support B *+cscope* |cscope| support
m *+cursorshape* |termcap-cursor-shape| support
m *+debug* Compiled for debugging.
N *+dialog_gui* Support for |:confirm| with GUI dialog. N *+dialog_gui* Support for |:confirm| with GUI dialog.
N *+dialog_con* Support for |:confirm| with console dialog. N *+dialog_con* Support for |:confirm| with console dialog.
N *+dialog_con_gui* Support for |:confirm| with GUI and console dialog. N *+dialog_con_gui* Support for |:confirm| with GUI and console dialog.
@ -487,10 +489,11 @@ N *+X11* Unix only: can restore window title |X11|
*:verbose-cmd* *:verbose-cmd*
When 'verbose' is non-zero, listing the value of a Vim option or a key map or When 'verbose' is non-zero, listing the value of a Vim option or a key map or
a user-defined function or a command or a highlight group will also display a user-defined function or a command or a highlight group or an autocommand
where it was last defined. If it was defined manually then there will be no will also display where it was last defined. If it was defined manually then
"Last set" message. When it was defined while executing a function, user there will be no "Last set" message. When it was defined while executing a
command or autocommand, the script in which it was defined is reported. function, user command or autocommand, the script in which it was defined is
reported.
{not available when compiled without the +eval feature} {not available when compiled without the +eval feature}
*K* *K*

View File

@ -1,4 +1,4 @@
*version7.txt* For Vim version 7.0aa. Last change: 2005 Aug 24 *version7.txt* For Vim version 7.0aa. Last change: 2005 Aug 28
VIM REFERENCE MANUAL by Bram Moolenaar VIM REFERENCE MANUAL by Bram Moolenaar
@ -327,7 +327,7 @@ Various new items *new-items-7*
Normal mode commands: ~ Normal mode commands: ~
a", a' and a` New text objects to select quoted strings. |a'| a", a' and a` New text objects to select quoted strings. |a'|
i", i' and i' (Taro Muraoka) i", i' and i` (Taro Muraoka)
CTRL-W <Enter> In the quickfix window: opens a new window to show the CTRL-W <Enter> In the quickfix window: opens a new window to show the
location of the error under the cursor. location of the error under the cursor.
@ -565,8 +565,8 @@ For xterm most combinations of modifiers with function keys are recognized.
When 'verbose' is set the output of ":highlight" will show where a highlight When 'verbose' is set the output of ":highlight" will show where a highlight
item was last set. item was last set.
When 'verbose' is set the output of ":map", ":command" and ":function" When 'verbose' is set the output of the ":map", ":command", ":function" and
commands will show where it was last defined. (Yegappan Lakshmanan) ":autocmd" commands will show where it was last defined. (Yegappan Lakshmanan)
============================================================================== ==============================================================================
IMPROVEMENTS *improvements-7* IMPROVEMENTS *improvements-7*
@ -774,6 +774,11 @@ sorted: user commands, variables, syntax names, etc.
When no locale is set, thus using the "C" locale, Vim will work with latin1 When no locale is set, thus using the "C" locale, Vim will work with latin1
characters, using it's own isupper()/toupper()/etc. functions. characters, using it's own isupper()/toupper()/etc. functions.
When using an rxvt terminal emulator guess the value of 'background' using the
COLORFGBG environment variable. (Ciaran McCreesh)
Also support t_SI and t_EI on Unix with normal features. (Ciaran McCreesh)
============================================================================== ==============================================================================
COMPILE TIME CHANGES *compile-changes-7* COMPILE TIME CHANGES *compile-changes-7*

View File

@ -1,7 +1,7 @@
" Vim support file to detect file types " Vim support file to detect file types
" "
" Maintainer: Bram Moolenaar <Bram@vim.org> " Maintainer: Bram Moolenaar <Bram@vim.org>
" Last Change: 2005 Aug 24 " Last Change: 2005 Aug 29
" Listen very carefully, I will say this only once " Listen very carefully, I will say this only once
if exists("did_load_filetypes") if exists("did_load_filetypes")
@ -1200,7 +1200,7 @@ function! s:FTprogress_asm()
" This function checks for an assembly comment the first ten lines. " This function checks for an assembly comment the first ten lines.
" If not found, assume Progress. " If not found, assume Progress.
let lnum = 1 let lnum = 1
while lnum <= 10 while lnum <= 10 && lnum < line('$')
let line = getline(lnum) let line = getline(lnum)
if line =~ '^\s*;' || line =~ '^\*' if line =~ '^\s*;' || line =~ '^\*'
call s:FTasm() call s:FTasm()
@ -1227,9 +1227,9 @@ function! s:FTprogress_pascal()
" Look for either an opening comment or a program start. " Look for either an opening comment or a program start.
" If not found, assume Progress. " If not found, assume Progress.
let lnum = 1 let lnum = 1
while lnum <= 10 while lnum <= 10 && lnum < line('$')
let line = getline(lnum) let line = getline(lnum)
if line =~ '^\s*\(program\|procedure\|function\|const\|type\|var\)\>' if line =~ '^\s*\(program\|unit\|procedure\|function\|const\|type\|var\)\>'
\ || line =~ '^\s*{' || line =~ '^\s*(\*' \ || line =~ '^\s*{' || line =~ '^\s*(\*'
setf pascal setf pascal
return return

View File

@ -1,7 +1,7 @@
" These commands create the option window. " These commands create the option window.
" "
" Maintainer: Bram Moolenaar <Bram@vim.org> " Maintainer: Bram Moolenaar <Bram@vim.org>
" Last Change: 2005 Jul 11 " Last Change: 2005 Aug 29
" If there already is an option window, jump to that one. " If there already is an option window, jump to that one.
if bufwinnr("option-window") > 0 if bufwinnr("option-window") > 0
@ -403,6 +403,8 @@ if has("syntax")
call <SID>OptionL("spc") call <SID>OptionL("spc")
call append("$", "spellsuggest\tmethods used to suggest corrections") call append("$", "spellsuggest\tmethods used to suggest corrections")
call <SID>OptionG("sps", &sps) call <SID>OptionG("sps", &sps)
call append("$", "mkspellmem\tamount of memory used by :mkspell before compressing")
call <SID>OptionG("msm", &msm)
endif endif

View File

@ -19,7 +19,6 @@ $SPELLDIR/bg.utf-8.spl : $FILES
../README_bg.txt: README_bg_BG.txt ../README_bg.txt: README_bg_BG.txt
:copy $source $target :copy $source $target
:sys $VIM $target -e -c "set ff=unix" -c wq
# #
# Fetching the files from OpenOffice.org. # Fetching the files from OpenOffice.org.
@ -35,8 +34,9 @@ bg_BG.aff bg_BG.dic: {buildcheck=}
:fetch bg_BG.zip :fetch bg_BG.zip
:sys $UNZIP bg_BG.zip :sys $UNZIP bg_BG.zip
:delete bg_BG.zip :delete bg_BG.zip
:sys $VIM bg_BG.aff -c "set ff=unix" -c "update" -c q :sys $VIM bg_BG.aff -e -c "set ff=unix" -c update -c q
:sys $VIM bg_BG.dic -c "set ff=unix" -c "update" -c q :sys $VIM bg_BG.dic -e -c "set ff=unix" -c update -c q
:sys $VIM README_bg_BG.txt -e -c "set ff=unix" -c update -c q
@if not os.path.exists('bg_BG.orig.aff'): @if not os.path.exists('bg_BG.orig.aff'):
:copy bg_BG.aff bg_BG.orig.aff :copy bg_BG.aff bg_BG.orig.aff
@if not os.path.exists('bg_BG.orig.dic'): @if not os.path.exists('bg_BG.orig.dic'):

View File

@ -4,7 +4,8 @@
# aap generate all the .spl files # aap generate all the .spl files
# aap diff create all the diff files # aap diff create all the diff files
LANG = af am bg ca cs da de el en eo es fr fo gl he hr it nl ny pl sk th yi hu LANG = af am bg ca cs da de el en eo es fr fo gl he hr it nl ny pl ru sk
th yi hu
# "hu" is at the end, because it takes very long. # "hu" is at the end, because it takes very long.
# #

104
runtime/spell/ru/main.aap Normal file
View File

@ -0,0 +1,104 @@
# Aap recipe for Russian Vim spell files.
# Use a freshly compiled Vim if it exists.
@if os.path.exists('../../../src/vim'):
VIM = ../../../src/vim
@else:
:progsearch VIM vim
REGIONS = RU IE YO
SPELLDIR = ..
FILES = ru_$*(REGIONS).aff ru_$*(REGIONS).dic
all: $SPELLDIR/ru.koi8-r.spl $SPELLDIR/ru.utf-8.spl \
$SPELLDIR/ru.cp1251.spl ../README_ru.txt
$SPELLDIR/ru.koi8-r.spl : $FILES
:sys env LANG=ru_RU.KOI8-R $VIM -u NONE -e -c "mkspell! $SPELLDIR/ru ru_RU ru_IE ru_YO" -c q
$SPELLDIR/ru.utf-8.spl : $FILES
:sys env LANG=ru_RU.UTF-8 $VIM -u NONE -e -c "mkspell! $SPELLDIR/ru ru_RU ru_IE ru_YO" -c q
$SPELLDIR/ru.cp1251.spl : $FILES
:sys env LANG=ru_RU.CP1251 $VIM -u NONE -e -c "mkspell! $SPELLDIR/ru ru_RU ru_IE ru_YO" -c q
../README_ru.txt: README_ru_$*(REGIONS).txt
:print ru_RU >! $target
:cat README_ru_RU.txt >> $target
:print =================================================== >>$target
:print ru_IE >> $target
:cat README_ru_IE.txt >> $target
:print =================================================== >>$target
:print ru_YO >> $target
:cat README_ru_YO.txt >> $target
#
# Fetching the files from OpenOffice.org.
#
OODIR = http://ftp.services.openoffice.org/pub/OpenOffice.org/contrib/dictionaries
:attr {fetch = $OODIR/%file%} ru_RU.zip ru_RU_ye.zip ru_RU_yo.zip
# The files don't depend on the .zip file so that we can delete it.
# Only download the zip file if the targets don't exist.
# This is a bit tricky, since the file name includes the date.
ru_RU.aff ru_RU.dic: {buildcheck=}
:assertpkg unzip
:fetch ru_RU.zip
:sys unzip ru_RU.zip
:delete ru_RU.zip
@if not os.path.exists('ru_RU.orig.aff'):
:copy ru_RU.aff ru_RU.orig.aff
@if not os.path.exists('ru_RU.orig.dic'):
:copy ru_RU.dic ru_RU.orig.dic
@if os.path.exists('ru_RU.diff'):
:sys patch <ru_RU.diff
ru_IE.aff ru_IE.dic: {buildcheck=}
:assertpkg unzip
:fetch ru_RU_ye.zip
:sys unzip ru_RU_ye.zip
:delete ru_RU_ye.zip
:move ru_RU_ie.aff ru_IE.aff
:move ru_RU_ie.dic ru_IE.dic
:move README_ru_RU_ie.txt README_ru_IE.txt
@if not os.path.exists('ru_IE.orig.aff'):
:copy ru_IE.aff ru_IE.orig.aff
@if not os.path.exists('ru_IE.orig.dic'):
:copy ru_IE.dic ru_IE.orig.dic
@if os.path.exists('ru_IE.diff'):
:sys patch <ru_IE.diff
ru_YO.aff ru_YO.dic: {buildcheck=}
:assertpkg unzip
:fetch ru_RU_yo.zip
:sys unzip ru_RU_yo.zip
:delete ru_RU_yo.zip
:move ru_RU_yo.aff ru_YO.aff
:move ru_RU_yo.dic ru_YO.dic
:move README_ru_RU_yo.txt README_ru_YO.txt
@if not os.path.exists('ru_YO.orig.aff'):
:copy ru_YO.aff ru_YO.orig.aff
@if not os.path.exists('ru_YO.orig.dic'):
:copy ru_YO.dic ru_YO.orig.dic
@if os.path.exists('ru_YO.diff'):
:sys patch <ru_YO.diff
# Generate diff files, so that others can get the OpenOffice files and apply
# the diffs to get the Vim versions.
diff:
:assertpkg diff
:sys {force} diff -a -C 1 ru_RU.orig.aff ru_RU.aff >ru_RU.diff
:sys {force} diff -a -C 1 ru_RU.orig.dic ru_RU.dic >>ru_RU.diff
:sys {force} diff -a -C 1 ru_IE.orig.aff ru_IE.aff >ru_IE.diff
:sys {force} diff -a -C 1 ru_IE.orig.dic ru_IE.dic >>ru_IE.diff
:sys {force} diff -a -C 1 ru_YO.orig.aff ru_YO.aff >ru_YO.diff
:sys {force} diff -a -C 1 ru_YO.orig.dic ru_YO.dic >>ru_YO.diff
# Check for updated spell files. When there are changes the
# ".new.aff" and ".new.dic" files are left behind for manual inspection.
check:
:print Doesn't work yet.

View File

@ -0,0 +1,32 @@
*** ru_RU.orig.dic Sat Aug 27 22:54:55 2005
--- ru_RU.dic Sun Aug 28 11:46:34 2005
***************
*** 8767,8769 ****
ÂĚĹËĚĎÓÔŘ/F
- ÂĚĹËĚŮĘ/A
ÂĚĹËĚŮĘ/AZ
--- 8767,8768 ----
***************
*** 98086,98088 ****
ŇÁÚŇŃÖĹÎÎŮĘ/AES
- ŇÁÚŇŃÖĹÎÎŮĘ/AS
ŇÁÚŐÂĹÄÉ×ŰÉĘ/A
--- 98085,98086 ----
***************
*** 115007,115009 ****
ÔĎĚËÉ/B
- ÔĎĚËÉ/O
ÔĎĚËĚÁ/L
--- 115005,115006 ----
***************
*** 119209,119211 ****
ŐÎÉÖĹÎÎŮĘ/ASX
- ŐÎÉÖĹÎÎŮĘ/AX
ŐÎÉÚÁ×ŰÉĘ/A
--- 119206,119207 ----
***************
*** 120603,120605 ****
ŐÔĎÎŢĹÎÎŮĘ/ASX
- ŐÔĎÎŢĹÎÎŮĘ/AX
ŐÔĎĐ/L
--- 120599,120600 ----

View File

@ -0,0 +1,14 @@
*** ru_YO.orig.dic Sat Aug 27 22:54:55 2005
--- ru_YO.dic Sun Aug 28 11:46:58 2005
***************
*** 86471,86473 ****
почтённый/AS
- почти
почти/B
--- 86471,86472 ----
***************
*** 115246,115248 ****
толки/B
- толки/O
толкла/L
--- 115245,115246 ----

View File

@ -10043,6 +10043,9 @@ f_has(argvars, rettv)
#ifdef FEAT_CSCOPE #ifdef FEAT_CSCOPE
"cscope", "cscope",
#endif #endif
#ifdef CURSOR_SHAPE
"cursorshape",
#endif
#ifdef DEBUG #ifdef DEBUG
"debug", "debug",
#endif #endif

View File

@ -1081,7 +1081,8 @@
/* GUI and some consoles can change the shape of the cursor. The code is also /* GUI and some consoles can change the shape of the cursor. The code is also
* needed for the 'mouseshape' option. */ * needed for the 'mouseshape' option. */
#if defined(FEAT_GUI) || defined(MCH_CURSOR_SHAPE) || defined(FEAT_MOUSESHAPE) #if defined(FEAT_GUI) || defined(MCH_CURSOR_SHAPE) || defined(FEAT_MOUSESHAPE) \
|| (defined(UNIX) && defined(FEAT_NORMAL))
# define CURSOR_SHAPE # define CURSOR_SHAPE
#endif #endif

View File

@ -6865,6 +6865,10 @@ show_autocmd(ap, event)
if (got_int) if (got_int)
return; return;
msg_outtrans(ac->cmd); msg_outtrans(ac->cmd);
#ifdef FEAT_EVAL
if (p_verbose > 0)
last_set_msg(ac->scriptID);
#endif
if (got_int) if (got_int)
return; return;
if (ac->next != NULL) if (ac->next != NULL)

View File

@ -460,10 +460,12 @@ serverSendToVim(dpy, name, cmd, result, server, asExpr, localLoop, silent)
/* /*
* Send the command to target interpreter by appending it to the * Send the command to target interpreter by appending it to the
* comm window in the communication window. * comm window in the communication window.
* Length must be computed exactly!
*/ */
length = STRLEN(name) + STRLEN(cmd) + 14;
#ifdef FEAT_MBYTE #ifdef FEAT_MBYTE
length += STRLEN(p_enc); length = STRLEN(name) + STRLEN(p_enc) + STRLEN(cmd) + 14;
#else
length = STRLEN(name) + STRLEN(cmd) + 10;
#endif #endif
property = (char_u *)alloc((unsigned)length + 30); property = (char_u *)alloc((unsigned)length + 30);
@ -480,6 +482,7 @@ serverSendToVim(dpy, name, cmd, result, server, asExpr, localLoop, silent)
serial++; serial++;
sprintf((char *)property + length, "%c-r %x %d", sprintf((char *)property + length, "%c-r %x %d",
0, (int_u)commWindow, serial); 0, (int_u)commWindow, serial);
/* Add length of what "-r %x %d" resulted in, skipping the NUL. */
length += STRLEN(property + length + 1) + 1; length += STRLEN(property + length + 1) + 1;
res = AppendPropCarefully(dpy, w, commProperty, property, length + 1); res = AppendPropCarefully(dpy, w, commProperty, property, length + 1);
@ -787,9 +790,10 @@ serverSendReply(name, str)
if (!WindowValid(dpy, win)) if (!WindowValid(dpy, win))
return -1; return -1;
length = STRLEN(str) + 11;
#ifdef FEAT_MBYTE #ifdef FEAT_MBYTE
length += STRLEN(p_enc); length = STRLEN(p_enc) + STRLEN(str) + 14;
#else
length = STRLEN(str) + 10;
#endif #endif
if ((property = (char_u *)alloc((unsigned)length + 30)) != NULL) if ((property = (char_u *)alloc((unsigned)length + 30)) != NULL)
{ {
@ -800,6 +804,7 @@ serverSendReply(name, str)
sprintf((char *)property, "%cn%c-n %s%c-w %x", sprintf((char *)property, "%cn%c-n %s%c-w %x",
0, 0, str, 0, (unsigned int)commWindow); 0, 0, str, 0, (unsigned int)commWindow);
#endif #endif
/* Add length of what "%x" resulted in. */
length += STRLEN(property + length); length += STRLEN(property + length);
res = AppendPropCarefully(dpy, win, commProperty, property, length + 1); res = AppendPropCarefully(dpy, win, commProperty, property, length + 1);
vim_free(property); vim_free(property);
@ -1268,11 +1273,12 @@ serverEventProc(dpy, eventPtr)
ga_grow(&reply, 50 + STRLEN(p_enc)); ga_grow(&reply, 50 + STRLEN(p_enc));
sprintf(reply.ga_data, "%cr%c-E %s%c-s %s%c-r ", sprintf(reply.ga_data, "%cr%c-E %s%c-s %s%c-r ",
0, 0, p_enc, 0, serial, 0); 0, 0, p_enc, 0, serial, 0);
reply.ga_len = 14 + STRLEN(serial);
#else #else
ga_grow(&reply, 50); ga_grow(&reply, 50);
sprintf(reply.ga_data, "%cr%c-s %s%c-r ", 0, 0, serial, 0); sprintf(reply.ga_data, "%cr%c-s %s%c-r ", 0, 0, serial, 0);
#endif
reply.ga_len = 10 + STRLEN(serial); reply.ga_len = 10 + STRLEN(serial);
#endif
} }
res = NULL; res = NULL;
if (serverName != NULL && STRICMP(name, serverName) == 0) if (serverName != NULL && STRICMP(name, serverName) == 0)

View File

@ -2706,17 +2706,37 @@ mb_prevptr(line, p)
mb_charlen(str) mb_charlen(str)
char_u *str; char_u *str;
{ {
int count; char_u *p = str;
int count;
if (str == NULL) if (p == NULL)
return 0; return 0;
for (count = 0; *str != NUL; count++) for (count = 0; *p != NUL; count++)
str += (*mb_ptr2len)(str); p += (*mb_ptr2len)(p);
return count; return count;
} }
#if defined(FEAT_SYN_HL) || defined(PROTO)
/*
* Like mb_charlen() but for a string with specified length.
*/
int
mb_charlen_len(str, len)
char_u *str;
int len;
{
char_u *p = str;
int count;
for (count = 0; *p != NUL && p < str + len; count++)
p += (*mb_ptr2len)(p);
return count;
}
#endif
/* /*
* Try to un-escape a multi-byte character. * Try to un-escape a multi-byte character.
* Used for the "to" and "from" part of a mapping. * Used for the "to" and "from" part of a mapping.

View File

@ -1664,7 +1664,7 @@ vim_strbyte(string, c)
/* /*
* Search for last occurrence of "c" in "string". * Search for last occurrence of "c" in "string".
* return NULL if not found. * Return NULL if not found.
* Does not handle multi-byte char for "c"! * Does not handle multi-byte char for "c"!
*/ */
char_u * char_u *
@ -3289,6 +3289,8 @@ parse_shape_opt(what)
return NULL; return NULL;
} }
# if defined(MCH_CURSOR_SHAPE) || defined(FEAT_GUI) \
|| defined(FEAT_MOUSESHAPE) || defined(PROTO)
/* /*
* Return the index into shape_table[] for the current mode. * Return the index into shape_table[] for the current mode.
* When "mouse" is TRUE, consider indexes valid for the mouse pointer. * When "mouse" is TRUE, consider indexes valid for the mouse pointer.
@ -3346,6 +3348,7 @@ get_shape_idx(mouse)
#endif #endif
return SHAPE_IDX_N; return SHAPE_IDX_N;
} }
#endif
# if defined(FEAT_MOUSESHAPE) || defined(PROTO) # if defined(FEAT_MOUSESHAPE) || defined(PROTO)
static int old_mouse_shape = 0; static int old_mouse_shape = 0;

View File

@ -3257,6 +3257,8 @@ set_init_2()
#if !((defined(MSDOS) || defined(OS2) || defined(WIN3264)) && !defined(FEAT_GUI)) #if !((defined(MSDOS) || defined(OS2) || defined(WIN3264)) && !defined(FEAT_GUI))
{ {
char_u *p;
/* /*
* If 'background' wasn't set by the user, try guessing the value, * If 'background' wasn't set by the user, try guessing the value,
* depending on the terminal name. Only need to check for terminals * depending on the terminal name. Only need to check for terminals
@ -3264,16 +3266,24 @@ set_init_2()
* "linux" Linux console * "linux" Linux console
* "screen.linux" Linux console with screen * "screen.linux" Linux console with screen
* "cygwin" Cygwin shell * "cygwin" Cygwin shell
* We also check the COLORFGBG environment variable, which is set by
* rxvt and derivatives. This variable contains either two or three
* values separated by semicolons; we want the last value in either
* case. If this value is 0-6 or 8, our background is dark.
*/ */
idx = findoption((char_u *)"bg"); idx = findoption((char_u *)"bg");
if (!(options[idx].flags & P_WAS_SET) if (!(options[idx].flags & P_WAS_SET)
&& (STRCMP(T_NAME, "linux") == 0 && (STRCMP(T_NAME, "linux") == 0
|| STRCMP(T_NAME, "screen.linux") == 0 || STRCMP(T_NAME, "screen.linux") == 0
|| STRCMP(T_NAME, "cygwin") == 0)) || STRCMP(T_NAME, "cygwin") == 0
|| ((p = mch_getenv("COLORFGBG")) != NULL
&& (p = vim_strrchr(p, ';')) != NULL
&& ((p[1] >= '0' && p[1] <= '6') || p[1] == '8')
&& p[2] == NUL)))
{ {
set_string_option_direct(NULL, idx, (char_u *)"dark", OPT_FREE); set_string_option_direct(NULL, idx, (char_u *)"dark", OPT_FREE);
/* don't mark it as set, when starting the GUI it may be changed /* don't mark it as set, when starting the GUI it may be
* again */ * changed again */
options[idx].flags &= ~P_WAS_SET; options[idx].flags &= ~P_WAS_SET;
} }
} }
@ -9777,15 +9787,15 @@ compatible_set()
static void static void
fill_breakat_flags() fill_breakat_flags()
{ {
char_u *c; char_u *p;
int i; int i;
for (i = 0; i < 256; i++) for (i = 0; i < 256; i++)
breakat_flags[i] = FALSE; breakat_flags[i] = FALSE;
if (p_breakat != NULL) if (p_breakat != NULL)
for (c = p_breakat; *c; c++) for (p = p_breakat; *p; p++)
breakat_flags[*c] = TRUE; breakat_flags[*p] = TRUE;
} }
# if defined(__BORLANDC__) && (__BORLANDC__ < 0x500) # if defined(__BORLANDC__) && (__BORLANDC__ < 0x500)

View File

@ -55,6 +55,7 @@ void mb_adjust_cursor __ARGS((void));
void mb_adjustpos __ARGS((pos_T *lp)); void mb_adjustpos __ARGS((pos_T *lp));
char_u *mb_prevptr __ARGS((char_u *line, char_u *p)); char_u *mb_prevptr __ARGS((char_u *line, char_u *p));
int mb_charlen __ARGS((char_u *str)); int mb_charlen __ARGS((char_u *str));
int mb_charlen_len __ARGS((char_u *str, int len));
char_u *mb_unescape __ARGS((char_u **pp)); char_u *mb_unescape __ARGS((char_u **pp));
int mb_lefthalve __ARGS((int row, int col)); int mb_lefthalve __ARGS((int row, int col));
int mb_fix_col __ARGS((int col, int row)); int mb_fix_col __ARGS((int col, int row));

View File

@ -214,9 +214,9 @@
* WF_REGION <region> follows * WF_REGION <region> follows
* WF_AFX <affixID> follows * WF_AFX <affixID> follows
* *
* <flags2> 1 byte Only used when there are postponed prefixes. * <flags2> 1 byte Bitmask of:
* Bitmask of:
* WF_HAS_AFF >> 8 word includes affix * WF_HAS_AFF >> 8 word includes affix
* WF_NEEDCOMP >> 8 word only valid in compound
* *
* <pflags> 1 byte bitmask of: * <pflags> 1 byte bitmask of:
* WFP_RARE rare prefix * WFP_RARE rare prefix
@ -273,6 +273,7 @@ typedef long idx_T;
/* for <flags2>, shifted up one byte to be used in wn_flags */ /* for <flags2>, shifted up one byte to be used in wn_flags */
#define WF_HAS_AFF 0x0100 /* word includes affix */ #define WF_HAS_AFF 0x0100 /* word includes affix */
#define WF_NEEDCOMP 0x0200 /* word only valid in compound */
#define WF_CAPMASK (WF_ONECAP | WF_ALLCAP | WF_KEEPCAP | WF_FIXCAP) #define WF_CAPMASK (WF_ONECAP | WF_ALLCAP | WF_KEEPCAP | WF_FIXCAP)
@ -754,7 +755,7 @@ static void spell_soundfold_wsal __ARGS((slang_T *slang, char_u *inword, char_u
static int soundalike_score __ARGS((char_u *goodsound, char_u *badsound)); static int soundalike_score __ARGS((char_u *goodsound, char_u *badsound));
static int spell_edit_score __ARGS((char_u *badword, char_u *goodword)); static int spell_edit_score __ARGS((char_u *badword, char_u *goodword));
static void dump_word __ARGS((char_u *word, int round, int flags, linenr_T lnum)); static void dump_word __ARGS((char_u *word, int round, int flags, linenr_T lnum));
static linenr_T apply_prefixes __ARGS((slang_T *slang, char_u *word, int round, int flags, linenr_T startlnum)); static linenr_T dump_prefixes __ARGS((slang_T *slang, char_u *word, int round, int flags, linenr_T startlnum));
/* /*
* Use our own character-case definitions, because the current locale may * Use our own character-case definitions, because the current locale may
@ -834,6 +835,7 @@ spell_check(wp, ptr, attrp, capcol)
int nrlen = 0; /* found a number first */ int nrlen = 0; /* found a number first */
int c; int c;
int wrongcaplen = 0; int wrongcaplen = 0;
int lpi;
/* A word never starts at a space or a control character. Return quickly /* A word never starts at a space or a control character. Return quickly
* then, skipping over the character. */ * then, skipping over the character. */
@ -907,9 +909,15 @@ spell_check(wp, ptr, attrp, capcol)
* We check them all, because a matching word may be longer than an * We check them all, because a matching word may be longer than an
* already found matching word. * already found matching word.
*/ */
for (mi.mi_lp = LANGP_ENTRY(wp->w_buffer->b_langp, 0); for (lpi = 0; lpi < wp->w_buffer->b_langp.ga_len; ++lpi)
mi.mi_lp->lp_slang != NULL; ++mi.mi_lp)
{ {
mi.mi_lp = LANGP_ENTRY(wp->w_buffer->b_langp, lpi);
/* If reloading fails the language is still in the list but everything
* has been cleared. */
if (mi.mi_lp->lp_slang->sl_fidxs == NULL)
continue;
/* Check for a matching word in case-folded words. */ /* Check for a matching word in case-folded words. */
find_word(&mi, FIND_FOLDWORD); find_word(&mi, FIND_FOLDWORD);
@ -973,23 +981,26 @@ spell_check(wp, ptr, attrp, capcol)
/* First language in 'spelllang' is NOBREAK. Find first position /* First language in 'spelllang' is NOBREAK. Find first position
* at which any word would be valid. */ * at which any word would be valid. */
mi.mi_lp = LANGP_ENTRY(wp->w_buffer->b_langp, 0); mi.mi_lp = LANGP_ENTRY(wp->w_buffer->b_langp, 0);
p = mi.mi_word; if (mi.mi_lp->lp_slang->sl_fidxs != NULL)
fp = mi.mi_fword;
for (;;)
{ {
mb_ptr_adv(p); p = mi.mi_word;
mb_ptr_adv(fp); fp = mi.mi_fword;
if (p >= mi.mi_end) for (;;)
break;
mi.mi_compoff = fp - mi.mi_fword;
find_word(&mi, FIND_COMPOUND);
if (mi.mi_result != SP_BAD)
{ {
mi.mi_end = p; mb_ptr_adv(p);
break; mb_ptr_adv(fp);
if (p >= mi.mi_end)
break;
mi.mi_compoff = fp - mi.mi_fword;
find_word(&mi, FIND_COMPOUND);
if (mi.mi_result != SP_BAD)
{
mi.mi_end = p;
break;
}
} }
mi.mi_result = save_result;
} }
mi.mi_result = save_result;
} }
if (mi.mi_result == SP_BAD || mi.mi_result == SP_BANNED) if (mi.mi_result == SP_BAD || mi.mi_result == SP_BANNED)
@ -1284,6 +1295,15 @@ find_word(mip, mode)
if (((unsigned)flags >> 24) == 0 if (((unsigned)flags >> 24) == 0
|| wlen - mip->mi_compoff < slang->sl_compminlen) || wlen - mip->mi_compoff < slang->sl_compminlen)
continue; continue;
#ifdef FEAT_MBYTE
/* For multi-byte chars check character length against
* COMPOUNDMIN. */
if (has_mbyte
&& slang->sl_compminlen < MAXWLEN
&& mb_charlen_len(mip->mi_word + mip->mi_compoff,
wlen - mip->mi_compoff) < slang->sl_compminlen)
continue;
#endif
/* Limit the number of compound words to COMPOUNDMAX if no /* Limit the number of compound words to COMPOUNDMAX if no
* maximum for syllables is specified. */ * maximum for syllables is specified. */
@ -1358,6 +1378,10 @@ find_word(mip, mode)
} }
} }
/* Check NEEDCOMPOUND: can't use word without compounding. */
else if (flags & WF_NEEDCOMP)
continue;
nobreak_result = SP_OK; nobreak_result = SP_OK;
if (!word_ends) if (!word_ends)
@ -1762,7 +1786,8 @@ no_spell_checking(wp)
/* /*
* Move to next spell error. * Move to next spell error.
* "curline" is TRUE for "z?": find word under/after cursor in the same line. * "curline" is FALSE for "[s", "]s", "[S" and "]S".
* "curline" is TRUE to find word under/after cursor in the same line.
* For Insert mode completion "dir" is BACKWARD and "curline" is TRUE: move * For Insert mode completion "dir" is BACKWARD and "curline" is TRUE: move
* to after badly spelled word before the cursor. * to after badly spelled word before the cursor.
* Return 0 if not found, length of the badly spelled word otherwise. * Return 0 if not found, length of the badly spelled word otherwise.
@ -1771,7 +1796,7 @@ no_spell_checking(wp)
spell_move_to(wp, dir, allwords, curline, attrp) spell_move_to(wp, dir, allwords, curline, attrp)
win_T *wp; win_T *wp;
int dir; /* FORWARD or BACKWARD */ int dir; /* FORWARD or BACKWARD */
int allwords; /* TRUE for "[s" and "]s" */ int allwords; /* TRUE for "[s"/"]s", FALSE for "[S"/"]S" */
int curline; int curline;
int *attrp; /* return: attributes of bad word or NULL */ int *attrp; /* return: attributes of bad word or NULL */
{ {
@ -1790,6 +1815,8 @@ spell_move_to(wp, dir, allwords, curline, attrp)
int buflen = 0; int buflen = 0;
int skip = 0; int skip = 0;
int capcol = -1; int capcol = -1;
int found_one = FALSE;
int wrapped = FALSE;
if (no_spell_checking(wp)) if (no_spell_checking(wp))
return 0; return 0;
@ -1840,9 +1867,11 @@ spell_move_to(wp, dir, allwords, curline, attrp)
endp = buf + len; endp = buf + len;
while (p < endp) while (p < endp)
{ {
/* When searching backward don't search after the cursor. */ /* When searching backward don't search after the cursor. Unless
* we wrapped around the end of the buffer. */
if (dir == BACKWARD if (dir == BACKWARD
&& lnum == wp->w_cursor.lnum && lnum == wp->w_cursor.lnum
&& !wrapped
&& (colnr_T)(p - buf) >= wp->w_cursor.col) && (colnr_T)(p - buf) >= wp->w_cursor.col)
break; break;
@ -1855,14 +1884,17 @@ spell_move_to(wp, dir, allwords, curline, attrp)
/* We found a bad word. Check the attribute. */ /* We found a bad word. Check the attribute. */
if (allwords || attr == highlight_attr[HLF_SPB]) if (allwords || attr == highlight_attr[HLF_SPB])
{ {
found_one = TRUE;
/* When searching forward only accept a bad word after /* When searching forward only accept a bad word after
* the cursor. */ * the cursor. */
if (dir == BACKWARD if (dir == BACKWARD
|| lnum > wp->w_cursor.lnum || lnum != wp->w_cursor.lnum
|| (lnum == wp->w_cursor.lnum || (lnum == wp->w_cursor.lnum
&& (colnr_T)(curline ? p - buf + len && (wrapped
|| (colnr_T)(curline ? p - buf + len
: p - buf) : p - buf)
> wp->w_cursor.col)) > wp->w_cursor.col)))
{ {
if (has_syntax) if (has_syntax)
{ {
@ -1906,7 +1938,7 @@ spell_move_to(wp, dir, allwords, curline, attrp)
if (dir == BACKWARD && found_pos.lnum != 0) if (dir == BACKWARD && found_pos.lnum != 0)
{ {
/* Use the last match in the line. */ /* Use the last match in the line (before the cursor). */
wp->w_cursor = found_pos; wp->w_cursor = found_pos;
vim_free(buf); vim_free(buf);
return found_len; return found_len;
@ -1918,16 +1950,42 @@ spell_move_to(wp, dir, allwords, curline, attrp)
/* Advance to next line. */ /* Advance to next line. */
if (dir == BACKWARD) if (dir == BACKWARD)
{ {
if (lnum == 1) /* If we are back at the starting line and searched it again there
* is no match, give up. */
if (lnum == wp->w_cursor.lnum && wrapped)
break; break;
--lnum;
if (lnum > 1)
--lnum;
else if (!p_ws)
break; /* at first line and 'nowrapscan' */
else
{
/* Wrap around to the end of the buffer. May search the
* starting line again and accept the last match. */
lnum = wp->w_buffer->b_ml.ml_line_count;
wrapped = TRUE;
}
capcol = -1; capcol = -1;
} }
else else
{ {
if (lnum == wp->w_buffer->b_ml.ml_line_count) if (lnum < wp->w_buffer->b_ml.ml_line_count)
++lnum;
else if (!p_ws)
break; /* at first line and 'nowrapscan' */
else
{
/* Wrap around to the start of the buffer. May search the
* starting line again and accept the first match. */
lnum = 1;
wrapped = TRUE;
}
/* If we are back at the starting line and there is no match then
* give up. */
if (lnum == wp->w_cursor.lnum && !found_one)
break; break;
++lnum;
/* Skip the characters at the start of the next line that were /* Skip the characters at the start of the next line that were
* included in a match crossing line boundaries. */ * included in a match crossing line boundaries. */
@ -2450,10 +2508,8 @@ endFAIL:
/* truncating the name signals the error to spell_load_lang() */ /* truncating the name signals the error to spell_load_lang() */
*lang = NUL; *lang = NUL;
if (lp != NULL && old_lp == NULL) if (lp != NULL && old_lp == NULL)
{
slang_free(lp); slang_free(lp);
lp = NULL; lp = NULL;
}
endOK: endOK:
if (fd != NULL) if (fd != NULL)
@ -2885,7 +2941,7 @@ read_compound(fd, slang, len)
--todo; --todo;
c = getc(fd); /* <compminlen> */ c = getc(fd); /* <compminlen> */
if (c < 1) if (c < 1)
c = 3; c = MAXWLEN;
slang->sl_compminlen = c; slang->sl_compminlen = c;
--todo; --todo;
@ -2972,7 +3028,7 @@ read_compound(fd, slang, len)
} }
else /* normal char, "[abc]" and '*' are copied as-is */ else /* normal char, "[abc]" and '*' are copied as-is */
{ {
if (c == '+') if (c == '+' || c == '~')
*pp++ = '\\'; /* "a+" becomes "a\+" */ *pp++ = '\\'; /* "a+" becomes "a\+" */
#ifdef FEAT_MBYTE #ifdef FEAT_MBYTE
if (enc_utf8) if (enc_utf8)
@ -3594,10 +3650,11 @@ did_set_spelllang(buf)
/* If it was already found above then skip it. */ /* If it was already found above then skip it. */
for (c = 0; c < ga.ga_len; ++c) for (c = 0; c < ga.ga_len; ++c)
if (fullpathcmp(spf_name, {
LANGP_ENTRY(ga, c)->lp_slang->sl_fname, p = LANGP_ENTRY(ga, c)->lp_slang->sl_fname;
FALSE) == FPC_SAME) if (p != NULL && fullpathcmp(spf_name, p, FALSE) == FPC_SAME)
break; break;
}
if (c < ga.ga_len) if (c < ga.ga_len)
continue; continue;
} }
@ -3646,15 +3703,6 @@ did_set_spelllang(buf)
} }
} }
/* Add a NULL entry to mark the end of the list. */
if (ga_grow(&ga, 1) == FAIL)
{
ga_clear(&ga);
return e_outofmem;
}
LANGP_ENTRY(ga, ga.ga_len)->lp_slang = NULL;
++ga.ga_len;
/* Everything is fine, store the new b_langp value. */ /* Everything is fine, store the new b_langp value. */
ga_clear(&buf->b_langp); ga_clear(&buf->b_langp);
buf->b_langp = ga; buf->b_langp = ga;
@ -3934,13 +3982,17 @@ spell_reload_one(fname, added_word)
int didit = FALSE; int didit = FALSE;
for (lp = first_lang; lp != NULL; lp = lp->sl_next) for (lp = first_lang; lp != NULL; lp = lp->sl_next)
{
if (fullpathcmp(fname, lp->sl_fname, FALSE) == FPC_SAME) if (fullpathcmp(fname, lp->sl_fname, FALSE) == FPC_SAME)
{ {
slang_clear(lp); slang_clear(lp);
(void)spell_load_file(fname, NULL, lp, FALSE); if (spell_load_file(fname, NULL, lp, FALSE) == NULL)
/* reloading failed, clear the language */
slang_clear(lp);
redraw_all_later(NOT_VALID); redraw_all_later(NOT_VALID);
didit = TRUE; didit = TRUE;
} }
}
/* When "zg" was used and the file wasn't loaded yet, should redo /* When "zg" was used and the file wasn't loaded yet, should redo
* 'spelllang' to get it loaded. */ * 'spelllang' to get it loaded. */
@ -3967,6 +4019,7 @@ typedef struct afffile_S
unsigned af_kep; /* KEP ID for keep-case word */ unsigned af_kep; /* KEP ID for keep-case word */
unsigned af_bad; /* BAD ID for banned word */ unsigned af_bad; /* BAD ID for banned word */
unsigned af_needaffix; /* NEEDAFFIX ID */ unsigned af_needaffix; /* NEEDAFFIX ID */
unsigned af_needcomp; /* NEEDCOMPOUND ID */
int af_pfxpostpone; /* postpone prefixes without chop string */ int af_pfxpostpone; /* postpone prefixes without chop string */
hashtab_T af_pref; /* hashtable for prefixes, affheader_T */ hashtab_T af_pref; /* hashtable for prefixes, affheader_T */
hashtab_T af_suff; /* hashtable for suffixes, affheader_T */ hashtab_T af_suff; /* hashtable for suffixes, affheader_T */
@ -4129,13 +4182,14 @@ typedef struct spellinfo_S
garray_T si_prefcond; /* table with conditions for postponed garray_T si_prefcond; /* table with conditions for postponed
* prefixes, each stored as a string */ * prefixes, each stored as a string */
int si_newprefID; /* current value for ah_newID */ int si_newprefID; /* current value for ah_newID */
int si_compID; /* current value for compound ID */ int si_newcompID; /* current value for compound ID */
} spellinfo_T; } spellinfo_T;
static afffile_T *spell_read_aff __ARGS((spellinfo_T *spin, char_u *fname)); static afffile_T *spell_read_aff __ARGS((spellinfo_T *spin, char_u *fname));
static unsigned affitem2flag __ARGS((int flagtype, char_u *item, char_u *fname, int lnum)); static unsigned affitem2flag __ARGS((int flagtype, char_u *item, char_u *fname, int lnum));
static unsigned get_affitem __ARGS((int flagtype, char_u **pp)); static unsigned get_affitem __ARGS((int flagtype, char_u **pp));
static void process_compflags __ARGS((spellinfo_T *spin, afffile_T *aff, char_u *compflags)); static void process_compflags __ARGS((spellinfo_T *spin, afffile_T *aff, char_u *compflags));
static void check_renumber __ARGS((spellinfo_T *spin));
static int flag_in_afflist __ARGS((int flagtype, char_u *afflist, unsigned flag)); static int flag_in_afflist __ARGS((int flagtype, char_u *afflist, unsigned flag));
static void aff_check_number __ARGS((int spinval, int affval, char *name)); static void aff_check_number __ARGS((int spinval, int affval, char *name));
static void aff_check_string __ARGS((char_u *spinval, char_u *affval, char *name)); static void aff_check_string __ARGS((char_u *spinval, char_u *affval, char *name));
@ -4161,7 +4215,7 @@ static void free_wordnode __ARGS((spellinfo_T *spin, wordnode_T *n));
static void wordtree_compress __ARGS((spellinfo_T *spin, wordnode_T *root)); static void wordtree_compress __ARGS((spellinfo_T *spin, wordnode_T *root));
static int node_compress __ARGS((spellinfo_T *spin, wordnode_T *node, hashtab_T *ht, int *tot)); static int node_compress __ARGS((spellinfo_T *spin, wordnode_T *node, hashtab_T *ht, int *tot));
static int node_equal __ARGS((wordnode_T *n1, wordnode_T *n2)); static int node_equal __ARGS((wordnode_T *n1, wordnode_T *n2));
static void write_vim_spell __ARGS((spellinfo_T *spin, char_u *fname)); static int write_vim_spell __ARGS((spellinfo_T *spin, char_u *fname));
static void clear_node __ARGS((wordnode_T *node)); static void clear_node __ARGS((wordnode_T *node));
static int put_node __ARGS((FILE *fd, wordnode_T *node, int index, int regionmask, int prefixtree)); static int put_node __ARGS((FILE *fd, wordnode_T *node, int index, int regionmask, int prefixtree));
static void mkspell __ARGS((int fcount, char_u **fnames, int ascii, int overwrite, int added_word)); static void mkspell __ARGS((int fcount, char_u **fnames, int ascii, int overwrite, int added_word));
@ -4445,7 +4499,9 @@ spell_read_aff(spin, fname)
smsg((char_u *)_("Invalid value for FLAG in %s line %d: %s"), smsg((char_u *)_("Invalid value for FLAG in %s line %d: %s"),
fname, lnum, items[1]); fname, lnum, items[1]);
if (aff->af_rar != 0 || aff->af_kep != 0 || aff->af_bad != 0 if (aff->af_rar != 0 || aff->af_kep != 0 || aff->af_bad != 0
|| aff->af_needaffix != 0 || compflags != NULL || aff->af_needaffix != 0
|| aff->af_needcomp != 0
|| compflags != NULL
|| aff->af_suff.ht_used > 0 || aff->af_suff.ht_used > 0
|| aff->af_pref.ht_used > 0) || aff->af_pref.ht_used > 0)
smsg((char_u *)_("FLAG after using flags in %s line %d: %s"), smsg((char_u *)_("FLAG after using flags in %s line %d: %s"),
@ -4496,6 +4552,12 @@ spell_read_aff(spin, fname)
aff->af_needaffix = affitem2flag(aff->af_flagtype, items[1], aff->af_needaffix = affitem2flag(aff->af_flagtype, items[1],
fname, lnum); fname, lnum);
} }
else if (STRCMP(items[0], "NEEDCOMPOUND") == 0 && itemcnt == 2
&& aff->af_needcomp == 0)
{
aff->af_needcomp = affitem2flag(aff->af_flagtype, items[1],
fname, lnum);
}
else if (STRCMP(items[0], "COMPOUNDFLAG") == 0 && itemcnt == 2 else if (STRCMP(items[0], "COMPOUNDFLAG") == 0 && itemcnt == 2
&& compflags == NULL) && compflags == NULL)
{ {
@ -4608,8 +4670,9 @@ spell_read_aff(spin, fname)
if (cur_aff->ah_flag == aff->af_bad if (cur_aff->ah_flag == aff->af_bad
|| cur_aff->ah_flag == aff->af_rar || cur_aff->ah_flag == aff->af_rar
|| cur_aff->ah_flag == aff->af_kep || cur_aff->ah_flag == aff->af_kep
|| cur_aff->ah_flag == aff->af_needaffix) || cur_aff->ah_flag == aff->af_needaffix
smsg((char_u *)_("Affix also used for BAD/RAR/KEP/NEEDAFFIX in %s line %d: %s"), || cur_aff->ah_flag == aff->af_needcomp)
smsg((char_u *)_("Affix also used for BAD/RAR/KEP/NEEDAFFIX/NEEDCOMPOUND in %s line %d: %s"),
fname, lnum, items[1]); fname, lnum, items[1]);
STRCPY(cur_aff->ah_key, items[1]); STRCPY(cur_aff->ah_key, items[1]);
hash_add(tp, cur_aff->ah_key); hash_add(tp, cur_aff->ah_key);
@ -4643,6 +4706,7 @@ spell_read_aff(spin, fname)
{ {
/* Use a new number in the .spl file later, to be able /* Use a new number in the .spl file later, to be able
* to handle multiple .aff files. */ * to handle multiple .aff files. */
check_renumber(spin);
cur_aff->ah_newID = ++spin->si_newprefID; cur_aff->ah_newID = ++spin->si_newprefID;
/* We only really use ah_newID if the prefix is /* We only really use ah_newID if the prefix is
@ -5011,11 +5075,11 @@ spell_read_aff(spin, fname)
process_compflags(spin, aff, compflags); process_compflags(spin, aff, compflags);
/* Check that we didn't use too many renumbered flags. */ /* Check that we didn't use too many renumbered flags. */
if (spin->si_compID < spin->si_newprefID) if (spin->si_newcompID < spin->si_newprefID)
{ {
if (spin->si_compID == 255) if (spin->si_newcompID == 127 || spin->si_newcompID == 255)
MSG(_("Too many postponed prefixes")); MSG(_("Too many postponed prefixes"));
else if (spin->si_newprefID == 0) else if (spin->si_newprefID == 0 || spin->si_newprefID == 127)
MSG(_("Too many compound flags")); MSG(_("Too many compound flags"));
else else
MSG(_("Too many posponed prefixes and/or compound flags")); MSG(_("Too many posponed prefixes and/or compound flags"));
@ -5199,8 +5263,9 @@ process_compflags(spin, aff, compflags)
* regexp (also inside []). */ * regexp (also inside []). */
do do
{ {
id = spin->si_compID--; check_renumber(spin);
} while (vim_strchr((char_u *)"/*+[]\\-^", id) != NULL); id = spin->si_newcompID--;
} while (vim_strchr((char_u *)"/+*[]\\-^", id) != NULL);
ci->ci_newID = id; ci->ci_newID = id;
hash_add(&aff->af_comp, ci->ci_key); hash_add(&aff->af_comp, ci->ci_key);
} }
@ -5214,6 +5279,23 @@ process_compflags(spin, aff, compflags)
*tp = NUL; *tp = NUL;
} }
/*
* Check that the new IDs for postponed affixes and compounding don't overrun
* each other. We have almost 255 available, but start at 0-127 to avoid
* using two bytes for utf-8. When the 0-127 range is used up go to 128-255.
* When that is used up an error message is given.
*/
static void
check_renumber(spin)
spellinfo_T *spin;
{
if (spin->si_newprefID == spin->si_newcompID && spin->si_newcompID < 128)
{
spin->si_newprefID = 127;
spin->si_newcompID = 255;
}
}
/* /*
* Return TRUE if flag "flag" appears in affix list "afflist". * Return TRUE if flag "flag" appears in affix list "afflist".
*/ */
@ -5579,6 +5661,9 @@ spell_read_dic(spin, fname, affile)
if (affile->af_needaffix != 0 && flag_in_afflist( if (affile->af_needaffix != 0 && flag_in_afflist(
affile->af_flagtype, afflist, affile->af_needaffix)) affile->af_flagtype, afflist, affile->af_needaffix))
need_affix = TRUE; need_affix = TRUE;
if (affile->af_needcomp != 0 && flag_in_afflist(
affile->af_flagtype, afflist, affile->af_needcomp))
flags |= WF_NEEDCOMP;
if (affile->af_pfxpostpone) if (affile->af_pfxpostpone)
/* Need to store the list of prefix IDs with the word. */ /* Need to store the list of prefix IDs with the word. */
@ -6703,8 +6788,9 @@ rep_compare(s1, s2)
/* /*
* Write the Vim .spl file "fname". * Write the Vim .spl file "fname".
* Return FAIL or OK;
*/ */
static void static int
write_vim_spell(spin, fname) write_vim_spell(spin, fname)
spellinfo_T *spin; spellinfo_T *spin;
char_u *fname; char_u *fname;
@ -6720,18 +6806,22 @@ write_vim_spell(spin, fname)
fromto_T *ftp; fromto_T *ftp;
char_u *p; char_u *p;
int rr; int rr;
int retval = OK;
fd = mch_fopen((char *)fname, "w"); fd = mch_fopen((char *)fname, "w");
if (fd == NULL) if (fd == NULL)
{ {
EMSG2(_(e_notopen), fname); EMSG2(_(e_notopen), fname);
return; return FAIL;
} }
/* <HEADER>: <fileID> <versionnr> */ /* <HEADER>: <fileID> <versionnr> */
/* <fileID> */ /* <fileID> */
if (fwrite(VIMSPELLMAGIC, VIMSPELLMAGICL, (size_t)1, fd) != 1) if (fwrite(VIMSPELLMAGIC, VIMSPELLMAGICL, (size_t)1, fd) != 1)
{
EMSG(_(e_write)); EMSG(_(e_write));
retval = FAIL;
}
putc(VIMSPELLVERSION, fd); /* <versionnr> */ putc(VIMSPELLVERSION, fd); /* <versionnr> */
/* /*
@ -6995,7 +7085,14 @@ write_vim_spell(spin, fname)
(void)put_node(fd, tree, 0, regionmask, round == 3); (void)put_node(fd, tree, 0, regionmask, round == 3);
} }
fclose(fd); /* Write another byte to check for errors. */
if (putc(0, fd) == EOF)
retval = FAIL;
if (fclose(fd) == EOF)
retval = FAIL;
return retval;
} }
/* /*
@ -7221,7 +7318,7 @@ mkspell(fcount, fnames, ascii, overwrite, added_word)
ga_init2(&spin.si_sal, (int)sizeof(fromto_T), 20); ga_init2(&spin.si_sal, (int)sizeof(fromto_T), 20);
ga_init2(&spin.si_map, (int)sizeof(char_u), 100); ga_init2(&spin.si_map, (int)sizeof(char_u), 100);
ga_init2(&spin.si_prefcond, (int)sizeof(char_u *), 50); ga_init2(&spin.si_prefcond, (int)sizeof(char_u *), 50);
spin.si_compID = 255; /* start compound ID at maximum, going down */ spin.si_newcompID = 127; /* start compound ID at first maximum */
/* default: fnames[0] is output file, following are input files */ /* default: fnames[0] is output file, following are input files */
innames = &fnames[1]; innames = &fnames[1];
@ -7407,7 +7504,7 @@ mkspell(fcount, fnames, ascii, overwrite, added_word)
verbose_leave(); verbose_leave();
} }
write_vim_spell(&spin, wfname); error = write_vim_spell(&spin, wfname) == FAIL;
if (spin.si_verbose || p_verbose > 2) if (spin.si_verbose || p_verbose > 2)
{ {
@ -7422,7 +7519,8 @@ mkspell(fcount, fnames, ascii, overwrite, added_word)
} }
/* If the file is loaded need to reload it. */ /* If the file is loaded need to reload it. */
spell_reload_one(wfname, added_word); if (!error)
spell_reload_one(wfname, added_word);
} }
/* Free the allocated memory. */ /* Free the allocated memory. */
@ -7602,7 +7700,7 @@ init_spellfile()
{ {
char_u buf[MAXPATHL]; char_u buf[MAXPATHL];
int l; int l;
slang_T *sl; char_u *fname;
char_u *rtp; char_u *rtp;
char_u *lend; char_u *lend;
@ -7624,12 +7722,14 @@ init_spellfile()
{ {
/* Use the first language name from 'spelllang' and the /* Use the first language name from 'spelllang' and the
* encoding used in the first loaded .spl file. */ * encoding used in the first loaded .spl file. */
sl = LANGP_ENTRY(curbuf->b_langp, 0)->lp_slang; fname = LANGP_ENTRY(curbuf->b_langp, 0)->lp_slang->sl_fname;
if (fname == NULL)
break;
l = STRLEN(buf); l = STRLEN(buf);
vim_snprintf((char *)buf + l, MAXPATHL - l, vim_snprintf((char *)buf + l, MAXPATHL - l,
"/spell/%.*s.%s.add", "/spell/%.*s.%s.add",
(int)(lend - curbuf->b_p_spl), curbuf->b_p_spl, (int)(lend - curbuf->b_p_spl), curbuf->b_p_spl,
strstr((char *)gettail(sl->sl_fname), ".ascii.") != NULL strstr((char *)gettail(fname), ".ascii.") != NULL
? (char_u *)"ascii" : spell_enc()); ? (char_u *)"ascii" : spell_enc());
set_option_value((char_u *)"spellfile", 0L, buf, OPT_LOCAL); set_option_value((char_u *)"spellfile", 0L, buf, OPT_LOCAL);
break; break;
@ -8976,6 +9076,7 @@ suggest_try_change(su)
int repextra = 0; /* extra bytes in fword[] from REP item */ int repextra = 0; /* extra bytes in fword[] from REP item */
slang_T *slang; slang_T *slang;
int fword_ends; int fword_ends;
int lpi;
/* We make a copy of the case-folded bad word, so that we can modify it /* We make a copy of the case-folded bad word, so that we can modify it
* to find matches (esp. REP items). Append some more text, changing * to find matches (esp. REP items). Append some more text, changing
@ -8985,11 +9086,16 @@ suggest_try_change(su)
p = su->su_badptr + su->su_badlen; p = su->su_badptr + su->su_badlen;
(void)spell_casefold(p, STRLEN(p), fword + n, MAXWLEN - n); (void)spell_casefold(p, STRLEN(p), fword + n, MAXWLEN - n);
for (lp = LANGP_ENTRY(curwin->w_buffer->b_langp, 0); for (lpi = 0; lpi < curwin->w_buffer->b_langp.ga_len; ++lpi)
lp->lp_slang != NULL; ++lp)
{ {
lp = LANGP_ENTRY(curwin->w_buffer->b_langp, lpi);
slang = lp->lp_slang; slang = lp->lp_slang;
/* If reloading a spell file fails it's still in the list but
* everything has been cleared. */
if (slang->sl_fbyts == NULL)
continue;
/* /*
* Go through the whole case-fold tree, try changes at each node. * Go through the whole case-fold tree, try changes at each node.
* "tword[]" contains the word collected from nodes in the tree. * "tword[]" contains the word collected from nodes in the tree.
@ -9146,6 +9252,11 @@ suggest_try_change(su)
} }
} }
/* Check NEEDCOMPOUND: can't use word without compounding. */
if (sp->ts_complen == sp->ts_compsplit && fword_ends
&& (flags & WF_NEEDCOMP))
break;
if (sp->ts_complen > sp->ts_compsplit) if (sp->ts_complen > sp->ts_compsplit)
{ {
if (slang->sl_nobreak) if (slang->sl_nobreak)
@ -9178,6 +9289,16 @@ suggest_try_change(su)
|| sp->ts_twordlen - sp->ts_splitoff || sp->ts_twordlen - sp->ts_splitoff
< slang->sl_compminlen) < slang->sl_compminlen)
break; break;
#ifdef FEAT_MBYTE
/* For multi-byte chars check character length against
* COMPOUNDMIN. */
if (has_mbyte
&& slang->sl_compminlen < MAXWLEN
&& mb_charlen(tword + sp->ts_splitoff)
< slang->sl_compminlen)
break;
#endif
compflags[sp->ts_complen] = ((unsigned)flags >> 24); compflags[sp->ts_complen] = ((unsigned)flags >> 24);
compflags[sp->ts_complen + 1] = NUL; compflags[sp->ts_complen + 1] = NUL;
vim_strncpy(preword + sp->ts_prewordlen, vim_strncpy(preword + sp->ts_prewordlen,
@ -9307,6 +9428,12 @@ suggest_try_change(su)
&& ((unsigned)flags >> 24) != 0 && ((unsigned)flags >> 24) != 0
&& sp->ts_twordlen - sp->ts_splitoff && sp->ts_twordlen - sp->ts_splitoff
>= slang->sl_compminlen >= slang->sl_compminlen
#ifdef FEAT_MBYTE
&& (!has_mbyte
|| slang->sl_compminlen == MAXWLEN
|| mb_charlen(tword + sp->ts_splitoff)
>= slang->sl_compminlen)
#endif
&& (slang->sl_compsylmax < MAXWLEN && (slang->sl_compsylmax < MAXWLEN
|| sp->ts_complen + 1 - sp->ts_compsplit || sp->ts_complen + 1 - sp->ts_compsplit
< slang->sl_compmax) < slang->sl_compmax)
@ -10282,13 +10409,15 @@ score_comp_sal(su)
suggest_T *stp; suggest_T *stp;
suggest_T *sstp; suggest_T *sstp;
int score; int score;
int lpi;
if (ga_grow(&su->su_sga, su->su_ga.ga_len) == FAIL) if (ga_grow(&su->su_sga, su->su_ga.ga_len) == FAIL)
return; return;
/* Use the sound-folding of the first language that supports it. */ /* Use the sound-folding of the first language that supports it. */
for (lp = LANGP_ENTRY(curwin->w_buffer->b_langp, 0); for (lpi = 0; lpi < curwin->w_buffer->b_langp.ga_len; ++lpi)
lp->lp_slang != NULL; ++lp) {
lp = LANGP_ENTRY(curwin->w_buffer->b_langp, lpi);
if (lp->lp_slang->sl_sal.ga_len > 0) if (lp->lp_slang->sl_sal.ga_len > 0)
{ {
/* soundfold the bad word */ /* soundfold the bad word */
@ -10317,6 +10446,7 @@ score_comp_sal(su)
} }
break; break;
} }
}
} }
/* /*
@ -10336,11 +10466,12 @@ score_combine(su)
char_u *p; char_u *p;
char_u badsound[MAXWLEN]; char_u badsound[MAXWLEN];
int round; int round;
int lpi;
/* Add the alternate score to su_ga. */ /* Add the alternate score to su_ga. */
for (lp = LANGP_ENTRY(curwin->w_buffer->b_langp, 0); for (lpi = 0; lpi < curwin->w_buffer->b_langp.ga_len; ++lpi)
lp->lp_slang != NULL; ++lp)
{ {
lp = LANGP_ENTRY(curwin->w_buffer->b_langp, lpi);
if (lp->lp_slang->sl_sal.ga_len > 0) if (lp->lp_slang->sl_sal.ga_len > 0)
{ {
/* soundfold the bad word */ /* soundfold the bad word */
@ -10483,11 +10614,12 @@ suggest_try_soundalike(su)
int flags; int flags;
int sound_score; int sound_score;
int local_score; int local_score;
int lpi;
/* Do this for all languages that support sound folding. */ /* Do this for all languages that support sound folding. */
for (lp = LANGP_ENTRY(curwin->w_buffer->b_langp, 0); for (lpi = 0; lpi < curwin->w_buffer->b_langp.ga_len; ++lpi)
lp->lp_slang != NULL; ++lp)
{ {
lp = LANGP_ENTRY(curwin->w_buffer->b_langp, lpi);
if (lp->lp_slang->sl_sal.ga_len > 0) if (lp->lp_slang->sl_sal.ga_len > 0)
{ {
/* soundfold the bad word */ /* soundfold the bad word */
@ -10940,10 +11072,11 @@ rescore_suggestions(su)
suggest_T *stp; suggest_T *stp;
char_u sal_badword[MAXWLEN]; char_u sal_badword[MAXWLEN];
int i; int i;
int lpi;
for (lp = LANGP_ENTRY(curwin->w_buffer->b_langp, 0); for (lpi = 0; lpi < curwin->w_buffer->b_langp.ga_len; ++lpi)
lp->lp_slang != NULL; ++lp)
{ {
lp = LANGP_ENTRY(curwin->w_buffer->b_langp, lpi);
if (lp->lp_slang->sl_sal.ga_len > 0) if (lp->lp_slang->sl_sal.ga_len > 0)
{ {
/* soundfold the bad word */ /* soundfold the bad word */
@ -11032,17 +11165,20 @@ eval_soundfold(word)
{ {
langp_T *lp; langp_T *lp;
char_u sound[MAXWLEN]; char_u sound[MAXWLEN];
int lpi;
if (curwin->w_p_spell && *curbuf->b_p_spl != NUL) if (curwin->w_p_spell && *curbuf->b_p_spl != NUL)
/* Use the sound-folding of the first language that supports it. */ /* Use the sound-folding of the first language that supports it. */
for (lp = LANGP_ENTRY(curwin->w_buffer->b_langp, 0); for (lpi = 0; lpi < curwin->w_buffer->b_langp.ga_len; ++lpi)
lp->lp_slang != NULL; ++lp) {
lp = LANGP_ENTRY(curwin->w_buffer->b_langp, lpi);
if (lp->lp_slang->sl_sal.ga_len > 0) if (lp->lp_slang->sl_sal.ga_len > 0)
{ {
/* soundfold the word */ /* soundfold the word */
spell_soundfold(lp->lp_slang, word, FALSE, sound); spell_soundfold(lp->lp_slang, word, FALSE, sound);
return vim_strsave(sound); return vim_strsave(sound);
} }
}
/* No language with sound folding, return word as-is. */ /* No language with sound folding, return word as-is. */
return vim_strsave(word); return vim_strsave(word);
@ -12119,6 +12255,7 @@ ex_spelldump(eap)
char_u *region_names = NULL; /* region names being used */ char_u *region_names = NULL; /* region names being used */
int do_region = TRUE; /* dump region names and numbers */ int do_region = TRUE; /* dump region names and numbers */
char_u *p; char_u *p;
int lpi;
if (no_spell_checking(curwin)) if (no_spell_checking(curwin))
return; return;
@ -12130,8 +12267,9 @@ ex_spelldump(eap)
/* Find out if we can support regions: All languages must support the same /* Find out if we can support regions: All languages must support the same
* regions or none at all. */ * regions or none at all. */
for (lp = LANGP_ENTRY(buf->b_langp, 0); lp->lp_slang != NULL; ++lp) for (lpi = 0; lpi < buf->b_langp.ga_len; ++lpi)
{ {
lp = LANGP_ENTRY(buf->b_langp, lpi);
p = lp->lp_slang->sl_regions; p = lp->lp_slang->sl_regions;
if (p[0] != 0) if (p[0] != 0)
{ {
@ -12156,9 +12294,12 @@ ex_spelldump(eap)
/* /*
* Loop over all files loaded for the entries in 'spelllang'. * Loop over all files loaded for the entries in 'spelllang'.
*/ */
for (lp = LANGP_ENTRY(buf->b_langp, 0); lp->lp_slang != NULL; ++lp) for (lpi = 0; lpi < buf->b_langp.ga_len; ++lpi)
{ {
lp = LANGP_ENTRY(buf->b_langp, lpi);
slang = lp->lp_slang; slang = lp->lp_slang;
if (slang->sl_fbyts == NULL) /* reloading failed */
continue;
vim_snprintf((char *)IObuff, IOSIZE, "# file: %s", slang->sl_fname); vim_snprintf((char *)IObuff, IOSIZE, "# file: %s", slang->sl_fname);
ml_append(lnum++, IObuff, (colnr_T)0, FALSE); ml_append(lnum++, IObuff, (colnr_T)0, FALSE);
@ -12205,6 +12346,7 @@ ex_spelldump(eap)
* Only use the word when the region matches. */ * Only use the word when the region matches. */
flags = (int)idxs[n]; flags = (int)idxs[n];
if ((round == 2 || (flags & WF_KEEPCAP) == 0) if ((round == 2 || (flags & WF_KEEPCAP) == 0)
&& (flags & WF_NEEDCOMP) == 0
&& (do_region && (do_region
|| (flags & WF_REGION) == 0 || (flags & WF_REGION) == 0
|| (((unsigned)flags >> 16) || (((unsigned)flags >> 16)
@ -12222,7 +12364,7 @@ ex_spelldump(eap)
/* Apply the prefix, if there is one. */ /* Apply the prefix, if there is one. */
if (c != 0) if (c != 0)
lnum = apply_prefixes(slang, word, round, lnum = dump_prefixes(slang, word, round,
flags, lnum); flags, lnum);
} }
} }
@ -12302,7 +12444,7 @@ dump_word(word, round, flags, lnum)
* Return the updated line number. * Return the updated line number.
*/ */
static linenr_T static linenr_T
apply_prefixes(slang, word, round, flags, startlnum) dump_prefixes(slang, word, round, flags, startlnum)
slang_T *slang; slang_T *slang;
char_u *word; /* case-folded word */ char_u *word; /* case-folded word */
int round; int round;

View File

@ -6,63 +6,50 @@ STARTTEST
:" Don't want to depend on the locale from the environment :" Don't want to depend on the locale from the environment
:set enc=latin1 :set enc=latin1
:e! :e!
:" First generate a .spl file from a .dic and a .aff file.
gg:/^affstart1/+1,/^affend1/-1w! Xtest.aff
gg:/^dicstart/+1,/^dicend/-1w! Xtest.dic
:mkspell! Xtest Xtest
:" :"
:" use that spell file :" Function to test .aff/.dic with list of good and bad words.
:set spl=Xtest.latin1.spl :func TestOne(aff, dic)
:set spell set spellfile=
:func SpellTest() $put =''
/^test1: $put ='test '. a:aff . '-' . a:dic
normal ]smm " Generate a .spl file from a .dic and .aff file.
let str = spellbadword() exe '1;/^' . a:aff . 'affstart/+1,/^' . a:aff . 'affend/-1w! Xtest.aff'
$put =str exe '1;/^' . a:dic . 'dicstart/+1,/^' . a:dic . 'dicend/-1w! Xtest.dic'
normal `m mkspell! Xtest Xtest
let lst = spellsuggest(str, 4) " use that spell file
$put =string(lst) set spl=Xtest.latin1.spl spell
normal `m]smm " list all valid words
let str = spellbadword() spelldump
$put =str %yank
normal `m quit
let lst = spellsuggest(str, 2) $put
$put =string(lst) $put ='-------'
normal `m]smm " find all bad words and suggestions for them
let str = spellbadword() exe '1;/^' . a:aff . 'good:'
$put =str normal 0f:]s
normal `m let prevbad = ''
let lst = spellsuggest(str, 2) while 1
$put =string(lst) let bad = spellbadword()
normal `m]smm if bad == '' || bad == prevbad || bad == 'badend'
let str = spellbadword() break
$put =str endif
normal `m let prevbad = bad
let lst = spellsuggest(str, 2) let lst = spellsuggest(bad, 3)
$put =string(lst) normal mm
normal `m]smm $put =bad
let str = spellbadword() $put =string(lst)
$put =str normal `m]s
normal `m endwhile
let lst = spellsuggest(str, 2)
$put =string(lst)
normal `m]smm
let str = spellbadword()
$put =str
normal `m
let lst = spellsuggest(str, 2)
$put =string(lst)
endfunc endfunc
:call SpellTest() :"
:spelldump :call TestOne('1', '1')
1GyG:q
:$put
:$put =soundfold('goobledygoook') :$put =soundfold('goobledygoook')
:$put =soundfold('kóopërÿnôven') :$put =soundfold('kóopërÿnôven')
:$put =soundfold('oeverloos gezwets edale') :$put =soundfold('oeverloos gezwets edale')
:" :"
:"
:" and now with SAL instead of SOFO items; test automatic reloading :" and now with SAL instead of SOFO items; test automatic reloading
gg:/^affstart2/+1,/^affend2/-1w! Xtest.aff gg:/^affstart_sal/+1,/^affend_sal/-1w! Xtest.aff
:mkspell! Xtest Xtest :mkspell! Xtest Xtest
:$put =soundfold('goobledygoook') :$put =soundfold('goobledygoook')
:$put =soundfold('kóopërÿnôven') :$put =soundfold('kóopërÿnôven')
@ -101,39 +88,16 @@ gg:/^addstart/+1,/^addend/-1w! Xtest.latin1.add
:$put =str :$put =str
:" :"
:" Postponed prefixes :" Postponed prefixes
gg:/^affstart3/+1,/^affend3/-1w! Xtest.aff :call TestOne('2', '1')
:mkspell! Xtest Xtest
:set spellfile=
:set spl=Xtest.latin1.spl
:spelldump
1GyG:q
:$put
:call SpellTest()
:" :"
:" Compounding :" Compound words
gg:/^compaffstart/+1,/^compaffend/-1w! Xtest.aff :call TestOne('3', '3')
gg:/^compdicstart/+1,/^compdicend/-1w! Xtest.dic :call TestOne('4', '4')
:mkspell! Xtest Xtest
:set spellfile=
:set spl=Xtest.latin1.spl
:spelldump
1GyG:q
:$put
/^comptest:
:for i in range(11)
normal ]smm
let str = spellbadword()
$put =str
normal `m
let lst = spellsuggest(str, 3)
$put =string(lst)
normal `m
endfor
:" :"
gg:/^test output:/,$wq! test.out gg:/^test output:/,$wq! test.out
ENDTEST ENDTEST
affstart1 1affstart
SET ISO8859-1 SET ISO8859-1
TRY esianrtolcdugmphbyfvkwjkqxz-ëéèêïîäàâöüû'ESIANRTOLCDUGMPHBYFVKWJKQXZ TRY esianrtolcdugmphbyfvkwjkqxz-ëéèêïîäàâöüû'ESIANRTOLCDUGMPHBYFVKWJKQXZ
@ -182,9 +146,27 @@ MAP n
MAP cç MAP cç
MAP yÿý MAP yÿý
MAP sß MAP sß
affend1 1affend
affstart2 1good: wrong OK puts. Test the end
bad: inputs comment ok Ok. test déôl end the
badend
1dicstart
123456
test/NO
# comment
wrong
Comment
OK
uk
put/ISO
the end
deol
déôr
1dicend
affstart_sal
SET ISO8859-1 SET ISO8859-1
TRY esianrtolcdugmphbyfvkwjkqxz-ëéèêïîäàâöüû'ESIANRTOLCDUGMPHBYFVKWJKQXZ TRY esianrtolcdugmphbyfvkwjkqxz-ëéèêïîäàâöüû'ESIANRTOLCDUGMPHBYFVKWJKQXZ
@ -338,9 +320,9 @@ SAL X KS
SAL Y(AEIOU)- Y SAL Y(AEIOU)- Y
SAL ZZ- _ SAL ZZ- _
SAL Z S SAL Z S
affend2 affend_sal
affstart3 2affstart
SET ISO8859-1 SET ISO8859-1
FOL àáâãäåæçèéêëìíîïðñòóôõöøùúûüýþßÿ FOL àáâãäåæçèéêëìíîïðñòóôõöøùúûüýþßÿ
@ -387,23 +369,47 @@ MAP n
MAP cç MAP cç
MAP yÿý MAP yÿý
MAP sß MAP sß
affend3 2affend
dicstart 2good: puts
123456 bad: inputs comment ok Ok end the. test déôl
test/NO badend
# comment
wrong
Comment
OK
uk
put/ISO
the end
deol
déôr
dicend
compaffstart addstart
/regions=usgbnz
elequint/2
elekwint/3
addend
test2:
elequint test elekwint test elekwent asdf
Test rules for compounding.
3affstart
SET ISO8859-1
COMPOUNDMIN 3
COMPOUNDFLAGS m*
NEEDCOMPOUND x
3affend
3dicstart
1234
foo/m
bar/mx
mï/m
la/mx
3dicend
3good: foo mï foobar foofoobar barfoo barbarfoo
bad: bar la foomï barmï mïfoo mïbar mïmï lala mïla lamï foola labar
badend
Tests for compounding.
4affstart
SET ISO8859-1 SET ISO8859-1
FOL àáâãäåæçèéêëìíîïðñòóôõöøùúûüýþßÿ FOL àáâãäåæçèéêëìíîïðñòóôõöøùúûüýþßÿ
@ -445,9 +451,9 @@ SFX a 0 ize . nocomp
PFX p N 1 PFX p N 1
PFX p 0 pre . PFX p 0 pre .
compaffend 4affend
compdicstart 4dicstart
1234 1234
word/m word/m
util/am util/am
@ -456,37 +462,16 @@ tomato/m
bork/mp bork/mp
start/s start/s
end/e end/e
compdicend 4dicend
addstart 4good: word util bork prebork start end wordutil wordutils pro-ok
/regions=usgbnz bork borkbork borkborkbork borkborkborkbork borkborkborkborkbork
elequint/2 tomato tomatotomato startend startword startwordword startwordend
elekwint/3 startwordwordend startwordwordwordend prebork preborkprebork
addend preborkborkprebork preborkpreborkbork
bad: wordutilize pro borkborkborkborkborkbork tomatotomatotomato
test1: endstart endend startstart wordend wordstart
inputs wrong startwordwordwordwordend borkpreborkpreborkbork
comment wrong badend
puts OK
ok wrong
Ok wrong
the end. test wrong
déôl
test2:
elequint test elekwint test elekwent asdf
comptest:
word util
wordutil wordutils wordutilize
pro pro-ok
bork borkbork borkborkbork borkborkborkbork borkborkborkborkbork
borkborkborkborkborkbork
tomato tomatotomato tomatotomatotomato
startend endstart endend startstart wordend
startword startwordword wordstart startwordend startwordwordend
startwordwordwordend startwordwordwordwordend
prebork preborkprebork preborkborkprebork preborkpreborkbork
borkpreborkpreborkbork
test output: test output:

View File

@ -1,16 +1,6 @@
test output: test output:
inputs
['input', 'puts', 'outputs', 'put'] test 1-1
comment
['Comment']
ok
['OK', 'uk']
Ok
['OK', 'Uk']
test
['test', 'Test']
déôl
['deol', 'déôr']
# file: Xtest.latin1.spl # file: Xtest.latin1.spl
Comment Comment
deol deol
@ -28,6 +18,25 @@ testn
the end the end
uk uk
wrong wrong
-------
bad
['put', 'OK', 'uk']
inputs
['input', 'puts', 'outputs']
comment
['Comment']
ok
['OK', 'uk', 'put']
Ok
['OK', 'Uk', 'Put']
test
['test', 'Test', 'testn']
déôl
['deol', 'déôr', 'test']
end
['put', 'test', 'uk']
the
['put', 'uk', 'test']
gebletegek gebletegek
kepereneven kepereneven
everles gesvets etele everles gesvets etele
@ -43,6 +52,8 @@ elequint
elekwent elekwent
elequint elequint
elekwint elekwint
test 2-1
# file: Xtest.latin1.spl # file: Xtest.latin1.spl
Comment Comment
deol deol
@ -60,18 +71,59 @@ testn
the end the end
uk uk
wrong wrong
-------
bad
['put', 'uk', 'OK']
inputs inputs
['input', 'puts', 'put', 'outputs'] ['input', 'puts', 'put']
comment comment
['Comment'] ['Comment']
ok ok
['OK', 'uk'] ['OK', 'uk', 'put']
Ok Ok
['OK', 'Uk'] ['OK', 'Uk', 'Put']
end
['put', 'uk', 'deol']
the
['put', 'uk', 'test']
test test
['test', 'Test'] ['test', 'Test', 'testn']
déôl déôl
['deol', 'déôr'] ['deol', 'déôr', 'test']
test 3-3
# file: Xtest.latin1.spl
foo
-------
bad
['foo', 'mï']
bar
['foobar', 'foo', 'mï']
la
['mï', 'foo']
foomï
['foo mï', 'foo', 'foofoo']
barmï
['bar mï', 'barfoo', 'barbar']
mïfoo
['mï foo', 'foo', 'foofoo']
mïbar
['foobar', 'barbar', 'mï']
mïmï
['mï mï', 'mï', 'la mï']
lala
['la mï']
mïla
['mï', 'mï mï']
lamï
['la mï', 'mï', 'mï mï']
foola
['foo', 'foobar', 'foofoo']
labar
['barbar', 'foobar']
test 4-4
# file: Xtest.latin1.spl # file: Xtest.latin1.spl
bork bork
prebork prebork
@ -83,6 +135,9 @@ util
utilize utilize
utils utils
word word
-------
bad
['end', 'bork', 'word']
wordutilize wordutilize
['word utilize', 'wordutils', 'wordutil'] ['word utilize', 'wordutils', 'wordutil']
pro pro

View File

@ -8,65 +8,52 @@ STARTTEST
:" text is in latin1, the test text is utf-8. :" text is in latin1, the test text is utf-8.
:set enc=latin1 :set enc=latin1
:e! :e!
:set fenc=
:" First generate a .spl file from a .dic and a .aff file.
gg:/^affstart1/+1,/^affend1/-1w! Xtest.aff
gg:/^dicstart/+1,/^dicend/-1w! Xtest.dic
:set enc=utf-8 :set enc=utf-8
:mkspell! Xtest Xtest :set fenc=
:" :"
:" use that spell file :" Function to test .aff/.dic with list of good and bad words.
:set spl=Xtest.utf-8.spl :func TestOne(aff, dic)
:set spell set spellfile=
:func SpellTest() $put =''
/^test1: $put ='test '. a:aff . '-' . a:dic
normal ]smm " Generate a .spl file from a .dic and .aff file.
let str = spellbadword() exe '1;/^' . a:aff . 'affstart/+1,/^' . a:aff . 'affend/-1w! Xtest.aff'
$put =str exe '1;/^' . a:dic . 'dicstart/+1,/^' . a:dic . 'dicend/-1w! Xtest.dic'
normal `m mkspell! Xtest Xtest
let lst = spellsuggest(str, 4) " use that spell file
$put =string(lst) set spl=Xtest.utf-8.spl spell
normal `m]smm " list all valid words
let str = spellbadword() spelldump
$put =str %yank
normal `m quit
let lst = spellsuggest(str, 2) $put
$put =string(lst) $put ='-------'
normal `m]smm " find all bad words and suggestions for them
let str = spellbadword() exe '1;/^' . a:aff . 'good:'
$put =str normal 0f:]s
normal `m let prevbad = ''
let lst = spellsuggest(str, 2) while 1
$put =string(lst) let bad = spellbadword()
normal `m]smm if bad == '' || bad == prevbad || bad == 'badend'
let str = spellbadword() break
$put =str endif
normal `m let prevbad = bad
let lst = spellsuggest(str, 2) let lst = spellsuggest(bad, 3)
$put =string(lst) normal mm
normal `m]smm $put =bad
let str = spellbadword() $put =string(lst)
$put =str normal `m]s
normal `m endwhile
let lst = spellsuggest(str, 2)
$put =string(lst)
normal `m]smm
let str = spellbadword()
$put =str
normal `m
let lst = spellsuggest(str, 2)
$put =string(lst)
endfunc endfunc
:call SpellTest() :"
:spelldump :call TestOne('1', '1')
1GyG:q
:$put
:$put =soundfold('goobledygoook') :$put =soundfold('goobledygoook')
:$put =soundfold('kóopërÿnôven') :$put =soundfold('kóopërÿnôven')
:$put =soundfold('oeverloos gezwets edale') :$put =soundfold('oeverloos gezwets edale')
:" :"
:"
:" and now with SAL instead of SOFO items; test automatic reloading :" and now with SAL instead of SOFO items; test automatic reloading
gg:/^affstart2/+1,/^affend2/-1w! Xtest.aff gg:/^affstart_sal/+1,/^affend_sal/-1w! Xtest.aff
:mkspell! Xtest Xtest :mkspell! Xtest Xtest
:$put =soundfold('goobledygoook') :$put =soundfold('goobledygoook')
:$put =soundfold('kóopërÿnôven') :$put =soundfold('kóopërÿnôven')
@ -105,20 +92,16 @@ gg:/^addstart/+1,/^addend/-1w! Xtest.utf-8.add
:$put =str :$put =str
:" :"
:" Postponed prefixes :" Postponed prefixes
gg:/^affstart3/+1,/^affend3/-1w! Xtest.aff :call TestOne('2', '1')
:mkspell! Xtest Xtest :"
:set spellfile= :" Compound words
:set spl=Xtest.utf-8.spl :call TestOne('3', '3')
:mess :call TestOne('4', '4')
:spelldump
1GyG:q
:$put
:call SpellTest()
:" :"
gg:/^test output:/,$wq! test.out gg:/^test output:/,$wq! test.out
ENDTEST ENDTEST
affstart1 1affstart
SET ISO8859-1 SET ISO8859-1
TRY esianrtolcdugmphbyfvkwjkqxz-ëéèêïîäàâöüû'ESIANRTOLCDUGMPHBYFVKWJKQXZ TRY esianrtolcdugmphbyfvkwjkqxz-ëéèêïîäàâöüû'ESIANRTOLCDUGMPHBYFVKWJKQXZ
@ -167,9 +150,9 @@ MAP n
MAP cç MAP cç
MAP yÿý MAP yÿý
MAP sß MAP sß
affend1 1affend
affstart2 affstart_sal
SET ISO8859-1 SET ISO8859-1
TRY esianrtolcdugmphbyfvkwjkqxz-ëéèêïîäàâöüû'ESIANRTOLCDUGMPHBYFVKWJKQXZ TRY esianrtolcdugmphbyfvkwjkqxz-ëéèêïîäàâöüû'ESIANRTOLCDUGMPHBYFVKWJKQXZ
@ -323,9 +306,9 @@ SAL X KS
SAL Y(AEIOU)- Y SAL Y(AEIOU)- Y
SAL ZZ- _ SAL ZZ- _
SAL Z S SAL Z S
affend2 affend_sal
affstart3 2affstart
SET ISO8859-1 SET ISO8859-1
FOL àáâãäåæçèéêëìíîïðñòóôõöøùúûüýþßÿ FOL àáâãäåæçèéêëìíîïðñòóôõöøùúûüýþßÿ
@ -372,9 +355,9 @@ MAP n
MAP cç MAP cç
MAP yÿý MAP yÿý
MAP sß MAP sß
affend3 2affend
dicstart 1dicstart
123456 123456
test/NO test/NO
# comment # comment
@ -386,7 +369,7 @@ put/ISO
the end the end
deol deol
déôr déôr
dicend 1dicend
addstart addstart
/regions=usgbnz /regions=usgbnz
@ -394,17 +377,105 @@ elequint/2
elekwint/3 elekwint/3
addend addend
test1: 1good: wrong OK puts. Test the end
inputs wrong bad: inputs comment ok Ok. test déôl end the
comment wrong badend
puts OK
ok wrong 2good: puts
Ok wrong bad: inputs comment ok Ok end the. test déôl
the end. test wrong badend
déôl
Test rules for compounding.
3affstart
SET ISO8859-1
COMPOUNDMIN 3
COMPOUNDFLAGS m*
NEEDCOMPOUND x
3affend
3dicstart
1234
foo/m
bar/mx
mï/m
la/mx
3dicend
3good: foo mï foobar foofoobar barfoo barbarfoo
bad: bar la foomï barmï mïfoo mïbar mïmï lala mïla lamï foola labar
badend
Tests for compounding.
4affstart
SET ISO8859-1
FOL àáâãäåæçèéêëìíîïðñòóôõöøùúûüýþßÿ
LOW àáâãäåæçèéêëìíîïðñòóôõöøùúûüýþßÿ
UPP ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßÿ
COMPOUNDFLAGS m+
COMPOUNDFLAGS sm*e
COMPOUNDFLAGS sm+
COMPOUNDMIN 3
COMPOUNDMAX 3
COMPOUNDSYLMAX 5
SYLLABLE aáeéiíoóöõuúüûy/aa/au/ea/ee/ei/ie/oa/oe/oo/ou/uu/ui
MAP 9
MAP aàáâãäå
MAP eèéêë
MAP iìíîï
MAP oòóôõö
MAP uùúûü
MAP nñ
MAP cç
MAP yÿý
MAP sß
NEEDAFFIX x
PFXPOSTPONE
MIDWORD '-
SFX q N 1
SFX q 0 -ok .
SFX a Y 2
SFX a 0 s .
SFX a 0 ize . nocomp
PFX p N 1
PFX p 0 pre .
4affend
4dicstart
1234
word/m
util/am
pro/xq
tomato/m
bork/mp
start/s
end/e
4dicend
4good: word util bork prebork start end wordutil wordutils pro-ok
bork borkbork borkborkbork borkborkborkbork borkborkborkborkbork
tomato tomatotomato startend startword startwordword startwordend
startwordwordend startwordwordwordend prebork preborkprebork
preborkborkprebork preborkpreborkbork
bad: wordutilize pro borkborkborkborkborkbork tomatotomatotomato
endstart endend startstart wordend wordstart
startwordwordwordwordend borkpreborkpreborkbork
badend
test2: test2:
elequint test elekwint test elekwent asdf elequint test elekwint test elekwent asdf
test output: test output:

View File

@ -1,16 +1,6 @@
test output: test output:
inputs
['input', 'puts', 'outputs', 'put'] test 1-1
comment
['Comment']
ok
['OK', 'uk']
Ok
['OK', 'Uk']
test
['test', 'Test']
déôl
['deol', 'déôr']
# file: Xtest.utf-8.spl # file: Xtest.utf-8.spl
Comment Comment
deol deol
@ -28,6 +18,25 @@ testn
the end the end
uk uk
wrong wrong
-------
bad
['put', 'OK', 'uk']
inputs
['input', 'puts', 'outputs']
comment
['Comment']
ok
['OK', 'uk', 'put']
Ok
['OK', 'Uk', 'Put']
test
['test', 'Test', 'testn']
déôl
['deol', 'déôr', 'test']
end
['put', 'test', 'uk']
the
['put', 'uk', 'test']
gebletegek gebletegek
kepereneven kepereneven
everles gesvets etele everles gesvets etele
@ -43,6 +52,8 @@ elequint
elekwent elekwent
elequint elequint
elekwint elekwint
test 2-1
# file: Xtest.utf-8.spl # file: Xtest.utf-8.spl
Comment Comment
deol deol
@ -60,15 +71,92 @@ testn
the end the end
uk uk
wrong wrong
-------
bad
['put', 'uk', 'OK']
inputs inputs
['input', 'puts', 'put', 'outputs'] ['input', 'puts', 'put']
comment comment
['Comment'] ['Comment']
ok ok
['OK', 'uk'] ['OK', 'uk', 'put']
Ok Ok
['OK', 'Uk'] ['OK', 'Uk', 'Put']
end
['put', 'uk', 'deol']
the
['put', 'uk', 'test']
test test
['test', 'Test'] ['test', 'Test', 'testn']
déôl déôl
['deol', 'déôr'] ['deol', 'déôr', 'test']
test 3-3
# file: Xtest.utf-8.spl
foo
-------
bad
['foo', 'mï']
bar
['foobar', 'foo', 'mï']
la
['foo', 'mï']
foomï
['foo mï', 'foo', 'foofoo']
barmï
['bar mï', 'barfoo', 'barbar']
mïfoo
['mï foo', 'foo', 'foofoo']
mïbar
['foobar', 'barbar', 'mï']
mïmï
['mï mï', 'mï', 'la mï']
lala
[]
mïla
['mï']
lamï
['la mï', 'mï', 'mï mï']
foola
['foo', 'foobar', 'foofoo']
labar
['barbar', 'foobar']
test 4-4
# file: Xtest.utf-8.spl
bork
prebork
end
pro-ok
start
tomato
util
utilize
utils
word
-------
bad
['end', 'bork', 'word']
wordutilize
['word utilize', 'wordutils', 'wordutil']
pro
['bork', 'end', 'word']
borkborkborkborkborkbork
['borkbork borkborkborkbork', 'borkborkbork borkborkbork', 'borkborkborkborkbork bork']
tomatotomatotomato
['tomato tomatotomato', 'tomatotomato tomato', 'tomato tomato tomato']
endstart
['end start', 'start']
endend
['end end', 'end']
startstart
['start start']
wordend
['word end', 'wordword', 'word']
wordstart
['word start', 'bork start']
startwordwordwordwordend
['startwordwordwordword end', 'startwordwordwordword', 'start wordwordwordword end']
borkpreborkpreborkbork
['borkpreborkprebork bork', 'borkprebork preborkbork', 'bork preborkpreborkbork']

View File

@ -36,5 +36,5 @@
#define VIM_VERSION_NODOT "vim70aa" #define VIM_VERSION_NODOT "vim70aa"
#define VIM_VERSION_SHORT "7.0aa" #define VIM_VERSION_SHORT "7.0aa"
#define VIM_VERSION_MEDIUM "7.0aa ALPHA" #define VIM_VERSION_MEDIUM "7.0aa ALPHA"
#define VIM_VERSION_LONG "VIM - Vi IMproved 7.0aa ALPHA (2005 Aug 26)" #define VIM_VERSION_LONG "VIM - Vi IMproved 7.0aa ALPHA (2005 Aug 29)"
#define VIM_VERSION_LONG_DATE "VIM - Vi IMproved 7.0aa ALPHA (2005 Aug 26, compiled " #define VIM_VERSION_LONG_DATE "VIM - Vi IMproved 7.0aa ALPHA (2005 Aug 29, compiled "