summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--runtime/doc/index.txt4
-rw-r--r--runtime/plugin/NetrwFileHandlers.vim14
-rw-r--r--src/spell.c226
3 files changed, 178 insertions, 66 deletions
diff --git a/runtime/doc/index.txt b/runtime/doc/index.txt
index b7be0b881..2607828ab 100644
--- a/runtime/doc/index.txt
+++ b/runtime/doc/index.txt
@@ -1,4 +1,4 @@
-*index.txt* For Vim version 7.0aa. Last change: 2005 Jul 29
+*index.txt* For Vim version 7.0aa. Last change: 2005 Aug 11
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -152,11 +152,13 @@ commands in CTRL-X submode *i_CTRL-X_index*
|i_CTRL-X_CTRL-N| CTRL-X CTRL-N next completion
|i_CTRL-X_CTRL-O| CTRL-X CTRL-O occult completion
|i_CTRL-X_CTRL-P| CTRL-X CTRL-P previous completion
+|i_CTRL-X_CTRL-S| CTRL-X CTRL-S spelling suggestions
|i_CTRL-X_CTRL-T| CTRL-X CTRL-T complete identifiers from thesaurus
|i_CTRL-X_CTRL-Y| CTRL-X CTRL-Y scroll down
|i_CTRL-X_CTRL-U| CTRL-X CTRL-U complete with 'completefunc'
|i_CTRL-X_CTRL-V| CTRL-X CTRL-V complete like in : command line
|i_CTRL-X_CTRL-]| CTRL-X CTRL-] complete tags
+|i_CTRL-X_s| CTRL-X s spelling suggestions
{not available when compiled without the +insert_expand feature}
==============================================================================
diff --git a/runtime/plugin/NetrwFileHandlers.vim b/runtime/plugin/NetrwFileHandlers.vim
index 6d3f8dcb9..9b9cd2060 100644
--- a/runtime/plugin/NetrwFileHandlers.vim
+++ b/runtime/plugin/NetrwFileHandlers.vim
@@ -1,8 +1,16 @@
" NetrwFileHandlers: contains various extension-based file handlers for
" netrw's browsers' x command ("eXecute launcher")
" Author: Charles E. Campbell, Jr.
-" Date: Apr 07, 2005
-" Version: 4a NOT RELEASED
+" Date: Aug 08, 2005
+" Version: 5a NOT RELEASED
+" Copyright: Copyright (C) 1999-2005 Charles E. Campbell, Jr.
+" Permission is hereby granted to use and distribute this code,
+" with or without modifications, provided that this copyright
+" notice is copied with it. Like anything else that's free,
+" netrw.vim is provided *as is* and comes with no
+" warranty of any kind, either expressed or implied. In no
+" event will the copyright holder be liable for any damages
+" resulting from the use of this software.
" ---------------------------------------------------------------------
" Load Once: {{{1
@@ -11,7 +19,7 @@ if exists("g:loaded_netrwfilehandlers") || &cp
endif
let s:keepcpo= &cpo
set cpo&vim
-let g:loaded_netrwfilehandlers= "v4a"
+let g:loaded_netrwfilehandlers= "v5a"
" ---------------------------------------------------------------------
" NetrwFileHandler_html: handles html when the user hits "x" when the {{{1
diff --git a/src/spell.c b/src/spell.c
index e4020699a..7513d0a73 100644
--- a/src/spell.c
+++ b/src/spell.c
@@ -478,6 +478,7 @@ typedef struct suggest_S
#define SCORE_DELDUP 64 /* delete a duplicated character */
#define SCORE_INS 96 /* insert a character */
#define SCORE_INSDUP 66 /* insert a duplicate character */
+#define SCORE_INSCOMP 30 /* insert a composing character */
#define SCORE_NONWORD 103 /* change non-word to word char */
#define SCORE_FILE 30 /* suggestion from a file */
@@ -646,6 +647,7 @@ static int set_spell_charflags __ARGS((char_u *flags, int cnt, char_u *upp));
static int set_spell_chartab __ARGS((char_u *fol, char_u *low, char_u *upp));
static void write_spell_chartab __ARGS((FILE *fd));
static int spell_casefold __ARGS((char_u *p, int len, char_u *buf, int buflen));
+static int check_need_cap __ARGS((linenr_T lnum, colnr_T col));
static void spell_find_suggest __ARGS((char_u *badptr, suginfo_T *su, int maxcount, int banbadword, int need_cap));
#ifdef FEAT_EVAL
static void spell_suggest_expr __ARGS((suginfo_T *su, char_u *expr));
@@ -2959,6 +2961,7 @@ badword_captype(word, end)
char_u *end;
{
int flags = captype(word, end);
+ int c;
int l, u;
int first;
char_u *p;
@@ -2970,7 +2973,8 @@ badword_captype(word, end)
first = FALSE;
for (p = word; p < end; mb_ptr_adv(p))
{
- if (SPELL_ISUPPER(PTR2CHAR(p)))
+ c = PTR2CHAR(p);
+ if (SPELL_ISUPPER(c))
{
++u;
if (p == word)
@@ -6568,9 +6572,6 @@ spell_suggest()
suggest_T *stp;
int mouse_used;
int need_cap;
- regmatch_T regmatch;
- int endcol;
- char_u *line_copy = NULL;
/* Find the start of the badly spelled word. */
if (spell_move_to(FORWARD, TRUE, TRUE) == FAIL
@@ -6600,60 +6601,11 @@ spell_suggest()
}
/* Get the word and its length. */
- line = ml_get_curline();
/* Figure out if the word should be capitalised. */
- need_cap = FALSE;
- if (curbuf->b_cap_prog != NULL)
- {
- endcol = 0;
- if ((int)(skipwhite(line) - line) == (int)curwin->w_cursor.col)
- {
- /* At start of line, check if previous line is empty or sentence
- * ends there. */
- if (curwin->w_cursor.lnum == 1)
- need_cap = TRUE;
- else
- {
- line = ml_get(curwin->w_cursor.lnum - 1);
- if (*skipwhite(line) == NUL)
- need_cap = TRUE;
- else
- {
- /* Append a space in place of the line break. */
- line_copy = concat_str(line, (char_u *)" ");
- line = line_copy;
- endcol = STRLEN(line);
- }
- }
- }
- else
- endcol = curwin->w_cursor.col;
-
- if (endcol > 0)
- {
- /* Check if sentence ends before the bad word. */
- regmatch.regprog = curbuf->b_cap_prog;
- regmatch.rm_ic = FALSE;
- p = line + endcol;
- for (;;)
- {
- mb_ptr_back(line, p);
- if (p == line || spell_iswordp_nmw(p))
- break;
- if (vim_regexec(&regmatch, p, 0)
- && regmatch.endp[0] == line + endcol)
- {
- need_cap = TRUE;
- break;
- }
- }
- }
+ need_cap = check_need_cap(curwin->w_cursor.lnum, curwin->w_cursor.col);
- /* get the line again, we may have been using the previous one */
- line = ml_get_curline();
- vim_free(line_copy);
- }
+ line = ml_get_curline();
/* Get the list of suggestions */
spell_find_suggest(line + curwin->w_cursor.col, &sug, (int)Rows - 2,
@@ -6787,6 +6739,76 @@ spell_suggest()
}
/*
+ * Check if the word at line "lnum" column "col" is required to start with a
+ * capital. This uses 'spellcapcheck' of the current buffer.
+ */
+ static int
+check_need_cap(lnum, col)
+ linenr_T lnum;
+ colnr_T col;
+{
+ int need_cap = FALSE;
+ char_u *line;
+ char_u *line_copy = NULL;
+ char_u *p;
+ colnr_T endcol;
+ regmatch_T regmatch;
+
+ if (curbuf->b_cap_prog == NULL)
+ return FALSE;
+
+ line = ml_get_curline();
+ endcol = 0;
+ if ((int)(skipwhite(line) - line) >= (int)col)
+ {
+ /* At start of line, check if previous line is empty or sentence
+ * ends there. */
+ if (lnum == 1)
+ need_cap = TRUE;
+ else
+ {
+ line = ml_get(lnum - 1);
+ if (*skipwhite(line) == NUL)
+ need_cap = TRUE;
+ else
+ {
+ /* Append a space in place of the line break. */
+ line_copy = concat_str(line, (char_u *)" ");
+ line = line_copy;
+ endcol = STRLEN(line);
+ }
+ }
+ }
+ else
+ endcol = col;
+
+ if (endcol > 0)
+ {
+ /* Check if sentence ends before the bad word. */
+ regmatch.regprog = curbuf->b_cap_prog;
+ regmatch.rm_ic = FALSE;
+ p = line + endcol;
+ for (;;)
+ {
+ mb_ptr_back(line, p);
+ if (p == line || spell_iswordp_nmw(p))
+ break;
+ if (vim_regexec(&regmatch, p, 0)
+ && regmatch.endp[0] == line + endcol)
+ {
+ need_cap = TRUE;
+ break;
+ }
+ }
+ }
+
+ vim_free(line_copy);
+
+ return need_cap;
+}
+
+
+/*
* ":spellrepall"
*/
/*ARGSUSED*/
@@ -6854,17 +6876,18 @@ ex_spellrepall(eap)
* a list of allocated strings.
*/
void
-spell_suggest_list(gap, word, maxcount)
+spell_suggest_list(gap, word, maxcount, need_cap)
garray_T *gap;
char_u *word;
int maxcount; /* maximum nr of suggestions */
+ int need_cap; /* 'spellcapcheck' matched */
{
suginfo_T sug;
int i;
suggest_T *stp;
char_u *wcopy;
- spell_find_suggest(word, &sug, maxcount, FALSE, FALSE);
+ spell_find_suggest(word, &sug, maxcount, FALSE, need_cap);
/* Make room in "gap". */
ga_init2(gap, sizeof(char_u *), sug.su_ga.ga_len + 1);
@@ -7732,16 +7755,26 @@ suggest_try_change(su)
else if (sp->ts_isdiff == DIFF_INSERT
&& sp->ts_twordlen > sp->ts_tcharlen)
{
- /* If the previous character was the same,
- * thus doubling a character, give a bonus
- * to the score. */
p = tword + sp->ts_twordlen
- sp->ts_tcharlen;
c = mb_ptr2char(p);
- mb_ptr_back(tword, p);
- if (c == mb_ptr2char(p))
+ if (enc_utf8 && utf_iscomposing(c))
+ {
+ /* Inserting a composing char doesn't
+ * count that much. */
sp->ts_score -= SCORE_INS
+ - SCORE_INSCOMP;
+ }
+ else
+ {
+ /* If the previous character was the
+ * same, thus doubling a character,
+ * give a bonus to the score. */
+ mb_ptr_back(tword, p);
+ if (c == mb_ptr2char(p))
+ sp->ts_score -= SCORE_INS
- SCORE_INSDUP;
+ }
}
/* Starting a new char, reset the length. */
@@ -10547,4 +10580,73 @@ apply_prefixes(slang, word, round, flags, startlnum)
return lnum;
}
+#if defined(FEAT_INS_EXPAND) || defined(PROTO)
+static int spell_expand_need_cap;
+
+/*
+ * Find start of the word in front of the cursor. We don't check if it is
+ * badly spelled, with completion we can only change the word in front of the
+ * cursor.
+ * Used for Insert mode completion CTRL-X ?.
+ * Returns the column number of the word.
+ */
+ int
+spell_word_start(startcol)
+ int startcol;
+{
+ char_u *line;
+ char_u *p;
+ int col = 0;
+
+ if (no_spell_checking())
+ return startcol;
+
+ /* Find a word character before "startcol". */
+ line = ml_get_curline();
+ for (p = line + startcol; p > line; )
+ {
+ mb_ptr_back(line, p);
+ if (spell_iswordp_nmw(p))
+ break;
+ }
+
+ /* Go back to start of the word. */
+ while (p > line)
+ {
+ col = p - line;
+ mb_ptr_back(line, p);
+ if (!spell_iswordp(p, curbuf))
+ break;
+ col = 0;
+ }
+
+ /* Need to check for 'spellcapcheck' now, the word is removed before
+ * expand_spelling() is called. Therefore the ugly global variable. */
+ spell_expand_need_cap = check_need_cap(curwin->w_cursor.lnum, col);
+
+ return col;
+}
+
+/*
+ * Get list of spelling suggestions.
+ * Used for Insert mode completion CTRL-X ?.
+ * Returns the number of matches. The matches are in "matchp[]", array of
+ * allocated strings.
+ */
+/*ARGSUSED*/
+ int
+expand_spelling(lnum, col, pat, matchp)
+ linenr_T lnum;
+ int col;
+ char_u *pat;
+ char_u ***matchp;
+{
+ garray_T ga;
+
+ spell_suggest_list(&ga, pat, 100, spell_expand_need_cap);
+ *matchp = ga.ga_data;
+ return ga.ga_len;
+}
+#endif
+
#endif /* FEAT_SYN_HL */