annotate src/edit.c @ 2378:85b7dc8da5eb vim73

Add the 'concealcursor' option to decide when the cursor line is to be concealed or not. Rename 'conc' to 'cole' as the short name for 'conceallevel'.
author Bram Moolenaar <bram@vim.org>
date Fri, 23 Jul 2010 22:10:27 +0200
parents 8878a9f8db87
children 0ca06a92adfb
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1 /* vi:set ts=8 sts=4 sw=4:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3 * VIM - Vi IMproved by Bram Moolenaar
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5 * Do ":help uganda" in Vim to read copying and usage conditions.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6 * Do ":help credits" in Vim to see a list of people who contributed.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7 * See README.txt for an overview of the Vim source code.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
11 * edit.c: functions for Insert mode
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
12 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
13
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
14 #include "vim.h"
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
15
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
16 #ifdef FEAT_INS_EXPAND
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
17 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
18 * definitions used for CTRL-X submode
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
19 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
20 #define CTRL_X_WANT_IDENT 0x100
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
21
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
22 #define CTRL_X_NOT_DEFINED_YET 1
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
23 #define CTRL_X_SCROLL 2
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
24 #define CTRL_X_WHOLE_LINE 3
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
25 #define CTRL_X_FILES 4
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
26 #define CTRL_X_TAGS (5 + CTRL_X_WANT_IDENT)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
27 #define CTRL_X_PATH_PATTERNS (6 + CTRL_X_WANT_IDENT)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
28 #define CTRL_X_PATH_DEFINES (7 + CTRL_X_WANT_IDENT)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
29 #define CTRL_X_FINISHED 8
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
30 #define CTRL_X_DICTIONARY (9 + CTRL_X_WANT_IDENT)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
31 #define CTRL_X_THESAURUS (10 + CTRL_X_WANT_IDENT)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
32 #define CTRL_X_CMDLINE 11
12
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 11
diff changeset
33 #define CTRL_X_FUNCTION 12
523
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 502
diff changeset
34 #define CTRL_X_OMNI 13
477
f8b75b8f1988 updated for version 7.0128
vimboss
parents: 474
diff changeset
35 #define CTRL_X_SPELL 14
f8b75b8f1988 updated for version 7.0128
vimboss
parents: 474
diff changeset
36 #define CTRL_X_LOCAL_MSG 15 /* only used in "ctrl_x_msgs" */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
37
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
38 #define CTRL_X_MSG(i) ctrl_x_msgs[(i) & ~CTRL_X_WANT_IDENT]
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
39
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
40 static char *ctrl_x_msgs[] =
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
41 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
42 N_(" Keyword completion (^N^P)"), /* ctrl_x_mode == 0, ^P/^N compl. */
819
23f82b5d2814 updated for version 7.0c10
vimboss
parents: 818
diff changeset
43 N_(" ^X mode (^]^D^E^F^I^K^L^N^O^Ps^U^V^Y)"),
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
44 NULL,
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
45 N_(" Whole line completion (^L^N^P)"),
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
46 N_(" File name completion (^F^N^P)"),
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
47 N_(" Tag completion (^]^N^P)"),
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
48 N_(" Path pattern completion (^N^P)"),
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
49 N_(" Definition completion (^D^N^P)"),
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
50 NULL,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
51 N_(" Dictionary completion (^K^N^P)"),
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
52 N_(" Thesaurus completion (^T^N^P)"),
12
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 11
diff changeset
53 N_(" Command-line completion (^V^N^P)"),
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 11
diff changeset
54 N_(" User defined completion (^U^N^P)"),
523
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 502
diff changeset
55 N_(" Omni completion (^O^N^P)"),
819
23f82b5d2814 updated for version 7.0c10
vimboss
parents: 818
diff changeset
56 N_(" Spelling suggestion (s^N^P)"),
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
57 N_(" Keyword Local completion (^N^P)"),
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
58 };
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
59
1869
720a59d79bcd updated for version 7.2-168
vimboss
parents: 1811
diff changeset
60 static char e_hitend[] = N_("Hit end of paragraph");
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
61
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
62 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
63 * Structure used to store one match for insert completion.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
64 */
681
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
65 typedef struct compl_S compl_T;
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
66 struct compl_S
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
67 {
464
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
68 compl_T *cp_next;
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
69 compl_T *cp_prev;
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
70 char_u *cp_str; /* matched text */
681
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
71 char cp_icase; /* TRUE or FALSE: ignore case */
786
8f6a426bc1e0 updated for version 7.0229
vimboss
parents: 782
diff changeset
72 char_u *(cp_text[CPT_COUNT]); /* text for the menu */
659
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
73 char_u *cp_fname; /* file containing the match, allocated when
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
74 * cp_flags has FREE_FNAME */
464
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
75 int cp_flags; /* ORIGINAL_TEXT, CONT_S_IPOS or FREE_FNAME */
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
76 int cp_number; /* sequence number */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
77 };
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
78
464
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
79 #define ORIGINAL_TEXT (1) /* the original text when the expansion begun */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
80 #define FREE_FNAME (2)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
81
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
82 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
83 * All the current matches are stored in a list.
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
84 * "compl_first_match" points to the start of the list.
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
85 * "compl_curr_match" points to the currently selected entry.
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
86 * "compl_shown_match" is different from compl_curr_match during
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
87 * ins_compl_get_exp().
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
88 */
464
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
89 static compl_T *compl_first_match = NULL;
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
90 static compl_T *compl_curr_match = NULL;
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
91 static compl_T *compl_shown_match = NULL;
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
92
825
6675076019ae updated for version 7.0d
vimboss
parents: 819
diff changeset
93 /* After using a cursor key <Enter> selects a match in the popup menu,
6675076019ae updated for version 7.0d
vimboss
parents: 819
diff changeset
94 * otherwise it inserts a line break. */
6675076019ae updated for version 7.0d
vimboss
parents: 819
diff changeset
95 static int compl_enter_selects = FALSE;
6675076019ae updated for version 7.0d
vimboss
parents: 819
diff changeset
96
657
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
97 /* When "compl_leader" is not NULL only matches that start with this string
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
98 * are used. */
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
99 static char_u *compl_leader = NULL;
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
100
665
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
101 static int compl_get_longest = FALSE; /* put longest common string
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
102 in compl_leader */
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
103
657
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
104 static int compl_used_match; /* Selected one of the matches. When
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
105 FALSE the match was edited or using
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
106 the longest common string. */
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
107
874
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
108 static int compl_was_interrupted = FALSE; /* didn't finish finding
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
109 completions. */
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
110
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
111 static int compl_restarting = FALSE; /* don't insert match */
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
112
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
113 /* When the first completion is done "compl_started" is set. When it's
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
114 * FALSE the word to be completed must be located. */
644
e4fa26ce8769 updated for version 7.0187
vimboss
parents: 634
diff changeset
115 static int compl_started = FALSE;
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
116
1927
f798c9043986 updated for version 7.2-224
vimboss
parents: 1892
diff changeset
117 /* Set when doing something for completion that may call edit() recursively,
f798c9043986 updated for version 7.2-224
vimboss
parents: 1892
diff changeset
118 * which is not allowed. */
f798c9043986 updated for version 7.2-224
vimboss
parents: 1892
diff changeset
119 static int compl_busy = FALSE;
f798c9043986 updated for version 7.2-224
vimboss
parents: 1892
diff changeset
120
464
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
121 static int compl_matches = 0;
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
122 static char_u *compl_pattern = NULL;
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
123 static int compl_direction = FORWARD;
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
124 static int compl_shows_dir = FORWARD;
716
8ae24f338cab updated for version 7.0217
vimboss
parents: 714
diff changeset
125 static int compl_pending = 0; /* > 1 for postponed CTRL-N */
464
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
126 static pos_T compl_startpos;
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
127 static colnr_T compl_col = 0; /* column where the text starts
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
128 * that is being completed */
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
129 static char_u *compl_orig_text = NULL; /* text as it was before
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
130 * completion started */
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
131 static int compl_cont_mode = 0;
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
132 static expand_T compl_xp;
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
133
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
134 static void ins_ctrl_x __ARGS((void));
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
135 static int has_compl_option __ARGS((int dict_opt));
1430
342cf2a9f5cc updated for version 7.1-145
vimboss
parents: 1389
diff changeset
136 static int ins_compl_accept_char __ARGS((int c));
944
b2dcb8457067 updated for version 7.0-070
vimboss
parents: 942
diff changeset
137 static int ins_compl_add __ARGS((char_u *str, int len, int icase, char_u *fname, char_u **cptext, int cdir, int flags, int adup));
681
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
138 static int ins_compl_equal __ARGS((compl_T *match, char_u *str, int len));
665
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
139 static void ins_compl_longest_match __ARGS((compl_T *match));
681
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
140 static void ins_compl_add_matches __ARGS((int num_matches, char_u **matches, int icase));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
141 static int ins_compl_make_cyclic __ARGS((void));
540
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
142 static void ins_compl_upd_pum __ARGS((void));
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
143 static void ins_compl_del_pum __ARGS((void));
648
9032e4668296 updated for version 7.0189
vimboss
parents: 644
diff changeset
144 static int pum_wanted __ARGS((void));
707
111b7dcc8a17 updated for version 7.0213
vimboss
parents: 703
diff changeset
145 static int pum_enough_matches __ARGS((void));
659
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
146 static void ins_compl_dictionaries __ARGS((char_u *dict, char_u *pat, int flags, int thesaurus));
703
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
147 static void ins_compl_files __ARGS((int count, char_u **files, int thesaurus, int flags, regmatch_T *regmatch, char_u *buf, int *dir));
667
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
148 static char_u *find_line_end __ARGS((char_u *ptr));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
149 static void ins_compl_free __ARGS((void));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
150 static void ins_compl_clear __ARGS((void));
657
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
151 static int ins_compl_bs __ARGS((void));
874
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
152 static void ins_compl_new_leader __ARGS((void));
657
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
153 static void ins_compl_addleader __ARGS((int c));
1782
12cecc379574 updated for version 7.2-080
vimboss
parents: 1698
diff changeset
154 static int ins_compl_len __ARGS((void));
874
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
155 static void ins_compl_restart __ARGS((void));
694
07d199fe02ed updated for version 7.0209
vimboss
parents: 692
diff changeset
156 static void ins_compl_set_original_text __ARGS((char_u *str));
659
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
157 static void ins_compl_addfrommatch __ARGS((void));
540
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
158 static int ins_compl_prep __ARGS((int c));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
159 static buf_T *ins_compl_next_buf __ARGS((buf_T *buf, int flag));
724
a35dce0cabc5 updated for version 7.0220
vimboss
parents: 716
diff changeset
160 #if defined(FEAT_COMPL_FUNC) || defined(FEAT_EVAL)
a35dce0cabc5 updated for version 7.0220
vimboss
parents: 716
diff changeset
161 static void ins_compl_add_list __ARGS((list_T *list));
a35dce0cabc5 updated for version 7.0220
vimboss
parents: 716
diff changeset
162 #endif
659
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
163 static int ins_compl_get_exp __ARGS((pos_T *ini));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
164 static void ins_compl_delete __ARGS((void));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
165 static void ins_compl_insert __ARGS((void));
665
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
166 static int ins_compl_next __ARGS((int allow_get_expansion, int count, int insert_match));
610
cd3689efd90a updated for version 7.0173
vimboss
parents: 603
diff changeset
167 static int ins_compl_key2dir __ARGS((int c));
644
e4fa26ce8769 updated for version 7.0187
vimboss
parents: 634
diff changeset
168 static int ins_compl_pum_key __ARGS((int c));
610
cd3689efd90a updated for version 7.0173
vimboss
parents: 603
diff changeset
169 static int ins_compl_key2count __ARGS((int c));
681
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
170 static int ins_compl_use_match __ARGS((int c));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
171 static int ins_complete __ARGS((int c));
1872
f13849167330 updated for version 7.2-169
vimboss
parents: 1869
diff changeset
172 static unsigned quote_meta __ARGS((char_u *dest, char_u *str, int len));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
173 #endif /* FEAT_INS_EXPAND */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
174
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
175 #define BACKSPACE_CHAR 1
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
176 #define BACKSPACE_WORD 2
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
177 #define BACKSPACE_WORD_NOT_SPACE 3
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
178 #define BACKSPACE_LINE 4
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
179
661
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 659
diff changeset
180 static void ins_redraw __ARGS((int ready));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
181 static void ins_ctrl_v __ARGS((void));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
182 static void undisplay_dollar __ARGS((void));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
183 static void insert_special __ARGS((int, int, int));
2004
9e554211caf5 updated for version 7.2-301
vimboss
parents: 1988
diff changeset
184 static void internal_format __ARGS((int textwidth, int second_indent, int flags, int format_only, int c));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
185 static void check_auto_format __ARGS((int));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
186 static void redo_literal __ARGS((int c));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
187 static void start_arrow __ARGS((pos_T *end_insert_pos));
744
07f7b4a7755c updated for version 7.0222
vimboss
parents: 732
diff changeset
188 #ifdef FEAT_SPELL
221
7fd4b5df33be updated for version 7.0062
vimboss
parents: 180
diff changeset
189 static void check_spell_redraw __ARGS((void));
484
f012c4ed8c38 updated for version 7.0132
vimboss
parents: 477
diff changeset
190 static void spell_back_to_badword __ARGS((void));
497
73f10d8124f4 updated for version 7.0136
vimboss
parents: 484
diff changeset
191 static int spell_bad_len = 0; /* length of located bad word */
221
7fd4b5df33be updated for version 7.0062
vimboss
parents: 180
diff changeset
192 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
193 static void stop_insert __ARGS((pos_T *end_insert_pos, int esc));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
194 static int echeck_abbr __ARGS((int));
840
2c885fab04e3 updated for version 7.0e06
vimboss
parents: 836
diff changeset
195 #if 0
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
196 static void replace_push_off __ARGS((int c));
840
2c885fab04e3 updated for version 7.0e06
vimboss
parents: 836
diff changeset
197 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
198 static int replace_pop __ARGS((void));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
199 static void replace_join __ARGS((int off));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
200 static void replace_pop_ins __ARGS((void));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
201 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
202 static void mb_replace_pop_ins __ARGS((int cc));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
203 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
204 static void replace_flush __ARGS((void));
1782
12cecc379574 updated for version 7.2-080
vimboss
parents: 1698
diff changeset
205 static void replace_do_bs __ARGS((int limit_col));
12cecc379574 updated for version 7.2-080
vimboss
parents: 1698
diff changeset
206 static int del_char_after_col __ARGS((int limit_col));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
207 #ifdef FEAT_CINDENT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
208 static int cindent_on __ARGS((void));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
209 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
210 static void ins_reg __ARGS((void));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
211 static void ins_ctrl_g __ARGS((void));
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
212 static void ins_ctrl_hat __ARGS((void));
477
f8b75b8f1988 updated for version 7.0128
vimboss
parents: 474
diff changeset
213 static int ins_esc __ARGS((long *count, int cmdchar, int nomove));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
214 #ifdef FEAT_RIGHTLEFT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
215 static void ins_ctrl_ __ARGS((void));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
216 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
217 #ifdef FEAT_VISUAL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
218 static int ins_start_select __ARGS((int c));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
219 #endif
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
220 static void ins_insert __ARGS((int replaceState));
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
221 static void ins_ctrl_o __ARGS((void));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
222 static void ins_shift __ARGS((int c, int lastc));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
223 static void ins_del __ARGS((void));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
224 static int ins_bs __ARGS((int c, int mode, int *inserted_space_p));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
225 #ifdef FEAT_MOUSE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
226 static void ins_mouse __ARGS((int c));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
227 static void ins_mousescroll __ARGS((int up));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
228 #endif
692
a28f83d37113 updated for version 7.0208
vimboss
parents: 683
diff changeset
229 #if defined(FEAT_GUI_TABLINE) || defined(PROTO)
a28f83d37113 updated for version 7.0208
vimboss
parents: 683
diff changeset
230 static void ins_tabline __ARGS((int c));
a28f83d37113 updated for version 7.0208
vimboss
parents: 683
diff changeset
231 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
232 static void ins_left __ARGS((void));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
233 static void ins_home __ARGS((int c));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
234 static void ins_end __ARGS((int c));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
235 static void ins_s_left __ARGS((void));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
236 static void ins_right __ARGS((void));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
237 static void ins_s_right __ARGS((void));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
238 static void ins_up __ARGS((int startcol));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
239 static void ins_pageup __ARGS((void));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
240 static void ins_down __ARGS((int startcol));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
241 static void ins_pagedown __ARGS((void));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
242 #ifdef FEAT_DND
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
243 static void ins_drop __ARGS((void));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
244 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
245 static int ins_tab __ARGS((void));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
246 static int ins_eol __ARGS((int c));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
247 #ifdef FEAT_DIGRAPHS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
248 static int ins_digraph __ARGS((void));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
249 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
250 static int ins_copychar __ARGS((linenr_T lnum));
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
251 static int ins_ctrl_ey __ARGS((int tc));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
252 #ifdef FEAT_SMARTINDENT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
253 static void ins_try_si __ARGS((int c));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
254 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
255 static colnr_T get_nolist_virtcol __ARGS((void));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
256
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
257 static colnr_T Insstart_textlen; /* length of line when insert started */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
258 static colnr_T Insstart_blank_vcol; /* vcol for first inserted blank */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
259
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
260 static char_u *last_insert = NULL; /* the text of the previous insert,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
261 K_SPECIAL and CSI are escaped */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
262 static int last_insert_skip; /* nr of chars in front of previous insert */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
263 static int new_insert_skip; /* nr of chars in front of current insert */
603
e4c00ec07598 updated for version 7.0171
vimboss
parents: 574
diff changeset
264 static int did_restart_edit; /* "restart_edit" when calling edit() */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
265
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
266 #ifdef FEAT_CINDENT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
267 static int can_cindent; /* may do cindenting on this line */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
268 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
269
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
270 static int old_indent = 0; /* for ^^D command in insert mode */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
271
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
272 #ifdef FEAT_RIGHTLEFT
298
f9de3e679a04 updated for version 7.0078
vimboss
parents: 278
diff changeset
273 static int revins_on; /* reverse insert mode on */
f9de3e679a04 updated for version 7.0078
vimboss
parents: 278
diff changeset
274 static int revins_chars; /* how much to skip after edit */
f9de3e679a04 updated for version 7.0078
vimboss
parents: 278
diff changeset
275 static int revins_legal; /* was the last char 'legal'? */
f9de3e679a04 updated for version 7.0078
vimboss
parents: 278
diff changeset
276 static int revins_scol; /* start column of revins session */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
277 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
278
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
279 static int ins_need_undo; /* call u_save() before inserting a
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
280 char. Set when edit() is called.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
281 after that arrow_used is used. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
282
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
283 static int did_add_space = FALSE; /* auto_format() added an extra space
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
284 under the cursor */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
285
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
286 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
287 * edit(): Start inserting text.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
288 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
289 * "cmdchar" can be:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
290 * 'i' normal insert command
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
291 * 'a' normal append command
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
292 * 'R' replace command
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
293 * 'r' "r<CR>" command: insert one <CR>. Note: count can be > 1, for redo,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
294 * but still only one <CR> is inserted. The <Esc> is not used for redo.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
295 * 'g' "gI" command.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
296 * 'V' "gR" command for Virtual Replace mode.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
297 * 'v' "gr" command for single character Virtual Replace mode.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
298 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
299 * This function is not called recursively. For CTRL-O commands, it returns
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
300 * and lets the caller handle the Normal-mode command.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
301 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
302 * Return TRUE if a CTRL-O command caused the return (insert mode pending).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
303 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
304 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
305 edit(cmdchar, startln, count)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
306 int cmdchar;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
307 int startln; /* if set, insert at start of line */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
308 long count;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
309 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
310 int c = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
311 char_u *ptr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
312 int lastc;
1869
720a59d79bcd updated for version 7.2-168
vimboss
parents: 1811
diff changeset
313 int mincol;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
314 static linenr_T o_lnum = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
315 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
316 int did_backspace = TRUE; /* previous char was backspace */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
317 #ifdef FEAT_CINDENT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
318 int line_is_white = FALSE; /* line is empty before insert */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
319 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
320 linenr_T old_topline = 0; /* topline before insertion */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
321 #ifdef FEAT_DIFF
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
322 int old_topfill = -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
323 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
324 int inserted_space = FALSE; /* just inserted a space */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
325 int replaceState = REPLACE;
477
f8b75b8f1988 updated for version 7.0128
vimboss
parents: 474
diff changeset
326 int nomove = FALSE; /* don't move cursor on return */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
327
603
e4c00ec07598 updated for version 7.0171
vimboss
parents: 574
diff changeset
328 /* Remember whether editing was restarted after CTRL-O. */
e4c00ec07598 updated for version 7.0171
vimboss
parents: 574
diff changeset
329 did_restart_edit = restart_edit;
e4c00ec07598 updated for version 7.0171
vimboss
parents: 574
diff changeset
330
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
331 /* sleep before redrawing, needed for "CTRL-O :" that results in an
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
332 * error message */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
333 check_for_delay(TRUE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
334
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
335 #ifdef HAVE_SANDBOX
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
336 /* Don't allow inserting in the sandbox. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
337 if (sandbox != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
338 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
339 EMSG(_(e_sandbox));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
340 return FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
341 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
342 #endif
632
b6632d553df3 updated for version 7.0182
vimboss
parents: 626
diff changeset
343 /* Don't allow changes in the buffer while editing the cmdline. The
b6632d553df3 updated for version 7.0182
vimboss
parents: 626
diff changeset
344 * caller of getcmdline() may get confused. */
634
1c586ee8dd45 updated for version 7.0183
vimboss
parents: 632
diff changeset
345 if (textlock != 0)
632
b6632d553df3 updated for version 7.0182
vimboss
parents: 626
diff changeset
346 {
b6632d553df3 updated for version 7.0182
vimboss
parents: 626
diff changeset
347 EMSG(_(e_secure));
b6632d553df3 updated for version 7.0182
vimboss
parents: 626
diff changeset
348 return FALSE;
b6632d553df3 updated for version 7.0182
vimboss
parents: 626
diff changeset
349 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
350
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
351 #ifdef FEAT_INS_EXPAND
844
d3bbb5dd3913 updated for version 7.0f02
vimboss
parents: 842
diff changeset
352 /* Don't allow recursive insert mode when busy with completion. */
1927
f798c9043986 updated for version 7.2-224
vimboss
parents: 1892
diff changeset
353 if (compl_started || compl_busy || pum_visible())
844
d3bbb5dd3913 updated for version 7.0f02
vimboss
parents: 842
diff changeset
354 {
d3bbb5dd3913 updated for version 7.0f02
vimboss
parents: 842
diff changeset
355 EMSG(_(e_secure));
d3bbb5dd3913 updated for version 7.0f02
vimboss
parents: 842
diff changeset
356 return FALSE;
d3bbb5dd3913 updated for version 7.0f02
vimboss
parents: 842
diff changeset
357 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
358 ins_compl_clear(); /* clear stuff for CTRL-X mode */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
359 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
360
11
4424b47a0797 updated for version 7.0003
vimboss
parents: 10
diff changeset
361 #ifdef FEAT_AUTOCMD
4424b47a0797 updated for version 7.0003
vimboss
parents: 10
diff changeset
362 /*
4424b47a0797 updated for version 7.0003
vimboss
parents: 10
diff changeset
363 * Trigger InsertEnter autocommands. Do not do this for "r<CR>" or "grx".
4424b47a0797 updated for version 7.0003
vimboss
parents: 10
diff changeset
364 */
4424b47a0797 updated for version 7.0003
vimboss
parents: 10
diff changeset
365 if (cmdchar != 'r' && cmdchar != 'v')
4424b47a0797 updated for version 7.0003
vimboss
parents: 10
diff changeset
366 {
532
7052f11a3dc9 updated for version 7.0150
vimboss
parents: 523
diff changeset
367 # ifdef FEAT_EVAL
11
4424b47a0797 updated for version 7.0003
vimboss
parents: 10
diff changeset
368 if (cmdchar == 'R')
4424b47a0797 updated for version 7.0003
vimboss
parents: 10
diff changeset
369 ptr = (char_u *)"r";
4424b47a0797 updated for version 7.0003
vimboss
parents: 10
diff changeset
370 else if (cmdchar == 'V')
4424b47a0797 updated for version 7.0003
vimboss
parents: 10
diff changeset
371 ptr = (char_u *)"v";
4424b47a0797 updated for version 7.0003
vimboss
parents: 10
diff changeset
372 else
4424b47a0797 updated for version 7.0003
vimboss
parents: 10
diff changeset
373 ptr = (char_u *)"i";
4424b47a0797 updated for version 7.0003
vimboss
parents: 10
diff changeset
374 set_vim_var_string(VV_INSERTMODE, ptr, 1);
532
7052f11a3dc9 updated for version 7.0150
vimboss
parents: 523
diff changeset
375 # endif
11
4424b47a0797 updated for version 7.0003
vimboss
parents: 10
diff changeset
376 apply_autocmds(EVENT_INSERTENTER, NULL, NULL, FALSE, curbuf);
4424b47a0797 updated for version 7.0003
vimboss
parents: 10
diff changeset
377 }
4424b47a0797 updated for version 7.0003
vimboss
parents: 10
diff changeset
378 #endif
4424b47a0797 updated for version 7.0003
vimboss
parents: 10
diff changeset
379
2378
85b7dc8da5eb Add the 'concealcursor' option to decide when the cursor line is to be
Bram Moolenaar <bram@vim.org>
parents: 2348
diff changeset
380 #ifdef FEAT_CONCEAL
85b7dc8da5eb Add the 'concealcursor' option to decide when the cursor line is to be
Bram Moolenaar <bram@vim.org>
parents: 2348
diff changeset
381 /* Check if the cursor line needs redrawing before changing State. If
85b7dc8da5eb Add the 'concealcursor' option to decide when the cursor line is to be
Bram Moolenaar <bram@vim.org>
parents: 2348
diff changeset
382 * 'concealcursor' is "n" it needs to be redrawn without concealing. */
85b7dc8da5eb Add the 'concealcursor' option to decide when the cursor line is to be
Bram Moolenaar <bram@vim.org>
parents: 2348
diff changeset
383 conceal_check_cursur_line_redraw();
85b7dc8da5eb Add the 'concealcursor' option to decide when the cursor line is to be
Bram Moolenaar <bram@vim.org>
parents: 2348
diff changeset
384 #endif
85b7dc8da5eb Add the 'concealcursor' option to decide when the cursor line is to be
Bram Moolenaar <bram@vim.org>
parents: 2348
diff changeset
385
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
386 #ifdef FEAT_MOUSE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
387 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
388 * When doing a paste with the middle mouse button, Insstart is set to
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
389 * where the paste started.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
390 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
391 if (where_paste_started.lnum != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
392 Insstart = where_paste_started;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
393 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
394 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
395 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
396 Insstart = curwin->w_cursor;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
397 if (startln)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
398 Insstart.col = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
399 }
1869
720a59d79bcd updated for version 7.2-168
vimboss
parents: 1811
diff changeset
400 Insstart_textlen = (colnr_T)linetabsize(ml_get_curline());
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
401 Insstart_blank_vcol = MAXCOL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
402 if (!did_ai)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
403 ai_col = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
404
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
405 if (cmdchar != NUL && restart_edit == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
406 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
407 ResetRedobuff();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
408 AppendNumberToRedobuff(count);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
409 #ifdef FEAT_VREPLACE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
410 if (cmdchar == 'V' || cmdchar == 'v')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
411 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
412 /* "gR" or "gr" command */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
413 AppendCharToRedobuff('g');
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
414 AppendCharToRedobuff((cmdchar == 'v') ? 'r' : 'R');
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
415 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
416 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
417 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
418 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
419 AppendCharToRedobuff(cmdchar);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
420 if (cmdchar == 'g') /* "gI" command */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
421 AppendCharToRedobuff('I');
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
422 else if (cmdchar == 'r') /* "r<CR>" command */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
423 count = 1; /* insert only one <CR> */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
424 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
425 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
426
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
427 if (cmdchar == 'R')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
428 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
429 #ifdef FEAT_FKMAP
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
430 if (p_fkmap && p_ri)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
431 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
432 beep_flush();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
433 EMSG(farsi_text_3); /* encoded in Farsi */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
434 State = INSERT;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
435 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
436 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
437 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
438 State = REPLACE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
439 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
440 #ifdef FEAT_VREPLACE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
441 else if (cmdchar == 'V' || cmdchar == 'v')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
442 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
443 State = VREPLACE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
444 replaceState = VREPLACE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
445 orig_line_count = curbuf->b_ml.ml_line_count;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
446 vr_lines_changed = 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
447 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
448 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
449 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
450 State = INSERT;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
451
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
452 stop_insert_mode = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
453
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
454 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
455 * Need to recompute the cursor position, it might move when the cursor is
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
456 * on a TAB or special character.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
457 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
458 curs_columns(TRUE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
459
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
460 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
461 * Enable langmap or IME, indicated by 'iminsert'.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
462 * Note that IME may enabled/disabled without us noticing here, thus the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
463 * 'iminsert' value may not reflect what is actually used. It is updated
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
464 * when hitting <Esc>.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
465 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
466 if (curbuf->b_p_iminsert == B_IMODE_LMAP)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
467 State |= LANGMAP;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
468 #ifdef USE_IM_CONTROL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
469 im_set_active(curbuf->b_p_iminsert == B_IMODE_IM);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
470 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
471
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
472 #ifdef FEAT_MOUSE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
473 setmouse();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
474 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
475 #ifdef FEAT_CMDL_INFO
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
476 clear_showcmd();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
477 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
478 #ifdef FEAT_RIGHTLEFT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
479 /* there is no reverse replace mode */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
480 revins_on = (State == INSERT && p_ri);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
481 if (revins_on)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
482 undisplay_dollar();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
483 revins_chars = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
484 revins_legal = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
485 revins_scol = -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
486 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
487
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
488 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
489 * Handle restarting Insert mode.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
490 * Don't do this for "CTRL-O ." (repeat an insert): we get here with
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
491 * restart_edit non-zero, and something in the stuff buffer.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
492 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
493 if (restart_edit != 0 && stuff_empty())
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
494 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
495 #ifdef FEAT_MOUSE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
496 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
497 * After a paste we consider text typed to be part of the insert for
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
498 * the pasted text. You can backspace over the pasted text too.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
499 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
500 if (where_paste_started.lnum)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
501 arrow_used = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
502 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
503 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
504 arrow_used = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
505 restart_edit = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
506
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
507 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
508 * If the cursor was after the end-of-line before the CTRL-O and it is
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
509 * now at the end-of-line, put it after the end-of-line (this is not
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
510 * correct in very rare cases).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
511 * Also do this if curswant is greater than the current virtual
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
512 * column. Eg after "^O$" or "^O80|".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
513 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
514 validate_virtcol();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
515 update_curswant();
230
9281a51ca7a2 updated for version 7.0064
vimboss
parents: 221
diff changeset
516 if (((ins_at_eol && curwin->w_cursor.lnum == o_lnum)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
517 || curwin->w_curswant > curwin->w_virtcol)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
518 && *(ptr = ml_get_curline() + curwin->w_cursor.col) != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
519 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
520 if (ptr[1] == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
521 ++curwin->w_cursor.col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
522 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
523 else if (has_mbyte)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
524 {
474
a5fcf36ef512 updated for version 7.0127
vimboss
parents: 470
diff changeset
525 i = (*mb_ptr2len)(ptr);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
526 if (ptr[i] == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
527 curwin->w_cursor.col += i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
528 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
529 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
530 }
230
9281a51ca7a2 updated for version 7.0064
vimboss
parents: 221
diff changeset
531 ins_at_eol = FALSE;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
532 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
533 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
534 arrow_used = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
535
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
536 /* we are in insert mode now, don't need to start it anymore */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
537 need_start_insertmode = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
538
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
539 /* Need to save the line for undo before inserting the first char. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
540 ins_need_undo = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
541
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
542 #ifdef FEAT_MOUSE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
543 where_paste_started.lnum = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
544 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
545 #ifdef FEAT_CINDENT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
546 can_cindent = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
547 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
548 #ifdef FEAT_FOLDING
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
549 /* The cursor line is not in a closed fold, unless 'insertmode' is set or
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
550 * restarting. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
551 if (!p_im && did_restart_edit == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
552 foldOpenCursor();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
553 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
554
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
555 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
556 * If 'showmode' is set, show the current (insert/replace/..) mode.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
557 * A warning message for changing a readonly file is given here, before
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
558 * actually changing anything. It's put after the mode, if any.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
559 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
560 i = 0;
644
e4fa26ce8769 updated for version 7.0187
vimboss
parents: 634
diff changeset
561 if (p_smd && msg_silent == 0)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
562 i = showmode();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
563
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
564 if (!p_im && did_restart_edit == 0)
1473
5ba8e25f7fc1 updated for version 7.1-188
vimboss
parents: 1470
diff changeset
565 change_warning(i == 0 ? 0 : i + 1);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
566
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
567 #ifdef CURSOR_SHAPE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
568 ui_cursor_shape(); /* may show different cursor shape */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
569 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
570 #ifdef FEAT_DIGRAPHS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
571 do_digraph(-1); /* clear digraphs */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
572 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
573
603
e4c00ec07598 updated for version 7.0171
vimboss
parents: 574
diff changeset
574 /*
e4c00ec07598 updated for version 7.0171
vimboss
parents: 574
diff changeset
575 * Get the current length of the redo buffer, those characters have to be
e4c00ec07598 updated for version 7.0171
vimboss
parents: 574
diff changeset
576 * skipped if we want to get to the inserted characters.
e4c00ec07598 updated for version 7.0171
vimboss
parents: 574
diff changeset
577 */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
578 ptr = get_inserted();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
579 if (ptr == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
580 new_insert_skip = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
581 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
582 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
583 new_insert_skip = (int)STRLEN(ptr);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
584 vim_free(ptr);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
585 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
586
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
587 old_indent = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
588
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
589 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
590 * Main loop in Insert mode: repeat until Insert mode is left.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
591 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
592 for (;;)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
593 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
594 #ifdef FEAT_RIGHTLEFT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
595 if (!revins_legal)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
596 revins_scol = -1; /* reset on illegal motions */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
597 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
598 revins_legal = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
599 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
600 if (arrow_used) /* don't repeat insert when arrow key used */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
601 count = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
602
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
603 if (stop_insert_mode)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
604 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
605 /* ":stopinsert" used or 'insertmode' reset */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
606 count = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
607 goto doESCkey;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
608 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
609
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
610 /* set curwin->w_curswant for next K_DOWN or K_UP */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
611 if (!arrow_used)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
612 curwin->w_set_curswant = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
613
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
614 /* If there is no typeahead may check for timestamps (e.g., for when a
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
615 * menu invoked a shell command). */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
616 if (stuff_empty())
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
617 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
618 did_check_timestamps = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
619 if (need_check_timestamps)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
620 check_timestamps(FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
621 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
622
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
623 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
624 * When emsg() was called msg_scroll will have been set.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
625 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
626 msg_scroll = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
627
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
628 #ifdef FEAT_GUI
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
629 /* When 'mousefocus' is set a mouse movement may have taken us to
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
630 * another window. "need_mouse_correct" may then be set because of an
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
631 * autocommand. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
632 if (need_mouse_correct)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
633 gui_mouse_correct();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
634 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
635
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
636 #ifdef FEAT_FOLDING
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
637 /* Open fold at the cursor line, according to 'foldopen'. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
638 if (fdo_flags & FDO_INSERT)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
639 foldOpenCursor();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
640 /* Close folds where the cursor isn't, according to 'foldclose' */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
641 if (!char_avail())
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
642 foldCheckClose();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
643 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
644
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
645 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
646 * If we inserted a character at the last position of the last line in
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
647 * the window, scroll the window one line up. This avoids an extra
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
648 * redraw.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
649 * This is detected when the cursor column is smaller after inserting
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
650 * something.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
651 * Don't do this when the topline changed already, it has
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
652 * already been adjusted (by insertchar() calling open_line())).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
653 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
654 if (curbuf->b_mod_set
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
655 && curwin->w_p_wrap
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
656 && !did_backspace
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
657 && curwin->w_topline == old_topline
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
658 #ifdef FEAT_DIFF
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
659 && curwin->w_topfill == old_topfill
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
660 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
661 )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
662 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
663 mincol = curwin->w_wcol;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
664 validate_cursor_col();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
665
1869
720a59d79bcd updated for version 7.2-168
vimboss
parents: 1811
diff changeset
666 if ((int)curwin->w_wcol < mincol - curbuf->b_p_ts
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
667 && curwin->w_wrow == W_WINROW(curwin)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
668 + curwin->w_height - 1 - p_so
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
669 && (curwin->w_cursor.lnum != curwin->w_topline
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
670 #ifdef FEAT_DIFF
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
671 || curwin->w_topfill > 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
672 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
673 ))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
674 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
675 #ifdef FEAT_DIFF
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
676 if (curwin->w_topfill > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
677 --curwin->w_topfill;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
678 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
679 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
680 #ifdef FEAT_FOLDING
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
681 if (hasFolding(curwin->w_topline, NULL, &old_topline))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
682 set_topline(curwin, old_topline + 1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
683 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
684 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
685 set_topline(curwin, curwin->w_topline + 1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
686 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
687 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
688
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
689 /* May need to adjust w_topline to show the cursor. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
690 update_topline();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
691
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
692 did_backspace = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
693
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
694 validate_cursor(); /* may set must_redraw */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
695
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
696 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
697 * Redraw the display when no characters are waiting.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
698 * Also shows mode, ruler and positions cursor.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
699 */
661
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 659
diff changeset
700 ins_redraw(TRUE);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
701
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
702 #ifdef FEAT_SCROLLBIND
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
703 if (curwin->w_p_scb)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
704 do_check_scrollbind(TRUE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
705 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
706
2250
1bac28a53fae Add the conceal patch from Vince Negri.
Bram Moolenaar <bram@vim.org>
parents: 2227
diff changeset
707 #ifdef FEAT_CURSORBIND
1bac28a53fae Add the conceal patch from Vince Negri.
Bram Moolenaar <bram@vim.org>
parents: 2227
diff changeset
708 if (curwin->w_p_crb)
1bac28a53fae Add the conceal patch from Vince Negri.
Bram Moolenaar <bram@vim.org>
parents: 2227
diff changeset
709 do_check_cursorbind();
1bac28a53fae Add the conceal patch from Vince Negri.
Bram Moolenaar <bram@vim.org>
parents: 2227
diff changeset
710 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
711 update_curswant();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
712 old_topline = curwin->w_topline;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
713 #ifdef FEAT_DIFF
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
714 old_topfill = curwin->w_topfill;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
715 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
716
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
717 #ifdef USE_ON_FLY_SCROLL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
718 dont_scroll = FALSE; /* allow scrolling here */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
719 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
720
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
721 /*
1526
f79bb0320025 updated for version 7.1-241
vimboss
parents: 1516
diff changeset
722 * Get a character for Insert mode. Ignore K_IGNORE.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
723 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
724 lastc = c; /* remember previous char for CTRL-D */
1526
f79bb0320025 updated for version 7.1-241
vimboss
parents: 1516
diff changeset
725 do
f79bb0320025 updated for version 7.1-241
vimboss
parents: 1516
diff changeset
726 {
f79bb0320025 updated for version 7.1-241
vimboss
parents: 1516
diff changeset
727 c = safe_vgetc();
f79bb0320025 updated for version 7.1-241
vimboss
parents: 1516
diff changeset
728 } while (c == K_IGNORE);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
729
978
0e3e208b4b90 updated for version 7.0-104
vimboss
parents: 947
diff changeset
730 #ifdef FEAT_AUTOCMD
0e3e208b4b90 updated for version 7.0-104
vimboss
parents: 947
diff changeset
731 /* Don't want K_CURSORHOLD for the second key, e.g., after CTRL-V. */
0e3e208b4b90 updated for version 7.0-104
vimboss
parents: 947
diff changeset
732 did_cursorhold = TRUE;
0e3e208b4b90 updated for version 7.0-104
vimboss
parents: 947
diff changeset
733 #endif
0e3e208b4b90 updated for version 7.0-104
vimboss
parents: 947
diff changeset
734
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
735 #ifdef FEAT_RIGHTLEFT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
736 if (p_hkmap && KeyTyped)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
737 c = hkmap(c); /* Hebrew mode mapping */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
738 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
739 #ifdef FEAT_FKMAP
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
740 if (p_fkmap && KeyTyped)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
741 c = fkmap(c); /* Farsi mode mapping */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
742 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
743
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
744 #ifdef FEAT_INS_EXPAND
659
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
745 /*
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
746 * Special handling of keys while the popup menu is visible or wanted
897
2e1e9b708941 updated for version 7.0-023
vimboss
parents: 887
diff changeset
747 * and the cursor is still in the completed word. Only when there is
2e1e9b708941 updated for version 7.0-023
vimboss
parents: 887
diff changeset
748 * a match, skip this when no matches were found.
659
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
749 */
897
2e1e9b708941 updated for version 7.0-023
vimboss
parents: 887
diff changeset
750 if (compl_started
2e1e9b708941 updated for version 7.0-023
vimboss
parents: 887
diff changeset
751 && pum_wanted()
2e1e9b708941 updated for version 7.0-023
vimboss
parents: 887
diff changeset
752 && curwin->w_cursor.col >= compl_col
2e1e9b708941 updated for version 7.0-023
vimboss
parents: 887
diff changeset
753 && (compl_shown_match == NULL
2e1e9b708941 updated for version 7.0-023
vimboss
parents: 887
diff changeset
754 || compl_shown_match != compl_shown_match->cp_next))
659
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
755 {
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
756 /* BS: Delete one character from "compl_leader". */
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
757 if ((c == K_BS || c == Ctrl_H)
836
5a7843c57316 updated for version 7.0e02
vimboss
parents: 835
diff changeset
758 && curwin->w_cursor.col > compl_col
5a7843c57316 updated for version 7.0e02
vimboss
parents: 835
diff changeset
759 && (c = ins_compl_bs()) == NUL)
657
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
760 continue;
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
761
659
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
762 /* When no match was selected or it was edited. */
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
763 if (!compl_used_match)
657
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
764 {
659
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
765 /* CTRL-L: Add one character from the current match to
836
5a7843c57316 updated for version 7.0e02
vimboss
parents: 835
diff changeset
766 * "compl_leader". Except when at the original match and
5a7843c57316 updated for version 7.0e02
vimboss
parents: 835
diff changeset
767 * there is nothing to add, CTRL-L works like CTRL-P then. */
5a7843c57316 updated for version 7.0e02
vimboss
parents: 835
diff changeset
768 if (c == Ctrl_L
5a7843c57316 updated for version 7.0e02
vimboss
parents: 835
diff changeset
769 && (ctrl_x_mode != CTRL_X_WHOLE_LINE
1872
f13849167330 updated for version 7.2-169
vimboss
parents: 1869
diff changeset
770 || (int)STRLEN(compl_shown_match->cp_str)
836
5a7843c57316 updated for version 7.0e02
vimboss
parents: 835
diff changeset
771 > curwin->w_cursor.col - compl_col))
659
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
772 {
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
773 ins_compl_addfrommatch();
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
774 continue;
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
775 }
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
776
1430
342cf2a9f5cc updated for version 7.1-145
vimboss
parents: 1389
diff changeset
777 /* A non-white character that fits in with the current
342cf2a9f5cc updated for version 7.1-145
vimboss
parents: 1389
diff changeset
778 * completion: Add to "compl_leader". */
342cf2a9f5cc updated for version 7.1-145
vimboss
parents: 1389
diff changeset
779 if (ins_compl_accept_char(c))
659
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
780 {
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
781 ins_compl_addleader(c);
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
782 continue;
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
783 }
665
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
784
887
9dc77520c6d3 updated for version 7.0-013
vimboss
parents: 874
diff changeset
785 /* Pressing CTRL-Y selects the current match. When
825
6675076019ae updated for version 7.0d
vimboss
parents: 819
diff changeset
786 * compl_enter_selects is set the Enter key does the same. */
6675076019ae updated for version 7.0d
vimboss
parents: 819
diff changeset
787 if (c == Ctrl_Y || (compl_enter_selects
6675076019ae updated for version 7.0d
vimboss
parents: 819
diff changeset
788 && (c == CAR || c == K_KENTER || c == NL)))
665
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
789 {
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
790 ins_compl_delete();
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
791 ins_compl_insert();
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
792 }
657
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
793 }
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
794 }
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
795
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
796 /* Prepare for or stop CTRL-X mode. This doesn't do completion, but
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
797 * it does fix up the text when finishing completion. */
665
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
798 compl_get_longest = FALSE;
1526
f79bb0320025 updated for version 7.1-241
vimboss
parents: 1516
diff changeset
799 if (ins_compl_prep(c))
657
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
800 continue;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
801 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
802
477
f8b75b8f1988 updated for version 7.0128
vimboss
parents: 474
diff changeset
803 /* CTRL-\ CTRL-N goes to Normal mode,
f8b75b8f1988 updated for version 7.0128
vimboss
parents: 474
diff changeset
804 * CTRL-\ CTRL-G goes to mode selected with 'insertmode',
f8b75b8f1988 updated for version 7.0128
vimboss
parents: 474
diff changeset
805 * CTRL-\ CTRL-O is like CTRL-O but without moving the cursor. */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
806 if (c == Ctrl_BSL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
807 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
808 /* may need to redraw when no more chars available now */
661
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 659
diff changeset
809 ins_redraw(FALSE);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
810 ++no_mapping;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
811 ++allow_keys;
1389
bdcfe793d49f updated for version 7.1-104
vimboss
parents: 1353
diff changeset
812 c = plain_vgetc();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
813 --no_mapping;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
814 --allow_keys;
477
f8b75b8f1988 updated for version 7.0128
vimboss
parents: 474
diff changeset
815 if (c != Ctrl_N && c != Ctrl_G && c != Ctrl_O)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
816 {
477
f8b75b8f1988 updated for version 7.0128
vimboss
parents: 474
diff changeset
817 /* it's something else */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
818 vungetc(c);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
819 c = Ctrl_BSL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
820 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
821 else if (c == Ctrl_G && p_im)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
822 continue;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
823 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
824 {
477
f8b75b8f1988 updated for version 7.0128
vimboss
parents: 474
diff changeset
825 if (c == Ctrl_O)
f8b75b8f1988 updated for version 7.0128
vimboss
parents: 474
diff changeset
826 {
f8b75b8f1988 updated for version 7.0128
vimboss
parents: 474
diff changeset
827 ins_ctrl_o();
f8b75b8f1988 updated for version 7.0128
vimboss
parents: 474
diff changeset
828 ins_at_eol = FALSE; /* cursor keeps its column */
f8b75b8f1988 updated for version 7.0128
vimboss
parents: 474
diff changeset
829 nomove = TRUE;
f8b75b8f1988 updated for version 7.0128
vimboss
parents: 474
diff changeset
830 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
831 count = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
832 goto doESCkey;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
833 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
834 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
835
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
836 #ifdef FEAT_DIGRAPHS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
837 c = do_digraph(c);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
838 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
839
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
840 #ifdef FEAT_INS_EXPAND
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
841 if ((c == Ctrl_V || c == Ctrl_Q) && ctrl_x_mode == CTRL_X_CMDLINE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
842 goto docomplete;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
843 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
844 if (c == Ctrl_V || c == Ctrl_Q)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
845 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
846 ins_ctrl_v();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
847 c = Ctrl_V; /* pretend CTRL-V is last typed character */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
848 continue;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
849 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
850
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
851 #ifdef FEAT_CINDENT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
852 if (cindent_on()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
853 # ifdef FEAT_INS_EXPAND
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
854 && ctrl_x_mode == 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
855 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
856 )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
857 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
858 /* A key name preceded by a bang means this key is not to be
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
859 * inserted. Skip ahead to the re-indenting below.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
860 * A key name preceded by a star means that indenting has to be
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
861 * done before inserting the key. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
862 line_is_white = inindent(0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
863 if (in_cinkeys(c, '!', line_is_white))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
864 goto force_cindent;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
865 if (can_cindent && in_cinkeys(c, '*', line_is_white)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
866 && stop_arrow() == OK)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
867 do_c_expr_indent();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
868 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
869 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
870
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
871 #ifdef FEAT_RIGHTLEFT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
872 if (curwin->w_p_rl)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
873 switch (c)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
874 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
875 case K_LEFT: c = K_RIGHT; break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
876 case K_S_LEFT: c = K_S_RIGHT; break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
877 case K_C_LEFT: c = K_C_RIGHT; break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
878 case K_RIGHT: c = K_LEFT; break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
879 case K_S_RIGHT: c = K_S_LEFT; break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
880 case K_C_RIGHT: c = K_C_LEFT; break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
881 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
882 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
883
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
884 #ifdef FEAT_VISUAL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
885 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
886 * If 'keymodel' contains "startsel", may start selection. If it
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
887 * does, a CTRL-O and c will be stuffed, we need to get these
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
888 * characters.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
889 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
890 if (ins_start_select(c))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
891 continue;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
892 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
893
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
894 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
895 * The big switch to handle a character in insert mode.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
896 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
897 switch (c)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
898 {
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
899 case ESC: /* End input mode */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
900 if (echeck_abbr(ESC + ABBR_OFF))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
901 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
902 /*FALLTHROUGH*/
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
903
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
904 case Ctrl_C: /* End input mode */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
905 #ifdef FEAT_CMDWIN
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
906 if (c == Ctrl_C && cmdwin_type != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
907 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
908 /* Close the cmdline window. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
909 cmdwin_result = K_IGNORE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
910 got_int = FALSE; /* don't stop executing autocommands et al. */
929
2448f4c8afc6 updated for version 7.0-055
vimboss
parents: 909
diff changeset
911 nomove = TRUE;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
912 goto doESCkey;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
913 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
914 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
915
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
916 #ifdef UNIX
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
917 do_intr:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
918 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
919 /* when 'insertmode' set, and not halfway a mapping, don't leave
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
920 * Insert mode */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
921 if (goto_im())
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
922 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
923 if (got_int)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
924 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
925 (void)vgetc(); /* flush all buffers */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
926 got_int = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
927 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
928 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
929 vim_beep();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
930 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
931 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
932 doESCkey:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
933 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
934 * This is the ONLY return from edit()!
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
935 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
936 /* Always update o_lnum, so that a "CTRL-O ." that adds a line
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
937 * still puts the cursor back after the inserted text. */
230
9281a51ca7a2 updated for version 7.0064
vimboss
parents: 221
diff changeset
938 if (ins_at_eol && gchar_cursor() == NUL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
939 o_lnum = curwin->w_cursor.lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
940
477
f8b75b8f1988 updated for version 7.0128
vimboss
parents: 474
diff changeset
941 if (ins_esc(&count, cmdchar, nomove))
11
4424b47a0797 updated for version 7.0003
vimboss
parents: 10
diff changeset
942 {
4424b47a0797 updated for version 7.0003
vimboss
parents: 10
diff changeset
943 #ifdef FEAT_AUTOCMD
4424b47a0797 updated for version 7.0003
vimboss
parents: 10
diff changeset
944 if (cmdchar != 'r' && cmdchar != 'v')
4424b47a0797 updated for version 7.0003
vimboss
parents: 10
diff changeset
945 apply_autocmds(EVENT_INSERTLEAVE, NULL, NULL,
4424b47a0797 updated for version 7.0003
vimboss
parents: 10
diff changeset
946 FALSE, curbuf);
993
cbc9c335ddb1 updated for version 7.0-119
vimboss
parents: 989
diff changeset
947 did_cursorhold = FALSE;
11
4424b47a0797 updated for version 7.0003
vimboss
parents: 10
diff changeset
948 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
949 return (c == Ctrl_O);
11
4424b47a0797 updated for version 7.0003
vimboss
parents: 10
diff changeset
950 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
951 continue;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
952
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
953 case Ctrl_Z: /* suspend when 'insertmode' set */
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
954 if (!p_im)
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
955 goto normalchar; /* insert CTRL-Z as normal char */
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
956 stuffReadbuff((char_u *)":st\r");
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
957 c = Ctrl_O;
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
958 /*FALLTHROUGH*/
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
959
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
960 case Ctrl_O: /* execute one command */
502
52e76e2b5b65 updated for version 7.0140
vimboss
parents: 499
diff changeset
961 #ifdef FEAT_COMPL_FUNC
523
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 502
diff changeset
962 if (ctrl_x_mode == CTRL_X_OMNI)
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
963 goto docomplete;
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
964 #endif
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
965 if (echeck_abbr(Ctrl_O + ABBR_OFF))
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
966 break;
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
967 ins_ctrl_o();
853
d10fbefd3bc1 updated for version 7.0f05
vimboss
parents: 846
diff changeset
968
d10fbefd3bc1 updated for version 7.0f05
vimboss
parents: 846
diff changeset
969 #ifdef FEAT_VIRTUALEDIT
d10fbefd3bc1 updated for version 7.0f05
vimboss
parents: 846
diff changeset
970 /* don't move the cursor left when 'virtualedit' has "onemore". */
d10fbefd3bc1 updated for version 7.0f05
vimboss
parents: 846
diff changeset
971 if (ve_flags & VE_ONEMORE)
d10fbefd3bc1 updated for version 7.0f05
vimboss
parents: 846
diff changeset
972 {
d10fbefd3bc1 updated for version 7.0f05
vimboss
parents: 846
diff changeset
973 ins_at_eol = FALSE;
d10fbefd3bc1 updated for version 7.0f05
vimboss
parents: 846
diff changeset
974 nomove = TRUE;
d10fbefd3bc1 updated for version 7.0f05
vimboss
parents: 846
diff changeset
975 }
d10fbefd3bc1 updated for version 7.0f05
vimboss
parents: 846
diff changeset
976 #endif
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
977 count = 0;
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
978 goto doESCkey;
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
979
464
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
980 case K_INS: /* toggle insert/replace mode */
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
981 case K_KINS:
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
982 ins_insert(replaceState);
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
983 break;
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
984
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
985 case K_SELECT: /* end of Select mode mapping - ignore */
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
986 break;
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
987
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
988 #ifdef FEAT_SNIFF
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
989 case K_SNIFF: /* Sniff command received */
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
990 stuffcharReadbuff(K_SNIFF);
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
991 goto doESCkey;
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
992 #endif
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
993
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
994 case K_HELP: /* Help key works like <ESC> <Help> */
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
995 case K_F1:
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
996 case K_XF1:
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
997 stuffcharReadbuff(K_HELP);
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
998 if (p_im)
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
999 need_start_insertmode = TRUE;
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
1000 goto doESCkey;
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
1001
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
1002 #ifdef FEAT_NETBEANS_INTG
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
1003 case K_F21: /* NetBeans command */
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
1004 ++no_mapping; /* don't map the next key hits */
1389
bdcfe793d49f updated for version 7.1-104
vimboss
parents: 1353
diff changeset
1005 i = plain_vgetc();
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
1006 --no_mapping;
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
1007 netbeans_keycommand(i);
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
1008 break;
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
1009 #endif
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
1010
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
1011 case K_ZERO: /* Insert the previously inserted text. */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1012 case NUL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1013 case Ctrl_A:
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
1014 /* For ^@ the trailing ESC will end the insert, unless there is an
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
1015 * error. */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1016 if (stuff_inserted(NUL, 1L, (c == Ctrl_A)) == FAIL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1017 && c != Ctrl_A && !p_im)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1018 goto doESCkey; /* quit insert mode */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1019 inserted_space = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1020 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1021
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
1022 case Ctrl_R: /* insert the contents of a register */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1023 ins_reg();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1024 auto_format(FALSE, TRUE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1025 inserted_space = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1026 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1027
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
1028 case Ctrl_G: /* commands starting with CTRL-G */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1029 ins_ctrl_g();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1030 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1031
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
1032 case Ctrl_HAT: /* switch input mode and/or langmap */
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
1033 ins_ctrl_hat();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1034 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1035
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1036 #ifdef FEAT_RIGHTLEFT
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
1037 case Ctrl__: /* switch between languages */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1038 if (!p_ari)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1039 goto normalchar;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1040 ins_ctrl_();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1041 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1042 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1043
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
1044 case Ctrl_D: /* Make indent one shiftwidth smaller. */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1045 #if defined(FEAT_INS_EXPAND) && defined(FEAT_FIND_ID)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1046 if (ctrl_x_mode == CTRL_X_PATH_DEFINES)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1047 goto docomplete;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1048 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1049 /* FALLTHROUGH */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1050
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
1051 case Ctrl_T: /* Make indent one shiftwidth greater. */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1052 # ifdef FEAT_INS_EXPAND
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1053 if (c == Ctrl_T && ctrl_x_mode == CTRL_X_THESAURUS)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1054 {
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
1055 if (has_compl_option(FALSE))
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
1056 goto docomplete;
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
1057 break;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1058 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1059 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1060 ins_shift(c, lastc);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1061 auto_format(FALSE, TRUE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1062 inserted_space = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1063 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1064
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
1065 case K_DEL: /* delete character under the cursor */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1066 case K_KDEL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1067 ins_del();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1068 auto_format(FALSE, TRUE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1069 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1070
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
1071 case K_BS: /* delete character before the cursor */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1072 case Ctrl_H:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1073 did_backspace = ins_bs(c, BACKSPACE_CHAR, &inserted_space);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1074 auto_format(FALSE, TRUE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1075 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1076
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
1077 case Ctrl_W: /* delete word before the cursor */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1078 did_backspace = ins_bs(c, BACKSPACE_WORD, &inserted_space);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1079 auto_format(FALSE, TRUE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1080 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1081
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
1082 case Ctrl_U: /* delete all inserted text in current line */
12
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 11
diff changeset
1083 # ifdef FEAT_COMPL_FUNC
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 11
diff changeset
1084 /* CTRL-X CTRL-U completes with 'completefunc'. */
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
1085 if (ctrl_x_mode == CTRL_X_FUNCTION)
12
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 11
diff changeset
1086 goto docomplete;
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 11
diff changeset
1087 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1088 did_backspace = ins_bs(c, BACKSPACE_LINE, &inserted_space);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1089 auto_format(FALSE, TRUE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1090 inserted_space = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1091 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1092
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1093 #ifdef FEAT_MOUSE
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
1094 case K_LEFTMOUSE: /* mouse keys */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1095 case K_LEFTMOUSE_NM:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1096 case K_LEFTDRAG:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1097 case K_LEFTRELEASE:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1098 case K_LEFTRELEASE_NM:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1099 case K_MIDDLEMOUSE:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1100 case K_MIDDLEDRAG:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1101 case K_MIDDLERELEASE:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1102 case K_RIGHTMOUSE:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1103 case K_RIGHTDRAG:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1104 case K_RIGHTRELEASE:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1105 case K_X1MOUSE:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1106 case K_X1DRAG:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1107 case K_X1RELEASE:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1108 case K_X2MOUSE:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1109 case K_X2DRAG:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1110 case K_X2RELEASE:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1111 ins_mouse(c);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1112 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1113
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
1114 case K_MOUSEDOWN: /* Default action for scroll wheel up: scroll up */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1115 ins_mousescroll(FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1116 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1117
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
1118 case K_MOUSEUP: /* Default action for scroll wheel down: scroll down */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1119 ins_mousescroll(TRUE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1120 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1121 #endif
692
a28f83d37113 updated for version 7.0208
vimboss
parents: 683
diff changeset
1122 #ifdef FEAT_GUI_TABLINE
a28f83d37113 updated for version 7.0208
vimboss
parents: 683
diff changeset
1123 case K_TABLINE:
a28f83d37113 updated for version 7.0208
vimboss
parents: 683
diff changeset
1124 case K_TABMENU:
a28f83d37113 updated for version 7.0208
vimboss
parents: 683
diff changeset
1125 ins_tabline(c);
a28f83d37113 updated for version 7.0208
vimboss
parents: 683
diff changeset
1126 break;
a28f83d37113 updated for version 7.0208
vimboss
parents: 683
diff changeset
1127 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1128
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
1129 case K_IGNORE: /* Something mapped to nothing */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1130 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1131
661
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 659
diff changeset
1132 #ifdef FEAT_AUTOCMD
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 659
diff changeset
1133 case K_CURSORHOLD: /* Didn't type something for a while. */
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 659
diff changeset
1134 apply_autocmds(EVENT_CURSORHOLDI, NULL, NULL, FALSE, curbuf);
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 659
diff changeset
1135 did_cursorhold = TRUE;
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 659
diff changeset
1136 break;
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 659
diff changeset
1137 #endif
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 659
diff changeset
1138
625
81fe2ccc1207 updated for version 7.0179
vimboss
parents: 620
diff changeset
1139 #ifdef FEAT_GUI_W32
81fe2ccc1207 updated for version 7.0179
vimboss
parents: 620
diff changeset
1140 /* On Win32 ignore <M-F4>, we get it when closing the window was
81fe2ccc1207 updated for version 7.0179
vimboss
parents: 620
diff changeset
1141 * cancelled. */
81fe2ccc1207 updated for version 7.0179
vimboss
parents: 620
diff changeset
1142 case K_F4:
81fe2ccc1207 updated for version 7.0179
vimboss
parents: 620
diff changeset
1143 if (mod_mask != MOD_MASK_ALT)
81fe2ccc1207 updated for version 7.0179
vimboss
parents: 620
diff changeset
1144 goto normalchar;
81fe2ccc1207 updated for version 7.0179
vimboss
parents: 620
diff changeset
1145 break;
81fe2ccc1207 updated for version 7.0179
vimboss
parents: 620
diff changeset
1146 #endif
81fe2ccc1207 updated for version 7.0179
vimboss
parents: 620
diff changeset
1147
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1148 #ifdef FEAT_GUI
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1149 case K_VER_SCROLLBAR:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1150 ins_scroll();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1151 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1152
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1153 case K_HOR_SCROLLBAR:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1154 ins_horscroll();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1155 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1156 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1157
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
1158 case K_HOME: /* <Home> */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1159 case K_KHOME:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1160 case K_S_HOME:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1161 case K_C_HOME:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1162 ins_home(c);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1163 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1164
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
1165 case K_END: /* <End> */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1166 case K_KEND:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1167 case K_S_END:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1168 case K_C_END:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1169 ins_end(c);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1170 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1171
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
1172 case K_LEFT: /* <Left> */
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 164
diff changeset
1173 if (mod_mask & (MOD_MASK_SHIFT|MOD_MASK_CTRL))
7e70fc748752 updated for version 7.0056
vimboss
parents: 164
diff changeset
1174 ins_s_left();
7e70fc748752 updated for version 7.0056
vimboss
parents: 164
diff changeset
1175 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 164
diff changeset
1176 ins_left();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1177 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1178
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
1179 case K_S_LEFT: /* <S-Left> */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1180 case K_C_LEFT:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1181 ins_s_left();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1182 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1183
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
1184 case K_RIGHT: /* <Right> */
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 164
diff changeset
1185 if (mod_mask & (MOD_MASK_SHIFT|MOD_MASK_CTRL))
7e70fc748752 updated for version 7.0056
vimboss
parents: 164
diff changeset
1186 ins_s_right();
7e70fc748752 updated for version 7.0056
vimboss
parents: 164
diff changeset
1187 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 164
diff changeset
1188 ins_right();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1189 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1190
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
1191 case K_S_RIGHT: /* <S-Right> */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1192 case K_C_RIGHT:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1193 ins_s_right();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1194 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1195
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
1196 case K_UP: /* <Up> */
665
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
1197 #ifdef FEAT_INS_EXPAND
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
1198 if (pum_visible())
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
1199 goto docomplete;
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
1200 #endif
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 164
diff changeset
1201 if (mod_mask & MOD_MASK_SHIFT)
7e70fc748752 updated for version 7.0056
vimboss
parents: 164
diff changeset
1202 ins_pageup();
7e70fc748752 updated for version 7.0056
vimboss
parents: 164
diff changeset
1203 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 164
diff changeset
1204 ins_up(FALSE);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1205 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1206
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
1207 case K_S_UP: /* <S-Up> */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1208 case K_PAGEUP:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1209 case K_KPAGEUP:
613
53114ef7778f updated for version 7.0174
vimboss
parents: 610
diff changeset
1210 #ifdef FEAT_INS_EXPAND
610
cd3689efd90a updated for version 7.0173
vimboss
parents: 603
diff changeset
1211 if (pum_visible())
cd3689efd90a updated for version 7.0173
vimboss
parents: 603
diff changeset
1212 goto docomplete;
613
53114ef7778f updated for version 7.0174
vimboss
parents: 610
diff changeset
1213 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1214 ins_pageup();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1215 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1216
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
1217 case K_DOWN: /* <Down> */
665
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
1218 #ifdef FEAT_INS_EXPAND
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
1219 if (pum_visible())
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
1220 goto docomplete;
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
1221 #endif
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 164
diff changeset
1222 if (mod_mask & MOD_MASK_SHIFT)
7e70fc748752 updated for version 7.0056
vimboss
parents: 164
diff changeset
1223 ins_pagedown();
7e70fc748752 updated for version 7.0056
vimboss
parents: 164
diff changeset
1224 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 164
diff changeset
1225 ins_down(FALSE);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1226 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1227
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
1228 case K_S_DOWN: /* <S-Down> */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1229 case K_PAGEDOWN:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1230 case K_KPAGEDOWN:
613
53114ef7778f updated for version 7.0174
vimboss
parents: 610
diff changeset
1231 #ifdef FEAT_INS_EXPAND
610
cd3689efd90a updated for version 7.0173
vimboss
parents: 603
diff changeset
1232 if (pum_visible())
cd3689efd90a updated for version 7.0173
vimboss
parents: 603
diff changeset
1233 goto docomplete;
613
53114ef7778f updated for version 7.0174
vimboss
parents: 610
diff changeset
1234 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1235 ins_pagedown();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1236 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1237
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1238 #ifdef FEAT_DND
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
1239 case K_DROP: /* drag-n-drop event */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1240 ins_drop();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1241 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1242 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1243
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
1244 case K_S_TAB: /* When not mapped, use like a normal TAB */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1245 c = TAB;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1246 /* FALLTHROUGH */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1247
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
1248 case TAB: /* TAB or Complete patterns along path */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1249 #if defined(FEAT_INS_EXPAND) && defined(FEAT_FIND_ID)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1250 if (ctrl_x_mode == CTRL_X_PATH_PATTERNS)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1251 goto docomplete;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1252 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1253 inserted_space = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1254 if (ins_tab())
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1255 goto normalchar; /* insert TAB as a normal char */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1256 auto_format(FALSE, TRUE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1257 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1258
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
1259 case K_KENTER: /* <Enter> */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1260 c = CAR;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1261 /* FALLTHROUGH */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1262 case CAR:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1263 case NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1264 #if defined(FEAT_WINDOWS) && defined(FEAT_QUICKFIX)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1265 /* In a quickfix window a <CR> jumps to the error under the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1266 * cursor. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1267 if (bt_quickfix(curbuf) && c == CAR)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1268 {
644
e4fa26ce8769 updated for version 7.0187
vimboss
parents: 634
diff changeset
1269 if (curwin->w_llist_ref == NULL) /* quickfix window */
e4fa26ce8769 updated for version 7.0187
vimboss
parents: 634
diff changeset
1270 do_cmdline_cmd((char_u *)".cc");
e4fa26ce8769 updated for version 7.0187
vimboss
parents: 634
diff changeset
1271 else /* location list window */
e4fa26ce8769 updated for version 7.0187
vimboss
parents: 634
diff changeset
1272 do_cmdline_cmd((char_u *)".ll");
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1273 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1274 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1275 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1276 #ifdef FEAT_CMDWIN
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1277 if (cmdwin_type != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1278 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1279 /* Execute the command in the cmdline window. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1280 cmdwin_result = CAR;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1281 goto doESCkey;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1282 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1283 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1284 if (ins_eol(c) && !p_im)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1285 goto doESCkey; /* out of memory */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1286 auto_format(FALSE, FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1287 inserted_space = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1288 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1289
2250
1bac28a53fae Add the conceal patch from Vince Negri.
Bram Moolenaar <bram@vim.org>
parents: 2227
diff changeset
1290 #if defined(FEAT_DIGRAPHS) || defined(FEAT_INS_EXPAND)
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
1291 case Ctrl_K: /* digraph or keyword completion */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1292 # ifdef FEAT_INS_EXPAND
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1293 if (ctrl_x_mode == CTRL_X_DICTIONARY)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1294 {
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
1295 if (has_compl_option(TRUE))
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
1296 goto docomplete;
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
1297 break;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1298 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1299 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1300 # ifdef FEAT_DIGRAPHS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1301 c = ins_digraph();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1302 if (c == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1303 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1304 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1305 goto normalchar;
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
1306 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1307
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1308 #ifdef FEAT_INS_EXPAND
464
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
1309 case Ctrl_X: /* Enter CTRL-X mode */
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
1310 ins_ctrl_x();
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
1311 break;
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
1312
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
1313 case Ctrl_RSB: /* Tag name completion after ^X */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1314 if (ctrl_x_mode != CTRL_X_TAGS)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1315 goto normalchar;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1316 goto docomplete;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1317
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
1318 case Ctrl_F: /* File name completion after ^X */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1319 if (ctrl_x_mode != CTRL_X_FILES)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1320 goto normalchar;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1321 goto docomplete;
477
f8b75b8f1988 updated for version 7.0128
vimboss
parents: 474
diff changeset
1322
f8b75b8f1988 updated for version 7.0128
vimboss
parents: 474
diff changeset
1323 case 's': /* Spelling completion after ^X */
f8b75b8f1988 updated for version 7.0128
vimboss
parents: 474
diff changeset
1324 case Ctrl_S:
f8b75b8f1988 updated for version 7.0128
vimboss
parents: 474
diff changeset
1325 if (ctrl_x_mode != CTRL_X_SPELL)
f8b75b8f1988 updated for version 7.0128
vimboss
parents: 474
diff changeset
1326 goto normalchar;
f8b75b8f1988 updated for version 7.0128
vimboss
parents: 474
diff changeset
1327 goto docomplete;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1328 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1329
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
1330 case Ctrl_L: /* Whole line completion after ^X */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1331 #ifdef FEAT_INS_EXPAND
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1332 if (ctrl_x_mode != CTRL_X_WHOLE_LINE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1333 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1334 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1335 /* CTRL-L with 'insertmode' set: Leave Insert mode */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1336 if (p_im)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1337 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1338 if (echeck_abbr(Ctrl_L + ABBR_OFF))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1339 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1340 goto doESCkey;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1341 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1342 goto normalchar;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1343 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1344 #ifdef FEAT_INS_EXPAND
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1345 /* FALLTHROUGH */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1346
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
1347 case Ctrl_P: /* Do previous/next pattern completion */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1348 case Ctrl_N:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1349 /* if 'complete' is empty then plain ^P is no longer special,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1350 * but it is under other ^X modes */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1351 if (*curbuf->b_p_cpt == NUL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1352 && ctrl_x_mode != 0
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
1353 && !(compl_cont_status & CONT_LOCAL))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1354 goto normalchar;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1355
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1356 docomplete:
1927
f798c9043986 updated for version 7.2-224
vimboss
parents: 1892
diff changeset
1357 compl_busy = TRUE;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1358 if (ins_complete(c) == FAIL)
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
1359 compl_cont_status = 0;
1927
f798c9043986 updated for version 7.2-224
vimboss
parents: 1892
diff changeset
1360 compl_busy = FALSE;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1361 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1362 #endif /* FEAT_INS_EXPAND */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1363
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
1364 case Ctrl_Y: /* copy from previous line or scroll down */
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
1365 case Ctrl_E: /* copy from next line or scroll up */
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
1366 c = ins_ctrl_ey(c);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1367 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1368
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1369 default:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1370 #ifdef UNIX
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1371 if (c == intr_char) /* special interrupt char */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1372 goto do_intr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1373 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1374
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1375 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1376 * Insert a nomal character.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1377 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1378 normalchar:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1379 #ifdef FEAT_SMARTINDENT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1380 /* Try to perform smart-indenting. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1381 ins_try_si(c);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1382 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1383
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1384 if (c == ' ')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1385 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1386 inserted_space = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1387 #ifdef FEAT_CINDENT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1388 if (inindent(0))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1389 can_cindent = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1390 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1391 if (Insstart_blank_vcol == MAXCOL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1392 && curwin->w_cursor.lnum == Insstart.lnum)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1393 Insstart_blank_vcol = get_nolist_virtcol();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1394 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1395
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1396 if (vim_iswordc(c) || !echeck_abbr(
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1397 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1398 /* Add ABBR_OFF for characters above 0x100, this is
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1399 * what check_abbr() expects. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1400 (has_mbyte && c >= 0x100) ? (c + ABBR_OFF) :
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1401 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1402 c))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1403 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1404 insert_special(c, FALSE, FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1405 #ifdef FEAT_RIGHTLEFT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1406 revins_legal++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1407 revins_chars++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1408 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1409 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1410
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1411 auto_format(FALSE, TRUE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1412
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1413 #ifdef FEAT_FOLDING
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1414 /* When inserting a character the cursor line must never be in a
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1415 * closed fold. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1416 foldOpenCursor();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1417 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1418 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1419 } /* end of switch (c) */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1420
978
0e3e208b4b90 updated for version 7.0-104
vimboss
parents: 947
diff changeset
1421 #ifdef FEAT_AUTOCMD
0e3e208b4b90 updated for version 7.0-104
vimboss
parents: 947
diff changeset
1422 /* If typed something may trigger CursorHoldI again. */
0e3e208b4b90 updated for version 7.0-104
vimboss
parents: 947
diff changeset
1423 if (c != K_CURSORHOLD)
0e3e208b4b90 updated for version 7.0-104
vimboss
parents: 947
diff changeset
1424 did_cursorhold = FALSE;
0e3e208b4b90 updated for version 7.0-104
vimboss
parents: 947
diff changeset
1425 #endif
0e3e208b4b90 updated for version 7.0-104
vimboss
parents: 947
diff changeset
1426
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1427 /* If the cursor was moved we didn't just insert a space */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1428 if (arrow_used)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1429 inserted_space = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1430
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1431 #ifdef FEAT_CINDENT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1432 if (can_cindent && cindent_on()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1433 # ifdef FEAT_INS_EXPAND
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1434 && ctrl_x_mode == 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1435 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1436 )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1437 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1438 force_cindent:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1439 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1440 * Indent now if a key was typed that is in 'cinkeys'.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1441 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1442 if (in_cinkeys(c, ' ', line_is_white))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1443 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1444 if (stop_arrow() == OK)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1445 /* re-indent the current line */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1446 do_c_expr_indent();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1447 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1448 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1449 #endif /* FEAT_CINDENT */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1450
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1451 } /* for (;;) */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1452 /* NOTREACHED */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1453 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1454
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1455 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1456 * Redraw for Insert mode.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1457 * This is postponed until getting the next character to make '$' in the 'cpo'
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1458 * option work correctly.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1459 * Only redraw when there are no characters available. This speeds up
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1460 * inserting sequences of characters (e.g., for CTRL-R).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1461 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1462 static void
661
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 659
diff changeset
1463 ins_redraw(ready)
1876
932ff0c0f57b updated for version 7.2-173
vimboss
parents: 1872
diff changeset
1464 int ready UNUSED; /* not busy with something */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1465 {
2282
a888ed7ba375 Make updating text for conceal mode simpler. A few compiler warning fixes.
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
1466 #ifdef FEAT_CONCEAL
a888ed7ba375 Make updating text for conceal mode simpler. A few compiler warning fixes.
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
1467 linenr_T conceal_old_cursor_line = 0;
a888ed7ba375 Make updating text for conceal mode simpler. A few compiler warning fixes.
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
1468 linenr_T conceal_new_cursor_line = 0;
a888ed7ba375 Make updating text for conceal mode simpler. A few compiler warning fixes.
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
1469 int conceal_update_lines = FALSE;
a888ed7ba375 Make updating text for conceal mode simpler. A few compiler warning fixes.
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
1470 #endif
a888ed7ba375 Make updating text for conceal mode simpler. A few compiler warning fixes.
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
1471
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1472 if (!char_avail())
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1473 {
2282
a888ed7ba375 Make updating text for conceal mode simpler. A few compiler warning fixes.
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
1474 #if defined(FEAT_AUTOCMD) || defined(FEAT_CONCEAL)
794
f19994020dad updated for version 7.0231
vimboss
parents: 786
diff changeset
1475 /* Trigger CursorMoved if the cursor moved. Not when the popup menu is
f19994020dad updated for version 7.0231
vimboss
parents: 786
diff changeset
1476 * visible, the command might delete it. */
2282
a888ed7ba375 Make updating text for conceal mode simpler. A few compiler warning fixes.
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
1477 if (ready && (
a888ed7ba375 Make updating text for conceal mode simpler. A few compiler warning fixes.
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
1478 # ifdef FEAT_AUTOCMD
a888ed7ba375 Make updating text for conceal mode simpler. A few compiler warning fixes.
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
1479 has_cursormovedI()
a888ed7ba375 Make updating text for conceal mode simpler. A few compiler warning fixes.
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
1480 # endif
a888ed7ba375 Make updating text for conceal mode simpler. A few compiler warning fixes.
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
1481 # if defined(FEAT_AUTOCMD) && defined(FEAT_CONCEAL)
a888ed7ba375 Make updating text for conceal mode simpler. A few compiler warning fixes.
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
1482 ||
a888ed7ba375 Make updating text for conceal mode simpler. A few compiler warning fixes.
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
1483 # endif
a888ed7ba375 Make updating text for conceal mode simpler. A few compiler warning fixes.
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
1484 # ifdef FEAT_CONCEAL
2378
85b7dc8da5eb Add the 'concealcursor' option to decide when the cursor line is to be
Bram Moolenaar <bram@vim.org>
parents: 2348
diff changeset
1485 curwin->w_p_cole > 0
2282
a888ed7ba375 Make updating text for conceal mode simpler. A few compiler warning fixes.
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
1486 # endif
a888ed7ba375 Make updating text for conceal mode simpler. A few compiler warning fixes.
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
1487 )
a888ed7ba375 Make updating text for conceal mode simpler. A few compiler warning fixes.
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
1488 && !equalpos(last_cursormoved, curwin->w_cursor)
794
f19994020dad updated for version 7.0231
vimboss
parents: 786
diff changeset
1489 # ifdef FEAT_INS_EXPAND
2282
a888ed7ba375 Make updating text for conceal mode simpler. A few compiler warning fixes.
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
1490 && !pum_visible()
794
f19994020dad updated for version 7.0231
vimboss
parents: 786
diff changeset
1491 # endif
2282
a888ed7ba375 Make updating text for conceal mode simpler. A few compiler warning fixes.
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
1492 )
661
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 659
diff changeset
1493 {
1506
64ed4359d957 updated for version 7.1-221
vimboss
parents: 1497
diff changeset
1494 # ifdef FEAT_SYN_HL
64ed4359d957 updated for version 7.1-221
vimboss
parents: 1497
diff changeset
1495 /* Need to update the screen first, to make sure syntax
64ed4359d957 updated for version 7.1-221
vimboss
parents: 1497
diff changeset
1496 * highlighting is correct after making a change (e.g., inserting
64ed4359d957 updated for version 7.1-221
vimboss
parents: 1497
diff changeset
1497 * a "(". The autocommand may also require a redraw, so it's done
64ed4359d957 updated for version 7.1-221
vimboss
parents: 1497
diff changeset
1498 * again below, unfortunately. */
2250
1bac28a53fae Add the conceal patch from Vince Negri.
Bram Moolenaar <bram@vim.org>
parents: 2227
diff changeset
1499 if (syntax_present(curwin) && must_redraw)
1506
64ed4359d957 updated for version 7.1-221
vimboss
parents: 1497
diff changeset
1500 update_screen(0);
64ed4359d957 updated for version 7.1-221
vimboss
parents: 1497
diff changeset
1501 # endif
2282
a888ed7ba375 Make updating text for conceal mode simpler. A few compiler warning fixes.
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
1502 # ifdef FEAT_AUTOCMD
a888ed7ba375 Make updating text for conceal mode simpler. A few compiler warning fixes.
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
1503 if (has_cursormovedI())
a888ed7ba375 Make updating text for conceal mode simpler. A few compiler warning fixes.
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
1504 apply_autocmds(EVENT_CURSORMOVEDI, NULL, NULL, FALSE, curbuf);
a888ed7ba375 Make updating text for conceal mode simpler. A few compiler warning fixes.
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
1505 # endif
a888ed7ba375 Make updating text for conceal mode simpler. A few compiler warning fixes.
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
1506 # ifdef FEAT_CONCEAL
2378
85b7dc8da5eb Add the 'concealcursor' option to decide when the cursor line is to be
Bram Moolenaar <bram@vim.org>
parents: 2348
diff changeset
1507 if (curwin->w_p_cole > 0)
2282
a888ed7ba375 Make updating text for conceal mode simpler. A few compiler warning fixes.
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
1508 {
a888ed7ba375 Make updating text for conceal mode simpler. A few compiler warning fixes.
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
1509 conceal_old_cursor_line = last_cursormoved.lnum;
a888ed7ba375 Make updating text for conceal mode simpler. A few compiler warning fixes.
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
1510 conceal_new_cursor_line = curwin->w_cursor.lnum;
a888ed7ba375 Make updating text for conceal mode simpler. A few compiler warning fixes.
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
1511 conceal_update_lines = TRUE;
a888ed7ba375 Make updating text for conceal mode simpler. A few compiler warning fixes.
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
1512 }
a888ed7ba375 Make updating text for conceal mode simpler. A few compiler warning fixes.
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
1513 # endif
661
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 659
diff changeset
1514 last_cursormoved = curwin->w_cursor;
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 659
diff changeset
1515 }
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 659
diff changeset
1516 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1517 if (must_redraw)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1518 update_screen(0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1519 else if (clear_cmdline || redraw_cmdline)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1520 showmode(); /* clear cmdline and show mode */
2282
a888ed7ba375 Make updating text for conceal mode simpler. A few compiler warning fixes.
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
1521 # if defined(FEAT_CONCEAL)
2378
85b7dc8da5eb Add the 'concealcursor' option to decide when the cursor line is to be
Bram Moolenaar <bram@vim.org>
parents: 2348
diff changeset
1522 if ((conceal_update_lines
85b7dc8da5eb Add the 'concealcursor' option to decide when the cursor line is to be
Bram Moolenaar <bram@vim.org>
parents: 2348
diff changeset
1523 && (conceal_old_cursor_line != conceal_new_cursor_line
85b7dc8da5eb Add the 'concealcursor' option to decide when the cursor line is to be
Bram Moolenaar <bram@vim.org>
parents: 2348
diff changeset
1524 || conceal_cursor_line(curwin)))
85b7dc8da5eb Add the 'concealcursor' option to decide when the cursor line is to be
Bram Moolenaar <bram@vim.org>
parents: 2348
diff changeset
1525 || need_cursor_line_redraw)
85b7dc8da5eb Add the 'concealcursor' option to decide when the cursor line is to be
Bram Moolenaar <bram@vim.org>
parents: 2348
diff changeset
1526 {
85b7dc8da5eb Add the 'concealcursor' option to decide when the cursor line is to be
Bram Moolenaar <bram@vim.org>
parents: 2348
diff changeset
1527 if (conceal_old_cursor_line != conceal_new_cursor_line)
85b7dc8da5eb Add the 'concealcursor' option to decide when the cursor line is to be
Bram Moolenaar <bram@vim.org>
parents: 2348
diff changeset
1528 update_single_line(curwin, conceal_old_cursor_line);
85b7dc8da5eb Add the 'concealcursor' option to decide when the cursor line is to be
Bram Moolenaar <bram@vim.org>
parents: 2348
diff changeset
1529 update_single_line(curwin, conceal_new_cursor_line == 0
85b7dc8da5eb Add the 'concealcursor' option to decide when the cursor line is to be
Bram Moolenaar <bram@vim.org>
parents: 2348
diff changeset
1530 ? curwin->w_cursor.lnum : conceal_new_cursor_line);
2282
a888ed7ba375 Make updating text for conceal mode simpler. A few compiler warning fixes.
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
1531 curwin->w_valid &= ~VALID_CROW;
a888ed7ba375 Make updating text for conceal mode simpler. A few compiler warning fixes.
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
1532 }
a888ed7ba375 Make updating text for conceal mode simpler. A few compiler warning fixes.
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
1533 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1534 showruler(FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1535 setcursor();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1536 emsg_on_display = FALSE; /* may remove error message now */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1537 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1538 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1539
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1540 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1541 * Handle a CTRL-V or CTRL-Q typed in Insert mode.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1542 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1543 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1544 ins_ctrl_v()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1545 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1546 int c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1547
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1548 /* may need to redraw when no more chars available now */
661
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 659
diff changeset
1549 ins_redraw(FALSE);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1550
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1551 if (redrawing() && !char_avail())
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1552 edit_putchar('^', TRUE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1553 AppendToRedobuff((char_u *)CTRL_V_STR); /* CTRL-V */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1554
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1555 #ifdef FEAT_CMDL_INFO
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1556 add_to_showcmd_c(Ctrl_V);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1557 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1558
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1559 c = get_literal();
2319
c79ccf947487 Fix: When entering a digraph or special character after a line that fits the
Bram Moolenaar <bram@vim.org>
parents: 2297
diff changeset
1560 edit_unputchar(); /* when line fits in 'columns' the '^' is at the start
c79ccf947487 Fix: When entering a digraph or special character after a line that fits the
Bram Moolenaar <bram@vim.org>
parents: 2297
diff changeset
1561 of the next line and will not be redrawn */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1562 #ifdef FEAT_CMDL_INFO
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1563 clear_showcmd();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1564 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1565 insert_special(c, FALSE, TRUE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1566 #ifdef FEAT_RIGHTLEFT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1567 revins_chars++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1568 revins_legal++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1569 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1570 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1571
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1572 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1573 * Put a character directly onto the screen. It's not stored in a buffer.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1574 * Used while handling CTRL-K, CTRL-V, etc. in Insert mode.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1575 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1576 static int pc_status;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1577 #define PC_STATUS_UNSET 0 /* pc_bytes was not set */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1578 #define PC_STATUS_RIGHT 1 /* right halve of double-wide char */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1579 #define PC_STATUS_LEFT 2 /* left halve of double-wide char */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1580 #define PC_STATUS_SET 3 /* pc_bytes was filled */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1581 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1582 static char_u pc_bytes[MB_MAXBYTES + 1]; /* saved bytes */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1583 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1584 static char_u pc_bytes[2]; /* saved bytes */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1585 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1586 static int pc_attr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1587 static int pc_row;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1588 static int pc_col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1589
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1590 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1591 edit_putchar(c, highlight)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1592 int c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1593 int highlight;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1594 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1595 int attr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1596
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1597 if (ScreenLines != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1598 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1599 update_topline(); /* just in case w_topline isn't valid */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1600 validate_cursor();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1601 if (highlight)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1602 attr = hl_attr(HLF_8);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1603 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1604 attr = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1605 pc_row = W_WINROW(curwin) + curwin->w_wrow;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1606 pc_col = W_WINCOL(curwin);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1607 #if defined(FEAT_RIGHTLEFT) || defined(FEAT_MBYTE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1608 pc_status = PC_STATUS_UNSET;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1609 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1610 #ifdef FEAT_RIGHTLEFT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1611 if (curwin->w_p_rl)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1612 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1613 pc_col += W_WIDTH(curwin) - 1 - curwin->w_wcol;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1614 # ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1615 if (has_mbyte)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1616 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1617 int fix_col = mb_fix_col(pc_col, pc_row);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1618
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1619 if (fix_col != pc_col)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1620 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1621 screen_putchar(' ', pc_row, fix_col, attr);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1622 --curwin->w_wcol;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1623 pc_status = PC_STATUS_RIGHT;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1624 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1625 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1626 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1627 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1628 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1629 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1630 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1631 pc_col += curwin->w_wcol;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1632 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1633 if (mb_lefthalve(pc_row, pc_col))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1634 pc_status = PC_STATUS_LEFT;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1635 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1636 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1637
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1638 /* save the character to be able to put it back */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1639 #if defined(FEAT_RIGHTLEFT) || defined(FEAT_MBYTE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1640 if (pc_status == PC_STATUS_UNSET)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1641 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1642 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1643 screen_getbytes(pc_row, pc_col, pc_bytes, &pc_attr);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1644 pc_status = PC_STATUS_SET;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1645 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1646 screen_putchar(c, pc_row, pc_col, attr);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1647 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1648 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1649
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1650 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1651 * Undo the previous edit_putchar().
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1652 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1653 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1654 edit_unputchar()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1655 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1656 if (pc_status != PC_STATUS_UNSET && pc_row >= msg_scrolled)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1657 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1658 #if defined(FEAT_MBYTE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1659 if (pc_status == PC_STATUS_RIGHT)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1660 ++curwin->w_wcol;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1661 if (pc_status == PC_STATUS_RIGHT || pc_status == PC_STATUS_LEFT)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1662 redrawWinline(curwin->w_cursor.lnum, FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1663 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1664 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1665 screen_puts(pc_bytes, pc_row - msg_scrolled, pc_col, pc_attr);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1666 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1667 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1668
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1669 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1670 * Called when p_dollar is set: display a '$' at the end of the changed text
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1671 * Only works when cursor is in the line that changes.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1672 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1673 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1674 display_dollar(col)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1675 colnr_T col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1676 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1677 colnr_T save_col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1678
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1679 if (!redrawing())
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1680 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1681
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1682 cursor_off();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1683 save_col = curwin->w_cursor.col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1684 curwin->w_cursor.col = col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1685 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1686 if (has_mbyte)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1687 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1688 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1689
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1690 /* If on the last byte of a multi-byte move to the first byte. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1691 p = ml_get_curline();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1692 curwin->w_cursor.col -= (*mb_head_off)(p, p + col);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1693 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1694 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1695 curs_columns(FALSE); /* recompute w_wrow and w_wcol */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1696 if (curwin->w_wcol < W_WIDTH(curwin))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1697 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1698 edit_putchar('$', FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1699 dollar_vcol = curwin->w_virtcol;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1700 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1701 curwin->w_cursor.col = save_col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1702 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1703
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1704 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1705 * Call this function before moving the cursor from the normal insert position
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1706 * in insert mode.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1707 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1708 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1709 undisplay_dollar()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1710 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1711 if (dollar_vcol)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1712 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1713 dollar_vcol = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1714 redrawWinline(curwin->w_cursor.lnum, FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1715 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1716 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1717
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1718 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1719 * Insert an indent (for <Tab> or CTRL-T) or delete an indent (for CTRL-D).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1720 * Keep the cursor on the same character.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1721 * type == INDENT_INC increase indent (for CTRL-T or <Tab>)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1722 * type == INDENT_DEC decrease indent (for CTRL-D)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1723 * type == INDENT_SET set indent to "amount"
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1724 * if round is TRUE, round the indent to 'shiftwidth' (only with _INC and _Dec).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1725 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1726 void
1516
ee9d2d24ea9b updated for version 7.1-231
vimboss
parents: 1514
diff changeset
1727 change_indent(type, amount, round, replaced, call_changed_bytes)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1728 int type;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1729 int amount;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1730 int round;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1731 int replaced; /* replaced character, put on replace stack */
1516
ee9d2d24ea9b updated for version 7.1-231
vimboss
parents: 1514
diff changeset
1732 int call_changed_bytes; /* call changed_bytes() */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1733 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1734 int vcol;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1735 int last_vcol;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1736 int insstart_less; /* reduction for Insstart.col */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1737 int new_cursor_col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1738 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1739 char_u *ptr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1740 int save_p_list;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1741 int start_col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1742 colnr_T vc;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1743 #ifdef FEAT_VREPLACE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1744 colnr_T orig_col = 0; /* init for GCC */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1745 char_u *new_line, *orig_line = NULL; /* init for GCC */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1746
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1747 /* VREPLACE mode needs to know what the line was like before changing */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1748 if (State & VREPLACE_FLAG)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1749 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1750 orig_line = vim_strsave(ml_get_curline()); /* Deal with NULL below */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1751 orig_col = curwin->w_cursor.col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1752 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1753 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1754
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1755 /* for the following tricks we don't want list mode */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1756 save_p_list = curwin->w_p_list;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1757 curwin->w_p_list = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1758 vc = getvcol_nolist(&curwin->w_cursor);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1759 vcol = vc;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1760
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1761 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1762 * For Replace mode we need to fix the replace stack later, which is only
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1763 * possible when the cursor is in the indent. Remember the number of
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1764 * characters before the cursor if it's possible.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1765 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1766 start_col = curwin->w_cursor.col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1767
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1768 /* determine offset from first non-blank */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1769 new_cursor_col = curwin->w_cursor.col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1770 beginline(BL_WHITE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1771 new_cursor_col -= curwin->w_cursor.col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1772
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1773 insstart_less = curwin->w_cursor.col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1774
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1775 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1776 * If the cursor is in the indent, compute how many screen columns the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1777 * cursor is to the left of the first non-blank.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1778 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1779 if (new_cursor_col < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1780 vcol = get_indent() - vcol;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1781
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1782 if (new_cursor_col > 0) /* can't fix replace stack */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1783 start_col = -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1784
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1785 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1786 * Set the new indent. The cursor will be put on the first non-blank.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1787 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1788 if (type == INDENT_SET)
1516
ee9d2d24ea9b updated for version 7.1-231
vimboss
parents: 1514
diff changeset
1789 (void)set_indent(amount, call_changed_bytes ? SIN_CHANGED : 0);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1790 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1791 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1792 #ifdef FEAT_VREPLACE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1793 int save_State = State;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1794
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1795 /* Avoid being called recursively. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1796 if (State & VREPLACE_FLAG)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1797 State = INSERT;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1798 #endif
1516
ee9d2d24ea9b updated for version 7.1-231
vimboss
parents: 1514
diff changeset
1799 shift_line(type == INDENT_DEC, round, 1, call_changed_bytes);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1800 #ifdef FEAT_VREPLACE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1801 State = save_State;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1802 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1803 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1804 insstart_less -= curwin->w_cursor.col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1805
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1806 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1807 * Try to put cursor on same character.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1808 * If the cursor is at or after the first non-blank in the line,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1809 * compute the cursor column relative to the column of the first
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1810 * non-blank character.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1811 * If we are not in insert mode, leave the cursor on the first non-blank.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1812 * If the cursor is before the first non-blank, position it relative
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1813 * to the first non-blank, counted in screen columns.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1814 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1815 if (new_cursor_col >= 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1816 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1817 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1818 * When changing the indent while the cursor is touching it, reset
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1819 * Insstart_col to 0.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1820 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1821 if (new_cursor_col == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1822 insstart_less = MAXCOL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1823 new_cursor_col += curwin->w_cursor.col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1824 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1825 else if (!(State & INSERT))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1826 new_cursor_col = curwin->w_cursor.col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1827 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1828 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1829 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1830 * Compute the screen column where the cursor should be.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1831 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1832 vcol = get_indent() - vcol;
1869
720a59d79bcd updated for version 7.2-168
vimboss
parents: 1811
diff changeset
1833 curwin->w_virtcol = (colnr_T)((vcol < 0) ? 0 : vcol);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1834
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1835 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1836 * Advance the cursor until we reach the right screen column.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1837 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1838 vcol = last_vcol = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1839 new_cursor_col = -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1840 ptr = ml_get_curline();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1841 while (vcol <= (int)curwin->w_virtcol)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1842 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1843 last_vcol = vcol;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1844 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1845 if (has_mbyte && new_cursor_col >= 0)
474
a5fcf36ef512 updated for version 7.0127
vimboss
parents: 470
diff changeset
1846 new_cursor_col += (*mb_ptr2len)(ptr + new_cursor_col);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1847 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1848 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1849 ++new_cursor_col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1850 vcol += lbr_chartabsize(ptr + new_cursor_col, (colnr_T)vcol);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1851 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1852 vcol = last_vcol;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1853
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1854 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1855 * May need to insert spaces to be able to position the cursor on
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1856 * the right screen column.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1857 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1858 if (vcol != (int)curwin->w_virtcol)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1859 {
1869
720a59d79bcd updated for version 7.2-168
vimboss
parents: 1811
diff changeset
1860 curwin->w_cursor.col = (colnr_T)new_cursor_col;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1861 i = (int)curwin->w_virtcol - vcol;
1869
720a59d79bcd updated for version 7.2-168
vimboss
parents: 1811
diff changeset
1862 ptr = alloc((unsigned)(i + 1));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1863 if (ptr != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1864 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1865 new_cursor_col += i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1866 ptr[i] = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1867 while (--i >= 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1868 ptr[i] = ' ';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1869 ins_str(ptr);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1870 vim_free(ptr);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1871 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1872 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1873
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1874 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1875 * When changing the indent while the cursor is in it, reset
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1876 * Insstart_col to 0.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1877 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1878 insstart_less = MAXCOL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1879 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1880
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1881 curwin->w_p_list = save_p_list;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1882
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1883 if (new_cursor_col <= 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1884 curwin->w_cursor.col = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1885 else
1869
720a59d79bcd updated for version 7.2-168
vimboss
parents: 1811
diff changeset
1886 curwin->w_cursor.col = (colnr_T)new_cursor_col;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1887 curwin->w_set_curswant = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1888 changed_cline_bef_curs();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1889
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1890 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1891 * May have to adjust the start of the insert.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1892 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1893 if (State & INSERT)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1894 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1895 if (curwin->w_cursor.lnum == Insstart.lnum && Insstart.col != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1896 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1897 if ((int)Insstart.col <= insstart_less)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1898 Insstart.col = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1899 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1900 Insstart.col -= insstart_less;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1901 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1902 if ((int)ai_col <= insstart_less)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1903 ai_col = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1904 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1905 ai_col -= insstart_less;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1906 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1907
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1908 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1909 * For REPLACE mode, may have to fix the replace stack, if it's possible.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1910 * If the number of characters before the cursor decreased, need to pop a
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1911 * few characters from the replace stack.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1912 * If the number of characters before the cursor increased, need to push a
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1913 * few NULs onto the replace stack.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1914 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1915 if (REPLACE_NORMAL(State) && start_col >= 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1916 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1917 while (start_col > (int)curwin->w_cursor.col)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1918 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1919 replace_join(0); /* remove a NUL from the replace stack */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1920 --start_col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1921 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1922 while (start_col < (int)curwin->w_cursor.col || replaced)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1923 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1924 replace_push(NUL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1925 if (replaced)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1926 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1927 replace_push(replaced);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1928 replaced = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1929 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1930 ++start_col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1931 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1932 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1933
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1934 #ifdef FEAT_VREPLACE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1935 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1936 * For VREPLACE mode, we also have to fix the replace stack. In this case
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1937 * it is always possible because we backspace over the whole line and then
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1938 * put it back again the way we wanted it.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1939 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1940 if (State & VREPLACE_FLAG)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1941 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1942 /* If orig_line didn't allocate, just return. At least we did the job,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1943 * even if you can't backspace. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1944 if (orig_line == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1945 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1946
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1947 /* Save new line */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1948 new_line = vim_strsave(ml_get_curline());
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1949 if (new_line == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1950 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1951
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1952 /* We only put back the new line up to the cursor */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1953 new_line[curwin->w_cursor.col] = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1954
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1955 /* Put back original line */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1956 ml_replace(curwin->w_cursor.lnum, orig_line, FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1957 curwin->w_cursor.col = orig_col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1958
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1959 /* Backspace from cursor to start of line */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1960 backspace_until_column(0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1961
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1962 /* Insert new stuff into line again */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1963 ins_bytes(new_line);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1964
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1965 vim_free(new_line);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1966 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1967 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1968 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1969
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1970 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1971 * Truncate the space at the end of a line. This is to be used only in an
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1972 * insert mode. It handles fixing the replace stack for REPLACE and VREPLACE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1973 * modes.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1974 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1975 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1976 truncate_spaces(line)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1977 char_u *line;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1978 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1979 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1980
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1981 /* find start of trailing white space */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1982 for (i = (int)STRLEN(line) - 1; i >= 0 && vim_iswhite(line[i]); i--)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1983 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1984 if (State & REPLACE_FLAG)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1985 replace_join(0); /* remove a NUL from the replace stack */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1986 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1987 line[i + 1] = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1988 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1989
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1990 #if defined(FEAT_VREPLACE) || defined(FEAT_INS_EXPAND) \
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1991 || defined(FEAT_COMMENTS) || defined(PROTO)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1992 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1993 * Backspace the cursor until the given column. Handles REPLACE and VREPLACE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1994 * modes correctly. May also be used when not in insert mode at all.
1782
12cecc379574 updated for version 7.2-080
vimboss
parents: 1698
diff changeset
1995 * Will attempt not to go before "col" even when there is a composing
12cecc379574 updated for version 7.2-080
vimboss
parents: 1698
diff changeset
1996 * character.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1997 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1998 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1999 backspace_until_column(col)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2000 int col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2001 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2002 while ((int)curwin->w_cursor.col > col)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2003 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2004 curwin->w_cursor.col--;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2005 if (State & REPLACE_FLAG)
1782
12cecc379574 updated for version 7.2-080
vimboss
parents: 1698
diff changeset
2006 replace_do_bs(col);
12cecc379574 updated for version 7.2-080
vimboss
parents: 1698
diff changeset
2007 else if (!del_char_after_col(col))
12cecc379574 updated for version 7.2-080
vimboss
parents: 1698
diff changeset
2008 break;
12cecc379574 updated for version 7.2-080
vimboss
parents: 1698
diff changeset
2009 }
12cecc379574 updated for version 7.2-080
vimboss
parents: 1698
diff changeset
2010 }
12cecc379574 updated for version 7.2-080
vimboss
parents: 1698
diff changeset
2011 #endif
12cecc379574 updated for version 7.2-080
vimboss
parents: 1698
diff changeset
2012
12cecc379574 updated for version 7.2-080
vimboss
parents: 1698
diff changeset
2013 /*
12cecc379574 updated for version 7.2-080
vimboss
parents: 1698
diff changeset
2014 * Like del_char(), but make sure not to go before column "limit_col".
12cecc379574 updated for version 7.2-080
vimboss
parents: 1698
diff changeset
2015 * Only matters when there are composing characters.
12cecc379574 updated for version 7.2-080
vimboss
parents: 1698
diff changeset
2016 * Return TRUE when something was deleted.
12cecc379574 updated for version 7.2-080
vimboss
parents: 1698
diff changeset
2017 */
12cecc379574 updated for version 7.2-080
vimboss
parents: 1698
diff changeset
2018 static int
12cecc379574 updated for version 7.2-080
vimboss
parents: 1698
diff changeset
2019 del_char_after_col(limit_col)
1876
932ff0c0f57b updated for version 7.2-173
vimboss
parents: 1872
diff changeset
2020 int limit_col UNUSED;
1782
12cecc379574 updated for version 7.2-080
vimboss
parents: 1698
diff changeset
2021 {
12cecc379574 updated for version 7.2-080
vimboss
parents: 1698
diff changeset
2022 #ifdef FEAT_MBYTE
12cecc379574 updated for version 7.2-080
vimboss
parents: 1698
diff changeset
2023 if (enc_utf8 && limit_col >= 0)
12cecc379574 updated for version 7.2-080
vimboss
parents: 1698
diff changeset
2024 {
1869
720a59d79bcd updated for version 7.2-168
vimboss
parents: 1811
diff changeset
2025 colnr_T ecol = curwin->w_cursor.col + 1;
1782
12cecc379574 updated for version 7.2-080
vimboss
parents: 1698
diff changeset
2026
12cecc379574 updated for version 7.2-080
vimboss
parents: 1698
diff changeset
2027 /* Make sure the cursor is at the start of a character, but
12cecc379574 updated for version 7.2-080
vimboss
parents: 1698
diff changeset
2028 * skip forward again when going too far back because of a
12cecc379574 updated for version 7.2-080
vimboss
parents: 1698
diff changeset
2029 * composing character. */
12cecc379574 updated for version 7.2-080
vimboss
parents: 1698
diff changeset
2030 mb_adjust_cursor();
1796
4589d1792c03 updated for version 7.2-094
vimboss
parents: 1782
diff changeset
2031 while (curwin->w_cursor.col < (colnr_T)limit_col)
1782
12cecc379574 updated for version 7.2-080
vimboss
parents: 1698
diff changeset
2032 {
12cecc379574 updated for version 7.2-080
vimboss
parents: 1698
diff changeset
2033 int l = utf_ptr2len(ml_get_cursor());
12cecc379574 updated for version 7.2-080
vimboss
parents: 1698
diff changeset
2034
12cecc379574 updated for version 7.2-080
vimboss
parents: 1698
diff changeset
2035 if (l == 0) /* end of line */
12cecc379574 updated for version 7.2-080
vimboss
parents: 1698
diff changeset
2036 break;
12cecc379574 updated for version 7.2-080
vimboss
parents: 1698
diff changeset
2037 curwin->w_cursor.col += l;
12cecc379574 updated for version 7.2-080
vimboss
parents: 1698
diff changeset
2038 }
12cecc379574 updated for version 7.2-080
vimboss
parents: 1698
diff changeset
2039 if (*ml_get_cursor() == NUL || curwin->w_cursor.col == ecol)
12cecc379574 updated for version 7.2-080
vimboss
parents: 1698
diff changeset
2040 return FALSE;
1869
720a59d79bcd updated for version 7.2-168
vimboss
parents: 1811
diff changeset
2041 del_bytes((long)((int)ecol - curwin->w_cursor.col), FALSE, TRUE);
1782
12cecc379574 updated for version 7.2-080
vimboss
parents: 1698
diff changeset
2042 }
12cecc379574 updated for version 7.2-080
vimboss
parents: 1698
diff changeset
2043 else
12cecc379574 updated for version 7.2-080
vimboss
parents: 1698
diff changeset
2044 #endif
12cecc379574 updated for version 7.2-080
vimboss
parents: 1698
diff changeset
2045 (void)del_char(FALSE);
12cecc379574 updated for version 7.2-080
vimboss
parents: 1698
diff changeset
2046 return TRUE;
12cecc379574 updated for version 7.2-080
vimboss
parents: 1698
diff changeset
2047 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2048
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2049 #if defined(FEAT_INS_EXPAND) || defined(PROTO)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2050 /*
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
2051 * CTRL-X pressed in Insert mode.
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
2052 */
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
2053 static void
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
2054 ins_ctrl_x()
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
2055 {
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
2056 /* CTRL-X after CTRL-X CTRL-V doesn't do anything, so that CTRL-X
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
2057 * CTRL-V works like CTRL-N */
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
2058 if (ctrl_x_mode != CTRL_X_CMDLINE)
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
2059 {
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
2060 /* if the next ^X<> won't ADD nothing, then reset
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
2061 * compl_cont_status */
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
2062 if (compl_cont_status & CONT_N_ADDS)
665
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
2063 compl_cont_status |= CONT_INTRPT;
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
2064 else
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
2065 compl_cont_status = 0;
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
2066 /* We're not sure which CTRL-X mode it will be yet */
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
2067 ctrl_x_mode = CTRL_X_NOT_DEFINED_YET;
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
2068 edit_submode = (char_u *)_(CTRL_X_MSG(ctrl_x_mode));
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
2069 edit_submode_pre = NULL;
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
2070 showmode();
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
2071 }
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
2072 }
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
2073
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
2074 /*
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
2075 * Return TRUE if the 'dict' or 'tsr' option can be used.
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
2076 */
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
2077 static int
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
2078 has_compl_option(dict_opt)
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
2079 int dict_opt;
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
2080 {
703
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
2081 if (dict_opt ? (*curbuf->b_p_dict == NUL && *p_dict == NUL
744
07f7b4a7755c updated for version 7.0222
vimboss
parents: 732
diff changeset
2082 # ifdef FEAT_SPELL
07f7b4a7755c updated for version 7.0222
vimboss
parents: 732
diff changeset
2083 && !curwin->w_p_spell
07f7b4a7755c updated for version 7.0222
vimboss
parents: 732
diff changeset
2084 # endif
07f7b4a7755c updated for version 7.0222
vimboss
parents: 732
diff changeset
2085 )
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
2086 : (*curbuf->b_p_tsr == NUL && *p_tsr == NUL))
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
2087 {
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
2088 ctrl_x_mode = 0;
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
2089 edit_submode = NULL;
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
2090 msg_attr(dict_opt ? (char_u *)_("'dictionary' option is empty")
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
2091 : (char_u *)_("'thesaurus' option is empty"),
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
2092 hl_attr(HLF_E));
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
2093 if (emsg_silent == 0)
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
2094 {
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
2095 vim_beep();
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
2096 setcursor();
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
2097 out_flush();
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
2098 ui_delay(2000L, FALSE);
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
2099 }
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
2100 return FALSE;
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
2101 }
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
2102 return TRUE;
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
2103 }
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
2104
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
2105 /*
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2106 * Is the character 'c' a valid key to go to or keep us in CTRL-X mode?
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2107 * This depends on the current mode.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2108 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2109 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2110 vim_is_ctrl_x_key(c)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2111 int c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2112 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2113 /* Always allow ^R - let it's results then be checked */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2114 if (c == Ctrl_R)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2115 return TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2116
610
cd3689efd90a updated for version 7.0173
vimboss
parents: 603
diff changeset
2117 /* Accept <PageUp> and <PageDown> if the popup menu is visible. */
644
e4fa26ce8769 updated for version 7.0187
vimboss
parents: 634
diff changeset
2118 if (ins_compl_pum_key(c))
610
cd3689efd90a updated for version 7.0173
vimboss
parents: 603
diff changeset
2119 return TRUE;
cd3689efd90a updated for version 7.0173
vimboss
parents: 603
diff changeset
2120
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2121 switch (ctrl_x_mode)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2122 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2123 case 0: /* Not in any CTRL-X mode */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2124 return (c == Ctrl_N || c == Ctrl_P || c == Ctrl_X);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2125 case CTRL_X_NOT_DEFINED_YET:
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
2126 return ( c == Ctrl_X || c == Ctrl_Y || c == Ctrl_E
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2127 || c == Ctrl_L || c == Ctrl_F || c == Ctrl_RSB
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2128 || c == Ctrl_I || c == Ctrl_D || c == Ctrl_P
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2129 || c == Ctrl_N || c == Ctrl_T || c == Ctrl_V
477
f8b75b8f1988 updated for version 7.0128
vimboss
parents: 474
diff changeset
2130 || c == Ctrl_Q || c == Ctrl_U || c == Ctrl_O
f8b75b8f1988 updated for version 7.0128
vimboss
parents: 474
diff changeset
2131 || c == Ctrl_S || c == 's');
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2132 case CTRL_X_SCROLL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2133 return (c == Ctrl_Y || c == Ctrl_E);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2134 case CTRL_X_WHOLE_LINE:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2135 return (c == Ctrl_L || c == Ctrl_P || c == Ctrl_N);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2136 case CTRL_X_FILES:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2137 return (c == Ctrl_F || c == Ctrl_P || c == Ctrl_N);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2138 case CTRL_X_DICTIONARY:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2139 return (c == Ctrl_K || c == Ctrl_P || c == Ctrl_N);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2140 case CTRL_X_THESAURUS:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2141 return (c == Ctrl_T || c == Ctrl_P || c == Ctrl_N);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2142 case CTRL_X_TAGS:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2143 return (c == Ctrl_RSB || c == Ctrl_P || c == Ctrl_N);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2144 #ifdef FEAT_FIND_ID
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2145 case CTRL_X_PATH_PATTERNS:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2146 return (c == Ctrl_P || c == Ctrl_N);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2147 case CTRL_X_PATH_DEFINES:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2148 return (c == Ctrl_D || c == Ctrl_P || c == Ctrl_N);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2149 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2150 case CTRL_X_CMDLINE:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2151 return (c == Ctrl_V || c == Ctrl_Q || c == Ctrl_P || c == Ctrl_N
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2152 || c == Ctrl_X);
12
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 11
diff changeset
2153 #ifdef FEAT_COMPL_FUNC
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 11
diff changeset
2154 case CTRL_X_FUNCTION:
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
2155 return (c == Ctrl_U || c == Ctrl_P || c == Ctrl_N);
523
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 502
diff changeset
2156 case CTRL_X_OMNI:
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
2157 return (c == Ctrl_O || c == Ctrl_P || c == Ctrl_N);
502
52e76e2b5b65 updated for version 7.0140
vimboss
parents: 499
diff changeset
2158 #endif
477
f8b75b8f1988 updated for version 7.0128
vimboss
parents: 474
diff changeset
2159 case CTRL_X_SPELL:
f8b75b8f1988 updated for version 7.0128
vimboss
parents: 474
diff changeset
2160 return (c == Ctrl_S || c == Ctrl_P || c == Ctrl_N);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2161 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2162 EMSG(_(e_internal));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2163 return FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2164 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2165
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2166 /*
1430
342cf2a9f5cc updated for version 7.1-145
vimboss
parents: 1389
diff changeset
2167 * Return TRUE when character "c" is part of the item currently being
342cf2a9f5cc updated for version 7.1-145
vimboss
parents: 1389
diff changeset
2168 * completed. Used to decide whether to abandon complete mode when the menu
342cf2a9f5cc updated for version 7.1-145
vimboss
parents: 1389
diff changeset
2169 * is visible.
342cf2a9f5cc updated for version 7.1-145
vimboss
parents: 1389
diff changeset
2170 */
342cf2a9f5cc updated for version 7.1-145
vimboss
parents: 1389
diff changeset
2171 static int
342cf2a9f5cc updated for version 7.1-145
vimboss
parents: 1389
diff changeset
2172 ins_compl_accept_char(c)
342cf2a9f5cc updated for version 7.1-145
vimboss
parents: 1389
diff changeset
2173 int c;
342cf2a9f5cc updated for version 7.1-145
vimboss
parents: 1389
diff changeset
2174 {
342cf2a9f5cc updated for version 7.1-145
vimboss
parents: 1389
diff changeset
2175 if (ctrl_x_mode & CTRL_X_WANT_IDENT)
342cf2a9f5cc updated for version 7.1-145
vimboss
parents: 1389
diff changeset
2176 /* When expanding an identifier only accept identifier chars. */
342cf2a9f5cc updated for version 7.1-145
vimboss
parents: 1389
diff changeset
2177 return vim_isIDc(c);
342cf2a9f5cc updated for version 7.1-145
vimboss
parents: 1389
diff changeset
2178
342cf2a9f5cc updated for version 7.1-145
vimboss
parents: 1389
diff changeset
2179 switch (ctrl_x_mode)
342cf2a9f5cc updated for version 7.1-145
vimboss
parents: 1389
diff changeset
2180 {
342cf2a9f5cc updated for version 7.1-145
vimboss
parents: 1389
diff changeset
2181 case CTRL_X_FILES:
342cf2a9f5cc updated for version 7.1-145
vimboss
parents: 1389
diff changeset
2182 /* When expanding file name only accept file name chars. But not
342cf2a9f5cc updated for version 7.1-145
vimboss
parents: 1389
diff changeset
2183 * path separators, so that "proto/<Tab>" expands files in
342cf2a9f5cc updated for version 7.1-145
vimboss
parents: 1389
diff changeset
2184 * "proto", not "proto/" as a whole */
342cf2a9f5cc updated for version 7.1-145
vimboss
parents: 1389
diff changeset
2185 return vim_isfilec(c) && !vim_ispathsep(c);
342cf2a9f5cc updated for version 7.1-145
vimboss
parents: 1389
diff changeset
2186
342cf2a9f5cc updated for version 7.1-145
vimboss
parents: 1389
diff changeset
2187 case CTRL_X_CMDLINE:
342cf2a9f5cc updated for version 7.1-145
vimboss
parents: 1389
diff changeset
2188 case CTRL_X_OMNI:
342cf2a9f5cc updated for version 7.1-145
vimboss
parents: 1389
diff changeset
2189 /* Command line and Omni completion can work with just about any
342cf2a9f5cc updated for version 7.1-145
vimboss
parents: 1389
diff changeset
2190 * printable character, but do stop at white space. */
342cf2a9f5cc updated for version 7.1-145
vimboss
parents: 1389
diff changeset
2191 return vim_isprintc(c) && !vim_iswhite(c);
342cf2a9f5cc updated for version 7.1-145
vimboss
parents: 1389
diff changeset
2192
342cf2a9f5cc updated for version 7.1-145
vimboss
parents: 1389
diff changeset
2193 case CTRL_X_WHOLE_LINE:
342cf2a9f5cc updated for version 7.1-145
vimboss
parents: 1389
diff changeset
2194 /* For while line completion a space can be part of the line. */
342cf2a9f5cc updated for version 7.1-145
vimboss
parents: 1389
diff changeset
2195 return vim_isprintc(c);
342cf2a9f5cc updated for version 7.1-145
vimboss
parents: 1389
diff changeset
2196 }
342cf2a9f5cc updated for version 7.1-145
vimboss
parents: 1389
diff changeset
2197 return vim_iswordc(c);
342cf2a9f5cc updated for version 7.1-145
vimboss
parents: 1389
diff changeset
2198 }
342cf2a9f5cc updated for version 7.1-145
vimboss
parents: 1389
diff changeset
2199
342cf2a9f5cc updated for version 7.1-145
vimboss
parents: 1389
diff changeset
2200 /*
659
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
2201 * This is like ins_compl_add(), but if 'ic' and 'inf' are set, then the
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2202 * case of the originally typed text is used, and the case of the completed
1219
aea597af5b4e updated for version 7.1b
vimboss
parents: 1159
diff changeset
2203 * text is inferred, ie this tries to work out what case you probably wanted
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2204 * the rest of the word to be in -- webb
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2205 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2206 int
681
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
2207 ins_compl_add_infercase(str, len, icase, fname, dir, flags)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2208 char_u *str;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2209 int len;
681
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
2210 int icase;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2211 char_u *fname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2212 int dir;
464
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
2213 int flags;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2214 {
1353
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2215 char_u *p;
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2216 int i, c;
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2217 int actual_len; /* Take multi-byte characters */
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2218 int actual_compl_length; /* into account. */
2227
9c510840e896 updated for version 7.2.439
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
2219 int min_len;
2004
9e554211caf5 updated for version 7.2-301
vimboss
parents: 1988
diff changeset
2220 int *wca; /* Wide character array. */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2221 int has_lower = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2222 int was_letter = FALSE;
1353
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2223
1436
77310929a1f9 updated for version 7.1-151
vimboss
parents: 1434
diff changeset
2224 if (p_ic && curbuf->b_p_inf && len > 0)
1353
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2225 {
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2226 /* Infer case of completed part. */
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2227
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2228 /* Find actual length of completion. */
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2229 #ifdef FEAT_MBYTE
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2230 if (has_mbyte)
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2231 {
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2232 p = str;
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2233 actual_len = 0;
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2234 while (*p != NUL)
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2235 {
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2236 mb_ptr_adv(p);
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2237 ++actual_len;
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2238 }
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2239 }
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2240 else
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2241 #endif
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2242 actual_len = len;
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2243
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2244 /* Find actual length of original text. */
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2245 #ifdef FEAT_MBYTE
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2246 if (has_mbyte)
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2247 {
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2248 p = compl_orig_text;
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2249 actual_compl_length = 0;
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2250 while (*p != NUL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2251 {
1353
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2252 mb_ptr_adv(p);
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2253 ++actual_compl_length;
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2254 }
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2255 }
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2256 else
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2257 #endif
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2258 actual_compl_length = compl_length;
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2259
2227
9c510840e896 updated for version 7.2.439
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
2260 /* "actual_len" may be smaller than "actual_compl_length" when using
9c510840e896 updated for version 7.2.439
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
2261 * thesaurus, only use the minimum when comparing. */
9c510840e896 updated for version 7.2.439
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
2262 min_len = actual_len < actual_compl_length
9c510840e896 updated for version 7.2.439
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
2263 ? actual_len : actual_compl_length;
9c510840e896 updated for version 7.2.439
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
2264
1353
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2265 /* Allocate wide character array for the completion and fill it. */
1869
720a59d79bcd updated for version 7.2-168
vimboss
parents: 1811
diff changeset
2266 wca = (int *)alloc((unsigned)(actual_len * sizeof(int)));
1353
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2267 if (wca != NULL)
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2268 {
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2269 p = str;
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2270 for (i = 0; i < actual_len; ++i)
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2271 #ifdef FEAT_MBYTE
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2272 if (has_mbyte)
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2273 wca[i] = mb_ptr2char_adv(&p);
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2274 else
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2275 #endif
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2276 wca[i] = *(p++);
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2277
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2278 /* Rule 1: Were any chars converted to lower? */
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2279 p = compl_orig_text;
2227
9c510840e896 updated for version 7.2.439
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
2280 for (i = 0; i < min_len; ++i)
1353
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2281 {
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2282 #ifdef FEAT_MBYTE
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2283 if (has_mbyte)
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2284 c = mb_ptr2char_adv(&p);
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2285 else
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2286 #endif
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2287 c = *(p++);
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2288 if (MB_ISLOWER(c))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2289 {
1353
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2290 has_lower = TRUE;
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2291 if (MB_ISUPPER(wca[i]))
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2292 {
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2293 /* Rule 1 is satisfied. */
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2294 for (i = actual_compl_length; i < actual_len; ++i)
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2295 wca[i] = MB_TOLOWER(wca[i]);
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2296 break;
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2297 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2298 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2299 }
1353
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2300
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2301 /*
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2302 * Rule 2: No lower case, 2nd consecutive letter converted to
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2303 * upper case.
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2304 */
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2305 if (!has_lower)
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2306 {
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2307 p = compl_orig_text;
2227
9c510840e896 updated for version 7.2.439
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
2308 for (i = 0; i < min_len; ++i)
1353
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2309 {
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2310 #ifdef FEAT_MBYTE
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2311 if (has_mbyte)
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2312 c = mb_ptr2char_adv(&p);
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2313 else
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2314 #endif
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2315 c = *(p++);
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2316 if (was_letter && MB_ISUPPER(c) && MB_ISLOWER(wca[i]))
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2317 {
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2318 /* Rule 2 is satisfied. */
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2319 for (i = actual_compl_length; i < actual_len; ++i)
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2320 wca[i] = MB_TOUPPER(wca[i]);
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2321 break;
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2322 }
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2323 was_letter = MB_ISLOWER(c) || MB_ISUPPER(c);
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2324 }
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2325 }
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2326
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2327 /* Copy the original case of the part we typed. */
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2328 p = compl_orig_text;
2227
9c510840e896 updated for version 7.2.439
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
2329 for (i = 0; i < min_len; ++i)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2330 {
1353
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2331 #ifdef FEAT_MBYTE
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2332 if (has_mbyte)
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2333 c = mb_ptr2char_adv(&p);
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2334 else
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2335 #endif
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2336 c = *(p++);
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2337 if (MB_ISLOWER(c))
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2338 wca[i] = MB_TOLOWER(wca[i]);
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2339 else if (MB_ISUPPER(c))
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2340 wca[i] = MB_TOUPPER(wca[i]);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2341 }
1353
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2342
1436
77310929a1f9 updated for version 7.1-151
vimboss
parents: 1434
diff changeset
2343 /*
1353
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2344 * Generate encoding specific output from wide character array.
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2345 * Multi-byte characters can occupy up to five bytes more than
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2346 * ASCII characters, and we also need one byte for NUL, so stay
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2347 * six bytes away from the edge of IObuff.
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2348 */
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2349 p = IObuff;
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2350 i = 0;
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2351 while (i < actual_len && (p - IObuff + 6) < IOSIZE)
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2352 #ifdef FEAT_MBYTE
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2353 if (has_mbyte)
1446
f0b3b9ac2147 updated for version 7.1-161
vimboss
parents: 1436
diff changeset
2354 p += (*mb_char2bytes)(wca[i++], p);
1353
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2355 else
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2356 #endif
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2357 *(p++) = wca[i++];
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2358 *p = NUL;
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2359
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2360 vim_free(wca);
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
2361 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2362
841
c2cae213194d updated for version 7.0e07
vimboss
parents: 840
diff changeset
2363 return ins_compl_add(IObuff, len, icase, fname, NULL, dir,
c2cae213194d updated for version 7.0e07
vimboss
parents: 840
diff changeset
2364 flags, FALSE);
c2cae213194d updated for version 7.0e07
vimboss
parents: 840
diff changeset
2365 }
c2cae213194d updated for version 7.0e07
vimboss
parents: 840
diff changeset
2366 return ins_compl_add(str, len, icase, fname, NULL, dir, flags, FALSE);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2367 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2368
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2369 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2370 * Add a match to the list of matches.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2371 * If the given string is already in the list of completions, then return
464
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
2372 * NOTDONE, otherwise add it to the list and return OK. If there is an error,
681
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
2373 * maybe because alloc() returns NULL, then FAIL is returned.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2374 */
841
c2cae213194d updated for version 7.0e07
vimboss
parents: 840
diff changeset
2375 static int
944
b2dcb8457067 updated for version 7.0-070
vimboss
parents: 942
diff changeset
2376 ins_compl_add(str, len, icase, fname, cptext, cdir, flags, adup)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2377 char_u *str;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2378 int len;
681
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
2379 int icase;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2380 char_u *fname;
841
c2cae213194d updated for version 7.0e07
vimboss
parents: 840
diff changeset
2381 char_u **cptext; /* extra text for popup menu or NULL */
659
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
2382 int cdir;
464
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
2383 int flags;
944
b2dcb8457067 updated for version 7.0-070
vimboss
parents: 942
diff changeset
2384 int adup; /* accept duplicate match */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2385 {
464
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
2386 compl_T *match;
659
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
2387 int dir = (cdir == 0 ? compl_direction : cdir);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2388
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2389 ui_breakcheck();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2390 if (got_int)
464
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
2391 return FAIL;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2392 if (len < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2393 len = (int)STRLEN(str);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2394
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2395 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2396 * If the same match is already present, don't add it.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2397 */
944
b2dcb8457067 updated for version 7.0-070
vimboss
parents: 942
diff changeset
2398 if (compl_first_match != NULL && !adup)
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
2399 {
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
2400 match = compl_first_match;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2401 do
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2402 {
464
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
2403 if ( !(match->cp_flags & ORIGINAL_TEXT)
989
3f8cf4c668c3 updated for version 7.0-115
vimboss
parents: 987
diff changeset
2404 && STRNCMP(match->cp_str, str, len) == 0
464
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
2405 && match->cp_str[len] == NUL)
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
2406 return NOTDONE;
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
2407 match = match->cp_next;
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
2408 } while (match != NULL && match != compl_first_match);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2409 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2410
540
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2411 /* Remove any popup menu before changing the list of matches. */
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2412 ins_compl_del_pum();
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2413
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2414 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2415 * Allocate a new match structure.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2416 * Copy the values to the new match structure.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2417 */
659
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
2418 match = (compl_T *)alloc_clear((unsigned)sizeof(compl_T));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2419 if (match == NULL)
464
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
2420 return FAIL;
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
2421 match->cp_number = -1;
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
2422 if (flags & ORIGINAL_TEXT)
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
2423 match->cp_number = 0;
694
07d199fe02ed updated for version 7.0209
vimboss
parents: 692
diff changeset
2424 if ((match->cp_str = vim_strnsave(str, len)) == NULL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2425 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2426 vim_free(match);
464
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
2427 return FAIL;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2428 }
681
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
2429 match->cp_icase = icase;
659
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
2430
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2431 /* match-fname is:
464
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
2432 * - compl_curr_match->cp_fname if it is a string equal to fname.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2433 * - a copy of fname, FREE_FNAME is set to free later THE allocated mem.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2434 * - NULL otherwise. --Acevedo */
659
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
2435 if (fname != NULL
829
dc8197342755 updated for version 7.0d04
vimboss
parents: 828
diff changeset
2436 && compl_curr_match != NULL
659
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
2437 && compl_curr_match->cp_fname != NULL
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
2438 && STRCMP(fname, compl_curr_match->cp_fname) == 0)
464
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
2439 match->cp_fname = compl_curr_match->cp_fname;
659
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
2440 else if (fname != NULL)
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
2441 {
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
2442 match->cp_fname = vim_strsave(fname);
464
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
2443 flags |= FREE_FNAME;
659
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
2444 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2445 else
464
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
2446 match->cp_fname = NULL;
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
2447 match->cp_flags = flags;
786
8f6a426bc1e0 updated for version 7.0229
vimboss
parents: 782
diff changeset
2448
8f6a426bc1e0 updated for version 7.0229
vimboss
parents: 782
diff changeset
2449 if (cptext != NULL)
8f6a426bc1e0 updated for version 7.0229
vimboss
parents: 782
diff changeset
2450 {
8f6a426bc1e0 updated for version 7.0229
vimboss
parents: 782
diff changeset
2451 int i;
8f6a426bc1e0 updated for version 7.0229
vimboss
parents: 782
diff changeset
2452
8f6a426bc1e0 updated for version 7.0229
vimboss
parents: 782
diff changeset
2453 for (i = 0; i < CPT_COUNT; ++i)
8f6a426bc1e0 updated for version 7.0229
vimboss
parents: 782
diff changeset
2454 if (cptext[i] != NULL && *cptext[i] != NUL)
8f6a426bc1e0 updated for version 7.0229
vimboss
parents: 782
diff changeset
2455 match->cp_text[i] = vim_strsave(cptext[i]);
8f6a426bc1e0 updated for version 7.0229
vimboss
parents: 782
diff changeset
2456 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2457
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2458 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2459 * Link the new match structure in the list of matches.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2460 */
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
2461 if (compl_first_match == NULL)
464
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
2462 match->cp_next = match->cp_prev = NULL;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2463 else if (dir == FORWARD)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2464 {
464
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
2465 match->cp_next = compl_curr_match->cp_next;
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
2466 match->cp_prev = compl_curr_match;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2467 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2468 else /* BACKWARD */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2469 {
464
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
2470 match->cp_next = compl_curr_match;
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
2471 match->cp_prev = compl_curr_match->cp_prev;
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
2472 }
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
2473 if (match->cp_next)
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
2474 match->cp_next->cp_prev = match;
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
2475 if (match->cp_prev)
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
2476 match->cp_prev->cp_next = match;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2477 else /* if there's nothing before, it is the first match */
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
2478 compl_first_match = match;
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
2479 compl_curr_match = match;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2480
665
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
2481 /*
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
2482 * Find the longest common string if still doing that.
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
2483 */
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
2484 if (compl_get_longest && (flags & ORIGINAL_TEXT) == 0)
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
2485 ins_compl_longest_match(match);
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
2486
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2487 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2488 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2489
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2490 /*
681
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
2491 * Return TRUE if "str[len]" matches with match->cp_str, considering
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
2492 * match->cp_icase.
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
2493 */
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
2494 static int
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
2495 ins_compl_equal(match, str, len)
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
2496 compl_T *match;
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
2497 char_u *str;
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
2498 int len;
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
2499 {
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
2500 if (match->cp_icase)
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
2501 return STRNICMP(match->cp_str, str, (size_t)len) == 0;
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
2502 return STRNCMP(match->cp_str, str, (size_t)len) == 0;
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
2503 }
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
2504
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
2505 /*
665
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
2506 * Reduce the longest common string for match "match".
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
2507 */
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
2508 static void
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
2509 ins_compl_longest_match(match)
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
2510 compl_T *match;
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
2511 {
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
2512 char_u *p, *s;
681
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
2513 int c1, c2;
665
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
2514 int had_match;
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
2515
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
2516 if (compl_leader == NULL)
842
a209672376fd updated for version 7.0f
vimboss
parents: 841
diff changeset
2517 {
665
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
2518 /* First match, use it as a whole. */
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
2519 compl_leader = vim_strsave(match->cp_str);
842
a209672376fd updated for version 7.0f
vimboss
parents: 841
diff changeset
2520 if (compl_leader != NULL)
a209672376fd updated for version 7.0f
vimboss
parents: 841
diff changeset
2521 {
a209672376fd updated for version 7.0f
vimboss
parents: 841
diff changeset
2522 had_match = (curwin->w_cursor.col > compl_col);
a209672376fd updated for version 7.0f
vimboss
parents: 841
diff changeset
2523 ins_compl_delete();
1782
12cecc379574 updated for version 7.2-080
vimboss
parents: 1698
diff changeset
2524 ins_bytes(compl_leader + ins_compl_len());
842
a209672376fd updated for version 7.0f
vimboss
parents: 841
diff changeset
2525 ins_redraw(FALSE);
a209672376fd updated for version 7.0f
vimboss
parents: 841
diff changeset
2526
a209672376fd updated for version 7.0f
vimboss
parents: 841
diff changeset
2527 /* When the match isn't there (to avoid matching itself) remove it
a209672376fd updated for version 7.0f
vimboss
parents: 841
diff changeset
2528 * again after redrawing. */
a209672376fd updated for version 7.0f
vimboss
parents: 841
diff changeset
2529 if (!had_match)
a209672376fd updated for version 7.0f
vimboss
parents: 841
diff changeset
2530 ins_compl_delete();
a209672376fd updated for version 7.0f
vimboss
parents: 841
diff changeset
2531 compl_used_match = FALSE;
a209672376fd updated for version 7.0f
vimboss
parents: 841
diff changeset
2532 }
a209672376fd updated for version 7.0f
vimboss
parents: 841
diff changeset
2533 }
665
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
2534 else
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
2535 {
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
2536 /* Reduce the text if this match differs from compl_leader. */
681
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
2537 p = compl_leader;
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
2538 s = match->cp_str;
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
2539 while (*p != NUL)
665
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
2540 {
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
2541 #ifdef FEAT_MBYTE
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
2542 if (has_mbyte)
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
2543 {
681
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
2544 c1 = mb_ptr2char(p);
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
2545 c2 = mb_ptr2char(s);
665
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
2546 }
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
2547 else
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
2548 #endif
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
2549 {
681
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
2550 c1 = *p;
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
2551 c2 = *s;
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
2552 }
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
2553 if (match->cp_icase ? (MB_TOLOWER(c1) != MB_TOLOWER(c2))
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
2554 : (c1 != c2))
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
2555 break;
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
2556 #ifdef FEAT_MBYTE
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
2557 if (has_mbyte)
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
2558 {
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
2559 mb_ptr_adv(p);
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
2560 mb_ptr_adv(s);
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
2561 }
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
2562 else
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
2563 #endif
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
2564 {
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
2565 ++p;
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
2566 ++s;
665
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
2567 }
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
2568 }
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
2569
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
2570 if (*p != NUL)
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
2571 {
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
2572 /* Leader was shortened, need to change the inserted text. */
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
2573 *p = NUL;
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
2574 had_match = (curwin->w_cursor.col > compl_col);
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
2575 ins_compl_delete();
1782
12cecc379574 updated for version 7.2-080
vimboss
parents: 1698
diff changeset
2576 ins_bytes(compl_leader + ins_compl_len());
665
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
2577 ins_redraw(FALSE);
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
2578
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
2579 /* When the match isn't there (to avoid matching itself) remove it
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
2580 * again after redrawing. */
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
2581 if (!had_match)
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
2582 ins_compl_delete();
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
2583 }
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
2584
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
2585 compl_used_match = FALSE;
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
2586 }
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
2587 }
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
2588
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
2589 /*
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2590 * Add an array of matches to the list of matches.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2591 * Frees matches[].
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2592 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2593 static void
681
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
2594 ins_compl_add_matches(num_matches, matches, icase)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2595 int num_matches;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2596 char_u **matches;
681
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
2597 int icase;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2598 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2599 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2600 int add_r = OK;
659
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
2601 int dir = compl_direction;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2602
464
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
2603 for (i = 0; i < num_matches && add_r != FAIL; i++)
681
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
2604 if ((add_r = ins_compl_add(matches[i], -1, icase,
841
c2cae213194d updated for version 7.0e07
vimboss
parents: 840
diff changeset
2605 NULL, NULL, dir, 0, FALSE)) == OK)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2606 /* if dir was BACKWARD then honor it just once */
659
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
2607 dir = FORWARD;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2608 FreeWild(num_matches, matches);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2609 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2610
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2611 /* Make the completion list cyclic.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2612 * Return the number of matches (excluding the original).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2613 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2614 static int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2615 ins_compl_make_cyclic()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2616 {
464
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
2617 compl_T *match;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2618 int count = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2619
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
2620 if (compl_first_match != NULL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2621 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2622 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2623 * Find the end of the list.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2624 */
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
2625 match = compl_first_match;
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
2626 /* there's always an entry for the compl_orig_text, it doesn't count. */
464
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
2627 while (match->cp_next != NULL && match->cp_next != compl_first_match)
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
2628 {
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
2629 match = match->cp_next;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2630 ++count;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2631 }
464
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
2632 match->cp_next = compl_first_match;
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
2633 compl_first_match->cp_prev = match;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2634 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2635 return count;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2636 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2637
724
a35dce0cabc5 updated for version 7.0220
vimboss
parents: 716
diff changeset
2638 /*
a35dce0cabc5 updated for version 7.0220
vimboss
parents: 716
diff changeset
2639 * Start completion for the complete() function.
a35dce0cabc5 updated for version 7.0220
vimboss
parents: 716
diff changeset
2640 * "startcol" is where the matched text starts (1 is first column).
a35dce0cabc5 updated for version 7.0220
vimboss
parents: 716
diff changeset
2641 * "list" is the list of matches.
a35dce0cabc5 updated for version 7.0220
vimboss
parents: 716
diff changeset
2642 */
a35dce0cabc5 updated for version 7.0220
vimboss
parents: 716
diff changeset
2643 void
a35dce0cabc5 updated for version 7.0220
vimboss
parents: 716
diff changeset
2644 set_completion(startcol, list)
1869
720a59d79bcd updated for version 7.2-168
vimboss
parents: 1811
diff changeset
2645 colnr_T startcol;
724
a35dce0cabc5 updated for version 7.0220
vimboss
parents: 716
diff changeset
2646 list_T *list;
a35dce0cabc5 updated for version 7.0220
vimboss
parents: 716
diff changeset
2647 {
a35dce0cabc5 updated for version 7.0220
vimboss
parents: 716
diff changeset
2648 /* If already doing completions stop it. */
a35dce0cabc5 updated for version 7.0220
vimboss
parents: 716
diff changeset
2649 if (ctrl_x_mode != 0)
a35dce0cabc5 updated for version 7.0220
vimboss
parents: 716
diff changeset
2650 ins_compl_prep(' ');
a35dce0cabc5 updated for version 7.0220
vimboss
parents: 716
diff changeset
2651 ins_compl_clear();
a35dce0cabc5 updated for version 7.0220
vimboss
parents: 716
diff changeset
2652
a35dce0cabc5 updated for version 7.0220
vimboss
parents: 716
diff changeset
2653 if (stop_arrow() == FAIL)
a35dce0cabc5 updated for version 7.0220
vimboss
parents: 716
diff changeset
2654 return;
a35dce0cabc5 updated for version 7.0220
vimboss
parents: 716
diff changeset
2655
1869
720a59d79bcd updated for version 7.2-168
vimboss
parents: 1811
diff changeset
2656 if (startcol > curwin->w_cursor.col)
724
a35dce0cabc5 updated for version 7.0220
vimboss
parents: 716
diff changeset
2657 startcol = curwin->w_cursor.col;
a35dce0cabc5 updated for version 7.0220
vimboss
parents: 716
diff changeset
2658 compl_col = startcol;
1869
720a59d79bcd updated for version 7.2-168
vimboss
parents: 1811
diff changeset
2659 compl_length = (int)curwin->w_cursor.col - (int)startcol;
724
a35dce0cabc5 updated for version 7.0220
vimboss
parents: 716
diff changeset
2660 /* compl_pattern doesn't need to be set */
a35dce0cabc5 updated for version 7.0220
vimboss
parents: 716
diff changeset
2661 compl_orig_text = vim_strnsave(ml_get_curline() + compl_col, compl_length);
a35dce0cabc5 updated for version 7.0220
vimboss
parents: 716
diff changeset
2662 if (compl_orig_text == NULL || ins_compl_add(compl_orig_text,
942
29bf49bad20d updated for version 7.0-068
vimboss
parents: 941
diff changeset
2663 -1, p_ic, NULL, NULL, 0, ORIGINAL_TEXT, FALSE) != OK)
724
a35dce0cabc5 updated for version 7.0220
vimboss
parents: 716
diff changeset
2664 return;
a35dce0cabc5 updated for version 7.0220
vimboss
parents: 716
diff changeset
2665
a35dce0cabc5 updated for version 7.0220
vimboss
parents: 716
diff changeset
2666 /* Handle like dictionary completion. */
a35dce0cabc5 updated for version 7.0220
vimboss
parents: 716
diff changeset
2667 ctrl_x_mode = CTRL_X_WHOLE_LINE;
a35dce0cabc5 updated for version 7.0220
vimboss
parents: 716
diff changeset
2668
a35dce0cabc5 updated for version 7.0220
vimboss
parents: 716
diff changeset
2669 ins_compl_add_list(list);
a35dce0cabc5 updated for version 7.0220
vimboss
parents: 716
diff changeset
2670 compl_matches = ins_compl_make_cyclic();
a35dce0cabc5 updated for version 7.0220
vimboss
parents: 716
diff changeset
2671 compl_started = TRUE;
a35dce0cabc5 updated for version 7.0220
vimboss
parents: 716
diff changeset
2672 compl_used_match = TRUE;
929
2448f4c8afc6 updated for version 7.0-055
vimboss
parents: 909
diff changeset
2673 compl_cont_status = 0;
724
a35dce0cabc5 updated for version 7.0220
vimboss
parents: 716
diff changeset
2674
a35dce0cabc5 updated for version 7.0220
vimboss
parents: 716
diff changeset
2675 compl_curr_match = compl_first_match;
a35dce0cabc5 updated for version 7.0220
vimboss
parents: 716
diff changeset
2676 ins_complete(Ctrl_N);
a35dce0cabc5 updated for version 7.0220
vimboss
parents: 716
diff changeset
2677 out_flush();
a35dce0cabc5 updated for version 7.0220
vimboss
parents: 716
diff changeset
2678 }
a35dce0cabc5 updated for version 7.0220
vimboss
parents: 716
diff changeset
2679
a35dce0cabc5 updated for version 7.0220
vimboss
parents: 716
diff changeset
2680
574
25a70b1cd2da updated for version 7.0163
vimboss
parents: 548
diff changeset
2681 /* "compl_match_array" points the currently displayed list of entries in the
25a70b1cd2da updated for version 7.0163
vimboss
parents: 548
diff changeset
2682 * popup menu. It is NULL when there is no popup menu. */
659
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
2683 static pumitem_T *compl_match_array = NULL;
540
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2684 static int compl_match_arraysize;
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2685
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2686 /*
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2687 * Update the screen and when there is any scrolling remove the popup menu.
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2688 */
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2689 static void
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2690 ins_compl_upd_pum()
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2691 {
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2692 int h;
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2693
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2694 if (compl_match_array != NULL)
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2695 {
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2696 h = curwin->w_cline_height;
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2697 update_screen(0);
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2698 if (h != curwin->w_cline_height)
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2699 ins_compl_del_pum();
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2700 }
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2701 }
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2702
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2703 /*
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2704 * Remove any popup menu.
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2705 */
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2706 static void
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2707 ins_compl_del_pum()
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2708 {
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2709 if (compl_match_array != NULL)
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2710 {
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2711 pum_undisplay();
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2712 vim_free(compl_match_array);
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2713 compl_match_array = NULL;
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2714 }
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2715 }
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2716
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2717 /*
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2718 * Return TRUE if the popup menu should be displayed.
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2719 */
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2720 static int
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2721 pum_wanted()
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2722 {
707
111b7dcc8a17 updated for version 7.0213
vimboss
parents: 703
diff changeset
2723 /* 'completeopt' must contain "menu" or "menuone" */
665
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
2724 if (vim_strchr(p_cot, 'm') == NULL)
540
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2725 return FALSE;
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2726
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2727 /* The display looks bad on a B&W display. */
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2728 if (t_colors < 8
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2729 #ifdef FEAT_GUI
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2730 && !gui.in_use
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2731 #endif
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2732 )
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2733 return FALSE;
657
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
2734 return TRUE;
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
2735 }
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
2736
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
2737 /*
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
2738 * Return TRUE if there are two or more matches to be shown in the popup menu.
707
111b7dcc8a17 updated for version 7.0213
vimboss
parents: 703
diff changeset
2739 * One if 'completopt' contains "menuone".
657
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
2740 */
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
2741 static int
707
111b7dcc8a17 updated for version 7.0213
vimboss
parents: 703
diff changeset
2742 pum_enough_matches()
657
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
2743 {
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
2744 compl_T *compl;
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
2745 int i;
540
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2746
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2747 /* Don't display the popup menu if there are no matches or there is only
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2748 * one (ignoring the original text). */
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2749 compl = compl_first_match;
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2750 i = 0;
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2751 do
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2752 {
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2753 if (compl == NULL
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2754 || ((compl->cp_flags & ORIGINAL_TEXT) == 0 && ++i == 2))
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2755 break;
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2756 compl = compl->cp_next;
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2757 } while (compl != compl_first_match);
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2758
707
111b7dcc8a17 updated for version 7.0213
vimboss
parents: 703
diff changeset
2759 if (strstr((char *)p_cot, "menuone") != NULL)
111b7dcc8a17 updated for version 7.0213
vimboss
parents: 703
diff changeset
2760 return (i >= 1);
540
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2761 return (i >= 2);
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2762 }
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2763
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2764 /*
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2765 * Show the popup menu for the list of matches.
659
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
2766 * Also adjusts "compl_shown_match" to an entry that is actually displayed.
540
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2767 */
648
9032e4668296 updated for version 7.0189
vimboss
parents: 644
diff changeset
2768 void
540
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2769 ins_compl_show_pum()
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2770 {
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2771 compl_T *compl;
659
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
2772 compl_T *shown_compl = NULL;
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
2773 int did_find_shown_match = FALSE;
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
2774 int shown_match_ok = FALSE;
540
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2775 int i;
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2776 int cur = -1;
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2777 colnr_T col;
657
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
2778 int lead_len = 0;
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
2779
707
111b7dcc8a17 updated for version 7.0213
vimboss
parents: 703
diff changeset
2780 if (!pum_wanted() || !pum_enough_matches())
540
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2781 return;
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2782
794
f19994020dad updated for version 7.0231
vimboss
parents: 786
diff changeset
2783 #if defined(FEAT_EVAL)
f19994020dad updated for version 7.0231
vimboss
parents: 786
diff changeset
2784 /* Dirty hard-coded hack: remove any matchparen highlighting. */
f19994020dad updated for version 7.0231
vimboss
parents: 786
diff changeset
2785 do_cmdline_cmd((char_u *)"if exists('g:loaded_matchparen')|3match none|endif");
f19994020dad updated for version 7.0231
vimboss
parents: 786
diff changeset
2786 #endif
f19994020dad updated for version 7.0231
vimboss
parents: 786
diff changeset
2787
540
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2788 /* Update the screen before drawing the popup menu over it. */
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2789 update_screen(0);
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2790
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2791 if (compl_match_array == NULL)
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2792 {
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2793 /* Need to build the popup menu list. */
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2794 compl_match_arraysize = 0;
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2795 compl = compl_first_match;
657
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
2796 if (compl_leader != NULL)
835
8bebcabccc2c updated for version 7.0e01
vimboss
parents: 829
diff changeset
2797 lead_len = (int)STRLEN(compl_leader);
540
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2798 do
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2799 {
657
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
2800 if ((compl->cp_flags & ORIGINAL_TEXT) == 0
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
2801 && (compl_leader == NULL
681
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
2802 || ins_compl_equal(compl, compl_leader, lead_len)))
540
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2803 ++compl_match_arraysize;
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2804 compl = compl->cp_next;
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2805 } while (compl != NULL && compl != compl_first_match);
657
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
2806 if (compl_match_arraysize == 0)
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
2807 return;
659
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
2808 compl_match_array = (pumitem_T *)alloc_clear(
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
2809 (unsigned)(sizeof(pumitem_T)
540
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2810 * compl_match_arraysize));
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2811 if (compl_match_array != NULL)
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2812 {
829
dc8197342755 updated for version 7.0d04
vimboss
parents: 828
diff changeset
2813 /* If the current match is the original text don't find the first
dc8197342755 updated for version 7.0d04
vimboss
parents: 828
diff changeset
2814 * match after it, don't highlight anything. */
dc8197342755 updated for version 7.0d04
vimboss
parents: 828
diff changeset
2815 if (compl_shown_match->cp_flags & ORIGINAL_TEXT)
dc8197342755 updated for version 7.0d04
vimboss
parents: 828
diff changeset
2816 shown_match_ok = TRUE;
dc8197342755 updated for version 7.0d04
vimboss
parents: 828
diff changeset
2817
540
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2818 i = 0;
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2819 compl = compl_first_match;
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2820 do
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2821 {
657
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
2822 if ((compl->cp_flags & ORIGINAL_TEXT) == 0
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
2823 && (compl_leader == NULL
681
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
2824 || ins_compl_equal(compl, compl_leader, lead_len)))
540
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2825 {
659
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
2826 if (!shown_match_ok)
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
2827 {
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
2828 if (compl == compl_shown_match || did_find_shown_match)
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
2829 {
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
2830 /* This item is the shown match or this is the
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
2831 * first displayed item after the shown match. */
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
2832 compl_shown_match = compl;
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
2833 did_find_shown_match = TRUE;
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
2834 shown_match_ok = TRUE;
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
2835 }
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
2836 else
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
2837 /* Remember this displayed match for when the
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
2838 * shown match is just below it. */
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
2839 shown_compl = compl;
540
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2840 cur = i;
659
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
2841 }
786
8f6a426bc1e0 updated for version 7.0229
vimboss
parents: 782
diff changeset
2842
8f6a426bc1e0 updated for version 7.0229
vimboss
parents: 782
diff changeset
2843 if (compl->cp_text[CPT_ABBR] != NULL)
8f6a426bc1e0 updated for version 7.0229
vimboss
parents: 782
diff changeset
2844 compl_match_array[i].pum_text =
8f6a426bc1e0 updated for version 7.0229
vimboss
parents: 782
diff changeset
2845 compl->cp_text[CPT_ABBR];
8f6a426bc1e0 updated for version 7.0229
vimboss
parents: 782
diff changeset
2846 else
8f6a426bc1e0 updated for version 7.0229
vimboss
parents: 782
diff changeset
2847 compl_match_array[i].pum_text = compl->cp_str;
8f6a426bc1e0 updated for version 7.0229
vimboss
parents: 782
diff changeset
2848 compl_match_array[i].pum_kind = compl->cp_text[CPT_KIND];
8f6a426bc1e0 updated for version 7.0229
vimboss
parents: 782
diff changeset
2849 compl_match_array[i].pum_info = compl->cp_text[CPT_INFO];
8f6a426bc1e0 updated for version 7.0229
vimboss
parents: 782
diff changeset
2850 if (compl->cp_text[CPT_MENU] != NULL)
8f6a426bc1e0 updated for version 7.0229
vimboss
parents: 782
diff changeset
2851 compl_match_array[i++].pum_extra =
8f6a426bc1e0 updated for version 7.0229
vimboss
parents: 782
diff changeset
2852 compl->cp_text[CPT_MENU];
659
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
2853 else
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
2854 compl_match_array[i++].pum_extra = compl->cp_fname;
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
2855 }
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
2856
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
2857 if (compl == compl_shown_match)
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
2858 {
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
2859 did_find_shown_match = TRUE;
716
8ae24f338cab updated for version 7.0217
vimboss
parents: 714
diff changeset
2860
8ae24f338cab updated for version 7.0217
vimboss
parents: 714
diff changeset
2861 /* When the original text is the shown match don't set
8ae24f338cab updated for version 7.0217
vimboss
parents: 714
diff changeset
2862 * compl_shown_match. */
8ae24f338cab updated for version 7.0217
vimboss
parents: 714
diff changeset
2863 if (compl->cp_flags & ORIGINAL_TEXT)
8ae24f338cab updated for version 7.0217
vimboss
parents: 714
diff changeset
2864 shown_match_ok = TRUE;
8ae24f338cab updated for version 7.0217
vimboss
parents: 714
diff changeset
2865
659
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
2866 if (!shown_match_ok && shown_compl != NULL)
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
2867 {
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
2868 /* The shown match isn't displayed, set it to the
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
2869 * previously displayed match. */
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
2870 compl_shown_match = shown_compl;
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
2871 shown_match_ok = TRUE;
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
2872 }
540
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2873 }
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2874 compl = compl->cp_next;
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2875 } while (compl != NULL && compl != compl_first_match);
659
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
2876
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
2877 if (!shown_match_ok) /* no displayed match at all */
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
2878 cur = -1;
540
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2879 }
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2880 }
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2881 else
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2882 {
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2883 /* popup menu already exists, only need to find the current item.*/
657
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
2884 for (i = 0; i < compl_match_arraysize; ++i)
786
8f6a426bc1e0 updated for version 7.0229
vimboss
parents: 782
diff changeset
2885 if (compl_match_array[i].pum_text == compl_shown_match->cp_str
8f6a426bc1e0 updated for version 7.0229
vimboss
parents: 782
diff changeset
2886 || compl_match_array[i].pum_text
8f6a426bc1e0 updated for version 7.0229
vimboss
parents: 782
diff changeset
2887 == compl_shown_match->cp_text[CPT_ABBR])
829
dc8197342755 updated for version 7.0d04
vimboss
parents: 828
diff changeset
2888 {
dc8197342755 updated for version 7.0d04
vimboss
parents: 828
diff changeset
2889 cur = i;
657
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
2890 break;
829
dc8197342755 updated for version 7.0d04
vimboss
parents: 828
diff changeset
2891 }
540
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2892 }
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2893
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2894 if (compl_match_array != NULL)
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2895 {
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2896 /* Compute the screen column of the start of the completed text.
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2897 * Use the cursor to get all wrapping and other settings right. */
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2898 col = curwin->w_cursor.col;
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2899 curwin->w_cursor.col = compl_col;
732
f7034dd506fd updated for version 7.0221
vimboss
parents: 724
diff changeset
2900 pum_display(compl_match_array, compl_match_arraysize, cur);
540
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2901 curwin->w_cursor.col = col;
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2902 }
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2903 }
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
2904
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2905 #define DICT_FIRST (1) /* use just first element in "dict" */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2906 #define DICT_EXACT (2) /* "dict" is the exact name of a file */
648
9032e4668296 updated for version 7.0189
vimboss
parents: 644
diff changeset
2907
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2908 /*
703
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
2909 * Add any identifiers that match the given pattern in the list of dictionary
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
2910 * files "dict_start" to the list of completions.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2911 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2912 static void
703
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
2913 ins_compl_dictionaries(dict_start, pat, flags, thesaurus)
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
2914 char_u *dict_start;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2915 char_u *pat;
667
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
2916 int flags; /* DICT_FIRST and/or DICT_EXACT */
703
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
2917 int thesaurus; /* Thesaurus completion */
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
2918 {
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
2919 char_u *dict = dict_start;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2920 char_u *ptr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2921 char_u *buf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2922 regmatch_T regmatch;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2923 char_u **files;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2924 int count;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2925 int save_p_scs;
659
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
2926 int dir = compl_direction;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2927
703
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
2928 if (*dict == NUL)
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
2929 {
744
07f7b4a7755c updated for version 7.0222
vimboss
parents: 732
diff changeset
2930 #ifdef FEAT_SPELL
703
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
2931 /* When 'dictionary' is empty and spell checking is enabled use
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
2932 * "spell". */
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
2933 if (!thesaurus && curwin->w_p_spell)
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
2934 dict = (char_u *)"spell";
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
2935 else
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
2936 #endif
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
2937 return;
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
2938 }
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
2939
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2940 buf = alloc(LSIZE);
703
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
2941 if (buf == NULL)
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
2942 return;
1074
a112fdce9ebd updated for version 7.0-200
vimboss
parents: 1073
diff changeset
2943 regmatch.regprog = NULL; /* so that we can goto theend */
703
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
2944
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2945 /* If 'infercase' is set, don't use 'smartcase' here */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2946 save_p_scs = p_scs;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2947 if (curbuf->b_p_inf)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2948 p_scs = FALSE;
667
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
2949
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
2950 /* When invoked to match whole lines for CTRL-X CTRL-L adjust the pattern
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
2951 * to only match at the start of a line. Otherwise just match the
842
a209672376fd updated for version 7.0f
vimboss
parents: 841
diff changeset
2952 * pattern. Also need to double backslashes. */
667
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
2953 if (ctrl_x_mode == CTRL_X_WHOLE_LINE)
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
2954 {
842
a209672376fd updated for version 7.0f
vimboss
parents: 841
diff changeset
2955 char_u *pat_esc = vim_strsave_escaped(pat, (char_u *)"\\");
1869
720a59d79bcd updated for version 7.2-168
vimboss
parents: 1811
diff changeset
2956 size_t len;
842
a209672376fd updated for version 7.0f
vimboss
parents: 841
diff changeset
2957
a209672376fd updated for version 7.0f
vimboss
parents: 841
diff changeset
2958 if (pat_esc == NULL)
1159
b5ee70fc4b0c updated for version 7.1a
vimboss
parents: 1085
diff changeset
2959 goto theend;
1869
720a59d79bcd updated for version 7.2-168
vimboss
parents: 1811
diff changeset
2960 len = STRLEN(pat_esc) + 10;
720a59d79bcd updated for version 7.2-168
vimboss
parents: 1811
diff changeset
2961 ptr = alloc((unsigned)len);
667
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
2962 if (ptr == NULL)
842
a209672376fd updated for version 7.0f
vimboss
parents: 841
diff changeset
2963 {
a209672376fd updated for version 7.0f
vimboss
parents: 841
diff changeset
2964 vim_free(pat_esc);
1074
a112fdce9ebd updated for version 7.0-200
vimboss
parents: 1073
diff changeset
2965 goto theend;
842
a209672376fd updated for version 7.0f
vimboss
parents: 841
diff changeset
2966 }
1869
720a59d79bcd updated for version 7.2-168
vimboss
parents: 1811
diff changeset
2967 vim_snprintf((char *)ptr, len, "^\\s*\\zs\\V%s", pat_esc);
842
a209672376fd updated for version 7.0f
vimboss
parents: 841
diff changeset
2968 regmatch.regprog = vim_regcomp(ptr, RE_MAGIC);
a209672376fd updated for version 7.0f
vimboss
parents: 841
diff changeset
2969 vim_free(pat_esc);
667
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
2970 vim_free(ptr);
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
2971 }
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
2972 else
703
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
2973 {
667
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
2974 regmatch.regprog = vim_regcomp(pat, p_magic ? RE_MAGIC : 0);
703
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
2975 if (regmatch.regprog == NULL)
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
2976 goto theend;
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
2977 }
667
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
2978
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2979 /* ignore case depends on 'ignorecase', 'smartcase' and "pat" */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2980 regmatch.rm_ic = ignorecase(pat);
703
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
2981 while (*dict != NUL && !got_int && !compl_interrupted)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2982 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2983 /* copy one dictionary file name into buf */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2984 if (flags == DICT_EXACT)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2985 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2986 count = 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2987 files = &dict;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2988 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2989 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2990 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2991 /* Expand wildcards in the dictionary name, but do not allow
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2992 * backticks (for security, the 'dict' option may have been set in
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2993 * a modeline). */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2994 copy_option_part(&dict, buf, LSIZE, ",");
744
07f7b4a7755c updated for version 7.0222
vimboss
parents: 732
diff changeset
2995 # ifdef FEAT_SPELL
703
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
2996 if (!thesaurus && STRCMP(buf, "spell") == 0)
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
2997 count = -1;
744
07f7b4a7755c updated for version 7.0222
vimboss
parents: 732
diff changeset
2998 else
07f7b4a7755c updated for version 7.0222
vimboss
parents: 732
diff changeset
2999 # endif
07f7b4a7755c updated for version 7.0222
vimboss
parents: 732
diff changeset
3000 if (vim_strchr(buf, '`') != NULL
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3001 || expand_wildcards(1, &buf, &count, &files,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3002 EW_FILE|EW_SILENT) != OK)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3003 count = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3004 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3005
744
07f7b4a7755c updated for version 7.0222
vimboss
parents: 732
diff changeset
3006 # ifdef FEAT_SPELL
703
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3007 if (count == -1)
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3008 {
712
2e887dfa8917 updated for version 7.0214
vimboss
parents: 707
diff changeset
3009 /* Complete from active spelling. Skip "\<" in the pattern, we
2e887dfa8917 updated for version 7.0214
vimboss
parents: 707
diff changeset
3010 * don't use it as a RE. */
703
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3011 if (pat[0] == '\\' && pat[1] == '<')
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3012 ptr = pat + 2;
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3013 else
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3014 ptr = pat;
2250
1bac28a53fae Add the conceal patch from Vince Negri.
Bram Moolenaar <bram@vim.org>
parents: 2227
diff changeset
3015 spell_dump_compl(ptr, regmatch.rm_ic, &dir, 0);
703
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3016 }
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3017 else
744
07f7b4a7755c updated for version 7.0222
vimboss
parents: 732
diff changeset
3018 # endif
938
fc0c566b9107 updated for version 7.0-064
vimboss
parents: 935
diff changeset
3019 if (count > 0) /* avoid warning for using "files" uninit */
703
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3020 {
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3021 ins_compl_files(count, files, thesaurus, flags,
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3022 &regmatch, buf, &dir);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3023 if (flags != DICT_EXACT)
703
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3024 FreeWild(count, files);
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3025 }
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3026 if (flags != 0)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3027 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3028 }
703
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3029
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3030 theend:
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3031 p_scs = save_p_scs;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3032 vim_free(regmatch.regprog);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3033 vim_free(buf);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3034 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3035
703
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3036 static void
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3037 ins_compl_files(count, files, thesaurus, flags, regmatch, buf, dir)
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3038 int count;
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3039 char_u **files;
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3040 int thesaurus;
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3041 int flags;
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3042 regmatch_T *regmatch;
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3043 char_u *buf;
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3044 int *dir;
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3045 {
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3046 char_u *ptr;
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3047 int i;
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3048 FILE *fp;
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3049 int add_r;
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3050
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3051 for (i = 0; i < count && !got_int && !compl_interrupted; i++)
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3052 {
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3053 fp = mch_fopen((char *)files[i], "r"); /* open dictionary file */
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3054 if (flags != DICT_EXACT)
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3055 {
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3056 vim_snprintf((char *)IObuff, IOSIZE,
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3057 _("Scanning dictionary: %s"), (char *)files[i]);
1869
720a59d79bcd updated for version 7.2-168
vimboss
parents: 1811
diff changeset
3058 (void)msg_trunc_attr(IObuff, TRUE, hl_attr(HLF_R));
703
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3059 }
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3060
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3061 if (fp != NULL)
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3062 {
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3063 /*
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3064 * Read dictionary file line by line.
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3065 * Check each line for a match.
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3066 */
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3067 while (!got_int && !compl_interrupted
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3068 && !vim_fgets(buf, LSIZE, fp))
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3069 {
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3070 ptr = buf;
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3071 while (vim_regexec(regmatch, buf, (colnr_T)(ptr - buf)))
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3072 {
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3073 ptr = regmatch->startp[0];
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3074 if (ctrl_x_mode == CTRL_X_WHOLE_LINE)
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3075 ptr = find_line_end(ptr);
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3076 else
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3077 ptr = find_word_end(ptr);
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3078 add_r = ins_compl_add_infercase(regmatch->startp[0],
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3079 (int)(ptr - regmatch->startp[0]),
942
29bf49bad20d updated for version 7.0-068
vimboss
parents: 941
diff changeset
3080 p_ic, files[i], *dir, 0);
703
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3081 if (thesaurus)
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3082 {
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3083 char_u *wstart;
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3084
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3085 /*
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3086 * Add the other matches on the line
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3087 */
1353
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
3088 ptr = buf;
703
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3089 while (!got_int)
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3090 {
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3091 /* Find start of the next word. Skip white
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3092 * space and punctuation. */
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3093 ptr = find_word_start(ptr);
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3094 if (*ptr == NUL || *ptr == NL)
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3095 break;
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3096 wstart = ptr;
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3097
1353
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
3098 /* Find end of the word. */
703
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3099 #ifdef FEAT_MBYTE
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3100 if (has_mbyte)
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3101 /* Japanese words may have characters in
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3102 * different classes, only separate words
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3103 * with single-byte non-word characters. */
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3104 while (*ptr != NUL)
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3105 {
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3106 int l = (*mb_ptr2len)(ptr);
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3107
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3108 if (l < 2 && !vim_iswordc(*ptr))
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3109 break;
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3110 ptr += l;
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3111 }
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3112 else
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3113 #endif
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3114 ptr = find_word_end(ptr);
1353
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
3115
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
3116 /* Add the word. Skip the regexp match. */
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
3117 if (wstart != regmatch->startp[0])
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
3118 add_r = ins_compl_add_infercase(wstart,
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
3119 (int)(ptr - wstart),
87401adbf5fc updated for version 7.1-067
vimboss
parents: 1330
diff changeset
3120 p_ic, files[i], *dir, 0);
703
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3121 }
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3122 }
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3123 if (add_r == OK)
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3124 /* if dir was BACKWARD then honor it just once */
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3125 *dir = FORWARD;
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3126 else if (add_r == FAIL)
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3127 break;
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3128 /* avoid expensive call to vim_regexec() when at end
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3129 * of line */
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3130 if (*ptr == '\n' || got_int)
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3131 break;
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3132 }
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3133 line_breakcheck();
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3134 ins_compl_check_keys(50);
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3135 }
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3136 fclose(fp);
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3137 }
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3138 }
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3139 }
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
3140
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3141 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3142 * Find the start of the next word.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3143 * Returns a pointer to the first char of the word. Also stops at a NUL.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3144 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3145 char_u *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3146 find_word_start(ptr)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3147 char_u *ptr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3148 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3149 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3150 if (has_mbyte)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3151 while (*ptr != NUL && *ptr != '\n' && mb_get_class(ptr) <= 1)
474
a5fcf36ef512 updated for version 7.0127
vimboss
parents: 470
diff changeset
3152 ptr += (*mb_ptr2len)(ptr);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3153 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3154 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3155 while (*ptr != NUL && *ptr != '\n' && !vim_iswordc(*ptr))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3156 ++ptr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3157 return ptr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3158 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3159
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3160 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3161 * Find the end of the word. Assumes it starts inside a word.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3162 * Returns a pointer to just after the word.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3163 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3164 char_u *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3165 find_word_end(ptr)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3166 char_u *ptr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3167 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3168 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3169 int start_class;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3170
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3171 if (has_mbyte)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3172 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3173 start_class = mb_get_class(ptr);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3174 if (start_class > 1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3175 while (*ptr != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3176 {
474
a5fcf36ef512 updated for version 7.0127
vimboss
parents: 470
diff changeset
3177 ptr += (*mb_ptr2len)(ptr);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3178 if (mb_get_class(ptr) != start_class)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3179 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3180 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3181 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3182 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3183 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3184 while (vim_iswordc(*ptr))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3185 ++ptr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3186 return ptr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3187 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3188
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3189 /*
667
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
3190 * Find the end of the line, omitting CR and NL at the end.
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
3191 * Returns a pointer to just after the line.
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
3192 */
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
3193 static char_u *
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
3194 find_line_end(ptr)
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
3195 char_u *ptr;
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
3196 {
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
3197 char_u *s;
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
3198
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
3199 s = ptr + STRLEN(ptr);
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
3200 while (s > ptr && (s[-1] == CAR || s[-1] == NL))
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
3201 --s;
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
3202 return s;
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
3203 }
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
3204
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
3205 /*
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3206 * Free the list of completions
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3207 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3208 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3209 ins_compl_free()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3210 {
464
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
3211 compl_T *match;
786
8f6a426bc1e0 updated for version 7.0229
vimboss
parents: 782
diff changeset
3212 int i;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3213
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
3214 vim_free(compl_pattern);
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
3215 compl_pattern = NULL;
657
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
3216 vim_free(compl_leader);
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
3217 compl_leader = NULL;
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
3218
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
3219 if (compl_first_match == NULL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3220 return;
540
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
3221
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
3222 ins_compl_del_pum();
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
3223 pum_clear();
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
3224
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
3225 compl_curr_match = compl_first_match;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3226 do
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3227 {
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
3228 match = compl_curr_match;
464
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
3229 compl_curr_match = compl_curr_match->cp_next;
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
3230 vim_free(match->cp_str);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3231 /* several entries may use the same fname, free it just once. */
464
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
3232 if (match->cp_flags & FREE_FNAME)
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
3233 vim_free(match->cp_fname);
786
8f6a426bc1e0 updated for version 7.0229
vimboss
parents: 782
diff changeset
3234 for (i = 0; i < CPT_COUNT; ++i)
8f6a426bc1e0 updated for version 7.0229
vimboss
parents: 782
diff changeset
3235 vim_free(match->cp_text[i]);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3236 vim_free(match);
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
3237 } while (compl_curr_match != NULL && compl_curr_match != compl_first_match);
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
3238 compl_first_match = compl_curr_match = NULL;
1927
f798c9043986 updated for version 7.2-224
vimboss
parents: 1892
diff changeset
3239 compl_shown_match = NULL;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3240 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3241
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3242 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3243 ins_compl_clear()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3244 {
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
3245 compl_cont_status = 0;
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
3246 compl_started = FALSE;
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
3247 compl_matches = 0;
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
3248 vim_free(compl_pattern);
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
3249 compl_pattern = NULL;
657
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
3250 vim_free(compl_leader);
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
3251 compl_leader = NULL;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3252 edit_submode_extra = NULL;
724
a35dce0cabc5 updated for version 7.0220
vimboss
parents: 716
diff changeset
3253 vim_free(compl_orig_text);
a35dce0cabc5 updated for version 7.0220
vimboss
parents: 716
diff changeset
3254 compl_orig_text = NULL;
825
6675076019ae updated for version 7.0d
vimboss
parents: 819
diff changeset
3255 compl_enter_selects = FALSE;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3256 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3257
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3258 /*
674
4b8583e82cb8 updated for version 7.0201
vimboss
parents: 667
diff changeset
3259 * Return TRUE when Insert completion is active.
4b8583e82cb8 updated for version 7.0201
vimboss
parents: 667
diff changeset
3260 */
4b8583e82cb8 updated for version 7.0201
vimboss
parents: 667
diff changeset
3261 int
4b8583e82cb8 updated for version 7.0201
vimboss
parents: 667
diff changeset
3262 ins_compl_active()
4b8583e82cb8 updated for version 7.0201
vimboss
parents: 667
diff changeset
3263 {
4b8583e82cb8 updated for version 7.0201
vimboss
parents: 667
diff changeset
3264 return compl_started;
4b8583e82cb8 updated for version 7.0201
vimboss
parents: 667
diff changeset
3265 }
4b8583e82cb8 updated for version 7.0201
vimboss
parents: 667
diff changeset
3266
4b8583e82cb8 updated for version 7.0201
vimboss
parents: 667
diff changeset
3267 /*
659
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
3268 * Delete one character before the cursor and show the subset of the matches
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
3269 * that match the word that is now before the cursor.
836
5a7843c57316 updated for version 7.0e02
vimboss
parents: 835
diff changeset
3270 * Returns the character to be used, NUL if the work is done and another char
5a7843c57316 updated for version 7.0e02
vimboss
parents: 835
diff changeset
3271 * to be got from the user.
657
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
3272 */
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
3273 static int
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
3274 ins_compl_bs()
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
3275 {
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
3276 char_u *line;
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
3277 char_u *p;
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
3278
836
5a7843c57316 updated for version 7.0e02
vimboss
parents: 835
diff changeset
3279 line = ml_get_curline();
5a7843c57316 updated for version 7.0e02
vimboss
parents: 835
diff changeset
3280 p = line + curwin->w_cursor.col;
5a7843c57316 updated for version 7.0e02
vimboss
parents: 835
diff changeset
3281 mb_ptr_back(line, p);
5a7843c57316 updated for version 7.0e02
vimboss
parents: 835
diff changeset
3282
1430
342cf2a9f5cc updated for version 7.1-145
vimboss
parents: 1389
diff changeset
3283 /* Stop completion when the whole word was deleted. For Omni completion
342cf2a9f5cc updated for version 7.1-145
vimboss
parents: 1389
diff changeset
3284 * allow the word to be deleted, we won't match everything. */
342cf2a9f5cc updated for version 7.1-145
vimboss
parents: 1389
diff changeset
3285 if ((int)(p - line) - (int)compl_col < 0
342cf2a9f5cc updated for version 7.1-145
vimboss
parents: 1389
diff changeset
3286 || ((int)(p - line) - (int)compl_col == 0
342cf2a9f5cc updated for version 7.1-145
vimboss
parents: 1389
diff changeset
3287 && (ctrl_x_mode & CTRL_X_OMNI) == 0))
836
5a7843c57316 updated for version 7.0e02
vimboss
parents: 835
diff changeset
3288 return K_BS;
5a7843c57316 updated for version 7.0e02
vimboss
parents: 835
diff changeset
3289
874
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
3290 /* Deleted more than what was used to find matches or didn't finish
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
3291 * finding all matches: need to look for matches all over again. */
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
3292 if (curwin->w_cursor.col <= compl_col + compl_length
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
3293 || compl_was_interrupted)
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
3294 ins_compl_restart();
657
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
3295
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
3296 vim_free(compl_leader);
835
8bebcabccc2c updated for version 7.0e01
vimboss
parents: 829
diff changeset
3297 compl_leader = vim_strnsave(line + compl_col, (int)(p - line) - compl_col);
657
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
3298 if (compl_leader != NULL)
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
3299 {
874
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
3300 ins_compl_new_leader();
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
3301 return NUL;
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
3302 }
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
3303 return K_BS;
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
3304 }
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
3305
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
3306 /*
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
3307 * Called after changing "compl_leader".
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
3308 * Show the popup menu with a different set of matches.
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
3309 * May also search for matches again if the previous search was interrupted.
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
3310 */
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
3311 static void
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
3312 ins_compl_new_leader()
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
3313 {
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
3314 ins_compl_del_pum();
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
3315 ins_compl_delete();
1782
12cecc379574 updated for version 7.2-080
vimboss
parents: 1698
diff changeset
3316 ins_bytes(compl_leader + ins_compl_len());
874
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
3317 compl_used_match = FALSE;
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
3318
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
3319 if (compl_started)
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
3320 ins_compl_set_original_text(compl_leader);
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
3321 else
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
3322 {
826
1cdd2661f34c updated for version 7.0d01
vimboss
parents: 825
diff changeset
3323 #ifdef FEAT_SPELL
874
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
3324 spell_bad_len = 0; /* need to redetect bad word */
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
3325 #endif
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
3326 /*
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
3327 * Matches were cleared, need to search for them now. First display
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
3328 * the changed text before the cursor. Set "compl_restarting" to
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
3329 * avoid that the first match is inserted.
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
3330 */
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
3331 update_screen(0);
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
3332 #ifdef FEAT_GUI
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
3333 if (gui.in_use)
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
3334 {
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
3335 /* Show the cursor after the match, not after the redrawn text. */
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
3336 setcursor();
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
3337 out_flush();
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
3338 gui_update_cursor(FALSE, FALSE);
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
3339 }
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
3340 #endif
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
3341 compl_restarting = TRUE;
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
3342 if (ins_complete(Ctrl_N) == FAIL)
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
3343 compl_cont_status = 0;
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
3344 compl_restarting = FALSE;
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
3345 }
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
3346
887
9dc77520c6d3 updated for version 7.0-013
vimboss
parents: 874
diff changeset
3347 #if 0 /* disabled, made CTRL-L, BS and typing char jump to original text. */
874
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
3348 if (!compl_used_match)
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
3349 {
829
dc8197342755 updated for version 7.0d04
vimboss
parents: 828
diff changeset
3350 /* Go to the original text, since none of the matches is inserted. */
dc8197342755 updated for version 7.0d04
vimboss
parents: 828
diff changeset
3351 if (compl_first_match->cp_prev != NULL
dc8197342755 updated for version 7.0d04
vimboss
parents: 828
diff changeset
3352 && (compl_first_match->cp_prev->cp_flags & ORIGINAL_TEXT))
dc8197342755 updated for version 7.0d04
vimboss
parents: 828
diff changeset
3353 compl_shown_match = compl_first_match->cp_prev;
dc8197342755 updated for version 7.0d04
vimboss
parents: 828
diff changeset
3354 else
dc8197342755 updated for version 7.0d04
vimboss
parents: 828
diff changeset
3355 compl_shown_match = compl_first_match;
dc8197342755 updated for version 7.0d04
vimboss
parents: 828
diff changeset
3356 compl_curr_match = compl_shown_match;
dc8197342755 updated for version 7.0d04
vimboss
parents: 828
diff changeset
3357 compl_shows_dir = compl_direction;
874
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
3358 }
887
9dc77520c6d3 updated for version 7.0-013
vimboss
parents: 874
diff changeset
3359 #endif
9dc77520c6d3 updated for version 7.0-013
vimboss
parents: 874
diff changeset
3360 compl_enter_selects = !compl_used_match;
874
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
3361
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
3362 /* Show the popup menu with a different set of matches. */
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
3363 ins_compl_show_pum();
947
a157c4786b79 updated for version 7.0-073
vimboss
parents: 944
diff changeset
3364
a157c4786b79 updated for version 7.0-073
vimboss
parents: 944
diff changeset
3365 /* Don't let Enter select the original text when there is no popup menu. */
a157c4786b79 updated for version 7.0-073
vimboss
parents: 944
diff changeset
3366 if (compl_match_array == NULL)
a157c4786b79 updated for version 7.0-073
vimboss
parents: 944
diff changeset
3367 compl_enter_selects = FALSE;
657
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
3368 }
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
3369
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
3370 /*
1782
12cecc379574 updated for version 7.2-080
vimboss
parents: 1698
diff changeset
3371 * Return the length of the completion, from the completion start column to
12cecc379574 updated for version 7.2-080
vimboss
parents: 1698
diff changeset
3372 * the cursor column. Making sure it never goes below zero.
12cecc379574 updated for version 7.2-080
vimboss
parents: 1698
diff changeset
3373 */
12cecc379574 updated for version 7.2-080
vimboss
parents: 1698
diff changeset
3374 static int
12cecc379574 updated for version 7.2-080
vimboss
parents: 1698
diff changeset
3375 ins_compl_len()
12cecc379574 updated for version 7.2-080
vimboss
parents: 1698
diff changeset
3376 {
1869
720a59d79bcd updated for version 7.2-168
vimboss
parents: 1811
diff changeset
3377 int off = (int)curwin->w_cursor.col - (int)compl_col;
1782
12cecc379574 updated for version 7.2-080
vimboss
parents: 1698
diff changeset
3378
12cecc379574 updated for version 7.2-080
vimboss
parents: 1698
diff changeset
3379 if (off < 0)
12cecc379574 updated for version 7.2-080
vimboss
parents: 1698
diff changeset
3380 return 0;
12cecc379574 updated for version 7.2-080
vimboss
parents: 1698
diff changeset
3381 return off;
12cecc379574 updated for version 7.2-080
vimboss
parents: 1698
diff changeset
3382 }
12cecc379574 updated for version 7.2-080
vimboss
parents: 1698
diff changeset
3383
12cecc379574 updated for version 7.2-080
vimboss
parents: 1698
diff changeset
3384 /*
657
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
3385 * Append one character to the match leader. May reduce the number of
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
3386 * matches.
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
3387 */
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
3388 static void
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
3389 ins_compl_addleader(c)
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
3390 int c;
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
3391 {
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
3392 #ifdef FEAT_MBYTE
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
3393 int cc;
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
3394
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
3395 if (has_mbyte && (cc = (*mb_char2len)(c)) > 1)
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
3396 {
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
3397 char_u buf[MB_MAXBYTES + 1];
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
3398
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
3399 (*mb_char2bytes)(c, buf);
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
3400 buf[cc] = NUL;
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
3401 ins_char_bytes(buf, cc);
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
3402 }
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
3403 else
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
3404 #endif
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
3405 ins_char(c);
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
3406
874
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
3407 /* If we didn't complete finding matches we must search again. */
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
3408 if (compl_was_interrupted)
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
3409 ins_compl_restart();
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
3410
657
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
3411 vim_free(compl_leader);
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
3412 compl_leader = vim_strnsave(ml_get_curline() + compl_col,
1869
720a59d79bcd updated for version 7.2-168
vimboss
parents: 1811
diff changeset
3413 (int)(curwin->w_cursor.col - compl_col));
657
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
3414 if (compl_leader != NULL)
874
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
3415 ins_compl_new_leader();
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
3416 }
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
3417
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
3418 /*
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
3419 * Setup for finding completions again without leaving CTRL-X mode. Used when
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
3420 * BS or a key was typed while still searching for matches.
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
3421 */
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
3422 static void
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
3423 ins_compl_restart()
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
3424 {
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
3425 ins_compl_free();
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
3426 compl_started = FALSE;
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
3427 compl_matches = 0;
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
3428 compl_cont_status = 0;
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
3429 compl_cont_mode = 0;
694
07d199fe02ed updated for version 7.0209
vimboss
parents: 692
diff changeset
3430 }
07d199fe02ed updated for version 7.0209
vimboss
parents: 692
diff changeset
3431
07d199fe02ed updated for version 7.0209
vimboss
parents: 692
diff changeset
3432 /*
07d199fe02ed updated for version 7.0209
vimboss
parents: 692
diff changeset
3433 * Set the first match, the original text.
07d199fe02ed updated for version 7.0209
vimboss
parents: 692
diff changeset
3434 */
07d199fe02ed updated for version 7.0209
vimboss
parents: 692
diff changeset
3435 static void
07d199fe02ed updated for version 7.0209
vimboss
parents: 692
diff changeset
3436 ins_compl_set_original_text(str)
07d199fe02ed updated for version 7.0209
vimboss
parents: 692
diff changeset
3437 char_u *str;
07d199fe02ed updated for version 7.0209
vimboss
parents: 692
diff changeset
3438 {
07d199fe02ed updated for version 7.0209
vimboss
parents: 692
diff changeset
3439 char_u *p;
07d199fe02ed updated for version 7.0209
vimboss
parents: 692
diff changeset
3440
07d199fe02ed updated for version 7.0209
vimboss
parents: 692
diff changeset
3441 /* Replace the original text entry. */
07d199fe02ed updated for version 7.0209
vimboss
parents: 692
diff changeset
3442 if (compl_first_match->cp_flags & ORIGINAL_TEXT) /* safety check */
07d199fe02ed updated for version 7.0209
vimboss
parents: 692
diff changeset
3443 {
07d199fe02ed updated for version 7.0209
vimboss
parents: 692
diff changeset
3444 p = vim_strsave(str);
07d199fe02ed updated for version 7.0209
vimboss
parents: 692
diff changeset
3445 if (p != NULL)
07d199fe02ed updated for version 7.0209
vimboss
parents: 692
diff changeset
3446 {
07d199fe02ed updated for version 7.0209
vimboss
parents: 692
diff changeset
3447 vim_free(compl_first_match->cp_str);
07d199fe02ed updated for version 7.0209
vimboss
parents: 692
diff changeset
3448 compl_first_match->cp_str = p;
07d199fe02ed updated for version 7.0209
vimboss
parents: 692
diff changeset
3449 }
657
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
3450 }
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
3451 }
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
3452
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
3453 /*
659
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
3454 * Append one character to the match leader. May reduce the number of
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
3455 * matches.
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
3456 */
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
3457 static void
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
3458 ins_compl_addfrommatch()
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
3459 {
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
3460 char_u *p;
1869
720a59d79bcd updated for version 7.2-168
vimboss
parents: 1811
diff changeset
3461 int len = (int)curwin->w_cursor.col - (int)compl_col;
659
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
3462 int c;
887
9dc77520c6d3 updated for version 7.0-013
vimboss
parents: 874
diff changeset
3463 compl_T *cp;
659
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
3464
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
3465 p = compl_shown_match->cp_str;
677
e649c78407e6 updated for version 7.0202
vimboss
parents: 674
diff changeset
3466 if ((int)STRLEN(p) <= len) /* the match is too short */
887
9dc77520c6d3 updated for version 7.0-013
vimboss
parents: 874
diff changeset
3467 {
9dc77520c6d3 updated for version 7.0-013
vimboss
parents: 874
diff changeset
3468 /* When still at the original match use the first entry that matches
9dc77520c6d3 updated for version 7.0-013
vimboss
parents: 874
diff changeset
3469 * the leader. */
9dc77520c6d3 updated for version 7.0-013
vimboss
parents: 874
diff changeset
3470 if (compl_shown_match->cp_flags & ORIGINAL_TEXT)
9dc77520c6d3 updated for version 7.0-013
vimboss
parents: 874
diff changeset
3471 {
9dc77520c6d3 updated for version 7.0-013
vimboss
parents: 874
diff changeset
3472 p = NULL;
9dc77520c6d3 updated for version 7.0-013
vimboss
parents: 874
diff changeset
3473 for (cp = compl_shown_match->cp_next; cp != NULL
9dc77520c6d3 updated for version 7.0-013
vimboss
parents: 874
diff changeset
3474 && cp != compl_first_match; cp = cp->cp_next)
9dc77520c6d3 updated for version 7.0-013
vimboss
parents: 874
diff changeset
3475 {
987
e625dad74346 updated for version 7.0-113
vimboss
parents: 978
diff changeset
3476 if (compl_leader == NULL
e625dad74346 updated for version 7.0-113
vimboss
parents: 978
diff changeset
3477 || ins_compl_equal(cp, compl_leader,
887
9dc77520c6d3 updated for version 7.0-013
vimboss
parents: 874
diff changeset
3478 (int)STRLEN(compl_leader)))
9dc77520c6d3 updated for version 7.0-013
vimboss
parents: 874
diff changeset
3479 {
9dc77520c6d3 updated for version 7.0-013
vimboss
parents: 874
diff changeset
3480 p = cp->cp_str;
9dc77520c6d3 updated for version 7.0-013
vimboss
parents: 874
diff changeset
3481 break;
9dc77520c6d3 updated for version 7.0-013
vimboss
parents: 874
diff changeset
3482 }
9dc77520c6d3 updated for version 7.0-013
vimboss
parents: 874
diff changeset
3483 }
9dc77520c6d3 updated for version 7.0-013
vimboss
parents: 874
diff changeset
3484 if (p == NULL || (int)STRLEN(p) <= len)
9dc77520c6d3 updated for version 7.0-013
vimboss
parents: 874
diff changeset
3485 return;
9dc77520c6d3 updated for version 7.0-013
vimboss
parents: 874
diff changeset
3486 }
9dc77520c6d3 updated for version 7.0-013
vimboss
parents: 874
diff changeset
3487 else
9dc77520c6d3 updated for version 7.0-013
vimboss
parents: 874
diff changeset
3488 return;
9dc77520c6d3 updated for version 7.0-013
vimboss
parents: 874
diff changeset
3489 }
659
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
3490 p += len;
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
3491 #ifdef FEAT_MBYTE
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
3492 c = mb_ptr2char(p);
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
3493 #else
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
3494 c = *p;
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
3495 #endif
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
3496 ins_compl_addleader(c);
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
3497 }
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
3498
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
3499 /*
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3500 * Prepare for Insert mode completion, or stop it.
464
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
3501 * Called just after typing a character in Insert mode.
540
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
3502 * Returns TRUE when the character is not to be inserted;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3503 */
540
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
3504 static int
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3505 ins_compl_prep(c)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3506 int c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3507 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3508 char_u *ptr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3509 int want_cindent;
540
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
3510 int retval = FALSE;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3511
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3512 /* Forget any previous 'special' messages if this is actually
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3513 * a ^X mode key - bar ^R, in which case we wait to see what it gives us.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3514 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3515 if (c != Ctrl_R && vim_is_ctrl_x_key(c))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3516 edit_submode_extra = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3517
1434
40aa7ae37901 updated for version 7.1-149
vimboss
parents: 1430
diff changeset
3518 /* Ignore end of Select mode mapping and mouse scroll buttons. */
40aa7ae37901 updated for version 7.1-149
vimboss
parents: 1430
diff changeset
3519 if (c == K_SELECT || c == K_MOUSEDOWN || c == K_MOUSEUP)
540
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
3520 return retval;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3521
665
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
3522 /* Set "compl_get_longest" when finding the first matches. */
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
3523 if (ctrl_x_mode == CTRL_X_NOT_DEFINED_YET
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
3524 || (ctrl_x_mode == 0 && !compl_started))
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
3525 {
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
3526 compl_get_longest = (vim_strchr(p_cot, 'l') != NULL);
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
3527 compl_used_match = TRUE;
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
3528 }
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
3529
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3530 if (ctrl_x_mode == CTRL_X_NOT_DEFINED_YET)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3531 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3532 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3533 * We have just typed CTRL-X and aren't quite sure which CTRL-X mode
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3534 * it will be yet. Now we decide.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3535 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3536 switch (c)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3537 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3538 case Ctrl_E:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3539 case Ctrl_Y:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3540 ctrl_x_mode = CTRL_X_SCROLL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3541 if (!(State & REPLACE_FLAG))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3542 edit_submode = (char_u *)_(" (insert) Scroll (^E/^Y)");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3543 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3544 edit_submode = (char_u *)_(" (replace) Scroll (^E/^Y)");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3545 edit_submode_pre = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3546 showmode();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3547 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3548 case Ctrl_L:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3549 ctrl_x_mode = CTRL_X_WHOLE_LINE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3550 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3551 case Ctrl_F:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3552 ctrl_x_mode = CTRL_X_FILES;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3553 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3554 case Ctrl_K:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3555 ctrl_x_mode = CTRL_X_DICTIONARY;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3556 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3557 case Ctrl_R:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3558 /* Simply allow ^R to happen without affecting ^X mode */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3559 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3560 case Ctrl_T:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3561 ctrl_x_mode = CTRL_X_THESAURUS;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3562 break;
12
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 11
diff changeset
3563 #ifdef FEAT_COMPL_FUNC
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 11
diff changeset
3564 case Ctrl_U:
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 11
diff changeset
3565 ctrl_x_mode = CTRL_X_FUNCTION;
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 11
diff changeset
3566 break;
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
3567 case Ctrl_O:
523
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 502
diff changeset
3568 ctrl_x_mode = CTRL_X_OMNI;
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
3569 break;
502
52e76e2b5b65 updated for version 7.0140
vimboss
parents: 499
diff changeset
3570 #endif
477
f8b75b8f1988 updated for version 7.0128
vimboss
parents: 474
diff changeset
3571 case 's':
f8b75b8f1988 updated for version 7.0128
vimboss
parents: 474
diff changeset
3572 case Ctrl_S:
f8b75b8f1988 updated for version 7.0128
vimboss
parents: 474
diff changeset
3573 ctrl_x_mode = CTRL_X_SPELL;
744
07f7b4a7755c updated for version 7.0222
vimboss
parents: 732
diff changeset
3574 #ifdef FEAT_SPELL
819
23f82b5d2814 updated for version 7.0c10
vimboss
parents: 818
diff changeset
3575 ++emsg_off; /* Avoid getting the E756 error twice. */
484
f012c4ed8c38 updated for version 7.0132
vimboss
parents: 477
diff changeset
3576 spell_back_to_badword();
819
23f82b5d2814 updated for version 7.0c10
vimboss
parents: 818
diff changeset
3577 --emsg_off;
484
f012c4ed8c38 updated for version 7.0132
vimboss
parents: 477
diff changeset
3578 #endif
477
f8b75b8f1988 updated for version 7.0128
vimboss
parents: 474
diff changeset
3579 break;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3580 case Ctrl_RSB:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3581 ctrl_x_mode = CTRL_X_TAGS;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3582 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3583 #ifdef FEAT_FIND_ID
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3584 case Ctrl_I:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3585 case K_S_TAB:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3586 ctrl_x_mode = CTRL_X_PATH_PATTERNS;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3587 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3588 case Ctrl_D:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3589 ctrl_x_mode = CTRL_X_PATH_DEFINES;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3590 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3591 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3592 case Ctrl_V:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3593 case Ctrl_Q:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3594 ctrl_x_mode = CTRL_X_CMDLINE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3595 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3596 case Ctrl_P:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3597 case Ctrl_N:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3598 /* ^X^P means LOCAL expansion if nothing interrupted (eg we
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3599 * just started ^X mode, or there were enough ^X's to cancel
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3600 * the previous mode, say ^X^F^X^X^P or ^P^X^X^X^P, see below)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3601 * do normal expansion when interrupting a different mode (say
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3602 * ^X^F^X^P or ^P^X^X^P, see below)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3603 * nothing changes if interrupting mode 0, (eg, the flag
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3604 * doesn't change when going to ADDING mode -- Acevedo */
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
3605 if (!(compl_cont_status & CONT_INTRPT))
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
3606 compl_cont_status |= CONT_LOCAL;
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
3607 else if (compl_cont_mode != 0)
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
3608 compl_cont_status &= ~CONT_LOCAL;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3609 /* FALLTHROUGH */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3610 default:
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
3611 /* If we have typed at least 2 ^X's... for modes != 0, we set
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
3612 * compl_cont_status = 0 (eg, as if we had just started ^X
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
3613 * mode).
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
3614 * For mode 0, we set "compl_cont_mode" to an impossible
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
3615 * value, in both cases ^X^X can be used to restart the same
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
3616 * mode (avoiding ADDING mode).
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
3617 * Undocumented feature: In a mode != 0 ^X^P and ^X^X^P start
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
3618 * 'complete' and local ^P expansions respectively.
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
3619 * In mode 0 an extra ^X is needed since ^X^P goes to ADDING
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
3620 * mode -- Acevedo */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3621 if (c == Ctrl_X)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3622 {
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
3623 if (compl_cont_mode != 0)
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
3624 compl_cont_status = 0;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3625 else
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
3626 compl_cont_mode = CTRL_X_NOT_DEFINED_YET;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3627 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3628 ctrl_x_mode = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3629 edit_submode = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3630 showmode();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3631 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3632 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3633 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3634 else if (ctrl_x_mode != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3635 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3636 /* We're already in CTRL-X mode, do we stay in it? */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3637 if (!vim_is_ctrl_x_key(c))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3638 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3639 if (ctrl_x_mode == CTRL_X_SCROLL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3640 ctrl_x_mode = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3641 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3642 ctrl_x_mode = CTRL_X_FINISHED;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3643 edit_submode = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3644 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3645 showmode();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3646 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3647
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
3648 if (compl_started || ctrl_x_mode == CTRL_X_FINISHED)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3649 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3650 /* Show error message from attempted keyword completion (probably
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3651 * 'Pattern not found') until another key is hit, then go back to
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
3652 * showing what mode we are in. */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3653 showmode();
644
e4fa26ce8769 updated for version 7.0187
vimboss
parents: 634
diff changeset
3654 if ((ctrl_x_mode == 0 && c != Ctrl_N && c != Ctrl_P && c != Ctrl_R
e4fa26ce8769 updated for version 7.0187
vimboss
parents: 634
diff changeset
3655 && !ins_compl_pum_key(c))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3656 || ctrl_x_mode == CTRL_X_FINISHED)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3657 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3658 /* Get here when we have finished typing a sequence of ^N and
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3659 * ^P or other completion characters in CTRL-X mode. Free up
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
3660 * memory that was used, and make sure we can redo the insert. */
836
5a7843c57316 updated for version 7.0e02
vimboss
parents: 835
diff changeset
3661 if (compl_curr_match != NULL || compl_leader != NULL || c == Ctrl_E)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3662 {
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
3663 char_u *p;
938
fc0c566b9107 updated for version 7.0-064
vimboss
parents: 935
diff changeset
3664 int temp = 0;
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
3665
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3666 /*
836
5a7843c57316 updated for version 7.0e02
vimboss
parents: 835
diff changeset
3667 * If any of the original typed text has been changed, eg when
5a7843c57316 updated for version 7.0e02
vimboss
parents: 835
diff changeset
3668 * ignorecase is set, we must add back-spaces to the redo
5a7843c57316 updated for version 7.0e02
vimboss
parents: 835
diff changeset
3669 * buffer. We add as few as necessary to delete just the part
5a7843c57316 updated for version 7.0e02
vimboss
parents: 835
diff changeset
3670 * of the original text that has changed.
5a7843c57316 updated for version 7.0e02
vimboss
parents: 835
diff changeset
3671 * When using the longest match, edited the match or used
5a7843c57316 updated for version 7.0e02
vimboss
parents: 835
diff changeset
3672 * CTRL-E then don't use the current match.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3673 */
836
5a7843c57316 updated for version 7.0e02
vimboss
parents: 835
diff changeset
3674 if (compl_curr_match != NULL && compl_used_match && c != Ctrl_E)
5a7843c57316 updated for version 7.0e02
vimboss
parents: 835
diff changeset
3675 ptr = compl_curr_match->cp_str;
5a7843c57316 updated for version 7.0e02
vimboss
parents: 835
diff changeset
3676 else if (compl_leader != NULL)
5a7843c57316 updated for version 7.0e02
vimboss
parents: 835
diff changeset
3677 ptr = compl_leader;
5a7843c57316 updated for version 7.0e02
vimboss
parents: 835
diff changeset
3678 else
5a7843c57316 updated for version 7.0e02
vimboss
parents: 835
diff changeset
3679 ptr = compl_orig_text;
897
2e1e9b708941 updated for version 7.0-023
vimboss
parents: 887
diff changeset
3680 if (compl_orig_text != NULL)
2e1e9b708941 updated for version 7.0-023
vimboss
parents: 887
diff changeset
3681 {
2e1e9b708941 updated for version 7.0-023
vimboss
parents: 887
diff changeset
3682 p = compl_orig_text;
2e1e9b708941 updated for version 7.0-023
vimboss
parents: 887
diff changeset
3683 for (temp = 0; p[temp] != NUL && p[temp] == ptr[temp];
2e1e9b708941 updated for version 7.0-023
vimboss
parents: 887
diff changeset
3684 ++temp)
2e1e9b708941 updated for version 7.0-023
vimboss
parents: 887
diff changeset
3685 ;
836
5a7843c57316 updated for version 7.0e02
vimboss
parents: 835
diff changeset
3686 #ifdef FEAT_MBYTE
897
2e1e9b708941 updated for version 7.0-023
vimboss
parents: 887
diff changeset
3687 if (temp > 0)
2e1e9b708941 updated for version 7.0-023
vimboss
parents: 887
diff changeset
3688 temp -= (*mb_head_off)(compl_orig_text, p + temp);
2e1e9b708941 updated for version 7.0-023
vimboss
parents: 887
diff changeset
3689 #endif
2e1e9b708941 updated for version 7.0-023
vimboss
parents: 887
diff changeset
3690 for (p += temp; *p != NUL; mb_ptr_adv(p))
2e1e9b708941 updated for version 7.0-023
vimboss
parents: 887
diff changeset
3691 AppendCharToRedobuff(K_BS);
2e1e9b708941 updated for version 7.0-023
vimboss
parents: 887
diff changeset
3692 }
2e1e9b708941 updated for version 7.0-023
vimboss
parents: 887
diff changeset
3693 if (ptr != NULL)
2e1e9b708941 updated for version 7.0-023
vimboss
parents: 887
diff changeset
3694 AppendToRedobuffLit(ptr + temp, -1);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3695 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3696
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3697 #ifdef FEAT_CINDENT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3698 want_cindent = (can_cindent && cindent_on());
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3699 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3700 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3701 * When completing whole lines: fix indent for 'cindent'.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3702 * Otherwise, break line if it's too long.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3703 */
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
3704 if (compl_cont_mode == CTRL_X_WHOLE_LINE)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3705 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3706 #ifdef FEAT_CINDENT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3707 /* re-indent the current line */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3708 if (want_cindent)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3709 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3710 do_c_expr_indent();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3711 want_cindent = FALSE; /* don't do it again */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3712 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3713 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3714 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3715 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3716 {
1073
ec7a570696ac updated for version 7.0-199
vimboss
parents: 1063
diff changeset
3717 int prev_col = curwin->w_cursor.col;
ec7a570696ac updated for version 7.0-199
vimboss
parents: 1063
diff changeset
3718
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3719 /* put the cursor on the last char, for 'tw' formatting */
1073
ec7a570696ac updated for version 7.0-199
vimboss
parents: 1063
diff changeset
3720 if (prev_col > 0)
ec7a570696ac updated for version 7.0-199
vimboss
parents: 1063
diff changeset
3721 dec_cursor();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3722 if (stop_arrow() == OK)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3723 insertchar(NUL, 0, -1);
1073
ec7a570696ac updated for version 7.0-199
vimboss
parents: 1063
diff changeset
3724 if (prev_col > 0
ec7a570696ac updated for version 7.0-199
vimboss
parents: 1063
diff changeset
3725 && ml_get_curline()[curwin->w_cursor.col] != NUL)
ec7a570696ac updated for version 7.0-199
vimboss
parents: 1063
diff changeset
3726 inc_cursor();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3727 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3728
816
4a79d6d376f0 updated for version 7.0c02
vimboss
parents: 794
diff changeset
3729 /* If the popup menu is displayed pressing CTRL-Y means accepting
825
6675076019ae updated for version 7.0d
vimboss
parents: 819
diff changeset
3730 * the selection without inserting anything. When
6675076019ae updated for version 7.0d
vimboss
parents: 819
diff changeset
3731 * compl_enter_selects is set the Enter key does the same. */
6675076019ae updated for version 7.0d
vimboss
parents: 819
diff changeset
3732 if ((c == Ctrl_Y || (compl_enter_selects
6675076019ae updated for version 7.0d
vimboss
parents: 819
diff changeset
3733 && (c == CAR || c == K_KENTER || c == NL)))
6675076019ae updated for version 7.0d
vimboss
parents: 819
diff changeset
3734 && pum_visible())
540
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
3735 retval = TRUE;
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
3736
816
4a79d6d376f0 updated for version 7.0c02
vimboss
parents: 794
diff changeset
3737 /* CTRL-E means completion is Ended, go back to the typed text. */
4a79d6d376f0 updated for version 7.0c02
vimboss
parents: 794
diff changeset
3738 if (c == Ctrl_E)
4a79d6d376f0 updated for version 7.0c02
vimboss
parents: 794
diff changeset
3739 {
4a79d6d376f0 updated for version 7.0c02
vimboss
parents: 794
diff changeset
3740 ins_compl_delete();
4a79d6d376f0 updated for version 7.0c02
vimboss
parents: 794
diff changeset
3741 if (compl_leader != NULL)
1782
12cecc379574 updated for version 7.2-080
vimboss
parents: 1698
diff changeset
3742 ins_bytes(compl_leader + ins_compl_len());
816
4a79d6d376f0 updated for version 7.0c02
vimboss
parents: 794
diff changeset
3743 else if (compl_first_match != NULL)
1782
12cecc379574 updated for version 7.2-080
vimboss
parents: 1698
diff changeset
3744 ins_bytes(compl_orig_text + ins_compl_len());
816
4a79d6d376f0 updated for version 7.0c02
vimboss
parents: 794
diff changeset
3745 retval = TRUE;
4a79d6d376f0 updated for version 7.0c02
vimboss
parents: 794
diff changeset
3746 }
4a79d6d376f0 updated for version 7.0c02
vimboss
parents: 794
diff changeset
3747
1698
f4f8014d516e updated for version 7.2c-000
vimboss
parents: 1622
diff changeset
3748 auto_format(FALSE, TRUE);
f4f8014d516e updated for version 7.2c-000
vimboss
parents: 1622
diff changeset
3749
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3750 ins_compl_free();
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
3751 compl_started = FALSE;
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
3752 compl_matches = 0;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3753 msg_clr_cmdline(); /* necessary for "noshowmode" */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3754 ctrl_x_mode = 0;
825
6675076019ae updated for version 7.0d
vimboss
parents: 819
diff changeset
3755 compl_enter_selects = FALSE;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3756 if (edit_submode != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3757 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3758 edit_submode = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3759 showmode();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3760 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3761
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3762 #ifdef FEAT_CINDENT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3763 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3764 * Indent now if a key was typed that is in 'cinkeys'.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3765 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3766 if (want_cindent && in_cinkeys(KEY_COMPLETE, ' ', inindent(0)))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3767 do_c_expr_indent();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3768 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3769 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3770 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3771
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3772 /* reset continue_* if we left expansion-mode, if we stay they'll be
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3773 * (re)set properly in ins_complete() */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3774 if (!vim_is_ctrl_x_key(c))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3775 {
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
3776 compl_cont_status = 0;
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
3777 compl_cont_mode = 0;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3778 }
540
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
3779
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
3780 return retval;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3781 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3782
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3783 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3784 * Loops through the list of windows, loaded-buffers or non-loaded-buffers
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3785 * (depending on flag) starting from buf and looking for a non-scanned
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3786 * buffer (other than curbuf). curbuf is special, if it is called with
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3787 * buf=curbuf then it has to be the first call for a given flag/expansion.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3788 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3789 * Returns the buffer to scan, if any, otherwise returns curbuf -- Acevedo
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3790 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3791 static buf_T *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3792 ins_compl_next_buf(buf, flag)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3793 buf_T *buf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3794 int flag;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3795 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3796 #ifdef FEAT_WINDOWS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3797 static win_T *wp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3798 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3799
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3800 if (flag == 'w') /* just windows */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3801 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3802 #ifdef FEAT_WINDOWS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3803 if (buf == curbuf) /* first call for this flag/expansion */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3804 wp = curwin;
383
8c229eb52e34 updated for version 7.0099
vimboss
parents: 359
diff changeset
3805 while ((wp = (wp->w_next != NULL ? wp->w_next : firstwin)) != curwin
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3806 && wp->w_buffer->b_scanned)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3807 ;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3808 buf = wp->w_buffer;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3809 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3810 buf = curbuf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3811 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3812 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3813 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3814 /* 'b' (just loaded buffers), 'u' (just non-loaded buffers) or 'U'
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3815 * (unlisted buffers)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3816 * When completing whole lines skip unloaded buffers. */
383
8c229eb52e34 updated for version 7.0099
vimboss
parents: 359
diff changeset
3817 while ((buf = (buf->b_next != NULL ? buf->b_next : firstbuf)) != curbuf
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3818 && ((flag == 'U'
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3819 ? buf->b_p_bl
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3820 : (!buf->b_p_bl
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3821 || (buf->b_ml.ml_mfp == NULL) != (flag == 'u')))
667
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
3822 || buf->b_scanned))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3823 ;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3824 return buf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3825 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3826
12
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 11
diff changeset
3827 #ifdef FEAT_COMPL_FUNC
659
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
3828 static void expand_by_function __ARGS((int type, char_u *base));
12
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 11
diff changeset
3829
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 11
diff changeset
3830 /*
523
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 502
diff changeset
3831 * Execute user defined complete function 'completefunc' or 'omnifunc', and
502
52e76e2b5b65 updated for version 7.0140
vimboss
parents: 499
diff changeset
3832 * get matches in "matches".
12
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 11
diff changeset
3833 */
659
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
3834 static void
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
3835 expand_by_function(type, base)
523
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 502
diff changeset
3836 int type; /* CTRL_X_OMNI or CTRL_X_FUNCTION */
12
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 11
diff changeset
3837 char_u *base;
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 11
diff changeset
3838 {
452
01af1008a8d8 updated for version 7.0120
vimboss
parents: 449
diff changeset
3839 list_T *matchlist;
502
52e76e2b5b65 updated for version 7.0140
vimboss
parents: 499
diff changeset
3840 char_u *args[2];
52e76e2b5b65 updated for version 7.0140
vimboss
parents: 499
diff changeset
3841 char_u *funcname;
52e76e2b5b65 updated for version 7.0140
vimboss
parents: 499
diff changeset
3842 pos_T pos;
52e76e2b5b65 updated for version 7.0140
vimboss
parents: 499
diff changeset
3843
52e76e2b5b65 updated for version 7.0140
vimboss
parents: 499
diff changeset
3844 funcname = (type == CTRL_X_FUNCTION) ? curbuf->b_p_cfu : curbuf->b_p_ofu;
52e76e2b5b65 updated for version 7.0140
vimboss
parents: 499
diff changeset
3845 if (*funcname == NUL)
659
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
3846 return;
452
01af1008a8d8 updated for version 7.0120
vimboss
parents: 449
diff changeset
3847
01af1008a8d8 updated for version 7.0120
vimboss
parents: 449
diff changeset
3848 /* Call 'completefunc' to obtain the list of matches. */
01af1008a8d8 updated for version 7.0120
vimboss
parents: 449
diff changeset
3849 args[0] = (char_u *)"0";
502
52e76e2b5b65 updated for version 7.0140
vimboss
parents: 499
diff changeset
3850 args[1] = base;
52e76e2b5b65 updated for version 7.0140
vimboss
parents: 499
diff changeset
3851
52e76e2b5b65 updated for version 7.0140
vimboss
parents: 499
diff changeset
3852 pos = curwin->w_cursor;
52e76e2b5b65 updated for version 7.0140
vimboss
parents: 499
diff changeset
3853 matchlist = call_func_retlist(funcname, 2, args, FALSE);
52e76e2b5b65 updated for version 7.0140
vimboss
parents: 499
diff changeset
3854 curwin->w_cursor = pos; /* restore the cursor position */
452
01af1008a8d8 updated for version 7.0120
vimboss
parents: 449
diff changeset
3855 if (matchlist == NULL)
659
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
3856 return;
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
3857
724
a35dce0cabc5 updated for version 7.0220
vimboss
parents: 716
diff changeset
3858 ins_compl_add_list(matchlist);
a35dce0cabc5 updated for version 7.0220
vimboss
parents: 716
diff changeset
3859 list_unref(matchlist);
a35dce0cabc5 updated for version 7.0220
vimboss
parents: 716
diff changeset
3860 }
a35dce0cabc5 updated for version 7.0220
vimboss
parents: 716
diff changeset
3861 #endif /* FEAT_COMPL_FUNC */
a35dce0cabc5 updated for version 7.0220
vimboss
parents: 716
diff changeset
3862
786
8f6a426bc1e0 updated for version 7.0229
vimboss
parents: 782
diff changeset
3863 #if defined(FEAT_COMPL_FUNC) || defined(FEAT_EVAL) || defined(PROTO)
724
a35dce0cabc5 updated for version 7.0220
vimboss
parents: 716
diff changeset
3864 /*
a35dce0cabc5 updated for version 7.0220
vimboss
parents: 716
diff changeset
3865 * Add completions from a list.
a35dce0cabc5 updated for version 7.0220
vimboss
parents: 716
diff changeset
3866 */
a35dce0cabc5 updated for version 7.0220
vimboss
parents: 716
diff changeset
3867 static void
a35dce0cabc5 updated for version 7.0220
vimboss
parents: 716
diff changeset
3868 ins_compl_add_list(list)
a35dce0cabc5 updated for version 7.0220
vimboss
parents: 716
diff changeset
3869 list_T *list;
a35dce0cabc5 updated for version 7.0220
vimboss
parents: 716
diff changeset
3870 {
a35dce0cabc5 updated for version 7.0220
vimboss
parents: 716
diff changeset
3871 listitem_T *li;
a35dce0cabc5 updated for version 7.0220
vimboss
parents: 716
diff changeset
3872 int dir = compl_direction;
a35dce0cabc5 updated for version 7.0220
vimboss
parents: 716
diff changeset
3873
659
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
3874 /* Go through the List with matches and add each of them. */
724
a35dce0cabc5 updated for version 7.0220
vimboss
parents: 716
diff changeset
3875 for (li = list->lv_first; li != NULL; li = li->li_next)
452
01af1008a8d8 updated for version 7.0120
vimboss
parents: 449
diff changeset
3876 {
786
8f6a426bc1e0 updated for version 7.0229
vimboss
parents: 782
diff changeset
3877 if (ins_compl_add_tv(&li->li_tv, dir) == OK)
8f6a426bc1e0 updated for version 7.0229
vimboss
parents: 782
diff changeset
3878 /* if dir was BACKWARD then honor it just once */
8f6a426bc1e0 updated for version 7.0229
vimboss
parents: 782
diff changeset
3879 dir = FORWARD;
648
9032e4668296 updated for version 7.0189
vimboss
parents: 644
diff changeset
3880 else if (did_emsg)
9032e4668296 updated for version 7.0189
vimboss
parents: 644
diff changeset
3881 break;
452
01af1008a8d8 updated for version 7.0120
vimboss
parents: 449
diff changeset
3882 }
724
a35dce0cabc5 updated for version 7.0220
vimboss
parents: 716
diff changeset
3883 }
786
8f6a426bc1e0 updated for version 7.0229
vimboss
parents: 782
diff changeset
3884
8f6a426bc1e0 updated for version 7.0229
vimboss
parents: 782
diff changeset
3885 /*
8f6a426bc1e0 updated for version 7.0229
vimboss
parents: 782
diff changeset
3886 * Add a match to the list of matches from a typeval_T.
8f6a426bc1e0 updated for version 7.0229
vimboss
parents: 782
diff changeset
3887 * If the given string is already in the list of completions, then return
8f6a426bc1e0 updated for version 7.0229
vimboss
parents: 782
diff changeset
3888 * NOTDONE, otherwise add it to the list and return OK. If there is an error,
8f6a426bc1e0 updated for version 7.0229
vimboss
parents: 782
diff changeset
3889 * maybe because alloc() returns NULL, then FAIL is returned.
8f6a426bc1e0 updated for version 7.0229
vimboss
parents: 782
diff changeset
3890 */
8f6a426bc1e0 updated for version 7.0229
vimboss
parents: 782
diff changeset
3891 int
8f6a426bc1e0 updated for version 7.0229
vimboss
parents: 782
diff changeset
3892 ins_compl_add_tv(tv, dir)
8f6a426bc1e0 updated for version 7.0229
vimboss
parents: 782
diff changeset
3893 typval_T *tv;
8f6a426bc1e0 updated for version 7.0229
vimboss
parents: 782
diff changeset
3894 int dir;
8f6a426bc1e0 updated for version 7.0229
vimboss
parents: 782
diff changeset
3895 {
8f6a426bc1e0 updated for version 7.0229
vimboss
parents: 782
diff changeset
3896 char_u *word;
867
a5677b7ce858 updated for version 7.0g04
vimboss
parents: 864
diff changeset
3897 int icase = FALSE;
944
b2dcb8457067 updated for version 7.0-070
vimboss
parents: 942
diff changeset
3898 int adup = FALSE;
786
8f6a426bc1e0 updated for version 7.0229
vimboss
parents: 782
diff changeset
3899 char_u *(cptext[CPT_COUNT]);
8f6a426bc1e0 updated for version 7.0229
vimboss
parents: 782
diff changeset
3900
8f6a426bc1e0 updated for version 7.0229
vimboss
parents: 782
diff changeset
3901 if (tv->v_type == VAR_DICT && tv->vval.v_dict != NULL)
8f6a426bc1e0 updated for version 7.0229
vimboss
parents: 782
diff changeset
3902 {
8f6a426bc1e0 updated for version 7.0229
vimboss
parents: 782
diff changeset
3903 word = get_dict_string(tv->vval.v_dict, (char_u *)"word", FALSE);
8f6a426bc1e0 updated for version 7.0229
vimboss
parents: 782
diff changeset
3904 cptext[CPT_ABBR] = get_dict_string(tv->vval.v_dict,
8f6a426bc1e0 updated for version 7.0229
vimboss
parents: 782
diff changeset
3905 (char_u *)"abbr", FALSE);
8f6a426bc1e0 updated for version 7.0229
vimboss
parents: 782
diff changeset
3906 cptext[CPT_MENU] = get_dict_string(tv->vval.v_dict,
8f6a426bc1e0 updated for version 7.0229
vimboss
parents: 782
diff changeset
3907 (char_u *)"menu", FALSE);
8f6a426bc1e0 updated for version 7.0229
vimboss
parents: 782
diff changeset
3908 cptext[CPT_KIND] = get_dict_string(tv->vval.v_dict,
8f6a426bc1e0 updated for version 7.0229
vimboss
parents: 782
diff changeset
3909 (char_u *)"kind", FALSE);
8f6a426bc1e0 updated for version 7.0229
vimboss
parents: 782
diff changeset
3910 cptext[CPT_INFO] = get_dict_string(tv->vval.v_dict,
8f6a426bc1e0 updated for version 7.0229
vimboss
parents: 782
diff changeset
3911 (char_u *)"info", FALSE);
8f6a426bc1e0 updated for version 7.0229
vimboss
parents: 782
diff changeset
3912 if (get_dict_string(tv->vval.v_dict, (char_u *)"icase", FALSE) != NULL)
8f6a426bc1e0 updated for version 7.0229
vimboss
parents: 782
diff changeset
3913 icase = get_dict_number(tv->vval.v_dict, (char_u *)"icase");
841
c2cae213194d updated for version 7.0e07
vimboss
parents: 840
diff changeset
3914 if (get_dict_string(tv->vval.v_dict, (char_u *)"dup", FALSE) != NULL)
944
b2dcb8457067 updated for version 7.0-070
vimboss
parents: 942
diff changeset
3915 adup = get_dict_number(tv->vval.v_dict, (char_u *)"dup");
786
8f6a426bc1e0 updated for version 7.0229
vimboss
parents: 782
diff changeset
3916 }
8f6a426bc1e0 updated for version 7.0229
vimboss
parents: 782
diff changeset
3917 else
8f6a426bc1e0 updated for version 7.0229
vimboss
parents: 782
diff changeset
3918 {
8f6a426bc1e0 updated for version 7.0229
vimboss
parents: 782
diff changeset
3919 word = get_tv_string_chk(tv);
8f6a426bc1e0 updated for version 7.0229
vimboss
parents: 782
diff changeset
3920 vim_memset(cptext, 0, sizeof(cptext));
8f6a426bc1e0 updated for version 7.0229
vimboss
parents: 782
diff changeset
3921 }
8f6a426bc1e0 updated for version 7.0229
vimboss
parents: 782
diff changeset
3922 if (word == NULL || *word == NUL)
8f6a426bc1e0 updated for version 7.0229
vimboss
parents: 782
diff changeset
3923 return FAIL;
944
b2dcb8457067 updated for version 7.0-070
vimboss
parents: 942
diff changeset
3924 return ins_compl_add(word, -1, icase, NULL, cptext, dir, 0, adup);
786
8f6a426bc1e0 updated for version 7.0229
vimboss
parents: 782
diff changeset
3925 }
724
a35dce0cabc5 updated for version 7.0220
vimboss
parents: 716
diff changeset
3926 #endif
12
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 11
diff changeset
3927
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
3928 /*
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
3929 * Get the next expansion(s), using "compl_pattern".
659
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
3930 * The search starts at position "ini" in curbuf and in the direction
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
3931 * compl_direction.
667
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
3932 * When "compl_started" is FALSE start at that position, otherwise continue
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
3933 * where we stopped searching before.
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
3934 * This may return before finding all the matches.
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
3935 * Return the total number of matches or -1 if still unknown -- Acevedo
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3936 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3937 static int
659
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
3938 ins_compl_get_exp(ini)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3939 pos_T *ini;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3940 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3941 static pos_T first_match_pos;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3942 static pos_T last_match_pos;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3943 static char_u *e_cpt = (char_u *)""; /* curr. entry in 'complete' */
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
3944 static int found_all = FALSE; /* Found all matches of a
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
3945 certain type. */
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
3946 static buf_T *ins_buf = NULL; /* buffer being scanned */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3947
464
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
3948 pos_T *pos;
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
3949 char_u **matches;
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
3950 int save_p_scs;
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
3951 int save_p_ws;
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
3952 int save_p_ic;
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
3953 int i;
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
3954 int num_matches;
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
3955 int len;
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
3956 int found_new_match;
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
3957 int type = ctrl_x_mode;
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
3958 char_u *ptr;
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
3959 char_u *dict = NULL;
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
3960 int dict_f = 0;
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
3961 compl_T *old_match;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3962
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
3963 if (!compl_started)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3964 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3965 for (ins_buf = firstbuf; ins_buf != NULL; ins_buf = ins_buf->b_next)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3966 ins_buf->b_scanned = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3967 found_all = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3968 ins_buf = curbuf;
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
3969 e_cpt = (compl_cont_status & CONT_LOCAL)
12
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 11
diff changeset
3970 ? (char_u *)"." : curbuf->b_p_cpt;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3971 last_match_pos = first_match_pos = *ini;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3972 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3973
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
3974 old_match = compl_curr_match; /* remember the last current match */
659
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
3975 pos = (compl_direction == FORWARD) ? &last_match_pos : &first_match_pos;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3976 /* For ^N/^P loop over all the flags/windows/buffers in 'complete' */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3977 for (;;)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3978 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3979 found_new_match = FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3980
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
3981 /* For ^N/^P pick a new entry from e_cpt if compl_started is off,
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3982 * or if found_all says this entry is done. For ^X^L only use the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3983 * entries from 'complete' that look in loaded buffers. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3984 if ((ctrl_x_mode == 0 || ctrl_x_mode == CTRL_X_WHOLE_LINE)
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
3985 && (!compl_started || found_all))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3986 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3987 found_all = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3988 while (*e_cpt == ',' || *e_cpt == ' ')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3989 e_cpt++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3990 if (*e_cpt == '.' && !curbuf->b_scanned)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3991 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3992 ins_buf = curbuf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3993 first_match_pos = *ini;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3994 /* So that ^N can match word immediately after cursor */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3995 if (ctrl_x_mode == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3996 dec(&first_match_pos);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3997 last_match_pos = first_match_pos;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3998 type = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3999 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4000 else if (vim_strchr((char_u *)"buwU", *e_cpt) != NULL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4001 && (ins_buf = ins_compl_next_buf(ins_buf, *e_cpt)) != curbuf)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4002 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4003 /* Scan a buffer, but not the current one. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4004 if (ins_buf->b_ml.ml_mfp != NULL) /* loaded buffer */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4005 {
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4006 compl_started = TRUE;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4007 first_match_pos.col = last_match_pos.col = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4008 first_match_pos.lnum = ins_buf->b_ml.ml_line_count + 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4009 last_match_pos.lnum = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4010 type = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4011 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4012 else /* unloaded buffer, scan like dictionary */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4013 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4014 found_all = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4015 if (ins_buf->b_fname == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4016 continue;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4017 type = CTRL_X_DICTIONARY;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4018 dict = ins_buf->b_fname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4019 dict_f = DICT_EXACT;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4020 }
274
8fa8d7964cf1 updated for version 7.0073
vimboss
parents: 237
diff changeset
4021 vim_snprintf((char *)IObuff, IOSIZE, _("Scanning: %s"),
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4022 ins_buf->b_fname == NULL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4023 ? buf_spname(ins_buf)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4024 : ins_buf->b_sfname == NULL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4025 ? (char *)ins_buf->b_fname
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4026 : (char *)ins_buf->b_sfname);
1869
720a59d79bcd updated for version 7.2-168
vimboss
parents: 1811
diff changeset
4027 (void)msg_trunc_attr(IObuff, TRUE, hl_attr(HLF_R));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4028 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4029 else if (*e_cpt == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4030 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4031 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4032 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4033 if (ctrl_x_mode == CTRL_X_WHOLE_LINE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4034 type = -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4035 else if (*e_cpt == 'k' || *e_cpt == 's')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4036 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4037 if (*e_cpt == 'k')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4038 type = CTRL_X_DICTIONARY;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4039 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4040 type = CTRL_X_THESAURUS;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4041 if (*++e_cpt != ',' && *e_cpt != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4042 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4043 dict = e_cpt;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4044 dict_f = DICT_FIRST;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4045 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4046 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4047 #ifdef FEAT_FIND_ID
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4048 else if (*e_cpt == 'i')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4049 type = CTRL_X_PATH_PATTERNS;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4050 else if (*e_cpt == 'd')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4051 type = CTRL_X_PATH_DEFINES;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4052 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4053 else if (*e_cpt == ']' || *e_cpt == 't')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4054 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4055 type = CTRL_X_TAGS;
1872
f13849167330 updated for version 7.2-169
vimboss
parents: 1869
diff changeset
4056 vim_snprintf((char *)IObuff, IOSIZE, _("Scanning tags."));
1869
720a59d79bcd updated for version 7.2-168
vimboss
parents: 1811
diff changeset
4057 (void)msg_trunc_attr(IObuff, TRUE, hl_attr(HLF_R));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4058 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4059 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4060 type = -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4061
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4062 /* in any case e_cpt is advanced to the next entry */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4063 (void)copy_option_part(&e_cpt, IObuff, IOSIZE, ",");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4064
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4065 found_all = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4066 if (type == -1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4067 continue;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4068 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4069 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4070
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4071 switch (type)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4072 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4073 case -1:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4074 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4075 #ifdef FEAT_FIND_ID
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4076 case CTRL_X_PATH_PATTERNS:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4077 case CTRL_X_PATH_DEFINES:
659
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
4078 find_pattern_in_path(compl_pattern, compl_direction,
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4079 (int)STRLEN(compl_pattern), FALSE, FALSE,
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4080 (type == CTRL_X_PATH_DEFINES
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4081 && !(compl_cont_status & CONT_SOL))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4082 ? FIND_DEFINE : FIND_ANY, 1L, ACTION_EXPAND,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4083 (linenr_T)1, (linenr_T)MAXLNUM);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4084 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4085 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4086
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4087 case CTRL_X_DICTIONARY:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4088 case CTRL_X_THESAURUS:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4089 ins_compl_dictionaries(
703
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
4090 dict != NULL ? dict
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4091 : (type == CTRL_X_THESAURUS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4092 ? (*curbuf->b_p_tsr == NUL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4093 ? p_tsr
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4094 : curbuf->b_p_tsr)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4095 : (*curbuf->b_p_dict == NUL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4096 ? p_dict
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4097 : curbuf->b_p_dict)),
659
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
4098 compl_pattern,
703
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
4099 dict != NULL ? dict_f
2fae45239fb3 updated for version 7.0212
vimboss
parents: 697
diff changeset
4100 : 0, type == CTRL_X_THESAURUS);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4101 dict = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4102 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4103
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4104 case CTRL_X_TAGS:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4105 /* set p_ic according to p_ic, p_scs and pat for find_tags(). */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4106 save_p_ic = p_ic;
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4107 p_ic = ignorecase(compl_pattern);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4108
2047
85da03763130 updated for version 7.2.333
Bram Moolenaar <bram@zimbu.org>
parents: 2025
diff changeset
4109 /* Find up to TAG_MANY matches. Avoids that an enormous number
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4110 * of matches is found when compl_pattern is empty */
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4111 if (find_tags(compl_pattern, &num_matches, &matches,
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4112 TAG_REGEXP | TAG_NAMES | TAG_NOIC |
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4113 TAG_INS_COMP | (ctrl_x_mode ? TAG_VERBOSE : 0),
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4114 TAG_MANY, curbuf->b_ffname) == OK && num_matches > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4115 {
942
29bf49bad20d updated for version 7.0-068
vimboss
parents: 941
diff changeset
4116 ins_compl_add_matches(num_matches, matches, p_ic);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4117 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4118 p_ic = save_p_ic;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4119 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4120
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4121 case CTRL_X_FILES:
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4122 if (expand_wildcards(1, &compl_pattern, &num_matches, &matches,
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4123 EW_FILE|EW_DIR|EW_ADDSLASH|EW_SILENT) == OK)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4124 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4125
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4126 /* May change home directory back to "~". */
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4127 tilde_replace(compl_pattern, num_matches, matches);
681
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
4128 ins_compl_add_matches(num_matches, matches,
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
4129 #ifdef CASE_INSENSITIVE_FILENAME
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
4130 TRUE
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
4131 #else
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
4132 FALSE
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
4133 #endif
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
4134 );
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4135 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4136 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4137
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4138 case CTRL_X_CMDLINE:
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4139 if (expand_cmdline(&compl_xp, compl_pattern,
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4140 (int)STRLEN(compl_pattern),
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4141 &num_matches, &matches) == EXPAND_OK)
681
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
4142 ins_compl_add_matches(num_matches, matches, FALSE);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4143 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4144
12
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 11
diff changeset
4145 #ifdef FEAT_COMPL_FUNC
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 11
diff changeset
4146 case CTRL_X_FUNCTION:
523
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 502
diff changeset
4147 case CTRL_X_OMNI:
659
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
4148 expand_by_function(type, compl_pattern);
12
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 11
diff changeset
4149 break;
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 11
diff changeset
4150 #endif
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 11
diff changeset
4151
477
f8b75b8f1988 updated for version 7.0128
vimboss
parents: 474
diff changeset
4152 case CTRL_X_SPELL:
744
07f7b4a7755c updated for version 7.0222
vimboss
parents: 732
diff changeset
4153 #ifdef FEAT_SPELL
477
f8b75b8f1988 updated for version 7.0128
vimboss
parents: 474
diff changeset
4154 num_matches = expand_spelling(first_match_pos.lnum,
1872
f13849167330 updated for version 7.2-169
vimboss
parents: 1869
diff changeset
4155 compl_pattern, &matches);
477
f8b75b8f1988 updated for version 7.0128
vimboss
parents: 474
diff changeset
4156 if (num_matches > 0)
942
29bf49bad20d updated for version 7.0-068
vimboss
parents: 941
diff changeset
4157 ins_compl_add_matches(num_matches, matches, p_ic);
477
f8b75b8f1988 updated for version 7.0128
vimboss
parents: 474
diff changeset
4158 #endif
f8b75b8f1988 updated for version 7.0128
vimboss
parents: 474
diff changeset
4159 break;
f8b75b8f1988 updated for version 7.0128
vimboss
parents: 474
diff changeset
4160
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4161 default: /* normal ^P/^N and ^X^L */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4162 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4163 * If 'infercase' is set, don't use 'smartcase' here
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4164 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4165 save_p_scs = p_scs;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4166 if (ins_buf->b_p_inf)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4167 p_scs = FALSE;
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4168
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4169 /* buffers other than curbuf are scanned from the beginning or the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4170 * end but never from the middle, thus setting nowrapscan in this
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4171 * buffers is a good idea, on the other hand, we always set
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4172 * wrapscan for curbuf to avoid missing matches -- Acevedo,Webb */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4173 save_p_ws = p_ws;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4174 if (ins_buf != curbuf)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4175 p_ws = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4176 else if (*e_cpt == '.')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4177 p_ws = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4178 for (;;)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4179 {
464
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
4180 int flags = 0;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4181
1007
7d29124f77f5 updated for version 7.0-133
vimboss
parents: 1000
diff changeset
4182 ++msg_silent; /* Don't want messages for wrapscan. */
7d29124f77f5 updated for version 7.0-133
vimboss
parents: 1000
diff changeset
4183
540
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
4184 /* ctrl_x_mode == CTRL_X_WHOLE_LINE || word-wise search that
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
4185 * has added a word that was at the beginning of the line */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4186 if ( ctrl_x_mode == CTRL_X_WHOLE_LINE
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4187 || (compl_cont_status & CONT_SOL))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4188 found_new_match = search_for_exact_line(ins_buf, pos,
659
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
4189 compl_direction, compl_pattern);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4190 else
659
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
4191 found_new_match = searchit(NULL, ins_buf, pos,
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
4192 compl_direction,
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4193 compl_pattern, 1L, SEARCH_KEEP + SEARCH_NFMSG,
1496
29c09fa57168 updated for version 7.1-211
vimboss
parents: 1473
diff changeset
4194 RE_LAST, (linenr_T)0, NULL);
1007
7d29124f77f5 updated for version 7.0-133
vimboss
parents: 1000
diff changeset
4195 --msg_silent;
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4196 if (!compl_started)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4197 {
667
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
4198 /* set "compl_started" even on fail */
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4199 compl_started = TRUE;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4200 first_match_pos = *pos;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4201 last_match_pos = *pos;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4202 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4203 else if (first_match_pos.lnum == last_match_pos.lnum
665
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
4204 && first_match_pos.col == last_match_pos.col)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4205 found_new_match = FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4206 if (found_new_match == FAIL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4207 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4208 if (ins_buf == curbuf)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4209 found_all = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4210 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4211 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4212
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4213 /* when ADDING, the text before the cursor matches, skip it */
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4214 if ( (compl_cont_status & CONT_ADDING) && ins_buf == curbuf
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4215 && ini->lnum == pos->lnum
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4216 && ini->col == pos->col)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4217 continue;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4218 ptr = ml_get_buf(ins_buf, pos->lnum, FALSE) + pos->col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4219 if (ctrl_x_mode == CTRL_X_WHOLE_LINE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4220 {
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4221 if (compl_cont_status & CONT_ADDING)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4222 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4223 if (pos->lnum >= ins_buf->b_ml.ml_line_count)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4224 continue;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4225 ptr = ml_get_buf(ins_buf, pos->lnum + 1, FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4226 if (!p_paste)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4227 ptr = skipwhite(ptr);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4228 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4229 len = (int)STRLEN(ptr);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4230 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4231 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4232 {
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4233 char_u *tmp_ptr = ptr;
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4234
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4235 if (compl_cont_status & CONT_ADDING)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4236 {
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4237 tmp_ptr += compl_length;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4238 /* Skip if already inside a word. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4239 if (vim_iswordp(tmp_ptr))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4240 continue;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4241 /* Find start of next word. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4242 tmp_ptr = find_word_start(tmp_ptr);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4243 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4244 /* Find end of this word. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4245 tmp_ptr = find_word_end(tmp_ptr);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4246 len = (int)(tmp_ptr - ptr);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4247
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4248 if ((compl_cont_status & CONT_ADDING)
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4249 && len == compl_length)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4250 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4251 if (pos->lnum < ins_buf->b_ml.ml_line_count)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4252 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4253 /* Try next line, if any. the new word will be
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4254 * "join" as if the normal command "J" was used.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4255 * IOSIZE is always greater than
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4256 * compl_length, so the next STRNCPY always
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4257 * works -- Acevedo */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4258 STRNCPY(IObuff, ptr, len);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4259 ptr = ml_get_buf(ins_buf, pos->lnum + 1, FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4260 tmp_ptr = ptr = skipwhite(ptr);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4261 /* Find start of next word. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4262 tmp_ptr = find_word_start(tmp_ptr);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4263 /* Find end of next word. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4264 tmp_ptr = find_word_end(tmp_ptr);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4265 if (tmp_ptr > ptr)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4266 {
419
f713fc55bf7b updated for version 7.0109
vimboss
parents: 408
diff changeset
4267 if (*ptr != ')' && IObuff[len - 1] != TAB)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4268 {
419
f713fc55bf7b updated for version 7.0109
vimboss
parents: 408
diff changeset
4269 if (IObuff[len - 1] != ' ')
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4270 IObuff[len++] = ' ';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4271 /* IObuf =~ "\k.* ", thus len >= 2 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4272 if (p_js
419
f713fc55bf7b updated for version 7.0109
vimboss
parents: 408
diff changeset
4273 && (IObuff[len - 2] == '.'
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4274 || (vim_strchr(p_cpo, CPO_JOINSP)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4275 == NULL
419
f713fc55bf7b updated for version 7.0109
vimboss
parents: 408
diff changeset
4276 && (IObuff[len - 2] == '?'
f713fc55bf7b updated for version 7.0109
vimboss
parents: 408
diff changeset
4277 || IObuff[len - 2] == '!'))))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4278 IObuff[len++] = ' ';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4279 }
2047
85da03763130 updated for version 7.2.333
Bram Moolenaar <bram@zimbu.org>
parents: 2025
diff changeset
4280 /* copy as much as possible of the new word */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4281 if (tmp_ptr - ptr >= IOSIZE - len)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4282 tmp_ptr = ptr + IOSIZE - len - 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4283 STRNCPY(IObuff + len, ptr, tmp_ptr - ptr);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4284 len += (int)(tmp_ptr - ptr);
464
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
4285 flags |= CONT_S_IPOS;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4286 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4287 IObuff[len] = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4288 ptr = IObuff;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4289 }
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4290 if (len == compl_length)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4291 continue;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4292 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4293 }
942
29bf49bad20d updated for version 7.0-068
vimboss
parents: 941
diff changeset
4294 if (ins_compl_add_infercase(ptr, len, p_ic,
540
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
4295 ins_buf == curbuf ? NULL : ins_buf->b_sfname,
659
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
4296 0, flags) != NOTDONE)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4297 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4298 found_new_match = OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4299 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4300 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4301 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4302 p_scs = save_p_scs;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4303 p_ws = save_p_ws;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4304 }
540
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
4305
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4306 /* check if compl_curr_match has changed, (e.g. other type of
1796
4589d1792c03 updated for version 7.2-094
vimboss
parents: 1782
diff changeset
4307 * expansion added something) */
540
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
4308 if (type != 0 && compl_curr_match != old_match)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4309 found_new_match = OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4310
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4311 /* break the loop for specialized modes (use 'complete' just for the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4312 * generic ctrl_x_mode == 0) or when we've found a new match */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4313 if ((ctrl_x_mode != 0 && ctrl_x_mode != CTRL_X_WHOLE_LINE)
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4314 || found_new_match != FAIL)
540
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
4315 {
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
4316 if (got_int)
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
4317 break;
665
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
4318 /* Fill the popup menu as soon as possible. */
989
3f8cf4c668c3 updated for version 7.0-115
vimboss
parents: 987
diff changeset
4319 if (type != -1)
540
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
4320 ins_compl_check_keys(0);
665
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
4321
540
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
4322 if ((ctrl_x_mode != 0 && ctrl_x_mode != CTRL_X_WHOLE_LINE)
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
4323 || compl_interrupted)
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
4324 break;
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
4325 compl_started = TRUE;
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
4326 }
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
4327 else
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
4328 {
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
4329 /* Mark a buffer scanned when it has been scanned completely */
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
4330 if (type == 0 || type == CTRL_X_PATH_PATTERNS)
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
4331 ins_buf->b_scanned = TRUE;
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
4332
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
4333 compl_started = FALSE;
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
4334 }
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4335 }
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4336 compl_started = TRUE;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4337
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4338 if ((ctrl_x_mode == 0 || ctrl_x_mode == CTRL_X_WHOLE_LINE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4339 && *e_cpt == NUL) /* Got to end of 'complete' */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4340 found_new_match = FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4341
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4342 i = -1; /* total of matches, unknown */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4343 if (found_new_match == FAIL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4344 || (ctrl_x_mode != 0 && ctrl_x_mode != CTRL_X_WHOLE_LINE))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4345 i = ins_compl_make_cyclic();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4346
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4347 /* If several matches were added (FORWARD) or the search failed and has
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4348 * just been made cyclic then we have to move compl_curr_match to the next
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4349 * or previous entry (if any) -- Acevedo */
724
a35dce0cabc5 updated for version 7.0220
vimboss
parents: 716
diff changeset
4350 compl_curr_match = compl_direction == FORWARD ? old_match->cp_next
a35dce0cabc5 updated for version 7.0220
vimboss
parents: 716
diff changeset
4351 : old_match->cp_prev;
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4352 if (compl_curr_match == NULL)
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4353 compl_curr_match = old_match;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4354 return i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4355 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4356
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4357 /* Delete the old text being completed. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4358 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4359 ins_compl_delete()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4360 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4361 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4362
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4363 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4364 * In insert mode: Delete the typed part.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4365 * In replace mode: Put the old characters back, if any.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4366 */
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4367 i = compl_col + (compl_cont_status & CONT_ADDING ? compl_length : 0);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4368 backspace_until_column(i);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4369 changed_cline_bef_curs();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4370 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4371
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4372 /* Insert the new text being completed. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4373 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4374 ins_compl_insert()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4375 {
1782
12cecc379574 updated for version 7.2-080
vimboss
parents: 1698
diff changeset
4376 ins_bytes(compl_shown_match->cp_str + ins_compl_len());
683
a39b8af64334 updated for version 7.0205
vimboss
parents: 681
diff changeset
4377 if (compl_shown_match->cp_flags & ORIGINAL_TEXT)
a39b8af64334 updated for version 7.0205
vimboss
parents: 681
diff changeset
4378 compl_used_match = FALSE;
a39b8af64334 updated for version 7.0205
vimboss
parents: 681
diff changeset
4379 else
a39b8af64334 updated for version 7.0205
vimboss
parents: 681
diff changeset
4380 compl_used_match = TRUE;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4381 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4382
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4383 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4384 * Fill in the next completion in the current direction.
464
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
4385 * If "allow_get_expansion" is TRUE, then we may call ins_compl_get_exp() to
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
4386 * get more completions. If it is FALSE, then we just do nothing when there
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
4387 * are no more completions in a given direction. The latter case is used when
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
4388 * we are still in the middle of finding completions, to allow browsing
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
4389 * through the ones found so far.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4390 * Return the total number of matches, or -1 if still unknown -- webb.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4391 *
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4392 * compl_curr_match is currently being used by ins_compl_get_exp(), so we use
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4393 * compl_shown_match here.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4394 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4395 * Note that this function may be called recursively once only. First with
464
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
4396 * "allow_get_expansion" TRUE, which calls ins_compl_get_exp(), which in turn
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
4397 * calls this function with "allow_get_expansion" FALSE.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4398 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4399 static int
665
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
4400 ins_compl_next(allow_get_expansion, count, insert_match)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4401 int allow_get_expansion;
610
cd3689efd90a updated for version 7.0173
vimboss
parents: 603
diff changeset
4402 int count; /* repeat completion this many times; should
cd3689efd90a updated for version 7.0173
vimboss
parents: 603
diff changeset
4403 be at least 1 */
665
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
4404 int insert_match; /* Insert the newly selected match */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4405 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4406 int num_matches = -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4407 int i;
610
cd3689efd90a updated for version 7.0173
vimboss
parents: 603
diff changeset
4408 int todo = count;
657
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
4409 compl_T *found_compl = NULL;
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
4410 int found_end = FALSE;
836
5a7843c57316 updated for version 7.0e02
vimboss
parents: 835
diff changeset
4411 int advance;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4412
665
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
4413 if (compl_leader != NULL
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
4414 && (compl_shown_match->cp_flags & ORIGINAL_TEXT) == 0)
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
4415 {
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
4416 /* Set "compl_shown_match" to the actually shown match, it may differ
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
4417 * when "compl_leader" is used to omit some of the matches. */
681
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
4418 while (!ins_compl_equal(compl_shown_match,
835
8bebcabccc2c updated for version 7.0e01
vimboss
parents: 829
diff changeset
4419 compl_leader, (int)STRLEN(compl_leader))
665
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
4420 && compl_shown_match->cp_next != NULL
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
4421 && compl_shown_match->cp_next != compl_first_match)
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
4422 compl_shown_match = compl_shown_match->cp_next;
887
9dc77520c6d3 updated for version 7.0-013
vimboss
parents: 874
diff changeset
4423
9dc77520c6d3 updated for version 7.0-013
vimboss
parents: 874
diff changeset
4424 /* If we didn't find it searching forward, and compl_shows_dir is
9dc77520c6d3 updated for version 7.0-013
vimboss
parents: 874
diff changeset
4425 * backward, find the last match. */
9dc77520c6d3 updated for version 7.0-013
vimboss
parents: 874
diff changeset
4426 if (compl_shows_dir == BACKWARD
9dc77520c6d3 updated for version 7.0-013
vimboss
parents: 874
diff changeset
4427 && !ins_compl_equal(compl_shown_match,
9dc77520c6d3 updated for version 7.0-013
vimboss
parents: 874
diff changeset
4428 compl_leader, (int)STRLEN(compl_leader))
9dc77520c6d3 updated for version 7.0-013
vimboss
parents: 874
diff changeset
4429 && (compl_shown_match->cp_next == NULL
9dc77520c6d3 updated for version 7.0-013
vimboss
parents: 874
diff changeset
4430 || compl_shown_match->cp_next == compl_first_match))
9dc77520c6d3 updated for version 7.0-013
vimboss
parents: 874
diff changeset
4431 {
9dc77520c6d3 updated for version 7.0-013
vimboss
parents: 874
diff changeset
4432 while (!ins_compl_equal(compl_shown_match,
9dc77520c6d3 updated for version 7.0-013
vimboss
parents: 874
diff changeset
4433 compl_leader, (int)STRLEN(compl_leader))
9dc77520c6d3 updated for version 7.0-013
vimboss
parents: 874
diff changeset
4434 && compl_shown_match->cp_prev != NULL
9dc77520c6d3 updated for version 7.0-013
vimboss
parents: 874
diff changeset
4435 && compl_shown_match->cp_prev != compl_first_match)
9dc77520c6d3 updated for version 7.0-013
vimboss
parents: 874
diff changeset
4436 compl_shown_match = compl_shown_match->cp_prev;
9dc77520c6d3 updated for version 7.0-013
vimboss
parents: 874
diff changeset
4437 }
665
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
4438 }
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
4439
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
4440 if (allow_get_expansion && insert_match
874
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
4441 && (!(compl_get_longest || compl_restarting) || compl_used_match))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4442 /* Delete old text to be replaced */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4443 ins_compl_delete();
665
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
4444
836
5a7843c57316 updated for version 7.0e02
vimboss
parents: 835
diff changeset
4445 /* When finding the longest common text we stick at the original text,
5a7843c57316 updated for version 7.0e02
vimboss
parents: 835
diff changeset
4446 * don't let CTRL-N or CTRL-P move to the first match. */
5a7843c57316 updated for version 7.0e02
vimboss
parents: 835
diff changeset
4447 advance = count != 1 || !allow_get_expansion || !compl_get_longest;
5a7843c57316 updated for version 7.0e02
vimboss
parents: 835
diff changeset
4448
874
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
4449 /* When restarting the search don't insert the first match either. */
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
4450 if (compl_restarting)
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
4451 {
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
4452 advance = FALSE;
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
4453 compl_restarting = FALSE;
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
4454 }
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
4455
610
cd3689efd90a updated for version 7.0173
vimboss
parents: 603
diff changeset
4456 /* Repeat this for when <PageUp> or <PageDown> is typed. But don't wrap
cd3689efd90a updated for version 7.0173
vimboss
parents: 603
diff changeset
4457 * around. */
cd3689efd90a updated for version 7.0173
vimboss
parents: 603
diff changeset
4458 while (--todo >= 0)
cd3689efd90a updated for version 7.0173
vimboss
parents: 603
diff changeset
4459 {
cd3689efd90a updated for version 7.0173
vimboss
parents: 603
diff changeset
4460 if (compl_shows_dir == FORWARD && compl_shown_match->cp_next != NULL)
cd3689efd90a updated for version 7.0173
vimboss
parents: 603
diff changeset
4461 {
cd3689efd90a updated for version 7.0173
vimboss
parents: 603
diff changeset
4462 compl_shown_match = compl_shown_match->cp_next;
657
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
4463 found_end = (compl_first_match != NULL
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
4464 && (compl_shown_match->cp_next == compl_first_match
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
4465 || compl_shown_match == compl_first_match));
610
cd3689efd90a updated for version 7.0173
vimboss
parents: 603
diff changeset
4466 }
cd3689efd90a updated for version 7.0173
vimboss
parents: 603
diff changeset
4467 else if (compl_shows_dir == BACKWARD
cd3689efd90a updated for version 7.0173
vimboss
parents: 603
diff changeset
4468 && compl_shown_match->cp_prev != NULL)
cd3689efd90a updated for version 7.0173
vimboss
parents: 603
diff changeset
4469 {
657
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
4470 found_end = (compl_shown_match == compl_first_match);
610
cd3689efd90a updated for version 7.0173
vimboss
parents: 603
diff changeset
4471 compl_shown_match = compl_shown_match->cp_prev;
657
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
4472 found_end |= (compl_shown_match == compl_first_match);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4473 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4474 else
610
cd3689efd90a updated for version 7.0173
vimboss
parents: 603
diff changeset
4475 {
909
073f98f45a44 updated for version 7.0-035
vimboss
parents: 908
diff changeset
4476 if (!allow_get_expansion)
073f98f45a44 updated for version 7.0-035
vimboss
parents: 908
diff changeset
4477 {
073f98f45a44 updated for version 7.0-035
vimboss
parents: 908
diff changeset
4478 if (advance)
073f98f45a44 updated for version 7.0-035
vimboss
parents: 908
diff changeset
4479 {
073f98f45a44 updated for version 7.0-035
vimboss
parents: 908
diff changeset
4480 if (compl_shows_dir == BACKWARD)
073f98f45a44 updated for version 7.0-035
vimboss
parents: 908
diff changeset
4481 compl_pending -= todo + 1;
073f98f45a44 updated for version 7.0-035
vimboss
parents: 908
diff changeset
4482 else
073f98f45a44 updated for version 7.0-035
vimboss
parents: 908
diff changeset
4483 compl_pending += todo + 1;
073f98f45a44 updated for version 7.0-035
vimboss
parents: 908
diff changeset
4484 }
073f98f45a44 updated for version 7.0-035
vimboss
parents: 908
diff changeset
4485 return -1;
073f98f45a44 updated for version 7.0-035
vimboss
parents: 908
diff changeset
4486 }
073f98f45a44 updated for version 7.0-035
vimboss
parents: 908
diff changeset
4487
836
5a7843c57316 updated for version 7.0e02
vimboss
parents: 835
diff changeset
4488 if (advance)
5a7843c57316 updated for version 7.0e02
vimboss
parents: 835
diff changeset
4489 {
5a7843c57316 updated for version 7.0e02
vimboss
parents: 835
diff changeset
4490 if (compl_shows_dir == BACKWARD)
5a7843c57316 updated for version 7.0e02
vimboss
parents: 835
diff changeset
4491 --compl_pending;
5a7843c57316 updated for version 7.0e02
vimboss
parents: 835
diff changeset
4492 else
5a7843c57316 updated for version 7.0e02
vimboss
parents: 835
diff changeset
4493 ++compl_pending;
5a7843c57316 updated for version 7.0e02
vimboss
parents: 835
diff changeset
4494 }
657
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
4495
874
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
4496 /* Find matches. */
659
d6a69271cb9a updated for version 7.0194
vimboss
parents: 657
diff changeset
4497 num_matches = ins_compl_get_exp(&compl_startpos);
909
073f98f45a44 updated for version 7.0-035
vimboss
parents: 908
diff changeset
4498
073f98f45a44 updated for version 7.0-035
vimboss
parents: 908
diff changeset
4499 /* handle any pending completions */
073f98f45a44 updated for version 7.0-035
vimboss
parents: 908
diff changeset
4500 while (compl_pending != 0 && compl_direction == compl_shows_dir
836
5a7843c57316 updated for version 7.0e02
vimboss
parents: 835
diff changeset
4501 && advance)
909
073f98f45a44 updated for version 7.0-035
vimboss
parents: 908
diff changeset
4502 {
073f98f45a44 updated for version 7.0-035
vimboss
parents: 908
diff changeset
4503 if (compl_pending > 0 && compl_shown_match->cp_next != NULL)
073f98f45a44 updated for version 7.0-035
vimboss
parents: 908
diff changeset
4504 {
073f98f45a44 updated for version 7.0-035
vimboss
parents: 908
diff changeset
4505 compl_shown_match = compl_shown_match->cp_next;
073f98f45a44 updated for version 7.0-035
vimboss
parents: 908
diff changeset
4506 --compl_pending;
073f98f45a44 updated for version 7.0-035
vimboss
parents: 908
diff changeset
4507 }
073f98f45a44 updated for version 7.0-035
vimboss
parents: 908
diff changeset
4508 if (compl_pending < 0 && compl_shown_match->cp_prev != NULL)
073f98f45a44 updated for version 7.0-035
vimboss
parents: 908
diff changeset
4509 {
073f98f45a44 updated for version 7.0-035
vimboss
parents: 908
diff changeset
4510 compl_shown_match = compl_shown_match->cp_prev;
073f98f45a44 updated for version 7.0-035
vimboss
parents: 908
diff changeset
4511 ++compl_pending;
073f98f45a44 updated for version 7.0-035
vimboss
parents: 908
diff changeset
4512 }
073f98f45a44 updated for version 7.0-035
vimboss
parents: 908
diff changeset
4513 else
073f98f45a44 updated for version 7.0-035
vimboss
parents: 908
diff changeset
4514 break;
073f98f45a44 updated for version 7.0-035
vimboss
parents: 908
diff changeset
4515 }
657
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
4516 found_end = FALSE;
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
4517 }
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
4518 if ((compl_shown_match->cp_flags & ORIGINAL_TEXT) == 0
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
4519 && compl_leader != NULL
681
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
4520 && !ins_compl_equal(compl_shown_match,
835
8bebcabccc2c updated for version 7.0e01
vimboss
parents: 829
diff changeset
4521 compl_leader, (int)STRLEN(compl_leader)))
657
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
4522 ++todo;
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
4523 else
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
4524 /* Remember a matching item. */
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
4525 found_compl = compl_shown_match;
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
4526
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
4527 /* Stop at the end of the list when we found a usable match. */
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
4528 if (found_end)
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
4529 {
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
4530 if (found_compl != NULL)
610
cd3689efd90a updated for version 7.0173
vimboss
parents: 603
diff changeset
4531 {
657
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
4532 compl_shown_match = found_compl;
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
4533 break;
610
cd3689efd90a updated for version 7.0173
vimboss
parents: 603
diff changeset
4534 }
657
b112ec5c73f0 updated for version 7.0193
vimboss
parents: 648
diff changeset
4535 todo = 1; /* use first usable match after wrapping around */
610
cd3689efd90a updated for version 7.0173
vimboss
parents: 603
diff changeset
4536 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4537 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4538
665
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
4539 /* Insert the text of the new completion, or the compl_leader. */
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
4540 if (insert_match)
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
4541 {
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
4542 if (!compl_get_longest || compl_used_match)
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
4543 ins_compl_insert();
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
4544 else
1782
12cecc379574 updated for version 7.2-080
vimboss
parents: 1698
diff changeset
4545 ins_bytes(compl_leader + ins_compl_len());
665
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
4546 }
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
4547 else
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
4548 compl_used_match = FALSE;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4549
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4550 if (!allow_get_expansion)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4551 {
540
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
4552 /* may undisplay the popup menu first */
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
4553 ins_compl_upd_pum();
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
4554
665
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
4555 /* redraw to show the user what was inserted */
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
4556 update_screen(0);
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
4557
540
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
4558 /* display the updated popup menu */
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
4559 ins_compl_show_pum();
864
bc620d6bdf06 updated for version 7.0g03
vimboss
parents: 857
diff changeset
4560 #ifdef FEAT_GUI
bc620d6bdf06 updated for version 7.0g03
vimboss
parents: 857
diff changeset
4561 if (gui.in_use)
bc620d6bdf06 updated for version 7.0g03
vimboss
parents: 857
diff changeset
4562 {
bc620d6bdf06 updated for version 7.0g03
vimboss
parents: 857
diff changeset
4563 /* Show the cursor after the match, not after the redrawn text. */
bc620d6bdf06 updated for version 7.0g03
vimboss
parents: 857
diff changeset
4564 setcursor();
bc620d6bdf06 updated for version 7.0g03
vimboss
parents: 857
diff changeset
4565 out_flush();
bc620d6bdf06 updated for version 7.0g03
vimboss
parents: 857
diff changeset
4566 gui_update_cursor(FALSE, FALSE);
bc620d6bdf06 updated for version 7.0g03
vimboss
parents: 857
diff changeset
4567 }
bc620d6bdf06 updated for version 7.0g03
vimboss
parents: 857
diff changeset
4568 #endif
540
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
4569
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4570 /* Delete old text to be replaced, since we're still searching and
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4571 * don't want to match ourselves! */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4572 ins_compl_delete();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4573 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4574
825
6675076019ae updated for version 7.0d
vimboss
parents: 819
diff changeset
4575 /* Enter will select a match when the match wasn't inserted and the popup
1219
aea597af5b4e updated for version 7.1b
vimboss
parents: 1159
diff changeset
4576 * menu is visible. */
825
6675076019ae updated for version 7.0d
vimboss
parents: 819
diff changeset
4577 compl_enter_selects = !insert_match && compl_match_array != NULL;
6675076019ae updated for version 7.0d
vimboss
parents: 819
diff changeset
4578
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4579 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4580 * Show the file name for the match (if any)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4581 * Truncate the file name to avoid a wait for return.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4582 */
464
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
4583 if (compl_shown_match->cp_fname != NULL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4584 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4585 STRCPY(IObuff, "match in file ");
464
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
4586 i = (vim_strsize(compl_shown_match->cp_fname) + 16) - sc_col;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4587 if (i <= 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4588 i = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4589 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4590 STRCAT(IObuff, "<");
464
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
4591 STRCAT(IObuff, compl_shown_match->cp_fname + i);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4592 msg(IObuff);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4593 redraw_cmdline = FALSE; /* don't overwrite! */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4594 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4595
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4596 return num_matches;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4597 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4598
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4599 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4600 * Call this while finding completions, to check whether the user has hit a key
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4601 * that should change the currently displayed completion, or exit completion
716
8ae24f338cab updated for version 7.0217
vimboss
parents: 714
diff changeset
4602 * mode. Also, when compl_pending is not zero, show a completion as soon as
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4603 * possible. -- webb
464
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
4604 * "frequency" specifies out of how many calls we actually check.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4605 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4606 void
464
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
4607 ins_compl_check_keys(frequency)
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
4608 int frequency;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4609 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4610 static int count = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4611
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4612 int c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4613
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4614 /* Don't check when reading keys from a script. That would break the test
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4615 * scripts */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4616 if (using_script())
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4617 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4618
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4619 /* Only do this at regular intervals */
464
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
4620 if (++count < frequency)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4621 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4622 count = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4623
909
073f98f45a44 updated for version 7.0-035
vimboss
parents: 908
diff changeset
4624 /* Check for a typed key. Do use mappings, otherwise vim_is_ctrl_x_key()
073f98f45a44 updated for version 7.0-035
vimboss
parents: 908
diff changeset
4625 * can't do its work correctly. */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4626 c = vpeekc_any();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4627 if (c != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4628 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4629 if (vim_is_ctrl_x_key(c) && c != Ctrl_X && c != Ctrl_R)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4630 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4631 c = safe_vgetc(); /* Eat the character */
610
cd3689efd90a updated for version 7.0173
vimboss
parents: 603
diff changeset
4632 compl_shows_dir = ins_compl_key2dir(c);
665
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
4633 (void)ins_compl_next(FALSE, ins_compl_key2count(c),
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
4634 c != K_UP && c != K_DOWN);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4635 }
909
073f98f45a44 updated for version 7.0-035
vimboss
parents: 908
diff changeset
4636 else
073f98f45a44 updated for version 7.0-035
vimboss
parents: 908
diff changeset
4637 {
073f98f45a44 updated for version 7.0-035
vimboss
parents: 908
diff changeset
4638 /* Need to get the character to have KeyTyped set. We'll put it
1526
f79bb0320025 updated for version 7.1-241
vimboss
parents: 1516
diff changeset
4639 * back with vungetc() below. But skip K_IGNORE. */
909
073f98f45a44 updated for version 7.0-035
vimboss
parents: 908
diff changeset
4640 c = safe_vgetc();
1526
f79bb0320025 updated for version 7.1-241
vimboss
parents: 1516
diff changeset
4641 if (c != K_IGNORE)
f79bb0320025 updated for version 7.1-241
vimboss
parents: 1516
diff changeset
4642 {
f79bb0320025 updated for version 7.1-241
vimboss
parents: 1516
diff changeset
4643 /* Don't interrupt completion when the character wasn't typed,
f79bb0320025 updated for version 7.1-241
vimboss
parents: 1516
diff changeset
4644 * e.g., when doing @q to replay keys. */
f79bb0320025 updated for version 7.1-241
vimboss
parents: 1516
diff changeset
4645 if (c != Ctrl_R && KeyTyped)
f79bb0320025 updated for version 7.1-241
vimboss
parents: 1516
diff changeset
4646 compl_interrupted = TRUE;
f79bb0320025 updated for version 7.1-241
vimboss
parents: 1516
diff changeset
4647
f79bb0320025 updated for version 7.1-241
vimboss
parents: 1516
diff changeset
4648 vungetc(c);
f79bb0320025 updated for version 7.1-241
vimboss
parents: 1516
diff changeset
4649 }
909
073f98f45a44 updated for version 7.0-035
vimboss
parents: 908
diff changeset
4650 }
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4651 }
716
8ae24f338cab updated for version 7.0217
vimboss
parents: 714
diff changeset
4652 if (compl_pending != 0 && !got_int)
909
073f98f45a44 updated for version 7.0-035
vimboss
parents: 908
diff changeset
4653 {
073f98f45a44 updated for version 7.0-035
vimboss
parents: 908
diff changeset
4654 int todo = compl_pending > 0 ? compl_pending : -compl_pending;
073f98f45a44 updated for version 7.0-035
vimboss
parents: 908
diff changeset
4655
073f98f45a44 updated for version 7.0-035
vimboss
parents: 908
diff changeset
4656 compl_pending = 0;
073f98f45a44 updated for version 7.0-035
vimboss
parents: 908
diff changeset
4657 (void)ins_compl_next(FALSE, todo, TRUE);
073f98f45a44 updated for version 7.0-035
vimboss
parents: 908
diff changeset
4658 }
610
cd3689efd90a updated for version 7.0173
vimboss
parents: 603
diff changeset
4659 }
cd3689efd90a updated for version 7.0173
vimboss
parents: 603
diff changeset
4660
cd3689efd90a updated for version 7.0173
vimboss
parents: 603
diff changeset
4661 /*
cd3689efd90a updated for version 7.0173
vimboss
parents: 603
diff changeset
4662 * Decide the direction of Insert mode complete from the key typed.
cd3689efd90a updated for version 7.0173
vimboss
parents: 603
diff changeset
4663 * Returns BACKWARD or FORWARD.
cd3689efd90a updated for version 7.0173
vimboss
parents: 603
diff changeset
4664 */
cd3689efd90a updated for version 7.0173
vimboss
parents: 603
diff changeset
4665 static int
cd3689efd90a updated for version 7.0173
vimboss
parents: 603
diff changeset
4666 ins_compl_key2dir(c)
cd3689efd90a updated for version 7.0173
vimboss
parents: 603
diff changeset
4667 int c;
cd3689efd90a updated for version 7.0173
vimboss
parents: 603
diff changeset
4668 {
665
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
4669 if (c == Ctrl_P || c == Ctrl_L
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
4670 || (pum_visible() && (c == K_PAGEUP || c == K_KPAGEUP
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
4671 || c == K_S_UP || c == K_UP)))
610
cd3689efd90a updated for version 7.0173
vimboss
parents: 603
diff changeset
4672 return BACKWARD;
cd3689efd90a updated for version 7.0173
vimboss
parents: 603
diff changeset
4673 return FORWARD;
cd3689efd90a updated for version 7.0173
vimboss
parents: 603
diff changeset
4674 }
cd3689efd90a updated for version 7.0173
vimboss
parents: 603
diff changeset
4675
cd3689efd90a updated for version 7.0173
vimboss
parents: 603
diff changeset
4676 /*
644
e4fa26ce8769 updated for version 7.0187
vimboss
parents: 634
diff changeset
4677 * Return TRUE for keys that are used for completion only when the popup menu
e4fa26ce8769 updated for version 7.0187
vimboss
parents: 634
diff changeset
4678 * is visible.
e4fa26ce8769 updated for version 7.0187
vimboss
parents: 634
diff changeset
4679 */
e4fa26ce8769 updated for version 7.0187
vimboss
parents: 634
diff changeset
4680 static int
e4fa26ce8769 updated for version 7.0187
vimboss
parents: 634
diff changeset
4681 ins_compl_pum_key(c)
e4fa26ce8769 updated for version 7.0187
vimboss
parents: 634
diff changeset
4682 int c;
e4fa26ce8769 updated for version 7.0187
vimboss
parents: 634
diff changeset
4683 {
e4fa26ce8769 updated for version 7.0187
vimboss
parents: 634
diff changeset
4684 return pum_visible() && (c == K_PAGEUP || c == K_KPAGEUP || c == K_S_UP
665
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
4685 || c == K_PAGEDOWN || c == K_KPAGEDOWN || c == K_S_DOWN
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
4686 || c == K_UP || c == K_DOWN);
644
e4fa26ce8769 updated for version 7.0187
vimboss
parents: 634
diff changeset
4687 }
e4fa26ce8769 updated for version 7.0187
vimboss
parents: 634
diff changeset
4688
e4fa26ce8769 updated for version 7.0187
vimboss
parents: 634
diff changeset
4689 /*
610
cd3689efd90a updated for version 7.0173
vimboss
parents: 603
diff changeset
4690 * Decide the number of completions to move forward.
cd3689efd90a updated for version 7.0173
vimboss
parents: 603
diff changeset
4691 * Returns 1 for most keys, height of the popup menu for page-up/down keys.
cd3689efd90a updated for version 7.0173
vimboss
parents: 603
diff changeset
4692 */
cd3689efd90a updated for version 7.0173
vimboss
parents: 603
diff changeset
4693 static int
cd3689efd90a updated for version 7.0173
vimboss
parents: 603
diff changeset
4694 ins_compl_key2count(c)
cd3689efd90a updated for version 7.0173
vimboss
parents: 603
diff changeset
4695 int c;
cd3689efd90a updated for version 7.0173
vimboss
parents: 603
diff changeset
4696 {
cd3689efd90a updated for version 7.0173
vimboss
parents: 603
diff changeset
4697 int h;
cd3689efd90a updated for version 7.0173
vimboss
parents: 603
diff changeset
4698
665
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
4699 if (ins_compl_pum_key(c) && c != K_UP && c != K_DOWN)
610
cd3689efd90a updated for version 7.0173
vimboss
parents: 603
diff changeset
4700 {
cd3689efd90a updated for version 7.0173
vimboss
parents: 603
diff changeset
4701 h = pum_get_height();
cd3689efd90a updated for version 7.0173
vimboss
parents: 603
diff changeset
4702 if (h > 3)
cd3689efd90a updated for version 7.0173
vimboss
parents: 603
diff changeset
4703 h -= 2; /* keep some context */
cd3689efd90a updated for version 7.0173
vimboss
parents: 603
diff changeset
4704 return h;
cd3689efd90a updated for version 7.0173
vimboss
parents: 603
diff changeset
4705 }
cd3689efd90a updated for version 7.0173
vimboss
parents: 603
diff changeset
4706 return 1;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4707 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4708
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4709 /*
681
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
4710 * Return TRUE if completion with "c" should insert the match, FALSE if only
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
4711 * to change the currently selected completion.
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
4712 */
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
4713 static int
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
4714 ins_compl_use_match(c)
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
4715 int c;
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
4716 {
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
4717 switch (c)
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
4718 {
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
4719 case K_UP:
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
4720 case K_DOWN:
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
4721 case K_PAGEDOWN:
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
4722 case K_KPAGEDOWN:
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
4723 case K_S_DOWN:
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
4724 case K_PAGEUP:
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
4725 case K_KPAGEUP:
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
4726 case K_S_UP:
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
4727 return FALSE;
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
4728 }
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
4729 return TRUE;
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
4730 }
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
4731
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
4732 /*
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4733 * Do Insert mode completion.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4734 * Called when character "c" was typed, which has a meaning for completion.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4735 * Returns OK if completion was done, FAIL if something failed (out of mem).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4736 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4737 static int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4738 ins_complete(c)
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4739 int c;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4740 {
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4741 char_u *line;
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4742 int startcol = 0; /* column where searched text starts */
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4743 colnr_T curs_col; /* cursor column */
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4744 int n;
2107
4a4287c09953 updated for version 7.2.390
Bram Moolenaar <bram@zimbu.org>
parents: 2047
diff changeset
4745 int save_w_wrow;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4746
610
cd3689efd90a updated for version 7.0173
vimboss
parents: 603
diff changeset
4747 compl_direction = ins_compl_key2dir(c);
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4748 if (!compl_started)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4749 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4750 /* First time we hit ^N or ^P (in a row, I mean) */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4751
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4752 did_ai = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4753 #ifdef FEAT_SMARTINDENT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4754 did_si = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4755 can_si = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4756 can_si_back = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4757 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4758 if (stop_arrow() == FAIL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4759 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4760
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4761 line = ml_get(curwin->w_cursor.lnum);
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4762 curs_col = curwin->w_cursor.col;
716
8ae24f338cab updated for version 7.0217
vimboss
parents: 714
diff changeset
4763 compl_pending = 0;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4764
1430
342cf2a9f5cc updated for version 7.1-145
vimboss
parents: 1389
diff changeset
4765 /* If this same ctrl_x_mode has been interrupted use the text from
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4766 * "compl_startpos" to the cursor as a pattern to add a new word
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4767 * instead of expand the one before the cursor, in word-wise if
1430
342cf2a9f5cc updated for version 7.1-145
vimboss
parents: 1389
diff changeset
4768 * "compl_startpos" is not in the same line as the cursor then fix it
342cf2a9f5cc updated for version 7.1-145
vimboss
parents: 1389
diff changeset
4769 * (the line has been split because it was longer than 'tw'). if SOL
342cf2a9f5cc updated for version 7.1-145
vimboss
parents: 1389
diff changeset
4770 * is set then skip the previous pattern, a word at the beginning of
342cf2a9f5cc updated for version 7.1-145
vimboss
parents: 1389
diff changeset
4771 * the line has been inserted, we'll look for that -- Acevedo. */
665
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
4772 if ((compl_cont_status & CONT_INTRPT) == CONT_INTRPT
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
4773 && compl_cont_mode == ctrl_x_mode)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4774 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4775 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4776 * it is a continued search
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4777 */
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4778 compl_cont_status &= ~CONT_INTRPT; /* remove INTRPT */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4779 if (ctrl_x_mode == 0 || ctrl_x_mode == CTRL_X_PATH_PATTERNS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4780 || ctrl_x_mode == CTRL_X_PATH_DEFINES)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4781 {
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4782 if (compl_startpos.lnum != curwin->w_cursor.lnum)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4783 {
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4784 /* line (probably) wrapped, set compl_startpos to the
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4785 * first non_blank in the line, if it is not a wordchar
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4786 * include it to get a better pattern, but then we don't
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4787 * want the "\\<" prefix, check it bellow */
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4788 compl_col = (colnr_T)(skipwhite(line) - line);
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4789 compl_startpos.col = compl_col;
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4790 compl_startpos.lnum = curwin->w_cursor.lnum;
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4791 compl_cont_status &= ~CONT_SOL; /* clear SOL if present */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4792 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4793 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4794 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4795 /* S_IPOS was set when we inserted a word that was at the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4796 * beginning of the line, which means that we'll go to SOL
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4797 * mode but first we need to redefine compl_startpos */
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4798 if (compl_cont_status & CONT_S_IPOS)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4799 {
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4800 compl_cont_status |= CONT_SOL;
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4801 compl_startpos.col = (colnr_T)(skipwhite(
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4802 line + compl_length
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4803 + compl_startpos.col) - line);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4804 }
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4805 compl_col = compl_startpos.col;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4806 }
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4807 compl_length = curwin->w_cursor.col - (int)compl_col;
502
52e76e2b5b65 updated for version 7.0140
vimboss
parents: 499
diff changeset
4808 /* IObuff is used to add a "word from the next line" would we
1796
4589d1792c03 updated for version 7.2-094
vimboss
parents: 1782
diff changeset
4809 * have enough space? just being paranoid */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4810 #define MIN_SPACE 75
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4811 if (compl_length > (IOSIZE - MIN_SPACE))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4812 {
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4813 compl_cont_status &= ~CONT_SOL;
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4814 compl_length = (IOSIZE - MIN_SPACE);
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4815 compl_col = curwin->w_cursor.col - compl_length;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4816 }
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4817 compl_cont_status |= CONT_ADDING | CONT_N_ADDS;
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4818 if (compl_length < 1)
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4819 compl_cont_status &= CONT_LOCAL;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4820 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4821 else if (ctrl_x_mode == CTRL_X_WHOLE_LINE)
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4822 compl_cont_status = CONT_ADDING | CONT_N_ADDS;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4823 else
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4824 compl_cont_status = 0;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4825 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4826 else
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4827 compl_cont_status &= CONT_LOCAL;
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4828
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4829 if (!(compl_cont_status & CONT_ADDING)) /* normal expansion */
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4830 {
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4831 compl_cont_mode = ctrl_x_mode;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4832 if (ctrl_x_mode != 0) /* Remove LOCAL if ctrl_x_mode != 0 */
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4833 compl_cont_status = 0;
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4834 compl_cont_status |= CONT_N_ADDS;
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4835 compl_startpos = curwin->w_cursor;
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4836 startcol = (int)curs_col;
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4837 compl_col = 0;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4838 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4839
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4840 /* Work out completion pattern and original text -- webb */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4841 if (ctrl_x_mode == 0 || (ctrl_x_mode & CTRL_X_WANT_IDENT))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4842 {
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4843 if ((compl_cont_status & CONT_SOL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4844 || ctrl_x_mode == CTRL_X_PATH_DEFINES)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4845 {
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4846 if (!(compl_cont_status & CONT_ADDING))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4847 {
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4848 while (--startcol >= 0 && vim_isIDc(line[startcol]))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4849 ;
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4850 compl_col += ++startcol;
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4851 compl_length = curs_col - startcol;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4852 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4853 if (p_ic)
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4854 compl_pattern = str_foldcase(line + compl_col,
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4855 compl_length, NULL, 0);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4856 else
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4857 compl_pattern = vim_strnsave(line + compl_col,
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4858 compl_length);
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4859 if (compl_pattern == NULL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4860 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4861 }
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4862 else if (compl_cont_status & CONT_ADDING)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4863 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4864 char_u *prefix = (char_u *)"\\<";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4865
1872
f13849167330 updated for version 7.2-169
vimboss
parents: 1869
diff changeset
4866 /* we need up to 2 extra chars for the prefix */
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4867 compl_pattern = alloc(quote_meta(NULL, line + compl_col,
1872
f13849167330 updated for version 7.2-169
vimboss
parents: 1869
diff changeset
4868 compl_length) + 2);
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4869 if (compl_pattern == NULL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4870 return FAIL;
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4871 if (!vim_iswordp(line + compl_col)
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4872 || (compl_col > 0
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4873 && (
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4874 #ifdef FEAT_MBYTE
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4875 vim_iswordp(mb_prevptr(line, line + compl_col))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4876 #else
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4877 vim_iswordc(line[compl_col - 1])
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4878 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4879 )))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4880 prefix = (char_u *)"";
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4881 STRCPY((char *)compl_pattern, prefix);
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4882 (void)quote_meta(compl_pattern + STRLEN(prefix),
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4883 line + compl_col, compl_length);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4884 }
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4885 else if (--startcol < 0 ||
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4886 #ifdef FEAT_MBYTE
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4887 !vim_iswordp(mb_prevptr(line, line + startcol + 1))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4888 #else
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4889 !vim_iswordc(line[startcol])
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4890 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4891 )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4892 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4893 /* Match any word of at least two chars */
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4894 compl_pattern = vim_strsave((char_u *)"\\<\\k\\k");
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4895 if (compl_pattern == NULL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4896 return FAIL;
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4897 compl_col += curs_col;
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4898 compl_length = 0;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4899 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4900 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4901 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4902 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4903 /* Search the point of change class of multibyte character
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4904 * or not a word single byte character backward. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4905 if (has_mbyte)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4906 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4907 int base_class;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4908 int head_off;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4909
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4910 startcol -= (*mb_head_off)(line, line + startcol);
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4911 base_class = mb_get_class(line + startcol);
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4912 while (--startcol >= 0)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4913 {
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4914 head_off = (*mb_head_off)(line, line + startcol);
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4915 if (base_class != mb_get_class(line + startcol
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4916 - head_off))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4917 break;
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4918 startcol -= head_off;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4919 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4920 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4921 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4922 #endif
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4923 while (--startcol >= 0 && vim_iswordc(line[startcol]))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4924 ;
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4925 compl_col += ++startcol;
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4926 compl_length = (int)curs_col - startcol;
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4927 if (compl_length == 1)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4928 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4929 /* Only match word with at least two chars -- webb
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4930 * there's no need to call quote_meta,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4931 * alloc(7) is enough -- Acevedo
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4932 */
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4933 compl_pattern = alloc(7);
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4934 if (compl_pattern == NULL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4935 return FAIL;
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4936 STRCPY((char *)compl_pattern, "\\<");
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4937 (void)quote_meta(compl_pattern + 2, line + compl_col, 1);
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4938 STRCAT((char *)compl_pattern, "\\k");
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4939 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4940 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4941 {
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4942 compl_pattern = alloc(quote_meta(NULL, line + compl_col,
1872
f13849167330 updated for version 7.2-169
vimboss
parents: 1869
diff changeset
4943 compl_length) + 2);
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4944 if (compl_pattern == NULL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4945 return FAIL;
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4946 STRCPY((char *)compl_pattern, "\\<");
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4947 (void)quote_meta(compl_pattern + 2, line + compl_col,
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4948 compl_length);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4949 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4950 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4951 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4952 else if (ctrl_x_mode == CTRL_X_WHOLE_LINE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4953 {
835
8bebcabccc2c updated for version 7.0e01
vimboss
parents: 829
diff changeset
4954 compl_col = (colnr_T)(skipwhite(line) - line);
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4955 compl_length = (int)curs_col - (int)compl_col;
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4956 if (compl_length < 0) /* cursor in indent: empty pattern */
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4957 compl_length = 0;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4958 if (p_ic)
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4959 compl_pattern = str_foldcase(line + compl_col, compl_length,
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4960 NULL, 0);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4961 else
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4962 compl_pattern = vim_strnsave(line + compl_col, compl_length);
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4963 if (compl_pattern == NULL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4964 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4965 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4966 else if (ctrl_x_mode == CTRL_X_FILES)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4967 {
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4968 while (--startcol >= 0 && vim_isfilec(line[startcol]))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4969 ;
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4970 compl_col += ++startcol;
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4971 compl_length = (int)curs_col - startcol;
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4972 compl_pattern = addstar(line + compl_col, compl_length,
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4973 EXPAND_FILES);
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4974 if (compl_pattern == NULL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4975 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4976 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4977 else if (ctrl_x_mode == CTRL_X_CMDLINE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4978 {
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4979 compl_pattern = vim_strnsave(line, curs_col);
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4980 if (compl_pattern == NULL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4981 return FAIL;
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4982 set_cmd_context(&compl_xp, compl_pattern,
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4983 (int)STRLEN(compl_pattern), curs_col);
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4984 if (compl_xp.xp_context == EXPAND_UNSUCCESSFUL
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
4985 || compl_xp.xp_context == EXPAND_NOTHING)
935
c8cae82dee30 updated for version 7.0-061
vimboss
parents: 929
diff changeset
4986 /* No completion possible, use an empty pattern to get a
c8cae82dee30 updated for version 7.0-061
vimboss
parents: 929
diff changeset
4987 * "pattern not found" message. */
897
2e1e9b708941 updated for version 7.0-023
vimboss
parents: 887
diff changeset
4988 compl_col = curs_col;
2e1e9b708941 updated for version 7.0-023
vimboss
parents: 887
diff changeset
4989 else
935
c8cae82dee30 updated for version 7.0-061
vimboss
parents: 929
diff changeset
4990 compl_col = (int)(compl_xp.xp_pattern - compl_pattern);
c8cae82dee30 updated for version 7.0-061
vimboss
parents: 929
diff changeset
4991 compl_length = curs_col - compl_col;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4992 }
523
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 502
diff changeset
4993 else if (ctrl_x_mode == CTRL_X_FUNCTION || ctrl_x_mode == CTRL_X_OMNI)
502
52e76e2b5b65 updated for version 7.0140
vimboss
parents: 499
diff changeset
4994 {
12
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 11
diff changeset
4995 #ifdef FEAT_COMPL_FUNC
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 11
diff changeset
4996 /*
502
52e76e2b5b65 updated for version 7.0140
vimboss
parents: 499
diff changeset
4997 * Call user defined function 'completefunc' with "a:findstart"
52e76e2b5b65 updated for version 7.0140
vimboss
parents: 499
diff changeset
4998 * set to 1 to obtain the length of text to use for completion.
12
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 11
diff changeset
4999 */
502
52e76e2b5b65 updated for version 7.0140
vimboss
parents: 499
diff changeset
5000 char_u *args[2];
452
01af1008a8d8 updated for version 7.0120
vimboss
parents: 449
diff changeset
5001 int col;
502
52e76e2b5b65 updated for version 7.0140
vimboss
parents: 499
diff changeset
5002 char_u *funcname;
52e76e2b5b65 updated for version 7.0140
vimboss
parents: 499
diff changeset
5003 pos_T pos;
52e76e2b5b65 updated for version 7.0140
vimboss
parents: 499
diff changeset
5004
523
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 502
diff changeset
5005 /* Call 'completefunc' or 'omnifunc' and get pattern length as a
502
52e76e2b5b65 updated for version 7.0140
vimboss
parents: 499
diff changeset
5006 * string */
52e76e2b5b65 updated for version 7.0140
vimboss
parents: 499
diff changeset
5007 funcname = ctrl_x_mode == CTRL_X_FUNCTION
52e76e2b5b65 updated for version 7.0140
vimboss
parents: 499
diff changeset
5008 ? curbuf->b_p_cfu : curbuf->b_p_ofu;
52e76e2b5b65 updated for version 7.0140
vimboss
parents: 499
diff changeset
5009 if (*funcname == NUL)
523
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 502
diff changeset
5010 {
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 502
diff changeset
5011 EMSG2(_(e_notset), ctrl_x_mode == CTRL_X_FUNCTION
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 502
diff changeset
5012 ? "completefunc" : "omnifunc");
12
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 11
diff changeset
5013 return FAIL;
523
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 502
diff changeset
5014 }
452
01af1008a8d8 updated for version 7.0120
vimboss
parents: 449
diff changeset
5015
01af1008a8d8 updated for version 7.0120
vimboss
parents: 449
diff changeset
5016 args[0] = (char_u *)"1";
502
52e76e2b5b65 updated for version 7.0140
vimboss
parents: 499
diff changeset
5017 args[1] = NULL;
52e76e2b5b65 updated for version 7.0140
vimboss
parents: 499
diff changeset
5018 pos = curwin->w_cursor;
52e76e2b5b65 updated for version 7.0140
vimboss
parents: 499
diff changeset
5019 col = call_func_retnr(funcname, 2, args, FALSE);
52e76e2b5b65 updated for version 7.0140
vimboss
parents: 499
diff changeset
5020 curwin->w_cursor = pos; /* restore the cursor position */
52e76e2b5b65 updated for version 7.0140
vimboss
parents: 499
diff changeset
5021
452
01af1008a8d8 updated for version 7.0120
vimboss
parents: 449
diff changeset
5022 if (col < 0)
523
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 502
diff changeset
5023 col = curs_col;
452
01af1008a8d8 updated for version 7.0120
vimboss
parents: 449
diff changeset
5024 compl_col = col;
1872
f13849167330 updated for version 7.2-169
vimboss
parents: 1869
diff changeset
5025 if (compl_col > curs_col)
452
01af1008a8d8 updated for version 7.0120
vimboss
parents: 449
diff changeset
5026 compl_col = curs_col;
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
5027
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
5028 /* Setup variables for completion. Need to obtain "line" again,
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
5029 * it may have become invalid. */
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
5030 line = ml_get(curwin->w_cursor.lnum);
452
01af1008a8d8 updated for version 7.0120
vimboss
parents: 449
diff changeset
5031 compl_length = curs_col - compl_col;
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
5032 compl_pattern = vim_strnsave(line + compl_col, compl_length);
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
5033 if (compl_pattern == NULL)
502
52e76e2b5b65 updated for version 7.0140
vimboss
parents: 499
diff changeset
5034 #endif
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
5035 return FAIL;
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
5036 }
477
f8b75b8f1988 updated for version 7.0128
vimboss
parents: 474
diff changeset
5037 else if (ctrl_x_mode == CTRL_X_SPELL)
f8b75b8f1988 updated for version 7.0128
vimboss
parents: 474
diff changeset
5038 {
744
07f7b4a7755c updated for version 7.0222
vimboss
parents: 732
diff changeset
5039 #ifdef FEAT_SPELL
497
73f10d8124f4 updated for version 7.0136
vimboss
parents: 484
diff changeset
5040 if (spell_bad_len > 0)
73f10d8124f4 updated for version 7.0136
vimboss
parents: 484
diff changeset
5041 compl_col = curs_col - spell_bad_len;
73f10d8124f4 updated for version 7.0136
vimboss
parents: 484
diff changeset
5042 else
73f10d8124f4 updated for version 7.0136
vimboss
parents: 484
diff changeset
5043 compl_col = spell_word_start(startcol);
73f10d8124f4 updated for version 7.0136
vimboss
parents: 484
diff changeset
5044 if (compl_col >= (colnr_T)startcol)
897
2e1e9b708941 updated for version 7.0-023
vimboss
parents: 887
diff changeset
5045 {
2e1e9b708941 updated for version 7.0-023
vimboss
parents: 887
diff changeset
5046 compl_length = 0;
2e1e9b708941 updated for version 7.0-023
vimboss
parents: 887
diff changeset
5047 compl_col = curs_col;
2e1e9b708941 updated for version 7.0-023
vimboss
parents: 887
diff changeset
5048 }
2e1e9b708941 updated for version 7.0-023
vimboss
parents: 887
diff changeset
5049 else
2e1e9b708941 updated for version 7.0-023
vimboss
parents: 887
diff changeset
5050 {
2e1e9b708941 updated for version 7.0-023
vimboss
parents: 887
diff changeset
5051 spell_expand_check_cap(compl_col);
2e1e9b708941 updated for version 7.0-023
vimboss
parents: 887
diff changeset
5052 compl_length = (int)curs_col - compl_col;
2e1e9b708941 updated for version 7.0-023
vimboss
parents: 887
diff changeset
5053 }
818
1f929f3ca806 updated for version 7.0c03
vimboss
parents: 816
diff changeset
5054 /* Need to obtain "line" again, it may have become invalid. */
1f929f3ca806 updated for version 7.0c03
vimboss
parents: 816
diff changeset
5055 line = ml_get(curwin->w_cursor.lnum);
477
f8b75b8f1988 updated for version 7.0128
vimboss
parents: 474
diff changeset
5056 compl_pattern = vim_strnsave(line + compl_col, compl_length);
f8b75b8f1988 updated for version 7.0128
vimboss
parents: 474
diff changeset
5057 if (compl_pattern == NULL)
f8b75b8f1988 updated for version 7.0128
vimboss
parents: 474
diff changeset
5058 #endif
f8b75b8f1988 updated for version 7.0128
vimboss
parents: 474
diff changeset
5059 return FAIL;
f8b75b8f1988 updated for version 7.0128
vimboss
parents: 474
diff changeset
5060 }
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
5061 else
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
5062 {
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
5063 EMSG2(_(e_intern2), "ins_complete()");
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
5064 return FAIL;
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
5065 }
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
5066
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
5067 if (compl_cont_status & CONT_ADDING)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5068 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5069 edit_submode_pre = (char_u *)_(" Adding");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5070 if (ctrl_x_mode == CTRL_X_WHOLE_LINE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5071 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5072 /* Insert a new line, keep indentation but ignore 'comments' */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5073 #ifdef FEAT_COMMENTS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5074 char_u *old = curbuf->b_p_com;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5075
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5076 curbuf->b_p_com = (char_u *)"";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5077 #endif
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
5078 compl_startpos.lnum = curwin->w_cursor.lnum;
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
5079 compl_startpos.col = compl_col;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5080 ins_eol('\r');
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5081 #ifdef FEAT_COMMENTS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5082 curbuf->b_p_com = old;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5083 #endif
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
5084 compl_length = 0;
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
5085 compl_col = curwin->w_cursor.col;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5086 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5087 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5088 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5089 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5090 edit_submode_pre = NULL;
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
5091 compl_startpos.col = compl_col;
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
5092 }
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
5093
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
5094 if (compl_cont_status & CONT_LOCAL)
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
5095 edit_submode = (char_u *)_(ctrl_x_msgs[CTRL_X_LOCAL_MSG]);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5096 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5097 edit_submode = (char_u *)_(CTRL_X_MSG(ctrl_x_mode));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5098
694
07d199fe02ed updated for version 7.0209
vimboss
parents: 692
diff changeset
5099 /* Always add completion for the original text. */
07d199fe02ed updated for version 7.0209
vimboss
parents: 692
diff changeset
5100 vim_free(compl_orig_text);
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
5101 compl_orig_text = vim_strnsave(line + compl_col, compl_length);
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
5102 if (compl_orig_text == NULL || ins_compl_add(compl_orig_text,
942
29bf49bad20d updated for version 7.0-068
vimboss
parents: 941
diff changeset
5103 -1, p_ic, NULL, NULL, 0, ORIGINAL_TEXT, FALSE) != OK)
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
5104 {
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
5105 vim_free(compl_pattern);
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
5106 compl_pattern = NULL;
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
5107 vim_free(compl_orig_text);
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
5108 compl_orig_text = NULL;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5109 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5110 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5111
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5112 /* showmode might reset the internal line pointers, so it must
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5113 * be called before line = ml_get(), or when this address is no
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5114 * longer needed. -- Acevedo.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5115 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5116 edit_submode_extra = (char_u *)_("-- Searching...");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5117 edit_submode_highl = HLF_COUNT;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5118 showmode();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5119 edit_submode_extra = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5120 out_flush();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5121 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5122
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
5123 compl_shown_match = compl_curr_match;
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
5124 compl_shows_dir = compl_direction;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5125
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5126 /*
665
21ab9abf0f08 updated for version 7.0196
vimboss
parents: 661
diff changeset
5127 * Find next match (and following matches).
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5128 */
2107
4a4287c09953 updated for version 7.2.390
Bram Moolenaar <bram@zimbu.org>
parents: 2047
diff changeset
5129 save_w_wrow = curwin->w_wrow;
681
9364d114ed8d updated for version 7.0204
vimboss
parents: 677
diff changeset
5130 n = ins_compl_next(TRUE, ins_compl_key2count(c), ins_compl_use_match(c));
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
5131
540
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
5132 /* may undisplay the popup menu */
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
5133 ins_compl_upd_pum();
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
5134
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
5135 if (n > 1) /* all matches have been found */
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
5136 compl_matches = n;
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
5137 compl_curr_match = compl_shown_match;
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
5138 compl_direction = compl_shows_dir;
857
b933657f7c9d updated for version 7.0g01
vimboss
parents: 853
diff changeset
5139
b933657f7c9d updated for version 7.0g01
vimboss
parents: 853
diff changeset
5140 /* Eat the ESC that vgetc() returns after a CTRL-C to avoid leaving Insert
b933657f7c9d updated for version 7.0g01
vimboss
parents: 853
diff changeset
5141 * mode. */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5142 if (got_int && !global_busy)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5143 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5144 (void)vgetc();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5145 got_int = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5146 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5147
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
5148 /* we found no match if the list has only the "compl_orig_text"-entry */
464
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
5149 if (compl_first_match == compl_first_match->cp_next)
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
5150 {
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
5151 edit_submode_extra = (compl_cont_status & CONT_ADDING)
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
5152 && compl_length > 1
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5153 ? (char_u *)_(e_hitend) : (char_u *)_(e_patnotf);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5154 edit_submode_highl = HLF_E;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5155 /* remove N_ADDS flag, so next ^X<> won't try to go to ADDING mode,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5156 * because we couldn't expand anything at first place, but if we used
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5157 * ^P, ^N, ^X^I or ^X^D we might want to add-expand a single-char-word
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5158 * (such as M in M'exico) if not tried already. -- Acevedo */
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
5159 if ( compl_length > 1
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
5160 || (compl_cont_status & CONT_ADDING)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5161 || (ctrl_x_mode != 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5162 && ctrl_x_mode != CTRL_X_PATH_PATTERNS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5163 && ctrl_x_mode != CTRL_X_PATH_DEFINES))
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
5164 compl_cont_status &= ~CONT_N_ADDS;
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
5165 }
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
5166
464
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
5167 if (compl_curr_match->cp_flags & CONT_S_IPOS)
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
5168 compl_cont_status |= CONT_S_IPOS;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5169 else
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
5170 compl_cont_status &= ~CONT_S_IPOS;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5171
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5172 if (edit_submode_extra == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5173 {
464
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
5174 if (compl_curr_match->cp_flags & ORIGINAL_TEXT)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5175 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5176 edit_submode_extra = (char_u *)_("Back at original");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5177 edit_submode_highl = HLF_W;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5178 }
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
5179 else if (compl_cont_status & CONT_S_IPOS)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5180 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5181 edit_submode_extra = (char_u *)_("Word from other line");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5182 edit_submode_highl = HLF_COUNT;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5183 }
464
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
5184 else if (compl_curr_match->cp_next == compl_curr_match->cp_prev)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5185 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5186 edit_submode_extra = (char_u *)_("The only match");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5187 edit_submode_highl = HLF_COUNT;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5188 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5189 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5190 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5191 /* Update completion sequence number when needed. */
464
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
5192 if (compl_curr_match->cp_number == -1)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5193 {
464
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
5194 int number = 0;
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
5195 compl_T *match;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5196
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
5197 if (compl_direction == FORWARD)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5198 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5199 /* search backwards for the first valid (!= -1) number.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5200 * This should normally succeed already at the first loop
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5201 * cycle, so it's fast! */
464
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
5202 for (match = compl_curr_match->cp_prev; match != NULL
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
5203 && match != compl_first_match;
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
5204 match = match->cp_prev)
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
5205 if (match->cp_number != -1)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5206 {
464
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
5207 number = match->cp_number;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5208 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5209 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5210 if (match != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5211 /* go up and assign all numbers which are not assigned
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5212 * yet */
540
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
5213 for (match = match->cp_next;
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
5214 match != NULL && match->cp_number == -1;
464
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
5215 match = match->cp_next)
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
5216 match->cp_number = ++number;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5217 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5218 else /* BACKWARD */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5219 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5220 /* search forwards (upwards) for the first valid (!= -1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5221 * number. This should normally succeed already at the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5222 * first loop cycle, so it's fast! */
464
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
5223 for (match = compl_curr_match->cp_next; match != NULL
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
5224 && match != compl_first_match;
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
5225 match = match->cp_next)
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
5226 if (match->cp_number != -1)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5227 {
464
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
5228 number = match->cp_number;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5229 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5230 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5231 if (match != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5232 /* go down and assign all numbers which are not
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5233 * assigned yet */
464
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
5234 for (match = match->cp_prev; match
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
5235 && match->cp_number == -1;
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
5236 match = match->cp_prev)
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
5237 match->cp_number = ++number;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5238 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5239 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5240
540
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
5241 /* The match should always have a sequence number now, this is
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
5242 * just a safety check. */
464
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
5243 if (compl_curr_match->cp_number != -1)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5244 {
1063
d763e7d7e938 updated for version 7.0-189
vimboss
parents: 1032
diff changeset
5245 /* Space for 10 text chars. + 2x10-digit no.s = 31.
d763e7d7e938 updated for version 7.0-189
vimboss
parents: 1032
diff changeset
5246 * Translations may need more than twice that. */
d763e7d7e938 updated for version 7.0-189
vimboss
parents: 1032
diff changeset
5247 static char_u match_ref[81];
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5248
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
5249 if (compl_matches > 0)
1063
d763e7d7e938 updated for version 7.0-189
vimboss
parents: 1032
diff changeset
5250 vim_snprintf((char *)match_ref, sizeof(match_ref),
d763e7d7e938 updated for version 7.0-189
vimboss
parents: 1032
diff changeset
5251 _("match %d of %d"),
464
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
5252 compl_curr_match->cp_number, compl_matches);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5253 else
1063
d763e7d7e938 updated for version 7.0-189
vimboss
parents: 1032
diff changeset
5254 vim_snprintf((char *)match_ref, sizeof(match_ref),
d763e7d7e938 updated for version 7.0-189
vimboss
parents: 1032
diff changeset
5255 _("match %d"),
d763e7d7e938 updated for version 7.0-189
vimboss
parents: 1032
diff changeset
5256 compl_curr_match->cp_number);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5257 edit_submode_extra = match_ref;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5258 edit_submode_highl = HLF_R;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5259 if (dollar_vcol)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5260 curs_columns(FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5261 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5262 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5263 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5264
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5265 /* Show a message about what (completion) mode we're in. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5266 showmode();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5267 if (edit_submode_extra != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5268 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5269 if (!p_smd)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5270 msg_attr(edit_submode_extra,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5271 edit_submode_highl < HLF_COUNT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5272 ? hl_attr(edit_submode_highl) : 0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5273 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5274 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5275 msg_clr_cmdline(); /* necessary for "noshowmode" */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5276
857
b933657f7c9d updated for version 7.0g01
vimboss
parents: 853
diff changeset
5277 /* Show the popup menu, unless we got interrupted. */
b933657f7c9d updated for version 7.0g01
vimboss
parents: 853
diff changeset
5278 if (!compl_interrupted)
b933657f7c9d updated for version 7.0g01
vimboss
parents: 853
diff changeset
5279 {
b933657f7c9d updated for version 7.0g01
vimboss
parents: 853
diff changeset
5280 /* RedrawingDisabled may be set when invoked through complete(). */
b933657f7c9d updated for version 7.0g01
vimboss
parents: 853
diff changeset
5281 n = RedrawingDisabled;
b933657f7c9d updated for version 7.0g01
vimboss
parents: 853
diff changeset
5282 RedrawingDisabled = 0;
2107
4a4287c09953 updated for version 7.2.390
Bram Moolenaar <bram@zimbu.org>
parents: 2047
diff changeset
5283
4a4287c09953 updated for version 7.2.390
Bram Moolenaar <bram@zimbu.org>
parents: 2047
diff changeset
5284 /* If the cursor moved we need to remove the pum first. */
4a4287c09953 updated for version 7.2.390
Bram Moolenaar <bram@zimbu.org>
parents: 2047
diff changeset
5285 setcursor();
4a4287c09953 updated for version 7.2.390
Bram Moolenaar <bram@zimbu.org>
parents: 2047
diff changeset
5286 if (save_w_wrow != curwin->w_wrow)
4a4287c09953 updated for version 7.2.390
Bram Moolenaar <bram@zimbu.org>
parents: 2047
diff changeset
5287 ins_compl_del_pum();
4a4287c09953 updated for version 7.2.390
Bram Moolenaar <bram@zimbu.org>
parents: 2047
diff changeset
5288
857
b933657f7c9d updated for version 7.0g01
vimboss
parents: 853
diff changeset
5289 ins_compl_show_pum();
b933657f7c9d updated for version 7.0g01
vimboss
parents: 853
diff changeset
5290 setcursor();
b933657f7c9d updated for version 7.0g01
vimboss
parents: 853
diff changeset
5291 RedrawingDisabled = n;
b933657f7c9d updated for version 7.0g01
vimboss
parents: 853
diff changeset
5292 }
874
4bac29d27e2f updated for version 7.0
vimboss
parents: 867
diff changeset
5293 compl_was_interrupted = compl_interrupted;
857
b933657f7c9d updated for version 7.0g01
vimboss
parents: 853
diff changeset
5294 compl_interrupted = FALSE;
540
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 537
diff changeset
5295
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5296 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5297 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5298
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5299 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5300 * Looks in the first "len" chars. of "src" for search-metachars.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5301 * If dest is not NULL the chars. are copied there quoting (with
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5302 * a backslash) the metachars, and dest would be NUL terminated.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5303 * Returns the length (needed) of dest
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5304 */
1872
f13849167330 updated for version 7.2-169
vimboss
parents: 1869
diff changeset
5305 static unsigned
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5306 quote_meta(dest, src, len)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5307 char_u *dest;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5308 char_u *src;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5309 int len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5310 {
1872
f13849167330 updated for version 7.2-169
vimboss
parents: 1869
diff changeset
5311 unsigned m = (unsigned)len + 1; /* one extra for the NUL */
f13849167330 updated for version 7.2-169
vimboss
parents: 1869
diff changeset
5312
f13849167330 updated for version 7.2-169
vimboss
parents: 1869
diff changeset
5313 for ( ; --len >= 0; src++)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5314 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5315 switch (*src)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5316 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5317 case '.':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5318 case '*':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5319 case '[':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5320 if (ctrl_x_mode == CTRL_X_DICTIONARY
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5321 || ctrl_x_mode == CTRL_X_THESAURUS)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5322 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5323 case '~':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5324 if (!p_magic) /* quote these only if magic is set */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5325 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5326 case '\\':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5327 if (ctrl_x_mode == CTRL_X_DICTIONARY
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5328 || ctrl_x_mode == CTRL_X_THESAURUS)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5329 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5330 case '^': /* currently it's not needed. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5331 case '$':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5332 m++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5333 if (dest != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5334 *dest++ = '\\';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5335 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5336 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5337 if (dest != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5338 *dest++ = *src;
464
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
5339 # ifdef FEAT_MBYTE
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5340 /* Copy remaining bytes of a multibyte character. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5341 if (has_mbyte)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5342 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5343 int i, mb_len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5344
474
a5fcf36ef512 updated for version 7.0127
vimboss
parents: 470
diff changeset
5345 mb_len = (*mb_ptr2len)(src) - 1;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5346 if (mb_len > 0 && len >= mb_len)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5347 for (i = 0; i < mb_len; ++i)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5348 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5349 --len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5350 ++src;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5351 if (dest != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5352 *dest++ = *src;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5353 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5354 }
464
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 452
diff changeset
5355 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5356 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5357 if (dest != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5358 *dest = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5359
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5360 return m;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5361 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5362 #endif /* FEAT_INS_EXPAND */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5363
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5364 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5365 * Next character is interpreted literally.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5366 * A one, two or three digit decimal number is interpreted as its byte value.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5367 * If one or two digits are entered, the next character is given to vungetc().
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5368 * For Unicode a character > 255 may be returned.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5369 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5370 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5371 get_literal()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5372 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5373 int cc;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5374 int nc;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5375 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5376 int hex = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5377 int octal = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5378 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5379 int unicode = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5380 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5381
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5382 if (got_int)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5383 return Ctrl_C;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5384
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5385 #ifdef FEAT_GUI
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5386 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5387 * In GUI there is no point inserting the internal code for a special key.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5388 * It is more useful to insert the string "<KEY>" instead. This would
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5389 * probably be useful in a text window too, but it would not be
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5390 * vi-compatible (maybe there should be an option for it?) -- webb
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5391 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5392 if (gui.in_use)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5393 ++allow_keys;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5394 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5395 #ifdef USE_ON_FLY_SCROLL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5396 dont_scroll = TRUE; /* disallow scrolling here */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5397 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5398 ++no_mapping; /* don't map the next key hits */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5399 cc = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5400 i = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5401 for (;;)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5402 {
1389
bdcfe793d49f updated for version 7.1-104
vimboss
parents: 1353
diff changeset
5403 nc = plain_vgetc();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5404 #ifdef FEAT_CMDL_INFO
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5405 if (!(State & CMDLINE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5406 # ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5407 && MB_BYTE2LEN_CHECK(nc) == 1
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5408 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5409 )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5410 add_to_showcmd(nc);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5411 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5412 if (nc == 'x' || nc == 'X')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5413 hex = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5414 else if (nc == 'o' || nc == 'O')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5415 octal = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5416 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5417 else if (nc == 'u' || nc == 'U')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5418 unicode = nc;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5419 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5420 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5421 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5422 if (hex
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5423 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5424 || unicode != 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5425 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5426 )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5427 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5428 if (!vim_isxdigit(nc))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5429 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5430 cc = cc * 16 + hex2nr(nc);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5431 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5432 else if (octal)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5433 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5434 if (nc < '0' || nc > '7')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5435 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5436 cc = cc * 8 + nc - '0';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5437 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5438 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5439 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5440 if (!VIM_ISDIGIT(nc))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5441 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5442 cc = cc * 10 + nc - '0';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5443 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5444
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5445 ++i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5446 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5447
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5448 if (cc > 255
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5449 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5450 && unicode == 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5451 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5452 )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5453 cc = 255; /* limit range to 0-255 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5454 nc = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5455
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5456 if (hex) /* hex: up to two chars */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5457 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5458 if (i >= 2)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5459 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5460 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5461 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5462 else if (unicode) /* Unicode: up to four or eight chars */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5463 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5464 if ((unicode == 'u' && i >= 4) || (unicode == 'U' && i >= 8))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5465 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5466 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5467 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5468 else if (i >= 3) /* decimal or octal: up to three chars */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5469 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5470 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5471 if (i == 0) /* no number entered */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5472 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5473 if (nc == K_ZERO) /* NUL is stored as NL */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5474 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5475 cc = '\n';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5476 nc = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5477 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5478 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5479 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5480 cc = nc;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5481 nc = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5482 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5483 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5484
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5485 if (cc == 0) /* NUL is stored as NL */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5486 cc = '\n';
221
7fd4b5df33be updated for version 7.0062
vimboss
parents: 180
diff changeset
5487 #ifdef FEAT_MBYTE
7fd4b5df33be updated for version 7.0062
vimboss
parents: 180
diff changeset
5488 if (enc_dbcs && (cc & 0xff) == 0)
7fd4b5df33be updated for version 7.0062
vimboss
parents: 180
diff changeset
5489 cc = '?'; /* don't accept an illegal DBCS char, the NUL in the
7fd4b5df33be updated for version 7.0062
vimboss
parents: 180
diff changeset
5490 second byte will cause trouble! */
7fd4b5df33be updated for version 7.0062
vimboss
parents: 180
diff changeset
5491 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5492
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5493 --no_mapping;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5494 #ifdef FEAT_GUI
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5495 if (gui.in_use)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5496 --allow_keys;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5497 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5498 if (nc)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5499 vungetc(nc);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5500 got_int = FALSE; /* CTRL-C typed after CTRL-V is not an interrupt */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5501 return cc;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5502 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5503
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5504 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5505 * Insert character, taking care of special keys and mod_mask
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5506 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5507 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5508 insert_special(c, allow_modmask, ctrlv)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5509 int c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5510 int allow_modmask;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5511 int ctrlv; /* c was typed after CTRL-V */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5512 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5513 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5514 int len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5515
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5516 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5517 * Special function key, translate into "<Key>". Up to the last '>' is
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5518 * inserted with ins_str(), so as not to replace characters in replace
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5519 * mode.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5520 * Only use mod_mask for special keys, to avoid things like <S-Space>,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5521 * unless 'allow_modmask' is TRUE.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5522 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5523 #ifdef MACOS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5524 /* Command-key never produces a normal key */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5525 if (mod_mask & MOD_MASK_CMD)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5526 allow_modmask = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5527 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5528 if (IS_SPECIAL(c) || (mod_mask && allow_modmask))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5529 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5530 p = get_special_key_name(c, mod_mask);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5531 len = (int)STRLEN(p);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5532 c = p[len - 1];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5533 if (len > 2)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5534 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5535 if (stop_arrow() == FAIL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5536 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5537 p[len - 1] = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5538 ins_str(p);
620
9e359e5759f6 updated for version 7.0177
vimboss
parents: 615
diff changeset
5539 AppendToRedobuffLit(p, -1);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5540 ctrlv = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5541 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5542 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5543 if (stop_arrow() == OK)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5544 insertchar(c, ctrlv ? INSCHAR_CTRLV : 0, -1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5545 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5546
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5547 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5548 * Special characters in this context are those that need processing other
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5549 * than the simple insertion that can be performed here. This includes ESC
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5550 * which terminates the insert, and CR/NL which need special processing to
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5551 * open up a new line. This routine tries to optimize insertions performed by
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5552 * the "redo", "undo" or "put" commands, so it needs to know when it should
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5553 * stop and defer processing to the "normal" mechanism.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5554 * '0' and '^' are special, because they can be followed by CTRL-D.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5555 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5556 #ifdef EBCDIC
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5557 # define ISSPECIAL(c) ((c) < ' ' || (c) == '0' || (c) == '^')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5558 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5559 # define ISSPECIAL(c) ((c) < ' ' || (c) >= DEL || (c) == '0' || (c) == '^')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5560 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5561
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5562 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5563 # define WHITECHAR(cc) (vim_iswhite(cc) && (!enc_utf8 || !utf_iscomposing(utf_ptr2char(ml_get_cursor() + 1))))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5564 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5565 # define WHITECHAR(cc) vim_iswhite(cc)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5566 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5567
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5568 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5569 insertchar(c, flags, second_indent)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5570 int c; /* character to insert or NUL */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5571 int flags; /* INSCHAR_FORMAT, etc. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5572 int second_indent; /* indent for second line if >= 0 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5573 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5574 int textwidth;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5575 #ifdef FEAT_COMMENTS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5576 char_u *p;
667
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5577 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5578 int fo_ins_blank;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5579
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5580 textwidth = comp_textwidth(flags & INSCHAR_FORMAT);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5581 fo_ins_blank = has_format_option(FO_INS_BLANK);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5582
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5583 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5584 * Try to break the line in two or more pieces when:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5585 * - Always do this if we have been called to do formatting only.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5586 * - Always do this when 'formatoptions' has the 'a' flag and the line
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5587 * ends in white space.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5588 * - Otherwise:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5589 * - Don't do this if inserting a blank
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5590 * - Don't do this if an existing character is being replaced, unless
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5591 * we're in VREPLACE mode.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5592 * - Do this if the cursor is not on the line where insert started
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5593 * or - 'formatoptions' doesn't have 'l' or the line was not too long
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5594 * before the insert.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5595 * - 'formatoptions' doesn't have 'b' or a blank was inserted at or
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5596 * before 'textwidth'
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5597 */
667
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5598 if (textwidth > 0
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5599 && ((flags & INSCHAR_FORMAT)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5600 || (!vim_iswhite(c)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5601 && !((State & REPLACE_FLAG)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5602 #ifdef FEAT_VREPLACE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5603 && !(State & VREPLACE_FLAG)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5604 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5605 && *ml_get_cursor() != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5606 && (curwin->w_cursor.lnum != Insstart.lnum
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5607 || ((!has_format_option(FO_INS_LONG)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5608 || Insstart_textlen <= (colnr_T)textwidth)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5609 && (!fo_ins_blank
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5610 || Insstart_blank_vcol <= (colnr_T)textwidth
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5611 ))))))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5612 {
667
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5613 /* Format with 'formatexpr' when it's set. Use internal formatting
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5614 * when 'formatexpr' isn't set or it returns non-zero. */
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5615 #if defined(FEAT_EVAL)
1000
cb49fa8c7196 updated for version 7.0-126
vimboss
parents: 993
diff changeset
5616 int do_internal = TRUE;
cb49fa8c7196 updated for version 7.0-126
vimboss
parents: 993
diff changeset
5617
1563
ed7fefbef738 updated for version 7.1-276
vimboss
parents: 1526
diff changeset
5618 if (*curbuf->b_p_fex != NUL && (flags & INSCHAR_NO_FEX) == 0)
1000
cb49fa8c7196 updated for version 7.0-126
vimboss
parents: 993
diff changeset
5619 {
cb49fa8c7196 updated for version 7.0-126
vimboss
parents: 993
diff changeset
5620 do_internal = (fex_format(curwin->w_cursor.lnum, 1L, c) != 0);
cb49fa8c7196 updated for version 7.0-126
vimboss
parents: 993
diff changeset
5621 /* It may be required to save for undo again, e.g. when setline()
cb49fa8c7196 updated for version 7.0-126
vimboss
parents: 993
diff changeset
5622 * was called. */
cb49fa8c7196 updated for version 7.0-126
vimboss
parents: 993
diff changeset
5623 ins_need_undo = TRUE;
cb49fa8c7196 updated for version 7.0-126
vimboss
parents: 993
diff changeset
5624 }
cb49fa8c7196 updated for version 7.0-126
vimboss
parents: 993
diff changeset
5625 if (do_internal)
667
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5626 #endif
2004
9e554211caf5 updated for version 7.2-301
vimboss
parents: 1988
diff changeset
5627 internal_format(textwidth, second_indent, flags, c == NUL, c);
667
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5628 }
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5629
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5630 if (c == NUL) /* only formatting was wanted */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5631 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5632
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5633 #ifdef FEAT_COMMENTS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5634 /* Check whether this character should end a comment. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5635 if (did_ai && (int)c == end_comment_pending)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5636 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5637 char_u *line;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5638 char_u lead_end[COM_MAX_LEN]; /* end-comment string */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5639 int middle_len, end_len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5640 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5641
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5642 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5643 * Need to remove existing (middle) comment leader and insert end
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5644 * comment leader. First, check what comment leader we can find.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5645 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5646 i = get_leader_len(line = ml_get_curline(), &p, FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5647 if (i > 0 && vim_strchr(p, COM_MIDDLE) != NULL) /* Just checking */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5648 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5649 /* Skip middle-comment string */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5650 while (*p && p[-1] != ':') /* find end of middle flags */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5651 ++p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5652 middle_len = copy_option_part(&p, lead_end, COM_MAX_LEN, ",");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5653 /* Don't count trailing white space for middle_len */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5654 while (middle_len > 0 && vim_iswhite(lead_end[middle_len - 1]))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5655 --middle_len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5656
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5657 /* Find the end-comment string */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5658 while (*p && p[-1] != ':') /* find end of end flags */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5659 ++p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5660 end_len = copy_option_part(&p, lead_end, COM_MAX_LEN, ",");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5661
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5662 /* Skip white space before the cursor */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5663 i = curwin->w_cursor.col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5664 while (--i >= 0 && vim_iswhite(line[i]))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5665 ;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5666 i++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5667
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5668 /* Skip to before the middle leader */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5669 i -= middle_len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5670
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5671 /* Check some expected things before we go on */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5672 if (i >= 0 && lead_end[end_len - 1] == end_comment_pending)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5673 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5674 /* Backspace over all the stuff we want to replace */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5675 backspace_until_column(i);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5676
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5677 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5678 * Insert the end-comment string, except for the last
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5679 * character, which will get inserted as normal later.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5680 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5681 ins_bytes_len(lead_end, end_len - 1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5682 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5683 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5684 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5685 end_comment_pending = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5686 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5687
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5688 did_ai = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5689 #ifdef FEAT_SMARTINDENT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5690 did_si = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5691 can_si = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5692 can_si_back = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5693 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5694
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5695 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5696 * If there's any pending input, grab up to INPUT_BUFLEN at once.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5697 * This speeds up normal text input considerably.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5698 * Don't do this when 'cindent' or 'indentexpr' is set, because we might
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5699 * need to re-indent at a ':', or any other character (but not what
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5700 * 'paste' is set)..
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5701 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5702 #ifdef USE_ON_FLY_SCROLL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5703 dont_scroll = FALSE; /* allow scrolling here */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5704 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5705
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5706 if ( !ISSPECIAL(c)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5707 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5708 && (!has_mbyte || (*mb_char2len)(c) == 1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5709 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5710 && vpeekc() != NUL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5711 && !(State & REPLACE_FLAG)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5712 #ifdef FEAT_CINDENT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5713 && !cindent_on()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5714 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5715 #ifdef FEAT_RIGHTLEFT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5716 && !p_ri
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5717 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5718 )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5719 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5720 #define INPUT_BUFLEN 100
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5721 char_u buf[INPUT_BUFLEN + 1];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5722 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5723 colnr_T virtcol = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5724
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5725 buf[0] = c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5726 i = 1;
667
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5727 if (textwidth > 0)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5728 virtcol = get_nolist_virtcol();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5729 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5730 * Stop the string when:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5731 * - no more chars available
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5732 * - finding a special character (command key)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5733 * - buffer is full
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5734 * - running into the 'textwidth' boundary
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5735 * - need to check for abbreviation: A non-word char after a word-char
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5736 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5737 while ( (c = vpeekc()) != NUL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5738 && !ISSPECIAL(c)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5739 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5740 && (!has_mbyte || MB_BYTE2LEN_CHECK(c) == 1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5741 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5742 && i < INPUT_BUFLEN
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5743 && (textwidth == 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5744 || (virtcol += byte2cells(buf[i - 1])) < (colnr_T)textwidth)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5745 && !(!no_abbr && !vim_iswordc(c) && vim_iswordc(buf[i - 1])))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5746 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5747 #ifdef FEAT_RIGHTLEFT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5748 c = vgetc();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5749 if (p_hkmap && KeyTyped)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5750 c = hkmap(c); /* Hebrew mode mapping */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5751 # ifdef FEAT_FKMAP
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5752 if (p_fkmap && KeyTyped)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5753 c = fkmap(c); /* Farsi mode mapping */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5754 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5755 buf[i++] = c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5756 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5757 buf[i++] = vgetc();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5758 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5759 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5760
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5761 #ifdef FEAT_DIGRAPHS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5762 do_digraph(-1); /* clear digraphs */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5763 do_digraph(buf[i-1]); /* may be the start of a digraph */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5764 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5765 buf[i] = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5766 ins_str(buf);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5767 if (flags & INSCHAR_CTRLV)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5768 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5769 redo_literal(*buf);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5770 i = 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5771 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5772 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5773 i = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5774 if (buf[i] != NUL)
620
9e359e5759f6 updated for version 7.0177
vimboss
parents: 615
diff changeset
5775 AppendToRedobuffLit(buf + i, -1);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5776 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5777 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5778 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5779 #ifdef FEAT_MBYTE
667
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5780 int cc;
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5781
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5782 if (has_mbyte && (cc = (*mb_char2len)(c)) > 1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5783 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5784 char_u buf[MB_MAXBYTES + 1];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5785
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5786 (*mb_char2bytes)(c, buf);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5787 buf[cc] = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5788 ins_char_bytes(buf, cc);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5789 AppendCharToRedobuff(c);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5790 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5791 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5792 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5793 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5794 ins_char(c);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5795 if (flags & INSCHAR_CTRLV)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5796 redo_literal(c);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5797 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5798 AppendCharToRedobuff(c);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5799 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5800 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5801 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5802
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5803 /*
667
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5804 * Format text at the current insert position.
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5805 */
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5806 static void
2004
9e554211caf5 updated for version 7.2-301
vimboss
parents: 1988
diff changeset
5807 internal_format(textwidth, second_indent, flags, format_only, c)
667
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5808 int textwidth;
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5809 int second_indent;
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5810 int flags;
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5811 int format_only;
2004
9e554211caf5 updated for version 7.2-301
vimboss
parents: 1988
diff changeset
5812 int c; /* character to be inserted (can be NUL) */
667
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5813 {
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5814 int cc;
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5815 int save_char = NUL;
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5816 int haveto_redraw = FALSE;
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5817 int fo_ins_blank = has_format_option(FO_INS_BLANK);
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5818 #ifdef FEAT_MBYTE
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5819 int fo_multibyte = has_format_option(FO_MBYTE_BREAK);
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5820 #endif
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5821 int fo_white_par = has_format_option(FO_WHITE_PAR);
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5822 int first_line = TRUE;
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5823 #ifdef FEAT_COMMENTS
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5824 colnr_T leader_len;
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5825 int no_leader = FALSE;
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5826 int do_comments = (flags & INSCHAR_DO_COM);
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5827 #endif
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5828
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5829 /*
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5830 * When 'ai' is off we don't want a space under the cursor to be
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5831 * deleted. Replace it with an 'x' temporarily.
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5832 */
2004
9e554211caf5 updated for version 7.2-301
vimboss
parents: 1988
diff changeset
5833 if (!curbuf->b_p_ai
9e554211caf5 updated for version 7.2-301
vimboss
parents: 1988
diff changeset
5834 #ifdef FEAT_VREPLACE
9e554211caf5 updated for version 7.2-301
vimboss
parents: 1988
diff changeset
5835 && !(State & VREPLACE_FLAG)
9e554211caf5 updated for version 7.2-301
vimboss
parents: 1988
diff changeset
5836 #endif
9e554211caf5 updated for version 7.2-301
vimboss
parents: 1988
diff changeset
5837 )
667
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5838 {
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5839 cc = gchar_cursor();
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5840 if (vim_iswhite(cc))
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5841 {
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5842 save_char = cc;
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5843 pchar_cursor('x');
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5844 }
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5845 }
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5846
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5847 /*
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5848 * Repeat breaking lines, until the current line is not too long.
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5849 */
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5850 while (!got_int)
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5851 {
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5852 int startcol; /* Cursor column at entry */
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5853 int wantcol; /* column at textwidth border */
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5854 int foundcol; /* column for start of spaces */
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5855 int end_foundcol = 0; /* column for start of word */
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5856 colnr_T len;
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5857 colnr_T virtcol;
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5858 #ifdef FEAT_VREPLACE
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5859 int orig_col = 0;
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5860 char_u *saved_text = NULL;
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5861 #endif
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5862 colnr_T col;
2004
9e554211caf5 updated for version 7.2-301
vimboss
parents: 1988
diff changeset
5863 colnr_T end_col;
9e554211caf5 updated for version 7.2-301
vimboss
parents: 1988
diff changeset
5864
9e554211caf5 updated for version 7.2-301
vimboss
parents: 1988
diff changeset
5865 virtcol = get_nolist_virtcol()
9e554211caf5 updated for version 7.2-301
vimboss
parents: 1988
diff changeset
5866 + char2cells(c != NUL ? c : gchar_cursor());
9e554211caf5 updated for version 7.2-301
vimboss
parents: 1988
diff changeset
5867 if (virtcol <= (colnr_T)textwidth)
667
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5868 break;
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5869
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5870 #ifdef FEAT_COMMENTS
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5871 if (no_leader)
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5872 do_comments = FALSE;
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5873 else if (!(flags & INSCHAR_FORMAT)
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5874 && has_format_option(FO_WRAP_COMS))
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5875 do_comments = TRUE;
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5876
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5877 /* Don't break until after the comment leader */
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5878 if (do_comments)
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5879 leader_len = get_leader_len(ml_get_curline(), NULL, FALSE);
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5880 else
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5881 leader_len = 0;
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5882
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5883 /* If the line doesn't start with a comment leader, then don't
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5884 * start one in a following broken line. Avoids that a %word
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5885 * moved to the start of the next line causes all following lines
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5886 * to start with %. */
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5887 if (leader_len == 0)
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5888 no_leader = TRUE;
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5889 #endif
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5890 if (!(flags & INSCHAR_FORMAT)
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5891 #ifdef FEAT_COMMENTS
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5892 && leader_len == 0
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5893 #endif
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5894 && !has_format_option(FO_WRAP))
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5895
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5896 break;
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5897 if ((startcol = curwin->w_cursor.col) == 0)
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5898 break;
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5899
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5900 /* find column of textwidth border */
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5901 coladvance((colnr_T)textwidth);
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5902 wantcol = curwin->w_cursor.col;
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5903
2004
9e554211caf5 updated for version 7.2-301
vimboss
parents: 1988
diff changeset
5904 curwin->w_cursor.col = startcol;
667
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5905 foundcol = 0;
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5906
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5907 /*
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5908 * Find position to break at.
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5909 * Stop at first entered white when 'formatoptions' has 'v'
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5910 */
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5911 while ((!fo_ins_blank && !has_format_option(FO_INS_VI))
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5912 || curwin->w_cursor.lnum != Insstart.lnum
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5913 || curwin->w_cursor.col >= Insstart.col)
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5914 {
2004
9e554211caf5 updated for version 7.2-301
vimboss
parents: 1988
diff changeset
5915 if (curwin->w_cursor.col == startcol && c != NUL)
9e554211caf5 updated for version 7.2-301
vimboss
parents: 1988
diff changeset
5916 cc = c;
9e554211caf5 updated for version 7.2-301
vimboss
parents: 1988
diff changeset
5917 else
9e554211caf5 updated for version 7.2-301
vimboss
parents: 1988
diff changeset
5918 cc = gchar_cursor();
667
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5919 if (WHITECHAR(cc))
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5920 {
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5921 /* remember position of blank just before text */
2004
9e554211caf5 updated for version 7.2-301
vimboss
parents: 1988
diff changeset
5922 end_col = curwin->w_cursor.col;
667
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5923
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5924 /* find start of sequence of blanks */
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5925 while (curwin->w_cursor.col > 0 && WHITECHAR(cc))
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5926 {
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5927 dec_cursor();
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5928 cc = gchar_cursor();
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5929 }
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5930 if (curwin->w_cursor.col == 0 && WHITECHAR(cc))
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5931 break; /* only spaces in front of text */
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5932 #ifdef FEAT_COMMENTS
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5933 /* Don't break until after the comment leader */
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5934 if (curwin->w_cursor.col < leader_len)
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5935 break;
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5936 #endif
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5937 if (has_format_option(FO_ONE_LETTER))
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5938 {
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5939 /* do not break after one-letter words */
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5940 if (curwin->w_cursor.col == 0)
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5941 break; /* one-letter word at begin */
2004
9e554211caf5 updated for version 7.2-301
vimboss
parents: 1988
diff changeset
5942 #ifdef FEAT_COMMENTS
9e554211caf5 updated for version 7.2-301
vimboss
parents: 1988
diff changeset
5943 /* do not break "#a b" when 'tw' is 2 */
9e554211caf5 updated for version 7.2-301
vimboss
parents: 1988
diff changeset
5944 if (curwin->w_cursor.col <= leader_len)
9e554211caf5 updated for version 7.2-301
vimboss
parents: 1988
diff changeset
5945 break;
9e554211caf5 updated for version 7.2-301
vimboss
parents: 1988
diff changeset
5946 #endif
667
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5947 col = curwin->w_cursor.col;
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5948 dec_cursor();
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5949 cc = gchar_cursor();
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5950
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5951 if (WHITECHAR(cc))
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5952 continue; /* one-letter, continue */
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5953 curwin->w_cursor.col = col;
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5954 }
2004
9e554211caf5 updated for version 7.2-301
vimboss
parents: 1988
diff changeset
5955
9e554211caf5 updated for version 7.2-301
vimboss
parents: 1988
diff changeset
5956 inc_cursor();
9e554211caf5 updated for version 7.2-301
vimboss
parents: 1988
diff changeset
5957
9e554211caf5 updated for version 7.2-301
vimboss
parents: 1988
diff changeset
5958 end_foundcol = end_col + 1;
9e554211caf5 updated for version 7.2-301
vimboss
parents: 1988
diff changeset
5959 foundcol = curwin->w_cursor.col;
9e554211caf5 updated for version 7.2-301
vimboss
parents: 1988
diff changeset
5960 if (curwin->w_cursor.col <= (colnr_T)wantcol)
667
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5961 break;
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5962 }
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5963 #ifdef FEAT_MBYTE
2004
9e554211caf5 updated for version 7.2-301
vimboss
parents: 1988
diff changeset
5964 else if (cc >= 0x100 && fo_multibyte)
667
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5965 {
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
5966 /* Break after or before a multi-byte character. */
2004
9e554211caf5 updated for version 7.2-301
vimboss
parents: 1988
diff changeset
5967 if (curwin->w_cursor.col != startcol)
9e554211caf5 updated for version 7.2-301
vimboss
parents: 1988
diff changeset
5968 {
9e554211caf5 updated for version 7.2-301
vimboss
parents: 1988
diff changeset
5969 #ifdef FEAT_COMMENTS
9e554211caf5 updated for version 7.2-301
vimboss
parents: 1988
diff changeset
5970 /* Don't break until after the comment leader */
9e554211caf5 updated for version 7.2-301
vimboss
parents: 1988
diff changeset
5971 if (curwin->w_cursor.col < leader_len)
9e554211caf5 updated for version 7.2-301
vimboss
parents: 1988
diff changeset
5972 break;
9e554211caf5 updated for version 7.2-301
vimboss
parents: 1988
diff changeset
5973 #endif
9e554211caf5 updated for version 7.2-301
vimboss
parents: 1988
diff changeset
5974 col = curwin->w_cursor.col;
9e554211caf5 updated for version 7.2-301
vimboss
parents: 1988
diff changeset
5975 inc_cursor();
9e554211caf5 updated for version 7.2-301
vimboss
parents: 1988
diff changeset
5976 /* Don't change end_foundcol if already set. */
9e554211caf5 updated for version 7.2-301
vimboss
parents: 1988
diff changeset
5977 if (foundcol != curwin->w_cursor.col)
9e554211caf5 updated for version 7.2-301
vimboss
parents: 1988
diff changeset
5978 {
9e554211caf5 updated for version 7.2-301
vimboss
parents: 1988
diff changeset
5979 foundcol = curwin->w_cursor.col;
9e554211caf5 updated for version 7.2-301
vimboss
parents: 1988
diff changeset
5980 end_foundcol = foundcol;
9e554211caf5 updated for version 7.2-301
vimboss
parents: 1988
diff changeset
5981 if (curwin->w_cursor.col <= (colnr_T)wantcol)
9e554211caf5 updated for version 7.2-301
vimboss
parents: 1988
diff changeset
5982 break;
9e554211caf5 updated for version 7.2-301
vimboss
parents: 1988
diff changeset
5983 }
9e554211caf5 updated for version 7.2-301
vimboss
parents: 1988
diff changeset
5984 curwin->w_cursor.col = col;
9e554211caf5 updated for version 7.2-301
vimboss
parents: 1988
diff changeset
5985 }
9e554211caf5 updated for version 7.2-301
vimboss
parents: 1988
diff changeset
5986
9e554211caf5 updated for version 7.2-301
vimboss
parents: 1988
diff changeset
5987 if (curwin->w_cursor.col == 0)
9e554211caf5 updated for version 7.2-301
vimboss
parents: 1988
diff changeset
5988 break;
9e554211caf5 updated for version 7.2-301
vimboss
parents: 1988
diff changeset
5989
9e554211caf5 updated for version 7.2-301
vimboss
parents: 1988
diff changeset
5990 col = curwin->w_cursor.col;
9e554211caf5 updated for version 7.2-301
vimboss
parents: 1988
diff changeset
5991
9e554211caf5 updated for version 7.2-301
vimboss
parents: 1988
diff changeset
5992 dec_cursor();
9e554211caf5 updated for version 7.2-301
vimboss
parents: 1988
diff changeset
5993 cc = gchar_cursor();
9e554211caf5 updated for version 7.2-301
vimboss
parents: 1988
diff changeset
5994
9e554211caf5 updated for version 7.2-301
vimboss
parents: 1988
diff changeset
5995 if (WHITECHAR(cc))
9e554211caf5 updated for version 7.2-301
vimboss
parents: 1988
diff changeset
5996 continue; /* break with space */
9e554211caf5 updated for version 7.2-301
vimboss
parents: 1988
diff changeset
5997 #ifdef FEAT_COMMENTS
9e554211caf5 updated for version 7.2-301
vimboss
parents: 1988
diff changeset
5998 /* Don't break until after the comment leader */
9e554211caf5 updated for version 7.2-301
vimboss
parents: 1988
diff changeset
5999 if (curwin->w_cursor.col < leader_len)
9e554211caf5 updated for version 7.2-301
vimboss
parents: 1988
diff changeset
6000 break;
9e554211caf5 updated for version 7.2-301
vimboss
parents: 1988
diff changeset
6001 #endif
9e554211caf5 updated for version 7.2-301
vimboss
parents: 1988
diff changeset
6002
9e554211caf5 updated for version 7.2-301
vimboss
parents: 1988
diff changeset
6003 curwin->w_cursor.col = col;
9e554211caf5 updated for version 7.2-301
vimboss
parents: 1988
diff changeset
6004
667
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6005 foundcol = curwin->w_cursor.col;
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6006 end_foundcol = foundcol;
2004
9e554211caf5 updated for version 7.2-301
vimboss
parents: 1988
diff changeset
6007 if (curwin->w_cursor.col <= (colnr_T)wantcol)
9e554211caf5 updated for version 7.2-301
vimboss
parents: 1988
diff changeset
6008 break;
667
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6009 }
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6010 #endif
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6011 if (curwin->w_cursor.col == 0)
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6012 break;
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6013 dec_cursor();
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6014 }
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6015
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6016 if (foundcol == 0) /* no spaces, cannot break line */
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6017 {
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6018 curwin->w_cursor.col = startcol;
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6019 break;
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6020 }
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6021
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6022 /* Going to break the line, remove any "$" now. */
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6023 undisplay_dollar();
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6024
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6025 /*
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6026 * Offset between cursor position and line break is used by replace
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6027 * stack functions. VREPLACE does not use this, and backspaces
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6028 * over the text instead.
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6029 */
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6030 #ifdef FEAT_VREPLACE
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6031 if (State & VREPLACE_FLAG)
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6032 orig_col = startcol; /* Will start backspacing from here */
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6033 else
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6034 #endif
2004
9e554211caf5 updated for version 7.2-301
vimboss
parents: 1988
diff changeset
6035 replace_offset = startcol - end_foundcol;
667
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6036
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6037 /*
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6038 * adjust startcol for spaces that will be deleted and
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6039 * characters that will remain on top line
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6040 */
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6041 curwin->w_cursor.col = foundcol;
2004
9e554211caf5 updated for version 7.2-301
vimboss
parents: 1988
diff changeset
6042 while ((cc = gchar_cursor(), WHITECHAR(cc))
9e554211caf5 updated for version 7.2-301
vimboss
parents: 1988
diff changeset
6043 && (!fo_white_par || curwin->w_cursor.col < startcol))
667
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6044 inc_cursor();
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6045 startcol -= curwin->w_cursor.col;
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6046 if (startcol < 0)
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6047 startcol = 0;
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6048
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6049 #ifdef FEAT_VREPLACE
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6050 if (State & VREPLACE_FLAG)
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6051 {
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6052 /*
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6053 * In VREPLACE mode, we will backspace over the text to be
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6054 * wrapped, so save a copy now to put on the next line.
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6055 */
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6056 saved_text = vim_strsave(ml_get_cursor());
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6057 curwin->w_cursor.col = orig_col;
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6058 if (saved_text == NULL)
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6059 break; /* Can't do it, out of memory */
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6060 saved_text[startcol] = NUL;
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6061
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6062 /* Backspace over characters that will move to the next line */
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6063 if (!fo_white_par)
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6064 backspace_until_column(foundcol);
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6065 }
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6066 else
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6067 #endif
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6068 {
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6069 /* put cursor after pos. to break line */
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6070 if (!fo_white_par)
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6071 curwin->w_cursor.col = foundcol;
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6072 }
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6073
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6074 /*
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6075 * Split the line just before the margin.
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6076 * Only insert/delete lines, but don't really redraw the window.
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6077 */
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6078 open_line(FORWARD, OPENLINE_DELSPACES + OPENLINE_MARKFIX
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6079 + (fo_white_par ? OPENLINE_KEEPTRAIL : 0)
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6080 #ifdef FEAT_COMMENTS
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6081 + (do_comments ? OPENLINE_DO_COM : 0)
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6082 #endif
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6083 , old_indent);
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6084 old_indent = 0;
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6085
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6086 replace_offset = 0;
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6087 if (first_line)
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6088 {
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6089 if (second_indent < 0 && has_format_option(FO_Q_NUMBER))
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6090 second_indent = get_number_indent(curwin->w_cursor.lnum -1);
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6091 if (second_indent >= 0)
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6092 {
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6093 #ifdef FEAT_VREPLACE
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6094 if (State & VREPLACE_FLAG)
1516
ee9d2d24ea9b updated for version 7.1-231
vimboss
parents: 1514
diff changeset
6095 change_indent(INDENT_SET, second_indent, FALSE, NUL, TRUE);
667
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6096 else
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6097 #endif
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6098 (void)set_indent(second_indent, SIN_CHANGED);
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6099 }
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6100 first_line = FALSE;
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6101 }
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6102
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6103 #ifdef FEAT_VREPLACE
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6104 if (State & VREPLACE_FLAG)
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6105 {
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6106 /*
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6107 * In VREPLACE mode we have backspaced over the text to be
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6108 * moved, now we re-insert it into the new line.
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6109 */
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6110 ins_bytes(saved_text);
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6111 vim_free(saved_text);
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6112 }
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6113 else
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6114 #endif
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6115 {
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6116 /*
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6117 * Check if cursor is not past the NUL off the line, cindent
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6118 * may have added or removed indent.
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6119 */
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6120 curwin->w_cursor.col += startcol;
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6121 len = (colnr_T)STRLEN(ml_get_curline());
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6122 if (curwin->w_cursor.col > len)
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6123 curwin->w_cursor.col = len;
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6124 }
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6125
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6126 haveto_redraw = TRUE;
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6127 #ifdef FEAT_CINDENT
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6128 can_cindent = TRUE;
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6129 #endif
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6130 /* moved the cursor, don't autoindent or cindent now */
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6131 did_ai = FALSE;
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6132 #ifdef FEAT_SMARTINDENT
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6133 did_si = FALSE;
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6134 can_si = FALSE;
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6135 can_si_back = FALSE;
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6136 #endif
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6137 line_breakcheck();
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6138 }
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6139
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6140 if (save_char != NUL) /* put back space after cursor */
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6141 pchar_cursor(save_char);
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6142
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6143 if (!format_only && haveto_redraw)
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6144 {
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6145 update_topline();
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6146 redraw_curbuf_later(VALID);
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6147 }
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6148 }
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6149
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
6150 /*
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6151 * Called after inserting or deleting text: When 'formatoptions' includes the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6152 * 'a' flag format from the current line until the end of the paragraph.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6153 * Keep the cursor at the same position relative to the text.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6154 * The caller must have saved the cursor line for undo, following ones will be
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6155 * saved here.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6156 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6157 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6158 auto_format(trailblank, prev_line)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6159 int trailblank; /* when TRUE also format with trailing blank */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6160 int prev_line; /* may start in previous line */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6161 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6162 pos_T pos;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6163 colnr_T len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6164 char_u *old;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6165 char_u *new, *pnew;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6166 int wasatend;
301
006e9c8a6a8a updated for version 7.0079
vimboss
parents: 298
diff changeset
6167 int cc;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6168
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6169 if (!has_format_option(FO_AUTO))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6170 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6171
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6172 pos = curwin->w_cursor;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6173 old = ml_get_curline();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6174
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6175 /* may remove added space */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6176 check_auto_format(FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6177
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6178 /* Don't format in Insert mode when the cursor is on a trailing blank, the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6179 * user might insert normal text next. Also skip formatting when "1" is
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6180 * in 'formatoptions' and there is a single character before the cursor.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6181 * Otherwise the line would be broken and when typing another non-white
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6182 * next they are not joined back together. */
1872
f13849167330 updated for version 7.2-169
vimboss
parents: 1869
diff changeset
6183 wasatend = (pos.col == (colnr_T)STRLEN(old));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6184 if (*old != NUL && !trailblank && wasatend)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6185 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6186 dec_cursor();
301
006e9c8a6a8a updated for version 7.0079
vimboss
parents: 298
diff changeset
6187 cc = gchar_cursor();
006e9c8a6a8a updated for version 7.0079
vimboss
parents: 298
diff changeset
6188 if (!WHITECHAR(cc) && curwin->w_cursor.col > 0
006e9c8a6a8a updated for version 7.0079
vimboss
parents: 298
diff changeset
6189 && has_format_option(FO_ONE_LETTER))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6190 dec_cursor();
301
006e9c8a6a8a updated for version 7.0079
vimboss
parents: 298
diff changeset
6191 cc = gchar_cursor();
006e9c8a6a8a updated for version 7.0079
vimboss
parents: 298
diff changeset
6192 if (WHITECHAR(cc))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6193 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6194 curwin->w_cursor = pos;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6195 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6196 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6197 curwin->w_cursor = pos;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6198 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6199
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6200 #ifdef FEAT_COMMENTS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6201 /* With the 'c' flag in 'formatoptions' and 't' missing: only format
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6202 * comments. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6203 if (has_format_option(FO_WRAP_COMS) && !has_format_option(FO_WRAP)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6204 && get_leader_len(old, NULL, FALSE) == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6205 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6206 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6207
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6208 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6209 * May start formatting in a previous line, so that after "x" a word is
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6210 * moved to the previous line if it fits there now. Only when this is not
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6211 * the start of a paragraph.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6212 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6213 if (prev_line && !paragraph_start(curwin->w_cursor.lnum))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6214 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6215 --curwin->w_cursor.lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6216 if (u_save_cursor() == FAIL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6217 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6218 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6219
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6220 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6221 * Do the formatting and restore the cursor position. "saved_cursor" will
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6222 * be adjusted for the text formatting.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6223 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6224 saved_cursor = pos;
1563
ed7fefbef738 updated for version 7.1-276
vimboss
parents: 1526
diff changeset
6225 format_lines((linenr_T)-1, FALSE);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6226 curwin->w_cursor = saved_cursor;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6227 saved_cursor.lnum = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6228
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6229 if (curwin->w_cursor.lnum > curbuf->b_ml.ml_line_count)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6230 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6231 /* "cannot happen" */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6232 curwin->w_cursor.lnum = curbuf->b_ml.ml_line_count;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6233 coladvance((colnr_T)MAXCOL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6234 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6235 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6236 check_cursor_col();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6237
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6238 /* Insert mode: If the cursor is now after the end of the line while it
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6239 * previously wasn't, the line was broken. Because of the rule above we
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6240 * need to add a space when 'w' is in 'formatoptions' to keep a paragraph
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6241 * formatted. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6242 if (!wasatend && has_format_option(FO_WHITE_PAR))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6243 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6244 new = ml_get_curline();
835
8bebcabccc2c updated for version 7.0e01
vimboss
parents: 829
diff changeset
6245 len = (colnr_T)STRLEN(new);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6246 if (curwin->w_cursor.col == len)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6247 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6248 pnew = vim_strnsave(new, len + 2);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6249 pnew[len] = ' ';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6250 pnew[len + 1] = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6251 ml_replace(curwin->w_cursor.lnum, pnew, FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6252 /* remove the space later */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6253 did_add_space = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6254 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6255 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6256 /* may remove added space */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6257 check_auto_format(FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6258 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6259
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6260 check_cursor();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6261 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6262
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6263 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6264 * When an extra space was added to continue a paragraph for auto-formatting,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6265 * delete it now. The space must be under the cursor, just after the insert
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6266 * position.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6267 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6268 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6269 check_auto_format(end_insert)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6270 int end_insert; /* TRUE when ending Insert mode */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6271 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6272 int c = ' ';
301
006e9c8a6a8a updated for version 7.0079
vimboss
parents: 298
diff changeset
6273 int cc;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6274
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6275 if (did_add_space)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6276 {
301
006e9c8a6a8a updated for version 7.0079
vimboss
parents: 298
diff changeset
6277 cc = gchar_cursor();
006e9c8a6a8a updated for version 7.0079
vimboss
parents: 298
diff changeset
6278 if (!WHITECHAR(cc))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6279 /* Somehow the space was removed already. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6280 did_add_space = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6281 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6282 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6283 if (!end_insert)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6284 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6285 inc_cursor();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6286 c = gchar_cursor();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6287 dec_cursor();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6288 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6289 if (c != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6290 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6291 /* The space is no longer at the end of the line, delete it. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6292 del_char(FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6293 did_add_space = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6294 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6295 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6296 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6297 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6298
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6299 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6300 * Find out textwidth to be used for formatting:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6301 * if 'textwidth' option is set, use it
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6302 * else if 'wrapmargin' option is set, use W_WIDTH(curwin) - 'wrapmargin'
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6303 * if invalid value, use 0.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6304 * Set default to window width (maximum 79) for "gq" operator.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6305 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6306 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6307 comp_textwidth(ff)
867
a5677b7ce858 updated for version 7.0g04
vimboss
parents: 864
diff changeset
6308 int ff; /* force formatting (for "gq" command) */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6309 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6310 int textwidth;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6311
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6312 textwidth = curbuf->b_p_tw;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6313 if (textwidth == 0 && curbuf->b_p_wm)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6314 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6315 /* The width is the window width minus 'wrapmargin' minus all the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6316 * things that add to the margin. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6317 textwidth = W_WIDTH(curwin) - curbuf->b_p_wm;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6318 #ifdef FEAT_CMDWIN
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6319 if (cmdwin_type != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6320 textwidth -= 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6321 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6322 #ifdef FEAT_FOLDING
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6323 textwidth -= curwin->w_p_fdc;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6324 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6325 #ifdef FEAT_SIGNS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6326 if (curwin->w_buffer->b_signlist != NULL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6327 # ifdef FEAT_NETBEANS_INTG
2210
8c6a66e2b3cc Add :nbstart and :nbclose.
Bram Moolenaar <bram@vim.org>
parents: 2209
diff changeset
6328 || netbeans_active()
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6329 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6330 )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6331 textwidth -= 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6332 #endif
2178
c6f1aa1e9f32 Add 'relativenumber' patch from Markus Heidelberg.
Bram Moolenaar <bram@vim.org>
parents: 2107
diff changeset
6333 if (curwin->w_p_nu || curwin->w_p_rnu)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6334 textwidth -= 8;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6335 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6336 if (textwidth < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6337 textwidth = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6338 if (ff && textwidth == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6339 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6340 textwidth = W_WIDTH(curwin) - 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6341 if (textwidth > 79)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6342 textwidth = 79;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6343 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6344 return textwidth;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6345 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6346
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6347 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6348 * Put a character in the redo buffer, for when just after a CTRL-V.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6349 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6350 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6351 redo_literal(c)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6352 int c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6353 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6354 char_u buf[10];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6355
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6356 /* Only digits need special treatment. Translate them into a string of
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6357 * three digits. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6358 if (VIM_ISDIGIT(c))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6359 {
1872
f13849167330 updated for version 7.2-169
vimboss
parents: 1869
diff changeset
6360 vim_snprintf((char *)buf, sizeof(buf), "%03d", c);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6361 AppendToRedobuff(buf);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6362 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6363 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6364 AppendCharToRedobuff(c);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6365 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6366
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6367 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6368 * start_arrow() is called when an arrow key is used in insert mode.
484
f012c4ed8c38 updated for version 7.0132
vimboss
parents: 477
diff changeset
6369 * For undo/redo it resembles hitting the <ESC> key.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6370 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6371 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6372 start_arrow(end_insert_pos)
840
2c885fab04e3 updated for version 7.0e06
vimboss
parents: 836
diff changeset
6373 pos_T *end_insert_pos; /* can be NULL */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6374 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6375 if (!arrow_used) /* something has been inserted */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6376 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6377 AppendToRedobuff(ESC_STR);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6378 stop_insert(end_insert_pos, FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6379 arrow_used = TRUE; /* this means we stopped the current insert */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6380 }
744
07f7b4a7755c updated for version 7.0222
vimboss
parents: 732
diff changeset
6381 #ifdef FEAT_SPELL
221
7fd4b5df33be updated for version 7.0062
vimboss
parents: 180
diff changeset
6382 check_spell_redraw();
7fd4b5df33be updated for version 7.0062
vimboss
parents: 180
diff changeset
6383 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6384 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6385
744
07f7b4a7755c updated for version 7.0222
vimboss
parents: 732
diff changeset
6386 #ifdef FEAT_SPELL
221
7fd4b5df33be updated for version 7.0062
vimboss
parents: 180
diff changeset
6387 /*
7fd4b5df33be updated for version 7.0062
vimboss
parents: 180
diff changeset
6388 * If we skipped highlighting word at cursor, do it now.
7fd4b5df33be updated for version 7.0062
vimboss
parents: 180
diff changeset
6389 * It may be skipped again, thus reset spell_redraw_lnum first.
7fd4b5df33be updated for version 7.0062
vimboss
parents: 180
diff changeset
6390 */
7fd4b5df33be updated for version 7.0062
vimboss
parents: 180
diff changeset
6391 static void
7fd4b5df33be updated for version 7.0062
vimboss
parents: 180
diff changeset
6392 check_spell_redraw()
7fd4b5df33be updated for version 7.0062
vimboss
parents: 180
diff changeset
6393 {
7fd4b5df33be updated for version 7.0062
vimboss
parents: 180
diff changeset
6394 if (spell_redraw_lnum != 0)
7fd4b5df33be updated for version 7.0062
vimboss
parents: 180
diff changeset
6395 {
7fd4b5df33be updated for version 7.0062
vimboss
parents: 180
diff changeset
6396 linenr_T lnum = spell_redraw_lnum;
7fd4b5df33be updated for version 7.0062
vimboss
parents: 180
diff changeset
6397
7fd4b5df33be updated for version 7.0062
vimboss
parents: 180
diff changeset
6398 spell_redraw_lnum = 0;
7fd4b5df33be updated for version 7.0062
vimboss
parents: 180
diff changeset
6399 redrawWinline(lnum, FALSE);
7fd4b5df33be updated for version 7.0062
vimboss
parents: 180
diff changeset
6400 }
7fd4b5df33be updated for version 7.0062
vimboss
parents: 180
diff changeset
6401 }
484
f012c4ed8c38 updated for version 7.0132
vimboss
parents: 477
diff changeset
6402
f012c4ed8c38 updated for version 7.0132
vimboss
parents: 477
diff changeset
6403 /*
f012c4ed8c38 updated for version 7.0132
vimboss
parents: 477
diff changeset
6404 * Called when starting CTRL_X_SPELL mode: Move backwards to a previous badly
f012c4ed8c38 updated for version 7.0132
vimboss
parents: 477
diff changeset
6405 * spelled word, if there is one.
f012c4ed8c38 updated for version 7.0132
vimboss
parents: 477
diff changeset
6406 */
f012c4ed8c38 updated for version 7.0132
vimboss
parents: 477
diff changeset
6407 static void
f012c4ed8c38 updated for version 7.0132
vimboss
parents: 477
diff changeset
6408 spell_back_to_badword()
f012c4ed8c38 updated for version 7.0132
vimboss
parents: 477
diff changeset
6409 {
f012c4ed8c38 updated for version 7.0132
vimboss
parents: 477
diff changeset
6410 pos_T tpos = curwin->w_cursor;
f012c4ed8c38 updated for version 7.0132
vimboss
parents: 477
diff changeset
6411
499
08012a1ff8d4 updated for version 7.0137
vimboss
parents: 497
diff changeset
6412 spell_bad_len = spell_move_to(curwin, BACKWARD, TRUE, TRUE, NULL);
484
f012c4ed8c38 updated for version 7.0132
vimboss
parents: 477
diff changeset
6413 if (curwin->w_cursor.col != tpos.col)
f012c4ed8c38 updated for version 7.0132
vimboss
parents: 477
diff changeset
6414 start_arrow(&tpos);
f012c4ed8c38 updated for version 7.0132
vimboss
parents: 477
diff changeset
6415 }
221
7fd4b5df33be updated for version 7.0062
vimboss
parents: 180
diff changeset
6416 #endif
7fd4b5df33be updated for version 7.0062
vimboss
parents: 180
diff changeset
6417
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6418 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6419 * stop_arrow() is called before a change is made in insert mode.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6420 * If an arrow key has been used, start a new insertion.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6421 * Returns FAIL if undo is impossible, shouldn't insert then.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6422 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6423 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6424 stop_arrow()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6425 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6426 if (arrow_used)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6427 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6428 if (u_save_cursor() == OK)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6429 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6430 arrow_used = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6431 ins_need_undo = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6432 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6433 Insstart = curwin->w_cursor; /* new insertion starts here */
1869
720a59d79bcd updated for version 7.2-168
vimboss
parents: 1811
diff changeset
6434 Insstart_textlen = (colnr_T)linetabsize(ml_get_curline());
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6435 ai_col = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6436 #ifdef FEAT_VREPLACE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6437 if (State & VREPLACE_FLAG)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6438 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6439 orig_line_count = curbuf->b_ml.ml_line_count;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6440 vr_lines_changed = 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6441 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6442 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6443 ResetRedobuff();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6444 AppendToRedobuff((char_u *)"1i"); /* pretend we start an insertion */
613
53114ef7778f updated for version 7.0174
vimboss
parents: 610
diff changeset
6445 new_insert_skip = 2;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6446 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6447 else if (ins_need_undo)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6448 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6449 if (u_save_cursor() == OK)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6450 ins_need_undo = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6451 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6452
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6453 #ifdef FEAT_FOLDING
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6454 /* Always open fold at the cursor line when inserting something. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6455 foldOpenCursor();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6456 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6457
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6458 return (arrow_used || ins_need_undo ? FAIL : OK);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6459 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6460
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6461 /*
840
2c885fab04e3 updated for version 7.0e06
vimboss
parents: 836
diff changeset
6462 * Do a few things to stop inserting.
2c885fab04e3 updated for version 7.0e06
vimboss
parents: 836
diff changeset
6463 * "end_insert_pos" is where insert ended. It is NULL when we already jumped
2c885fab04e3 updated for version 7.0e06
vimboss
parents: 836
diff changeset
6464 * to another window/buffer.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6465 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6466 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6467 stop_insert(end_insert_pos, esc)
840
2c885fab04e3 updated for version 7.0e06
vimboss
parents: 836
diff changeset
6468 pos_T *end_insert_pos;
603
e4c00ec07598 updated for version 7.0171
vimboss
parents: 574
diff changeset
6469 int esc; /* called by ins_esc() */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6470 {
603
e4c00ec07598 updated for version 7.0171
vimboss
parents: 574
diff changeset
6471 int cc;
e4c00ec07598 updated for version 7.0171
vimboss
parents: 574
diff changeset
6472 char_u *ptr;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6473
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6474 stop_redo_ins();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6475 replace_flush(); /* abandon replace stack */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6476
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6477 /*
603
e4c00ec07598 updated for version 7.0171
vimboss
parents: 574
diff changeset
6478 * Save the inserted text for later redo with ^@ and CTRL-A.
e4c00ec07598 updated for version 7.0171
vimboss
parents: 574
diff changeset
6479 * Don't do it when "restart_edit" was set and nothing was inserted,
e4c00ec07598 updated for version 7.0171
vimboss
parents: 574
diff changeset
6480 * otherwise CTRL-O w and then <Left> will clear "last_insert".
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6481 */
603
e4c00ec07598 updated for version 7.0171
vimboss
parents: 574
diff changeset
6482 ptr = get_inserted();
615
7fe13e0f5dce updated for version 7.0175
vimboss
parents: 613
diff changeset
6483 if (did_restart_edit == 0 || (ptr != NULL
7fe13e0f5dce updated for version 7.0175
vimboss
parents: 613
diff changeset
6484 && (int)STRLEN(ptr) > new_insert_skip))
603
e4c00ec07598 updated for version 7.0171
vimboss
parents: 574
diff changeset
6485 {
e4c00ec07598 updated for version 7.0171
vimboss
parents: 574
diff changeset
6486 vim_free(last_insert);
e4c00ec07598 updated for version 7.0171
vimboss
parents: 574
diff changeset
6487 last_insert = ptr;
e4c00ec07598 updated for version 7.0171
vimboss
parents: 574
diff changeset
6488 last_insert_skip = new_insert_skip;
e4c00ec07598 updated for version 7.0171
vimboss
parents: 574
diff changeset
6489 }
e4c00ec07598 updated for version 7.0171
vimboss
parents: 574
diff changeset
6490 else
e4c00ec07598 updated for version 7.0171
vimboss
parents: 574
diff changeset
6491 vim_free(ptr);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6492
840
2c885fab04e3 updated for version 7.0e06
vimboss
parents: 836
diff changeset
6493 if (!arrow_used && end_insert_pos != NULL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6494 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6495 /* Auto-format now. It may seem strange to do this when stopping an
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6496 * insertion (or moving the cursor), but it's required when appending
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6497 * a line and having it end in a space. But only do it when something
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6498 * was actually inserted, otherwise undo won't work. */
10
4e2284e71352 updated for version 7.0002
vimboss
parents: 7
diff changeset
6499 if (!ins_need_undo && has_format_option(FO_AUTO))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6500 {
10
4e2284e71352 updated for version 7.0002
vimboss
parents: 7
diff changeset
6501 pos_T tpos = curwin->w_cursor;
4e2284e71352 updated for version 7.0002
vimboss
parents: 7
diff changeset
6502
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6503 /* When the cursor is at the end of the line after a space the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6504 * formatting will move it to the following word. Avoid that by
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6505 * moving the cursor onto the space. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6506 cc = 'x';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6507 if (curwin->w_cursor.col > 0 && gchar_cursor() == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6508 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6509 dec_cursor();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6510 cc = gchar_cursor();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6511 if (!vim_iswhite(cc))
10
4e2284e71352 updated for version 7.0002
vimboss
parents: 7
diff changeset
6512 curwin->w_cursor = tpos;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6513 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6514
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6515 auto_format(TRUE, FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6516
10
4e2284e71352 updated for version 7.0002
vimboss
parents: 7
diff changeset
6517 if (vim_iswhite(cc))
4e2284e71352 updated for version 7.0002
vimboss
parents: 7
diff changeset
6518 {
4e2284e71352 updated for version 7.0002
vimboss
parents: 7
diff changeset
6519 if (gchar_cursor() != NUL)
4e2284e71352 updated for version 7.0002
vimboss
parents: 7
diff changeset
6520 inc_cursor();
4e2284e71352 updated for version 7.0002
vimboss
parents: 7
diff changeset
6521 #ifdef FEAT_VIRTUALEDIT
4e2284e71352 updated for version 7.0002
vimboss
parents: 7
diff changeset
6522 /* If the cursor is still at the same character, also keep
4e2284e71352 updated for version 7.0002
vimboss
parents: 7
diff changeset
6523 * the "coladd". */
4e2284e71352 updated for version 7.0002
vimboss
parents: 7
diff changeset
6524 if (gchar_cursor() == NUL
4e2284e71352 updated for version 7.0002
vimboss
parents: 7
diff changeset
6525 && curwin->w_cursor.lnum == tpos.lnum
4e2284e71352 updated for version 7.0002
vimboss
parents: 7
diff changeset
6526 && curwin->w_cursor.col == tpos.col)
4e2284e71352 updated for version 7.0002
vimboss
parents: 7
diff changeset
6527 curwin->w_cursor.coladd = tpos.coladd;
4e2284e71352 updated for version 7.0002
vimboss
parents: 7
diff changeset
6528 #endif
4e2284e71352 updated for version 7.0002
vimboss
parents: 7
diff changeset
6529 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6530 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6531
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6532 /* If a space was inserted for auto-formatting, remove it now. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6533 check_auto_format(TRUE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6534
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6535 /* If we just did an auto-indent, remove the white space from the end
10
4e2284e71352 updated for version 7.0002
vimboss
parents: 7
diff changeset
6536 * of the line, and put the cursor back.
1892
04613e770ec0 updated for version 7.2-189
vimboss
parents: 1879
diff changeset
6537 * Do this when ESC was used or moving the cursor up/down.
04613e770ec0 updated for version 7.2-189
vimboss
parents: 1879
diff changeset
6538 * Check for the old position still being valid, just in case the text
04613e770ec0 updated for version 7.2-189
vimboss
parents: 1879
diff changeset
6539 * got changed unexpectedly. */
10
4e2284e71352 updated for version 7.0002
vimboss
parents: 7
diff changeset
6540 if (did_ai && (esc || (vim_strchr(p_cpo, CPO_INDENT) == NULL
1892
04613e770ec0 updated for version 7.2-189
vimboss
parents: 1879
diff changeset
6541 && curwin->w_cursor.lnum != end_insert_pos->lnum))
04613e770ec0 updated for version 7.2-189
vimboss
parents: 1879
diff changeset
6542 && end_insert_pos->lnum <= curbuf->b_ml.ml_line_count)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6543 {
10
4e2284e71352 updated for version 7.0002
vimboss
parents: 7
diff changeset
6544 pos_T tpos = curwin->w_cursor;
4e2284e71352 updated for version 7.0002
vimboss
parents: 7
diff changeset
6545
4e2284e71352 updated for version 7.0002
vimboss
parents: 7
diff changeset
6546 curwin->w_cursor = *end_insert_pos;
1892
04613e770ec0 updated for version 7.2-189
vimboss
parents: 1879
diff changeset
6547 check_cursor_col(); /* make sure it is not past the line */
786
8f6a426bc1e0 updated for version 7.0229
vimboss
parents: 782
diff changeset
6548 for (;;)
8f6a426bc1e0 updated for version 7.0229
vimboss
parents: 782
diff changeset
6549 {
8f6a426bc1e0 updated for version 7.0229
vimboss
parents: 782
diff changeset
6550 if (gchar_cursor() == NUL && curwin->w_cursor.col > 0)
8f6a426bc1e0 updated for version 7.0229
vimboss
parents: 782
diff changeset
6551 --curwin->w_cursor.col;
8f6a426bc1e0 updated for version 7.0229
vimboss
parents: 782
diff changeset
6552 cc = gchar_cursor();
8f6a426bc1e0 updated for version 7.0229
vimboss
parents: 782
diff changeset
6553 if (!vim_iswhite(cc))
8f6a426bc1e0 updated for version 7.0229
vimboss
parents: 782
diff changeset
6554 break;
1892
04613e770ec0 updated for version 7.2-189
vimboss
parents: 1879
diff changeset
6555 if (del_char(TRUE) == FAIL)
04613e770ec0 updated for version 7.2-189
vimboss
parents: 1879
diff changeset
6556 break; /* should not happen */
786
8f6a426bc1e0 updated for version 7.0229
vimboss
parents: 782
diff changeset
6557 }
10
4e2284e71352 updated for version 7.0002
vimboss
parents: 7
diff changeset
6558 if (curwin->w_cursor.lnum != tpos.lnum)
4e2284e71352 updated for version 7.0002
vimboss
parents: 7
diff changeset
6559 curwin->w_cursor = tpos;
4e2284e71352 updated for version 7.0002
vimboss
parents: 7
diff changeset
6560 else if (cc != NUL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6561 ++curwin->w_cursor.col; /* put cursor back on the NUL */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6562
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6563 #ifdef FEAT_VISUAL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6564 /* <C-S-Right> may have started Visual mode, adjust the position for
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6565 * deleted characters. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6566 if (VIsual_active && VIsual.lnum == curwin->w_cursor.lnum)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6567 {
1872
f13849167330 updated for version 7.2-169
vimboss
parents: 1869
diff changeset
6568 int len = (int)STRLEN(ml_get_curline());
f13849167330 updated for version 7.2-169
vimboss
parents: 1869
diff changeset
6569
f13849167330 updated for version 7.2-169
vimboss
parents: 1869
diff changeset
6570 if (VIsual.col > len)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6571 {
1872
f13849167330 updated for version 7.2-169
vimboss
parents: 1869
diff changeset
6572 VIsual.col = len;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6573 # ifdef FEAT_VIRTUALEDIT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6574 VIsual.coladd = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6575 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6576 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6577 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6578 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6579 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6580 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6581 did_ai = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6582 #ifdef FEAT_SMARTINDENT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6583 did_si = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6584 can_si = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6585 can_si_back = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6586 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6587
840
2c885fab04e3 updated for version 7.0e06
vimboss
parents: 836
diff changeset
6588 /* Set '[ and '] to the inserted text. When end_insert_pos is NULL we are
2c885fab04e3 updated for version 7.0e06
vimboss
parents: 836
diff changeset
6589 * now in a different buffer. */
2c885fab04e3 updated for version 7.0e06
vimboss
parents: 836
diff changeset
6590 if (end_insert_pos != NULL)
2c885fab04e3 updated for version 7.0e06
vimboss
parents: 836
diff changeset
6591 {
2c885fab04e3 updated for version 7.0e06
vimboss
parents: 836
diff changeset
6592 curbuf->b_op_start = Insstart;
2c885fab04e3 updated for version 7.0e06
vimboss
parents: 836
diff changeset
6593 curbuf->b_op_end = *end_insert_pos;
2c885fab04e3 updated for version 7.0e06
vimboss
parents: 836
diff changeset
6594 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6595 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6596
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6597 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6598 * Set the last inserted text to a single character.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6599 * Used for the replace command.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6600 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6601 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6602 set_last_insert(c)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6603 int c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6604 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6605 char_u *s;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6606
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6607 vim_free(last_insert);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6608 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6609 last_insert = alloc(MB_MAXBYTES * 3 + 5);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6610 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6611 last_insert = alloc(6);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6612 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6613 if (last_insert != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6614 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6615 s = last_insert;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6616 /* Use the CTRL-V only when entering a special char */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6617 if (c < ' ' || c == DEL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6618 *s++ = Ctrl_V;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6619 s = add_char2buf(c, s);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6620 *s++ = ESC;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6621 *s++ = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6622 last_insert_skip = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6623 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6624 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6625
359
6c62b9b939bd updated for version 7.0093
vimboss
parents: 301
diff changeset
6626 #if defined(EXITFREE) || defined(PROTO)
6c62b9b939bd updated for version 7.0093
vimboss
parents: 301
diff changeset
6627 void
6c62b9b939bd updated for version 7.0093
vimboss
parents: 301
diff changeset
6628 free_last_insert()
6c62b9b939bd updated for version 7.0093
vimboss
parents: 301
diff changeset
6629 {
6c62b9b939bd updated for version 7.0093
vimboss
parents: 301
diff changeset
6630 vim_free(last_insert);
6c62b9b939bd updated for version 7.0093
vimboss
parents: 301
diff changeset
6631 last_insert = NULL;
1446
f0b3b9ac2147 updated for version 7.1-161
vimboss
parents: 1436
diff changeset
6632 # ifdef FEAT_INS_EXPAND
694
07d199fe02ed updated for version 7.0209
vimboss
parents: 692
diff changeset
6633 vim_free(compl_orig_text);
07d199fe02ed updated for version 7.0209
vimboss
parents: 692
diff changeset
6634 compl_orig_text = NULL;
1446
f0b3b9ac2147 updated for version 7.1-161
vimboss
parents: 1436
diff changeset
6635 # endif
359
6c62b9b939bd updated for version 7.0093
vimboss
parents: 301
diff changeset
6636 }
6c62b9b939bd updated for version 7.0093
vimboss
parents: 301
diff changeset
6637 #endif
6c62b9b939bd updated for version 7.0093
vimboss
parents: 301
diff changeset
6638
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6639 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6640 * Add character "c" to buffer "s". Escape the special meaning of K_SPECIAL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6641 * and CSI. Handle multi-byte characters.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6642 * Returns a pointer to after the added bytes.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6643 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6644 char_u *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6645 add_char2buf(c, s)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6646 int c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6647 char_u *s;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6648 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6649 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6650 char_u temp[MB_MAXBYTES];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6651 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6652 int len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6653
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6654 len = (*mb_char2bytes)(c, temp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6655 for (i = 0; i < len; ++i)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6656 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6657 c = temp[i];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6658 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6659 /* Need to escape K_SPECIAL and CSI like in the typeahead buffer. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6660 if (c == K_SPECIAL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6661 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6662 *s++ = K_SPECIAL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6663 *s++ = KS_SPECIAL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6664 *s++ = KE_FILLER;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6665 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6666 #ifdef FEAT_GUI
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6667 else if (c == CSI)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6668 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6669 *s++ = CSI;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6670 *s++ = KS_EXTRA;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6671 *s++ = (int)KE_CSI;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6672 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6673 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6674 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6675 *s++ = c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6676 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6677 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6678 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6679 return s;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6680 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6681
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6682 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6683 * move cursor to start of line
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6684 * if flags & BL_WHITE move to first non-white
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6685 * if flags & BL_SOL move to first non-white if startofline is set,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6686 * otherwise keep "curswant" column
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6687 * if flags & BL_FIX don't leave the cursor on a NUL.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6688 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6689 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6690 beginline(flags)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6691 int flags;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6692 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6693 if ((flags & BL_SOL) && !p_sol)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6694 coladvance(curwin->w_curswant);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6695 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6696 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6697 curwin->w_cursor.col = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6698 #ifdef FEAT_VIRTUALEDIT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6699 curwin->w_cursor.coladd = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6700 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6701
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6702 if (flags & (BL_WHITE | BL_SOL))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6703 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6704 char_u *ptr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6705
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6706 for (ptr = ml_get_curline(); vim_iswhite(*ptr)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6707 && !((flags & BL_FIX) && ptr[1] == NUL); ++ptr)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6708 ++curwin->w_cursor.col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6709 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6710 curwin->w_set_curswant = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6711 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6712 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6713
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6714 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6715 * oneright oneleft cursor_down cursor_up
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6716 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6717 * Move one char {right,left,down,up}.
773
8c9ef63b1ccc updated for version 7.0226
vimboss
parents: 767
diff changeset
6718 * Doesn't move onto the NUL past the end of the line, unless it is allowed.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6719 * Return OK when successful, FAIL when we hit a line of file boundary.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6720 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6721
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6722 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6723 oneright()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6724 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6725 char_u *ptr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6726 int l;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6727
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6728 #ifdef FEAT_VIRTUALEDIT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6729 if (virtual_active())
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6730 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6731 pos_T prevpos = curwin->w_cursor;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6732
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6733 /* Adjust for multi-wide char (excluding TAB) */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6734 ptr = ml_get_cursor();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6735 coladvance(getviscol() + ((*ptr != TAB && vim_isprintc(
773
8c9ef63b1ccc updated for version 7.0226
vimboss
parents: 767
diff changeset
6736 # ifdef FEAT_MBYTE
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6737 (*mb_ptr2char)(ptr)
773
8c9ef63b1ccc updated for version 7.0226
vimboss
parents: 767
diff changeset
6738 # else
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6739 *ptr
773
8c9ef63b1ccc updated for version 7.0226
vimboss
parents: 767
diff changeset
6740 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6741 ))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6742 ? ptr2cells(ptr) : 1));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6743 curwin->w_set_curswant = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6744 /* Return OK if the cursor moved, FAIL otherwise (at window edge). */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6745 return (prevpos.col != curwin->w_cursor.col
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6746 || prevpos.coladd != curwin->w_cursor.coladd) ? OK : FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6747 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6748 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6749
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6750 ptr = ml_get_cursor();
773
8c9ef63b1ccc updated for version 7.0226
vimboss
parents: 767
diff changeset
6751 if (*ptr == NUL)
8c9ef63b1ccc updated for version 7.0226
vimboss
parents: 767
diff changeset
6752 return FAIL; /* already at the very end */
8c9ef63b1ccc updated for version 7.0226
vimboss
parents: 767
diff changeset
6753
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6754 #ifdef FEAT_MBYTE
773
8c9ef63b1ccc updated for version 7.0226
vimboss
parents: 767
diff changeset
6755 if (has_mbyte)
8c9ef63b1ccc updated for version 7.0226
vimboss
parents: 767
diff changeset
6756 l = (*mb_ptr2len)(ptr);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6757 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6758 #endif
773
8c9ef63b1ccc updated for version 7.0226
vimboss
parents: 767
diff changeset
6759 l = 1;
8c9ef63b1ccc updated for version 7.0226
vimboss
parents: 767
diff changeset
6760
8c9ef63b1ccc updated for version 7.0226
vimboss
parents: 767
diff changeset
6761 /* move "l" bytes right, but don't end up on the NUL, unless 'virtualedit'
8c9ef63b1ccc updated for version 7.0226
vimboss
parents: 767
diff changeset
6762 * contains "onemore". */
8c9ef63b1ccc updated for version 7.0226
vimboss
parents: 767
diff changeset
6763 if (ptr[l] == NUL
8c9ef63b1ccc updated for version 7.0226
vimboss
parents: 767
diff changeset
6764 #ifdef FEAT_VIRTUALEDIT
8c9ef63b1ccc updated for version 7.0226
vimboss
parents: 767
diff changeset
6765 && (ve_flags & VE_ONEMORE) == 0
8c9ef63b1ccc updated for version 7.0226
vimboss
parents: 767
diff changeset
6766 #endif
8c9ef63b1ccc updated for version 7.0226
vimboss
parents: 767
diff changeset
6767 )
8c9ef63b1ccc updated for version 7.0226
vimboss
parents: 767
diff changeset
6768 return FAIL;
8c9ef63b1ccc updated for version 7.0226
vimboss
parents: 767
diff changeset
6769 curwin->w_cursor.col += l;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6770
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6771 curwin->w_set_curswant = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6772 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6773 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6774
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6775 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6776 oneleft()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6777 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6778 #ifdef FEAT_VIRTUALEDIT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6779 if (virtual_active())
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6780 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6781 int width;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6782 int v = getviscol();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6783
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6784 if (v == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6785 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6786
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6787 # ifdef FEAT_LINEBREAK
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6788 /* We might get stuck on 'showbreak', skip over it. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6789 width = 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6790 for (;;)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6791 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6792 coladvance(v - width);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6793 /* getviscol() is slow, skip it when 'showbreak' is empty and
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6794 * there are no multi-byte characters */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6795 if ((*p_sbr == NUL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6796 # ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6797 && !has_mbyte
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6798 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6799 ) || getviscol() < v)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6800 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6801 ++width;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6802 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6803 # else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6804 coladvance(v - 1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6805 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6806
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6807 if (curwin->w_cursor.coladd == 1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6808 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6809 char_u *ptr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6810
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6811 /* Adjust for multi-wide char (not a TAB) */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6812 ptr = ml_get_cursor();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6813 if (*ptr != TAB && vim_isprintc(
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6814 # ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6815 (*mb_ptr2char)(ptr)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6816 # else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6817 *ptr
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6818 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6819 ) && ptr2cells(ptr) > 1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6820 curwin->w_cursor.coladd = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6821 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6822
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6823 curwin->w_set_curswant = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6824 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6825 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6826 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6827
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6828 if (curwin->w_cursor.col == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6829 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6830
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6831 curwin->w_set_curswant = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6832 --curwin->w_cursor.col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6833
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6834 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6835 /* if the character on the left of the current cursor is a multi-byte
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6836 * character, move to its first byte */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6837 if (has_mbyte)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6838 mb_adjust_cursor();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6839 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6840 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6841 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6842
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6843 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6844 cursor_up(n, upd_topline)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6845 long n;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6846 int upd_topline; /* When TRUE: update topline */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6847 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6848 linenr_T lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6849
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6850 if (n > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6851 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6852 lnum = curwin->w_cursor.lnum;
161
6df0106fc595 updated for version 7.0049
vimboss
parents: 140
diff changeset
6853 /* This fails if the cursor is already in the first line or the count
6df0106fc595 updated for version 7.0049
vimboss
parents: 140
diff changeset
6854 * is larger than the line number and '-' is in 'cpoptions' */
6df0106fc595 updated for version 7.0049
vimboss
parents: 140
diff changeset
6855 if (lnum <= 1 || (n >= lnum && vim_strchr(p_cpo, CPO_MINUS) != NULL))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6856 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6857 if (n >= lnum)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6858 lnum = 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6859 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6860 #ifdef FEAT_FOLDING
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6861 if (hasAnyFolding(curwin))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6862 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6863 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6864 * Count each sequence of folded lines as one logical line.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6865 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6866 /* go to the the start of the current fold */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6867 (void)hasFolding(lnum, &lnum, NULL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6868
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6869 while (n--)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6870 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6871 /* move up one line */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6872 --lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6873 if (lnum <= 1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6874 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6875 /* If we entered a fold, move to the beginning, unless in
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6876 * Insert mode or when 'foldopen' contains "all": it will open
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6877 * in a moment. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6878 if (n > 0 || !((State & INSERT) || (fdo_flags & FDO_ALL)))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6879 (void)hasFolding(lnum, &lnum, NULL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6880 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6881 if (lnum < 1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6882 lnum = 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6883 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6884 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6885 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6886 lnum -= n;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6887 curwin->w_cursor.lnum = lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6888 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6889
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6890 /* try to advance to the column we want to be at */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6891 coladvance(curwin->w_curswant);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6892
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6893 if (upd_topline)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6894 update_topline(); /* make sure curwin->w_topline is valid */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6895
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6896 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6897 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6898
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6899 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6900 * Cursor down a number of logical lines.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6901 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6902 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6903 cursor_down(n, upd_topline)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6904 long n;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6905 int upd_topline; /* When TRUE: update topline */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6906 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6907 linenr_T lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6908
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6909 if (n > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6910 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6911 lnum = curwin->w_cursor.lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6912 #ifdef FEAT_FOLDING
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6913 /* Move to last line of fold, will fail if it's the end-of-file. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6914 (void)hasFolding(lnum, NULL, &lnum);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6915 #endif
161
6df0106fc595 updated for version 7.0049
vimboss
parents: 140
diff changeset
6916 /* This fails if the cursor is already in the last line or would move
6df0106fc595 updated for version 7.0049
vimboss
parents: 140
diff changeset
6917 * beyound the last line and '-' is in 'cpoptions' */
6df0106fc595 updated for version 7.0049
vimboss
parents: 140
diff changeset
6918 if (lnum >= curbuf->b_ml.ml_line_count
6df0106fc595 updated for version 7.0049
vimboss
parents: 140
diff changeset
6919 || (lnum + n > curbuf->b_ml.ml_line_count
6df0106fc595 updated for version 7.0049
vimboss
parents: 140
diff changeset
6920 && vim_strchr(p_cpo, CPO_MINUS) != NULL))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6921 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6922 if (lnum + n >= curbuf->b_ml.ml_line_count)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6923 lnum = curbuf->b_ml.ml_line_count;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6924 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6925 #ifdef FEAT_FOLDING
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6926 if (hasAnyFolding(curwin))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6927 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6928 linenr_T last;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6929
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6930 /* count each sequence of folded lines as one logical line */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6931 while (n--)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6932 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6933 if (hasFolding(lnum, NULL, &last))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6934 lnum = last + 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6935 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6936 ++lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6937 if (lnum >= curbuf->b_ml.ml_line_count)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6938 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6939 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6940 if (lnum > curbuf->b_ml.ml_line_count)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6941 lnum = curbuf->b_ml.ml_line_count;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6942 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6943 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6944 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6945 lnum += n;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6946 curwin->w_cursor.lnum = lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6947 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6948
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6949 /* try to advance to the column we want to be at */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6950 coladvance(curwin->w_curswant);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6951
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6952 if (upd_topline)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6953 update_topline(); /* make sure curwin->w_topline is valid */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6954
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6955 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6956 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6957
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6958 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6959 * Stuff the last inserted text in the read buffer.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6960 * Last_insert actually is a copy of the redo buffer, so we
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6961 * first have to remove the command.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6962 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6963 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6964 stuff_inserted(c, count, no_esc)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6965 int c; /* Command character to be inserted */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6966 long count; /* Repeat this many times */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6967 int no_esc; /* Don't add an ESC at the end */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6968 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6969 char_u *esc_ptr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6970 char_u *ptr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6971 char_u *last_ptr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6972 char_u last = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6973
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6974 ptr = get_last_insert();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6975 if (ptr == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6976 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6977 EMSG(_(e_noinstext));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6978 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6979 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6980
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6981 /* may want to stuff the command character, to start Insert mode */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6982 if (c != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6983 stuffcharReadbuff(c);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6984 if ((esc_ptr = (char_u *)vim_strrchr(ptr, ESC)) != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6985 *esc_ptr = NUL; /* remove the ESC */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6986
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6987 /* when the last char is either "0" or "^" it will be quoted if no ESC
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6988 * comes after it OR if it will inserted more than once and "ptr"
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6989 * starts with ^D. -- Acevedo
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6990 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6991 last_ptr = (esc_ptr ? esc_ptr : ptr + STRLEN(ptr)) - 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6992 if (last_ptr >= ptr && (*last_ptr == '0' || *last_ptr == '^')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6993 && (no_esc || (*ptr == Ctrl_D && count > 1)))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6994 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6995 last = *last_ptr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6996 *last_ptr = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6997 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6998
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6999 do
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7000 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7001 stuffReadbuff(ptr);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7002 /* a trailing "0" is inserted as "<C-V>048", "^" as "<C-V>^" */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7003 if (last)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7004 stuffReadbuff((char_u *)(last == '0'
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7005 ? IF_EB("\026\060\064\070", CTRL_V_STR "xf0")
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7006 : IF_EB("\026^", CTRL_V_STR "^")));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7007 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7008 while (--count > 0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7009
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7010 if (last)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7011 *last_ptr = last;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7012
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7013 if (esc_ptr != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7014 *esc_ptr = ESC; /* put the ESC back */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7015
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7016 /* may want to stuff a trailing ESC, to get out of Insert mode */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7017 if (!no_esc)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7018 stuffcharReadbuff(ESC);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7019
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7020 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7021 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7022
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7023 char_u *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7024 get_last_insert()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7025 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7026 if (last_insert == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7027 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7028 return last_insert + last_insert_skip;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7029 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7030
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7031 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7032 * Get last inserted string, and remove trailing <Esc>.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7033 * Returns pointer to allocated memory (must be freed) or NULL.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7034 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7035 char_u *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7036 get_last_insert_save()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7037 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7038 char_u *s;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7039 int len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7040
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7041 if (last_insert == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7042 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7043 s = vim_strsave(last_insert + last_insert_skip);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7044 if (s != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7045 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7046 len = (int)STRLEN(s);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7047 if (len > 0 && s[len - 1] == ESC) /* remove trailing ESC */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7048 s[len - 1] = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7049 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7050 return s;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7051 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7052
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7053 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7054 * Check the word in front of the cursor for an abbreviation.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7055 * Called when the non-id character "c" has been entered.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7056 * When an abbreviation is recognized it is removed from the text and
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7057 * the replacement string is inserted in typebuf.tb_buf[], followed by "c".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7058 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7059 static int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7060 echeck_abbr(c)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7061 int c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7062 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7063 /* Don't check for abbreviation in paste mode, when disabled and just
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7064 * after moving around with cursor keys. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7065 if (p_paste || no_abbr || arrow_used)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7066 return FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7067
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7068 return check_abbr(c, ml_get_curline(), curwin->w_cursor.col,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7069 curwin->w_cursor.lnum == Insstart.lnum ? Insstart.col : 0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7070 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7071
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7072 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7073 * replace-stack functions
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7074 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7075 * When replacing characters, the replaced characters are remembered for each
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7076 * new character. This is used to re-insert the old text when backspacing.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7077 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7078 * There is a NUL headed list of characters for each character that is
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7079 * currently in the file after the insertion point. When BS is used, one NUL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7080 * headed list is put back for the deleted character.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7081 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7082 * For a newline, there are two NUL headed lists. One contains the characters
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7083 * that the NL replaced. The extra one stores the characters after the cursor
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7084 * that were deleted (always white space).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7085 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7086 * Replace_offset is normally 0, in which case replace_push will add a new
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7087 * character at the end of the stack. If replace_offset is not 0, that many
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7088 * characters will be left on the stack above the newly inserted character.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7089 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7090
298
f9de3e679a04 updated for version 7.0078
vimboss
parents: 278
diff changeset
7091 static char_u *replace_stack = NULL;
f9de3e679a04 updated for version 7.0078
vimboss
parents: 278
diff changeset
7092 static long replace_stack_nr = 0; /* next entry in replace stack */
f9de3e679a04 updated for version 7.0078
vimboss
parents: 278
diff changeset
7093 static long replace_stack_len = 0; /* max. number of entries */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7094
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7095 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7096 replace_push(c)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7097 int c; /* character that is replaced (NUL is none) */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7098 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7099 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7100
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7101 if (replace_stack_nr < replace_offset) /* nothing to do */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7102 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7103 if (replace_stack_len <= replace_stack_nr)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7104 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7105 replace_stack_len += 50;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7106 p = lalloc(sizeof(char_u) * replace_stack_len, TRUE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7107 if (p == NULL) /* out of memory */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7108 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7109 replace_stack_len -= 50;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7110 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7111 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7112 if (replace_stack != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7113 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7114 mch_memmove(p, replace_stack,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7115 (size_t)(replace_stack_nr * sizeof(char_u)));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7116 vim_free(replace_stack);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7117 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7118 replace_stack = p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7119 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7120 p = replace_stack + replace_stack_nr - replace_offset;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7121 if (replace_offset)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7122 mch_memmove(p + 1, p, (size_t)(replace_offset * sizeof(char_u)));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7123 *p = c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7124 ++replace_stack_nr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7125 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7126
1470
48b22e2eb1ed updated for version 7.1-185
vimboss
parents: 1460
diff changeset
7127 #if defined(FEAT_MBYTE) || defined(PROTO)
48b22e2eb1ed updated for version 7.1-185
vimboss
parents: 1460
diff changeset
7128 /*
48b22e2eb1ed updated for version 7.1-185
vimboss
parents: 1460
diff changeset
7129 * Push a character onto the replace stack. Handles a multi-byte character in
48b22e2eb1ed updated for version 7.1-185
vimboss
parents: 1460
diff changeset
7130 * reverse byte order, so that the first byte is popped off first.
48b22e2eb1ed updated for version 7.1-185
vimboss
parents: 1460
diff changeset
7131 * Return the number of bytes done (includes composing characters).
48b22e2eb1ed updated for version 7.1-185
vimboss
parents: 1460
diff changeset
7132 */
48b22e2eb1ed updated for version 7.1-185
vimboss
parents: 1460
diff changeset
7133 int
48b22e2eb1ed updated for version 7.1-185
vimboss
parents: 1460
diff changeset
7134 replace_push_mb(p)
48b22e2eb1ed updated for version 7.1-185
vimboss
parents: 1460
diff changeset
7135 char_u *p;
48b22e2eb1ed updated for version 7.1-185
vimboss
parents: 1460
diff changeset
7136 {
48b22e2eb1ed updated for version 7.1-185
vimboss
parents: 1460
diff changeset
7137 int l = (*mb_ptr2len)(p);
48b22e2eb1ed updated for version 7.1-185
vimboss
parents: 1460
diff changeset
7138 int j;
48b22e2eb1ed updated for version 7.1-185
vimboss
parents: 1460
diff changeset
7139
48b22e2eb1ed updated for version 7.1-185
vimboss
parents: 1460
diff changeset
7140 for (j = l - 1; j >= 0; --j)
48b22e2eb1ed updated for version 7.1-185
vimboss
parents: 1460
diff changeset
7141 replace_push(p[j]);
48b22e2eb1ed updated for version 7.1-185
vimboss
parents: 1460
diff changeset
7142 return l;
48b22e2eb1ed updated for version 7.1-185
vimboss
parents: 1460
diff changeset
7143 }
48b22e2eb1ed updated for version 7.1-185
vimboss
parents: 1460
diff changeset
7144 #endif
48b22e2eb1ed updated for version 7.1-185
vimboss
parents: 1460
diff changeset
7145
840
2c885fab04e3 updated for version 7.0e06
vimboss
parents: 836
diff changeset
7146 #if 0
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7147 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7148 * call replace_push(c) with replace_offset set to the first NUL.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7149 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7150 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7151 replace_push_off(c)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7152 int c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7153 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7154 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7155
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7156 p = replace_stack + replace_stack_nr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7157 for (replace_offset = 1; replace_offset < replace_stack_nr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7158 ++replace_offset)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7159 if (*--p == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7160 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7161 replace_push(c);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7162 replace_offset = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7163 }
840
2c885fab04e3 updated for version 7.0e06
vimboss
parents: 836
diff changeset
7164 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7165
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7166 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7167 * Pop one item from the replace stack.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7168 * return -1 if stack empty
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7169 * return replaced character or NUL otherwise
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7170 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7171 static int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7172 replace_pop()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7173 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7174 if (replace_stack_nr == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7175 return -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7176 return (int)replace_stack[--replace_stack_nr];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7177 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7178
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7179 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7180 * Join the top two items on the replace stack. This removes to "off"'th NUL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7181 * encountered.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7182 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7183 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7184 replace_join(off)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7185 int off; /* offset for which NUL to remove */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7186 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7187 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7188
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7189 for (i = replace_stack_nr; --i >= 0; )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7190 if (replace_stack[i] == NUL && off-- <= 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7191 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7192 --replace_stack_nr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7193 mch_memmove(replace_stack + i, replace_stack + i + 1,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7194 (size_t)(replace_stack_nr - i));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7195 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7196 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7197 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7198
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7199 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7200 * Pop bytes from the replace stack until a NUL is found, and insert them
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7201 * before the cursor. Can only be used in REPLACE or VREPLACE mode.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7202 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7203 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7204 replace_pop_ins()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7205 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7206 int cc;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7207 int oldState = State;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7208
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7209 State = NORMAL; /* don't want REPLACE here */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7210 while ((cc = replace_pop()) > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7211 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7212 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7213 mb_replace_pop_ins(cc);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7214 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7215 ins_char(cc);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7216 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7217 dec_cursor();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7218 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7219 State = oldState;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7220 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7221
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7222 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7223 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7224 * Insert bytes popped from the replace stack. "cc" is the first byte. If it
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7225 * indicates a multi-byte char, pop the other bytes too.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7226 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7227 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7228 mb_replace_pop_ins(cc)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7229 int cc;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7230 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7231 int n;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7232 char_u buf[MB_MAXBYTES];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7233 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7234 int c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7235
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7236 if (has_mbyte && (n = MB_BYTE2LEN(cc)) > 1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7237 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7238 buf[0] = cc;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7239 for (i = 1; i < n; ++i)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7240 buf[i] = replace_pop();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7241 ins_bytes_len(buf, n);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7242 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7243 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7244 ins_char(cc);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7245
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7246 if (enc_utf8)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7247 /* Handle composing chars. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7248 for (;;)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7249 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7250 c = replace_pop();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7251 if (c == -1) /* stack empty */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7252 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7253 if ((n = MB_BYTE2LEN(c)) == 1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7254 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7255 /* Not a multi-byte char, put it back. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7256 replace_push(c);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7257 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7258 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7259 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7260 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7261 buf[0] = c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7262 for (i = 1; i < n; ++i)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7263 buf[i] = replace_pop();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7264 if (utf_iscomposing(utf_ptr2char(buf)))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7265 ins_bytes_len(buf, n);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7266 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7267 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7268 /* Not a composing char, put it back. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7269 for (i = n - 1; i >= 0; --i)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7270 replace_push(buf[i]);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7271 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7272 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7273 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7274 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7275 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7276 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7277
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7278 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7279 * make the replace stack empty
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7280 * (called when exiting replace mode)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7281 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7282 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7283 replace_flush()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7284 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7285 vim_free(replace_stack);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7286 replace_stack = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7287 replace_stack_len = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7288 replace_stack_nr = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7289 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7290
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7291 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7292 * Handle doing a BS for one character.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7293 * cc < 0: replace stack empty, just move cursor
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7294 * cc == 0: character was inserted, delete it
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7295 * cc > 0: character was replaced, put cc (first byte of original char) back
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7296 * and check for more characters to be put back
1782
12cecc379574 updated for version 7.2-080
vimboss
parents: 1698
diff changeset
7297 * When "limit_col" is >= 0, don't delete before this column. Matters when
12cecc379574 updated for version 7.2-080
vimboss
parents: 1698
diff changeset
7298 * using composing characters, use del_char_after_col() instead of del_char().
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7299 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7300 static void
1782
12cecc379574 updated for version 7.2-080
vimboss
parents: 1698
diff changeset
7301 replace_do_bs(limit_col)
12cecc379574 updated for version 7.2-080
vimboss
parents: 1698
diff changeset
7302 int limit_col;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7303 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7304 int cc;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7305 #ifdef FEAT_VREPLACE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7306 int orig_len = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7307 int ins_len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7308 int orig_vcols = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7309 colnr_T start_vcol;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7310 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7311 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7312 int vcol;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7313 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7314
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7315 cc = replace_pop();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7316 if (cc > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7317 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7318 #ifdef FEAT_VREPLACE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7319 if (State & VREPLACE_FLAG)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7320 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7321 /* Get the number of screen cells used by the character we are
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7322 * going to delete. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7323 getvcol(curwin, &curwin->w_cursor, NULL, &start_vcol, NULL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7324 orig_vcols = chartabsize(ml_get_cursor(), start_vcol);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7325 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7326 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7327 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7328 if (has_mbyte)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7329 {
1782
12cecc379574 updated for version 7.2-080
vimboss
parents: 1698
diff changeset
7330 (void)del_char_after_col(limit_col);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7331 # ifdef FEAT_VREPLACE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7332 if (State & VREPLACE_FLAG)
835
8bebcabccc2c updated for version 7.0e01
vimboss
parents: 829
diff changeset
7333 orig_len = (int)STRLEN(ml_get_cursor());
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7334 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7335 replace_push(cc);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7336 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7337 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7338 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7339 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7340 pchar_cursor(cc);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7341 #ifdef FEAT_VREPLACE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7342 if (State & VREPLACE_FLAG)
835
8bebcabccc2c updated for version 7.0e01
vimboss
parents: 829
diff changeset
7343 orig_len = (int)STRLEN(ml_get_cursor()) - 1;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7344 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7345 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7346 replace_pop_ins();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7347
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7348 #ifdef FEAT_VREPLACE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7349 if (State & VREPLACE_FLAG)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7350 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7351 /* Get the number of screen cells used by the inserted characters */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7352 p = ml_get_cursor();
835
8bebcabccc2c updated for version 7.0e01
vimboss
parents: 829
diff changeset
7353 ins_len = (int)STRLEN(p) - orig_len;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7354 vcol = start_vcol;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7355 for (i = 0; i < ins_len; ++i)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7356 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7357 vcol += chartabsize(p + i, vcol);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7358 #ifdef FEAT_MBYTE
474
a5fcf36ef512 updated for version 7.0127
vimboss
parents: 470
diff changeset
7359 i += (*mb_ptr2len)(p) - 1;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7360 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7361 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7362 vcol -= start_vcol;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7363
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7364 /* Delete spaces that were inserted after the cursor to keep the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7365 * text aligned. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7366 curwin->w_cursor.col += ins_len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7367 while (vcol > orig_vcols && gchar_cursor() == ' ')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7368 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7369 del_char(FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7370 ++orig_vcols;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7371 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7372 curwin->w_cursor.col -= ins_len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7373 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7374 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7375
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7376 /* mark the buffer as changed and prepare for displaying */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7377 changed_bytes(curwin->w_cursor.lnum, curwin->w_cursor.col);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7378 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7379 else if (cc == 0)
1782
12cecc379574 updated for version 7.2-080
vimboss
parents: 1698
diff changeset
7380 (void)del_char_after_col(limit_col);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7381 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7382
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7383 #ifdef FEAT_CINDENT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7384 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7385 * Return TRUE if C-indenting is on.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7386 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7387 static int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7388 cindent_on()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7389 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7390 return (!p_paste && (curbuf->b_p_cin
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7391 # ifdef FEAT_EVAL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7392 || *curbuf->b_p_inde != NUL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7393 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7394 ));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7395 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7396 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7397
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7398 #if defined(FEAT_LISP) || defined(FEAT_CINDENT) || defined(PROTO)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7399 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7400 * Re-indent the current line, based on the current contents of it and the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7401 * surrounding lines. Fixing the cursor position seems really easy -- I'm very
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7402 * confused what all the part that handles Control-T is doing that I'm not.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7403 * "get_the_indent" should be get_c_indent, get_expr_indent or get_lisp_indent.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7404 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7405
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7406 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7407 fixthisline(get_the_indent)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7408 int (*get_the_indent) __ARGS((void));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7409 {
1516
ee9d2d24ea9b updated for version 7.1-231
vimboss
parents: 1514
diff changeset
7410 change_indent(INDENT_SET, get_the_indent(), FALSE, 0, TRUE);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7411 if (linewhite(curwin->w_cursor.lnum))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7412 did_ai = TRUE; /* delete the indent if the line stays empty */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7413 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7414
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7415 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7416 fix_indent()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7417 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7418 if (p_paste)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7419 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7420 # ifdef FEAT_LISP
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7421 if (curbuf->b_p_lisp && curbuf->b_p_ai)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7422 fixthisline(get_lisp_indent);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7423 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7424 # if defined(FEAT_LISP) && defined(FEAT_CINDENT)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7425 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7426 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7427 # ifdef FEAT_CINDENT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7428 if (cindent_on())
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7429 do_c_expr_indent();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7430 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7431 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7432
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7433 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7434
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7435 #ifdef FEAT_CINDENT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7436 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7437 * return TRUE if 'cinkeys' contains the key "keytyped",
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7438 * when == '*': Only if key is preceded with '*' (indent before insert)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7439 * when == '!': Only if key is prededed with '!' (don't insert)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7440 * when == ' ': Only if key is not preceded with '*'(indent afterwards)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7441 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7442 * "keytyped" can have a few special values:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7443 * KEY_OPEN_FORW
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7444 * KEY_OPEN_BACK
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7445 * KEY_COMPLETE just finished completion.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7446 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7447 * If line_is_empty is TRUE accept keys with '0' before them.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7448 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7449 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7450 in_cinkeys(keytyped, when, line_is_empty)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7451 int keytyped;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7452 int when;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7453 int line_is_empty;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7454 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7455 char_u *look;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7456 int try_match;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7457 int try_match_word;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7458 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7459 char_u *line;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7460 int icase;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7461 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7462
2025
d06a461924a3 updated for version 7.2-322
vimboss
parents: 2004
diff changeset
7463 if (keytyped == NUL)
d06a461924a3 updated for version 7.2-322
vimboss
parents: 2004
diff changeset
7464 /* Can happen with CTRL-Y and CTRL-E on a short line. */
d06a461924a3 updated for version 7.2-322
vimboss
parents: 2004
diff changeset
7465 return FALSE;
d06a461924a3 updated for version 7.2-322
vimboss
parents: 2004
diff changeset
7466
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7467 #ifdef FEAT_EVAL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7468 if (*curbuf->b_p_inde != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7469 look = curbuf->b_p_indk; /* 'indentexpr' set: use 'indentkeys' */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7470 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7471 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7472 look = curbuf->b_p_cink; /* 'indentexpr' empty: use 'cinkeys' */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7473 while (*look)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7474 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7475 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7476 * Find out if we want to try a match with this key, depending on
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7477 * 'when' and a '*' or '!' before the key.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7478 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7479 switch (when)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7480 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7481 case '*': try_match = (*look == '*'); break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7482 case '!': try_match = (*look == '!'); break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7483 default: try_match = (*look != '*'); break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7484 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7485 if (*look == '*' || *look == '!')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7486 ++look;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7487
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7488 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7489 * If there is a '0', only accept a match if the line is empty.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7490 * But may still match when typing last char of a word.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7491 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7492 if (*look == '0')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7493 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7494 try_match_word = try_match;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7495 if (!line_is_empty)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7496 try_match = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7497 ++look;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7498 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7499 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7500 try_match_word = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7501
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7502 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7503 * does it look like a control character?
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7504 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7505 if (*look == '^'
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7506 #ifdef EBCDIC
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7507 && (Ctrl_chr(look[1]) != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7508 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7509 && look[1] >= '?' && look[1] <= '_'
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7510 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7511 )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7512 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7513 if (try_match && keytyped == Ctrl_chr(look[1]))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7514 return TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7515 look += 2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7516 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7517 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7518 * 'o' means "o" command, open forward.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7519 * 'O' means "O" command, open backward.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7520 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7521 else if (*look == 'o')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7522 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7523 if (try_match && keytyped == KEY_OPEN_FORW)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7524 return TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7525 ++look;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7526 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7527 else if (*look == 'O')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7528 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7529 if (try_match && keytyped == KEY_OPEN_BACK)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7530 return TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7531 ++look;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7532 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7533
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7534 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7535 * 'e' means to check for "else" at start of line and just before the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7536 * cursor.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7537 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7538 else if (*look == 'e')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7539 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7540 if (try_match && keytyped == 'e' && curwin->w_cursor.col >= 4)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7541 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7542 p = ml_get_curline();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7543 if (skipwhite(p) == p + curwin->w_cursor.col - 4 &&
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7544 STRNCMP(p + curwin->w_cursor.col - 4, "else", 4) == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7545 return TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7546 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7547 ++look;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7548 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7549
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7550 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7551 * ':' only causes an indent if it is at the end of a label or case
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7552 * statement, or when it was before typing the ':' (to fix
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7553 * class::method for C++).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7554 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7555 else if (*look == ':')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7556 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7557 if (try_match && keytyped == ':')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7558 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7559 p = ml_get_curline();
2297
5ffe000a9ecf Improve Javascript indenting. Add "J" flag to 'cino'. (Hari Kumar G)
Bram Moolenaar <bram@vim.org>
parents: 2294
diff changeset
7560 if (cin_iscase(p, FALSE) || cin_isscopedecl(p)
5ffe000a9ecf Improve Javascript indenting. Add "J" flag to 'cino'. (Hari Kumar G)
Bram Moolenaar <bram@vim.org>
parents: 2294
diff changeset
7561 || cin_islabel(30))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7562 return TRUE;
1300
bacdeee78827 updated for version 7.1-014
vimboss
parents: 1219
diff changeset
7563 /* Need to get the line again after cin_islabel(). */
bacdeee78827 updated for version 7.1-014
vimboss
parents: 1219
diff changeset
7564 p = ml_get_curline();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7565 if (curwin->w_cursor.col > 2
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7566 && p[curwin->w_cursor.col - 1] == ':'
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7567 && p[curwin->w_cursor.col - 2] == ':')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7568 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7569 p[curwin->w_cursor.col - 1] = ' ';
2297
5ffe000a9ecf Improve Javascript indenting. Add "J" flag to 'cino'. (Hari Kumar G)
Bram Moolenaar <bram@vim.org>
parents: 2294
diff changeset
7570 i = (cin_iscase(p, FALSE) || cin_isscopedecl(p)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7571 || cin_islabel(30));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7572 p = ml_get_curline();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7573 p[curwin->w_cursor.col - 1] = ':';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7574 if (i)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7575 return TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7576 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7577 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7578 ++look;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7579 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7580
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7581
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7582 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7583 * Is it a key in <>, maybe?
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7584 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7585 else if (*look == '<')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7586 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7587 if (try_match)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7588 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7589 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7590 * make up some named keys <o>, <O>, <e>, <0>, <>>, <<>, <*>,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7591 * <:> and <!> so that people can re-indent on o, O, e, 0, <,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7592 * >, *, : and ! keys if they really really want to.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7593 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7594 if (vim_strchr((char_u *)"<>!*oOe0:", look[1]) != NULL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7595 && keytyped == look[1])
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7596 return TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7597
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7598 if (keytyped == get_special_key_code(look + 1))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7599 return TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7600 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7601 while (*look && *look != '>')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7602 look++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7603 while (*look == '>')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7604 look++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7605 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7606
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7607 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7608 * Is it a word: "=word"?
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7609 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7610 else if (*look == '=' && look[1] != ',' && look[1] != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7611 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7612 ++look;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7613 if (*look == '~')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7614 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7615 icase = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7616 ++look;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7617 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7618 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7619 icase = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7620 p = vim_strchr(look, ',');
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7621 if (p == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7622 p = look + STRLEN(look);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7623 if ((try_match || try_match_word)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7624 && curwin->w_cursor.col >= (colnr_T)(p - look))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7625 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7626 int match = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7627
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7628 #ifdef FEAT_INS_EXPAND
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7629 if (keytyped == KEY_COMPLETE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7630 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7631 char_u *s;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7632
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7633 /* Just completed a word, check if it starts with "look".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7634 * search back for the start of a word. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7635 line = ml_get_curline();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7636 # ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7637 if (has_mbyte)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7638 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7639 char_u *n;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7640
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7641 for (s = line + curwin->w_cursor.col; s > line; s = n)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7642 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7643 n = mb_prevptr(line, s);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7644 if (!vim_iswordp(n))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7645 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7646 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7647 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7648 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7649 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7650 for (s = line + curwin->w_cursor.col; s > line; --s)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7651 if (!vim_iswordc(s[-1]))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7652 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7653 if (s + (p - look) <= line + curwin->w_cursor.col
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7654 && (icase
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7655 ? MB_STRNICMP(s, look, p - look)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7656 : STRNCMP(s, look, p - look)) == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7657 match = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7658 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7659 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7660 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7661 /* TODO: multi-byte */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7662 if (keytyped == (int)p[-1] || (icase && keytyped < 256
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7663 && TOLOWER_LOC(keytyped) == TOLOWER_LOC((int)p[-1])))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7664 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7665 line = ml_get_cursor();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7666 if ((curwin->w_cursor.col == (colnr_T)(p - look)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7667 || !vim_iswordc(line[-(p - look) - 1]))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7668 && (icase
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7669 ? MB_STRNICMP(line - (p - look), look, p - look)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7670 : STRNCMP(line - (p - look), look, p - look))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7671 == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7672 match = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7673 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7674 if (match && try_match_word && !try_match)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7675 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7676 /* "0=word": Check if there are only blanks before the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7677 * word. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7678 line = ml_get_curline();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7679 if ((int)(skipwhite(line) - line) !=
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7680 (int)(curwin->w_cursor.col - (p - look)))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7681 match = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7682 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7683 if (match)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7684 return TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7685 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7686 look = p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7687 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7688
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7689 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7690 * ok, it's a boring generic character.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7691 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7692 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7693 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7694 if (try_match && *look == keytyped)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7695 return TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7696 ++look;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7697 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7698
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7699 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7700 * Skip over ", ".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7701 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7702 look = skip_to_option_part(look);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7703 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7704 return FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7705 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7706 #endif /* FEAT_CINDENT */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7707
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7708 #if defined(FEAT_RIGHTLEFT) || defined(PROTO)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7709 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7710 * Map Hebrew keyboard when in hkmap mode.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7711 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7712 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7713 hkmap(c)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7714 int c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7715 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7716 if (p_hkmapp) /* phonetic mapping, by Ilya Dogolazky */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7717 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7718 enum {hALEF=0, BET, GIMEL, DALET, HEI, VAV, ZAIN, HET, TET, IUD,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7719 KAFsofit, hKAF, LAMED, MEMsofit, MEM, NUNsofit, NUN, SAMEH, AIN,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7720 PEIsofit, PEI, ZADIsofit, ZADI, KOF, RESH, hSHIN, TAV};
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7721 static char_u map[26] =
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7722 {(char_u)hALEF/*a*/, (char_u)BET /*b*/, (char_u)hKAF /*c*/,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7723 (char_u)DALET/*d*/, (char_u)-1 /*e*/, (char_u)PEIsofit/*f*/,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7724 (char_u)GIMEL/*g*/, (char_u)HEI /*h*/, (char_u)IUD /*i*/,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7725 (char_u)HET /*j*/, (char_u)KOF /*k*/, (char_u)LAMED /*l*/,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7726 (char_u)MEM /*m*/, (char_u)NUN /*n*/, (char_u)SAMEH /*o*/,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7727 (char_u)PEI /*p*/, (char_u)-1 /*q*/, (char_u)RESH /*r*/,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7728 (char_u)ZAIN /*s*/, (char_u)TAV /*t*/, (char_u)TET /*u*/,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7729 (char_u)VAV /*v*/, (char_u)hSHIN/*w*/, (char_u)-1 /*x*/,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7730 (char_u)AIN /*y*/, (char_u)ZADI /*z*/};
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7731
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7732 if (c == 'N' || c == 'M' || c == 'P' || c == 'C' || c == 'Z')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7733 return (int)(map[CharOrd(c)] - 1 + p_aleph);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7734 /* '-1'='sofit' */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7735 else if (c == 'x')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7736 return 'X';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7737 else if (c == 'q')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7738 return '\''; /* {geresh}={'} */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7739 else if (c == 246)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7740 return ' '; /* \"o --> ' ' for a german keyboard */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7741 else if (c == 228)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7742 return ' '; /* \"a --> ' ' -- / -- */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7743 else if (c == 252)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7744 return ' '; /* \"u --> ' ' -- / -- */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7745 #ifdef EBCDIC
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7746 else if (islower(c))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7747 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7748 /* NOTE: islower() does not do the right thing for us on Linux so we
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7749 * do this the same was as 5.7 and previous, so it works correctly on
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7750 * all systems. Specifically, the e.g. Delete and Arrow keys are
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7751 * munged and won't work if e.g. searching for Hebrew text.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7752 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7753 else if (c >= 'a' && c <= 'z')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7754 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7755 return (int)(map[CharOrdLow(c)] + p_aleph);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7756 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7757 return c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7758 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7759 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7760 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7761 switch (c)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7762 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7763 case '`': return ';';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7764 case '/': return '.';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7765 case '\'': return ',';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7766 case 'q': return '/';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7767 case 'w': return '\'';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7768
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7769 /* Hebrew letters - set offset from 'a' */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7770 case ',': c = '{'; break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7771 case '.': c = 'v'; break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7772 case ';': c = 't'; break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7773 default: {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7774 static char str[] = "zqbcxlsjphmkwonu ydafe rig";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7775
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7776 #ifdef EBCDIC
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7777 /* see note about islower() above */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7778 if (!islower(c))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7779 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7780 if (c < 'a' || c > 'z')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7781 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7782 return c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7783 c = str[CharOrdLow(c)];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7784 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7785 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7786 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7787
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7788 return (int)(CharOrdLow(c) + p_aleph);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7789 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7790 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7791 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7792
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7793 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7794 ins_reg()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7795 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7796 int need_redraw = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7797 int regname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7798 int literally = 0;
844
d3bbb5dd3913 updated for version 7.0f02
vimboss
parents: 842
diff changeset
7799 #ifdef FEAT_VISUAL
d3bbb5dd3913 updated for version 7.0f02
vimboss
parents: 842
diff changeset
7800 int vis_active = VIsual_active;
d3bbb5dd3913 updated for version 7.0f02
vimboss
parents: 842
diff changeset
7801 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7802
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7803 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7804 * If we are going to wait for a character, show a '"'.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7805 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7806 pc_status = PC_STATUS_UNSET;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7807 if (redrawing() && !char_avail())
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7808 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7809 /* may need to redraw when no more chars available now */
661
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 659
diff changeset
7810 ins_redraw(FALSE);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7811
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7812 edit_putchar('"', TRUE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7813 #ifdef FEAT_CMDL_INFO
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7814 add_to_showcmd_c(Ctrl_R);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7815 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7816 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7817
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7818 #ifdef USE_ON_FLY_SCROLL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7819 dont_scroll = TRUE; /* disallow scrolling here */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7820 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7821
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7822 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7823 * Don't map the register name. This also prevents the mode message to be
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7824 * deleted when ESC is hit.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7825 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7826 ++no_mapping;
1389
bdcfe793d49f updated for version 7.1-104
vimboss
parents: 1353
diff changeset
7827 regname = plain_vgetc();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7828 LANGMAP_ADJUST(regname, TRUE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7829 if (regname == Ctrl_R || regname == Ctrl_O || regname == Ctrl_P)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7830 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7831 /* Get a third key for literal register insertion */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7832 literally = regname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7833 #ifdef FEAT_CMDL_INFO
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7834 add_to_showcmd_c(literally);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7835 #endif
1389
bdcfe793d49f updated for version 7.1-104
vimboss
parents: 1353
diff changeset
7836 regname = plain_vgetc();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7837 LANGMAP_ADJUST(regname, TRUE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7838 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7839 --no_mapping;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7840
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7841 #ifdef FEAT_EVAL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7842 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7843 * Don't call u_sync() while getting the expression,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7844 * evaluating it or giving an error message for it!
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7845 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7846 ++no_u_sync;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7847 if (regname == '=')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7848 {
133
bcb347a8f934 updated for version 7.0044
vimboss
parents: 75
diff changeset
7849 # ifdef USE_IM_CONTROL
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7850 int im_on = im_get_status();
133
bcb347a8f934 updated for version 7.0044
vimboss
parents: 75
diff changeset
7851 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7852 regname = get_expr_register();
133
bcb347a8f934 updated for version 7.0044
vimboss
parents: 75
diff changeset
7853 # ifdef USE_IM_CONTROL
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7854 /* Restore the Input Method. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7855 if (im_on)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7856 im_set_active(TRUE);
133
bcb347a8f934 updated for version 7.0044
vimboss
parents: 75
diff changeset
7857 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7858 }
140
8ecb0db93e9a updated for version 7.0045
vimboss
parents: 133
diff changeset
7859 if (regname == NUL || !valid_yank_reg(regname, FALSE))
8ecb0db93e9a updated for version 7.0045
vimboss
parents: 133
diff changeset
7860 {
8ecb0db93e9a updated for version 7.0045
vimboss
parents: 133
diff changeset
7861 vim_beep();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7862 need_redraw = TRUE; /* remove the '"' */
140
8ecb0db93e9a updated for version 7.0045
vimboss
parents: 133
diff changeset
7863 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7864 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7865 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7866 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7867 if (literally == Ctrl_O || literally == Ctrl_P)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7868 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7869 /* Append the command to the redo buffer. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7870 AppendCharToRedobuff(Ctrl_R);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7871 AppendCharToRedobuff(literally);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7872 AppendCharToRedobuff(regname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7873
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7874 do_put(regname, BACKWARD, 1L,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7875 (literally == Ctrl_P ? PUT_FIXINDENT : 0) | PUT_CURSEND);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7876 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7877 else if (insert_reg(regname, literally) == FAIL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7878 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7879 vim_beep();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7880 need_redraw = TRUE; /* remove the '"' */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7881 }
133
bcb347a8f934 updated for version 7.0044
vimboss
parents: 75
diff changeset
7882 else if (stop_insert_mode)
bcb347a8f934 updated for version 7.0044
vimboss
parents: 75
diff changeset
7883 /* When the '=' register was used and a function was invoked that
bcb347a8f934 updated for version 7.0044
vimboss
parents: 75
diff changeset
7884 * did ":stopinsert" then stuff_empty() returns FALSE but we won't
bcb347a8f934 updated for version 7.0044
vimboss
parents: 75
diff changeset
7885 * insert anything, need to remove the '"' */
bcb347a8f934 updated for version 7.0044
vimboss
parents: 75
diff changeset
7886 need_redraw = TRUE;
bcb347a8f934 updated for version 7.0044
vimboss
parents: 75
diff changeset
7887
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7888 #ifdef FEAT_EVAL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7889 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7890 --no_u_sync;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7891 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7892 #ifdef FEAT_CMDL_INFO
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7893 clear_showcmd();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7894 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7895
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7896 /* If the inserted register is empty, we need to remove the '"' */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7897 if (need_redraw || stuff_empty())
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7898 edit_unputchar();
844
d3bbb5dd3913 updated for version 7.0f02
vimboss
parents: 842
diff changeset
7899
d3bbb5dd3913 updated for version 7.0f02
vimboss
parents: 842
diff changeset
7900 #ifdef FEAT_VISUAL
d3bbb5dd3913 updated for version 7.0f02
vimboss
parents: 842
diff changeset
7901 /* Disallow starting Visual mode here, would get a weird mode. */
d3bbb5dd3913 updated for version 7.0f02
vimboss
parents: 842
diff changeset
7902 if (!vis_active && VIsual_active)
d3bbb5dd3913 updated for version 7.0f02
vimboss
parents: 842
diff changeset
7903 end_visual_mode();
d3bbb5dd3913 updated for version 7.0f02
vimboss
parents: 842
diff changeset
7904 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7905 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7906
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7907 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7908 * CTRL-G commands in Insert mode.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7909 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7910 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7911 ins_ctrl_g()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7912 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7913 int c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7914
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7915 #ifdef FEAT_INS_EXPAND
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7916 /* Right after CTRL-X the cursor will be after the ruler. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7917 setcursor();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7918 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7919
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7920 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7921 * Don't map the second key. This also prevents the mode message to be
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7922 * deleted when ESC is hit.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7923 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7924 ++no_mapping;
1389
bdcfe793d49f updated for version 7.1-104
vimboss
parents: 1353
diff changeset
7925 c = plain_vgetc();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7926 --no_mapping;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7927 switch (c)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7928 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7929 /* CTRL-G k and CTRL-G <Up>: cursor up to Insstart.col */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7930 case K_UP:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7931 case Ctrl_K:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7932 case 'k': ins_up(TRUE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7933 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7934
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7935 /* CTRL-G j and CTRL-G <Down>: cursor down to Insstart.col */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7936 case K_DOWN:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7937 case Ctrl_J:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7938 case 'j': ins_down(TRUE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7939 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7940
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7941 /* CTRL-G u: start new undoable edit */
825
6675076019ae updated for version 7.0d
vimboss
parents: 819
diff changeset
7942 case 'u': u_sync(TRUE);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7943 ins_need_undo = TRUE;
626
732c7ae5743e updated for version 7.0180
vimboss
parents: 625
diff changeset
7944
732c7ae5743e updated for version 7.0180
vimboss
parents: 625
diff changeset
7945 /* Need to reset Insstart, esp. because a BS that joins
1219
aea597af5b4e updated for version 7.1b
vimboss
parents: 1159
diff changeset
7946 * a line to the previous one must save for undo. */
626
732c7ae5743e updated for version 7.0180
vimboss
parents: 625
diff changeset
7947 Insstart = curwin->w_cursor;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7948 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7949
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7950 /* Unknown CTRL-G command, reserved for future expansion. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7951 default: vim_beep();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7952 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7953 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7954
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7955 /*
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
7956 * CTRL-^ in Insert mode.
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
7957 */
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
7958 static void
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
7959 ins_ctrl_hat()
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
7960 {
782
d20041a02ee5 updated for version 7.0228
vimboss
parents: 773
diff changeset
7961 if (map_to_exists_mode((char_u *)"", LANGMAP, FALSE))
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
7962 {
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
7963 /* ":lmap" mappings exists, Toggle use of ":lmap" mappings. */
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
7964 if (State & LANGMAP)
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
7965 {
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
7966 curbuf->b_p_iminsert = B_IMODE_NONE;
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
7967 State &= ~LANGMAP;
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
7968 }
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
7969 else
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
7970 {
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
7971 curbuf->b_p_iminsert = B_IMODE_LMAP;
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
7972 State |= LANGMAP;
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
7973 #ifdef USE_IM_CONTROL
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
7974 im_set_active(FALSE);
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
7975 #endif
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
7976 }
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
7977 }
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
7978 #ifdef USE_IM_CONTROL
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
7979 else
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
7980 {
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
7981 /* There are no ":lmap" mappings, toggle IM */
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
7982 if (im_get_status())
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
7983 {
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
7984 curbuf->b_p_iminsert = B_IMODE_NONE;
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
7985 im_set_active(FALSE);
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
7986 }
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
7987 else
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
7988 {
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
7989 curbuf->b_p_iminsert = B_IMODE_IM;
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
7990 State &= ~LANGMAP;
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
7991 im_set_active(TRUE);
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
7992 }
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
7993 }
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
7994 #endif
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
7995 set_iminsert_global();
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
7996 showmode();
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
7997 #ifdef FEAT_GUI
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
7998 /* may show different cursor shape or color */
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
7999 if (gui.in_use)
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
8000 gui_update_cursor(TRUE, FALSE);
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
8001 #endif
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
8002 #if defined(FEAT_WINDOWS) && defined(FEAT_KEYMAP)
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
8003 /* Show/unshow value of 'keymap' in status lines. */
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
8004 status_redraw_curbuf();
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
8005 #endif
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
8006 }
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
8007
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
8008 /*
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8009 * Handle ESC in insert mode.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8010 * Returns TRUE when leaving insert mode, FALSE when going to repeat the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8011 * insert.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8012 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8013 static int
477
f8b75b8f1988 updated for version 7.0128
vimboss
parents: 474
diff changeset
8014 ins_esc(count, cmdchar, nomove)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8015 long *count;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8016 int cmdchar;
477
f8b75b8f1988 updated for version 7.0128
vimboss
parents: 474
diff changeset
8017 int nomove; /* don't move cursor */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8018 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8019 int temp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8020 static int disabled_redraw = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8021
744
07f7b4a7755c updated for version 7.0222
vimboss
parents: 732
diff changeset
8022 #ifdef FEAT_SPELL
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
8023 check_spell_redraw();
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
8024 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8025 #if defined(FEAT_HANGULIN)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8026 # if defined(ESC_CHG_TO_ENG_MODE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8027 hangul_input_state_set(0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8028 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8029 if (composing_hangul)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8030 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8031 push_raw_key(composing_hangul_buffer, 2);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8032 composing_hangul = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8033 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8034 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8035
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8036 temp = curwin->w_cursor.col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8037 if (disabled_redraw)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8038 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8039 --RedrawingDisabled;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8040 disabled_redraw = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8041 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8042 if (!arrow_used)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8043 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8044 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8045 * Don't append the ESC for "r<CR>" and "grx".
75
388f285bda1b updated for version 7.0031
vimboss
parents: 41
diff changeset
8046 * When 'insertmode' is set only CTRL-L stops Insert mode. Needed for
388f285bda1b updated for version 7.0031
vimboss
parents: 41
diff changeset
8047 * when "count" is non-zero.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8048 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8049 if (cmdchar != 'r' && cmdchar != 'v')
75
388f285bda1b updated for version 7.0031
vimboss
parents: 41
diff changeset
8050 AppendToRedobuff(p_im ? (char_u *)"\014" : ESC_STR);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8051
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8052 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8053 * Repeating insert may take a long time. Check for
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8054 * interrupt now and then.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8055 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8056 if (*count > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8057 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8058 line_breakcheck();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8059 if (got_int)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8060 *count = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8061 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8062
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8063 if (--*count > 0) /* repeat what was typed */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8064 {
164
8b0ee9d57d7f updated for version 7.0050
vimboss
parents: 161
diff changeset
8065 /* Vi repeats the insert without replacing characters. */
8b0ee9d57d7f updated for version 7.0050
vimboss
parents: 161
diff changeset
8066 if (vim_strchr(p_cpo, CPO_REPLCNT) != NULL)
8b0ee9d57d7f updated for version 7.0050
vimboss
parents: 161
diff changeset
8067 State &= ~REPLACE_FLAG;
8b0ee9d57d7f updated for version 7.0050
vimboss
parents: 161
diff changeset
8068
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8069 (void)start_redo_ins();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8070 if (cmdchar == 'r' || cmdchar == 'v')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8071 stuffReadbuff(ESC_STR); /* no ESC in redo buffer */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8072 ++RedrawingDisabled;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8073 disabled_redraw = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8074 return FALSE; /* repeat the insert */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8075 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8076 stop_insert(&curwin->w_cursor, TRUE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8077 undisplay_dollar();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8078 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8079
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8080 /* When an autoindent was removed, curswant stays after the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8081 * indent */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8082 if (restart_edit == NUL && (colnr_T)temp == curwin->w_cursor.col)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8083 curwin->w_set_curswant = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8084
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8085 /* Remember the last Insert position in the '^ mark. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8086 if (!cmdmod.keepjumps)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8087 curbuf->b_last_insert = curwin->w_cursor;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8088
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8089 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8090 * The cursor should end up on the last inserted character.
477
f8b75b8f1988 updated for version 7.0128
vimboss
parents: 474
diff changeset
8091 * Don't do it for CTRL-O, unless past the end of the line.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8092 */
477
f8b75b8f1988 updated for version 7.0128
vimboss
parents: 474
diff changeset
8093 if (!nomove
f8b75b8f1988 updated for version 7.0128
vimboss
parents: 474
diff changeset
8094 && (curwin->w_cursor.col != 0
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8095 #ifdef FEAT_VIRTUALEDIT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8096 || curwin->w_cursor.coladd > 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8097 #endif
477
f8b75b8f1988 updated for version 7.0128
vimboss
parents: 474
diff changeset
8098 )
f8b75b8f1988 updated for version 7.0128
vimboss
parents: 474
diff changeset
8099 && (restart_edit == NUL
f8b75b8f1988 updated for version 7.0128
vimboss
parents: 474
diff changeset
8100 || (gchar_cursor() == NUL
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8101 #ifdef FEAT_VISUAL
477
f8b75b8f1988 updated for version 7.0128
vimboss
parents: 474
diff changeset
8102 && !VIsual_active
f8b75b8f1988 updated for version 7.0128
vimboss
parents: 474
diff changeset
8103 #endif
f8b75b8f1988 updated for version 7.0128
vimboss
parents: 474
diff changeset
8104 ))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8105 #ifdef FEAT_RIGHTLEFT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8106 && !revins_on
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8107 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8108 )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8109 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8110 #ifdef FEAT_VIRTUALEDIT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8111 if (curwin->w_cursor.coladd > 0 || ve_flags == VE_ALL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8112 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8113 oneleft();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8114 if (restart_edit != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8115 ++curwin->w_cursor.coladd;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8116 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8117 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8118 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8119 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8120 --curwin->w_cursor.col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8121 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8122 /* Correct cursor for multi-byte character. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8123 if (has_mbyte)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8124 mb_adjust_cursor();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8125 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8126 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8127 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8128
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8129 #ifdef USE_IM_CONTROL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8130 /* Disable IM to allow typing English directly for Normal mode commands.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8131 * When ":lmap" is enabled don't change 'iminsert' (IM can be enabled as
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8132 * well). */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8133 if (!(State & LANGMAP))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8134 im_save_status(&curbuf->b_p_iminsert);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8135 im_set_active(FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8136 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8137
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8138 State = NORMAL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8139 /* need to position cursor again (e.g. when on a TAB ) */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8140 changed_cline_bef_curs();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8141
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8142 #ifdef FEAT_MOUSE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8143 setmouse();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8144 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8145 #ifdef CURSOR_SHAPE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8146 ui_cursor_shape(); /* may show different cursor shape */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8147 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8148
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8149 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8150 * When recording or for CTRL-O, need to display the new mode.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8151 * Otherwise remove the mode message.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8152 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8153 if (Recording || restart_edit != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8154 showmode();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8155 else if (p_smd)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8156 MSG("");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8157
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8158 return TRUE; /* exit Insert mode */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8159 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8160
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8161 #ifdef FEAT_RIGHTLEFT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8162 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8163 * Toggle language: hkmap and revins_on.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8164 * Move to end of reverse inserted text.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8165 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8166 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8167 ins_ctrl_()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8168 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8169 if (revins_on && revins_chars && revins_scol >= 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8170 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8171 while (gchar_cursor() != NUL && revins_chars--)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8172 ++curwin->w_cursor.col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8173 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8174 p_ri = !p_ri;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8175 revins_on = (State == INSERT && p_ri);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8176 if (revins_on)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8177 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8178 revins_scol = curwin->w_cursor.col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8179 revins_legal++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8180 revins_chars = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8181 undisplay_dollar();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8182 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8183 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8184 revins_scol = -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8185 #ifdef FEAT_FKMAP
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8186 if (p_altkeymap)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8187 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8188 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8189 * to be consistent also for redo command, using '.'
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8190 * set arrow_used to true and stop it - causing to redo
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8191 * characters entered in one mode (normal/reverse insert).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8192 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8193 arrow_used = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8194 (void)stop_arrow();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8195 p_fkmap = curwin->w_p_rl ^ p_ri;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8196 if (p_fkmap && p_ri)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8197 State = INSERT;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8198 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8199 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8200 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8201 p_hkmap = curwin->w_p_rl ^ p_ri; /* be consistent! */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8202 showmode();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8203 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8204 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8205
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8206 #ifdef FEAT_VISUAL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8207 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8208 * If 'keymodel' contains "startsel", may start selection.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8209 * Returns TRUE when a CTRL-O and other keys stuffed.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8210 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8211 static int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8212 ins_start_select(c)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8213 int c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8214 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8215 if (km_startsel)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8216 switch (c)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8217 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8218 case K_KHOME:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8219 case K_KEND:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8220 case K_PAGEUP:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8221 case K_KPAGEUP:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8222 case K_PAGEDOWN:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8223 case K_KPAGEDOWN:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8224 # ifdef MACOS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8225 case K_LEFT:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8226 case K_RIGHT:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8227 case K_UP:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8228 case K_DOWN:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8229 case K_END:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8230 case K_HOME:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8231 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8232 if (!(mod_mask & MOD_MASK_SHIFT))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8233 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8234 /* FALLTHROUGH */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8235 case K_S_LEFT:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8236 case K_S_RIGHT:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8237 case K_S_UP:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8238 case K_S_DOWN:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8239 case K_S_END:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8240 case K_S_HOME:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8241 /* Start selection right away, the cursor can move with
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8242 * CTRL-O when beyond the end of the line. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8243 start_selection();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8244
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8245 /* Execute the key in (insert) Select mode. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8246 stuffcharReadbuff(Ctrl_O);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8247 if (mod_mask)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8248 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8249 char_u buf[4];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8250
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8251 buf[0] = K_SPECIAL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8252 buf[1] = KS_MODIFIER;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8253 buf[2] = mod_mask;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8254 buf[3] = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8255 stuffReadbuff(buf);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8256 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8257 stuffcharReadbuff(c);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8258 return TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8259 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8260 return FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8261 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8262 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8263
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8264 /*
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
8265 * <Insert> key in Insert mode: toggle insert/remplace mode.
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
8266 */
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
8267 static void
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
8268 ins_insert(replaceState)
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
8269 int replaceState;
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
8270 {
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
8271 #ifdef FEAT_FKMAP
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
8272 if (p_fkmap && p_ri)
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
8273 {
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
8274 beep_flush();
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
8275 EMSG(farsi_text_3); /* encoded in Farsi */
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
8276 return;
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
8277 }
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
8278 #endif
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
8279
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
8280 #ifdef FEAT_AUTOCMD
532
7052f11a3dc9 updated for version 7.0150
vimboss
parents: 523
diff changeset
8281 # ifdef FEAT_EVAL
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
8282 set_vim_var_string(VV_INSERTMODE,
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
8283 (char_u *)((State & REPLACE_FLAG) ? "i" :
667
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
8284 # ifdef FEAT_VREPLACE
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
8285 replaceState == VREPLACE ? "v" :
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
8286 # endif
9090f866cd57 updated for version 7.0197
vimboss
parents: 665
diff changeset
8287 "r"), 1);
532
7052f11a3dc9 updated for version 7.0150
vimboss
parents: 523
diff changeset
8288 # endif
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
8289 apply_autocmds(EVENT_INSERTCHANGE, NULL, NULL, FALSE, curbuf);
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
8290 #endif
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
8291 if (State & REPLACE_FLAG)
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
8292 State = INSERT | (State & LANGMAP);
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
8293 else
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
8294 State = replaceState | (State & LANGMAP);
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
8295 AppendCharToRedobuff(K_INS);
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
8296 showmode();
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
8297 #ifdef CURSOR_SHAPE
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
8298 ui_cursor_shape(); /* may show different cursor shape */
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
8299 #endif
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
8300 }
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
8301
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
8302 /*
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
8303 * Pressed CTRL-O in Insert mode.
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
8304 */
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
8305 static void
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
8306 ins_ctrl_o()
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
8307 {
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
8308 #ifdef FEAT_VREPLACE
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
8309 if (State & VREPLACE_FLAG)
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
8310 restart_edit = 'V';
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
8311 else
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
8312 #endif
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
8313 if (State & REPLACE_FLAG)
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
8314 restart_edit = 'R';
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
8315 else
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
8316 restart_edit = 'I';
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
8317 #ifdef FEAT_VIRTUALEDIT
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
8318 if (virtual_active())
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
8319 ins_at_eol = FALSE; /* cursor always keeps its column */
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
8320 else
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
8321 #endif
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
8322 ins_at_eol = (gchar_cursor() == NUL);
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
8323 }
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
8324
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
8325 /*
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8326 * If the cursor is on an indent, ^T/^D insert/delete one
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8327 * shiftwidth. Otherwise ^T/^D behave like a "<<" or ">>".
1796
4589d1792c03 updated for version 7.2-094
vimboss
parents: 1782
diff changeset
8328 * Always round the indent to 'shiftwidth', this is compatible
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8329 * with vi. But vi only supports ^T and ^D after an
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8330 * autoindent, we support it everywhere.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8331 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8332 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8333 ins_shift(c, lastc)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8334 int c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8335 int lastc;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8336 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8337 if (stop_arrow() == FAIL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8338 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8339 AppendCharToRedobuff(c);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8340
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8341 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8342 * 0^D and ^^D: remove all indent.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8343 */
1330
9fb5bb1ea79b updated for version 7.1-044
vimboss
parents: 1300
diff changeset
8344 if (c == Ctrl_D && (lastc == '0' || lastc == '^')
9fb5bb1ea79b updated for version 7.1-044
vimboss
parents: 1300
diff changeset
8345 && curwin->w_cursor.col > 0)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8346 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8347 --curwin->w_cursor.col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8348 (void)del_char(FALSE); /* delete the '^' or '0' */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8349 /* In Replace mode, restore the characters that '^' or '0' replaced. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8350 if (State & REPLACE_FLAG)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8351 replace_pop_ins();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8352 if (lastc == '^')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8353 old_indent = get_indent(); /* remember curr. indent */
1516
ee9d2d24ea9b updated for version 7.1-231
vimboss
parents: 1514
diff changeset
8354 change_indent(INDENT_SET, 0, TRUE, 0, TRUE);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8355 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8356 else
1516
ee9d2d24ea9b updated for version 7.1-231
vimboss
parents: 1514
diff changeset
8357 change_indent(c == Ctrl_D ? INDENT_DEC : INDENT_INC, 0, TRUE, 0, TRUE);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8358
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8359 if (did_ai && *skipwhite(ml_get_curline()) != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8360 did_ai = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8361 #ifdef FEAT_SMARTINDENT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8362 did_si = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8363 can_si = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8364 can_si_back = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8365 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8366 #ifdef FEAT_CINDENT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8367 can_cindent = FALSE; /* no cindenting after ^D or ^T */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8368 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8369 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8370
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8371 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8372 ins_del()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8373 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8374 int temp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8375
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8376 if (stop_arrow() == FAIL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8377 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8378 if (gchar_cursor() == NUL) /* delete newline */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8379 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8380 temp = curwin->w_cursor.col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8381 if (!can_bs(BS_EOL) /* only if "eol" included */
2294
2209060c340d Make joining a range of lines much faster. (Milan Vancura)
Bram Moolenaar <bram@vim.org>
parents: 2282
diff changeset
8382 || do_join(2, FALSE, TRUE) == FAIL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8383 vim_beep();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8384 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8385 curwin->w_cursor.col = temp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8386 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8387 else if (del_char(FALSE) == FAIL) /* delete char under cursor */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8388 vim_beep();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8389 did_ai = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8390 #ifdef FEAT_SMARTINDENT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8391 did_si = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8392 can_si = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8393 can_si_back = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8394 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8395 AppendCharToRedobuff(K_DEL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8396 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8397
1460
b0dabd584b8f updated for version 7.1-175
vimboss
parents: 1446
diff changeset
8398 static void ins_bs_one __ARGS((colnr_T *vcolp));
b0dabd584b8f updated for version 7.1-175
vimboss
parents: 1446
diff changeset
8399
b0dabd584b8f updated for version 7.1-175
vimboss
parents: 1446
diff changeset
8400 /*
b0dabd584b8f updated for version 7.1-175
vimboss
parents: 1446
diff changeset
8401 * Delete one character for ins_bs().
b0dabd584b8f updated for version 7.1-175
vimboss
parents: 1446
diff changeset
8402 */
b0dabd584b8f updated for version 7.1-175
vimboss
parents: 1446
diff changeset
8403 static void
b0dabd584b8f updated for version 7.1-175
vimboss
parents: 1446
diff changeset
8404 ins_bs_one(vcolp)
b0dabd584b8f updated for version 7.1-175
vimboss
parents: 1446
diff changeset
8405 colnr_T *vcolp;
b0dabd584b8f updated for version 7.1-175
vimboss
parents: 1446
diff changeset
8406 {
b0dabd584b8f updated for version 7.1-175
vimboss
parents: 1446
diff changeset
8407 dec_cursor();
b0dabd584b8f updated for version 7.1-175
vimboss
parents: 1446
diff changeset
8408 getvcol(curwin, &curwin->w_cursor, vcolp, NULL, NULL);
b0dabd584b8f updated for version 7.1-175
vimboss
parents: 1446
diff changeset
8409 if (State & REPLACE_FLAG)
b0dabd584b8f updated for version 7.1-175
vimboss
parents: 1446
diff changeset
8410 {
b0dabd584b8f updated for version 7.1-175
vimboss
parents: 1446
diff changeset
8411 /* Don't delete characters before the insert point when in
b0dabd584b8f updated for version 7.1-175
vimboss
parents: 1446
diff changeset
8412 * Replace mode */
b0dabd584b8f updated for version 7.1-175
vimboss
parents: 1446
diff changeset
8413 if (curwin->w_cursor.lnum != Insstart.lnum
b0dabd584b8f updated for version 7.1-175
vimboss
parents: 1446
diff changeset
8414 || curwin->w_cursor.col >= Insstart.col)
1782
12cecc379574 updated for version 7.2-080
vimboss
parents: 1698
diff changeset
8415 replace_do_bs(-1);
1460
b0dabd584b8f updated for version 7.1-175
vimboss
parents: 1446
diff changeset
8416 }
b0dabd584b8f updated for version 7.1-175
vimboss
parents: 1446
diff changeset
8417 else
b0dabd584b8f updated for version 7.1-175
vimboss
parents: 1446
diff changeset
8418 (void)del_char(FALSE);
b0dabd584b8f updated for version 7.1-175
vimboss
parents: 1446
diff changeset
8419 }
b0dabd584b8f updated for version 7.1-175
vimboss
parents: 1446
diff changeset
8420
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8421 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8422 * Handle Backspace, delete-word and delete-line in Insert mode.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8423 * Return TRUE when backspace was actually used.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8424 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8425 static int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8426 ins_bs(c, mode, inserted_space_p)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8427 int c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8428 int mode;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8429 int *inserted_space_p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8430 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8431 linenr_T lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8432 int cc;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8433 int temp = 0; /* init for GCC */
1872
f13849167330 updated for version 7.2-169
vimboss
parents: 1869
diff changeset
8434 colnr_T save_col;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8435 colnr_T mincol;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8436 int did_backspace = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8437 int in_indent;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8438 int oldState;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8439 #ifdef FEAT_MBYTE
714
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 712
diff changeset
8440 int cpc[MAX_MCO]; /* composing characters */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8441 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8442
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8443 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8444 * can't delete anything in an empty file
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8445 * can't backup past first character in buffer
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8446 * can't backup past starting point unless 'backspace' > 1
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8447 * can backup to a previous line if 'backspace' == 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8448 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8449 if ( bufempty()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8450 || (
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8451 #ifdef FEAT_RIGHTLEFT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8452 !revins_on &&
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8453 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8454 ((curwin->w_cursor.lnum == 1 && curwin->w_cursor.col == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8455 || (!can_bs(BS_START)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8456 && (arrow_used
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8457 || (curwin->w_cursor.lnum == Insstart.lnum
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8458 && curwin->w_cursor.col <= Insstart.col)))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8459 || (!can_bs(BS_INDENT) && !arrow_used && ai_col > 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8460 && curwin->w_cursor.col <= ai_col)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8461 || (!can_bs(BS_EOL) && curwin->w_cursor.col == 0))))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8462 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8463 vim_beep();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8464 return FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8465 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8466
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8467 if (stop_arrow() == FAIL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8468 return FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8469 in_indent = inindent(0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8470 #ifdef FEAT_CINDENT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8471 if (in_indent)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8472 can_cindent = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8473 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8474 #ifdef FEAT_COMMENTS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8475 end_comment_pending = NUL; /* After BS, don't auto-end comment */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8476 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8477 #ifdef FEAT_RIGHTLEFT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8478 if (revins_on) /* put cursor after last inserted char */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8479 inc_cursor();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8480 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8481
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8482 #ifdef FEAT_VIRTUALEDIT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8483 /* Virtualedit:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8484 * BACKSPACE_CHAR eats a virtual space
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8485 * BACKSPACE_WORD eats all coladd
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8486 * BACKSPACE_LINE eats all coladd and keeps going
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8487 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8488 if (curwin->w_cursor.coladd > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8489 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8490 if (mode == BACKSPACE_CHAR)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8491 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8492 --curwin->w_cursor.coladd;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8493 return TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8494 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8495 if (mode == BACKSPACE_WORD)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8496 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8497 curwin->w_cursor.coladd = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8498 return TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8499 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8500 curwin->w_cursor.coladd = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8501 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8502 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8503
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8504 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8505 * delete newline!
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8506 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8507 if (curwin->w_cursor.col == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8508 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8509 lnum = Insstart.lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8510 if (curwin->w_cursor.lnum == Insstart.lnum
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8511 #ifdef FEAT_RIGHTLEFT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8512 || revins_on
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8513 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8514 )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8515 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8516 if (u_save((linenr_T)(curwin->w_cursor.lnum - 2),
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8517 (linenr_T)(curwin->w_cursor.lnum + 1)) == FAIL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8518 return FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8519 --Insstart.lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8520 Insstart.col = MAXCOL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8521 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8522 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8523 * In replace mode:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8524 * cc < 0: NL was inserted, delete it
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8525 * cc >= 0: NL was replaced, put original characters back
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8526 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8527 cc = -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8528 if (State & REPLACE_FLAG)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8529 cc = replace_pop(); /* returns -1 if NL was inserted */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8530 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8531 * In replace mode, in the line we started replacing, we only move the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8532 * cursor.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8533 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8534 if ((State & REPLACE_FLAG) && curwin->w_cursor.lnum <= lnum)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8535 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8536 dec_cursor();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8537 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8538 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8539 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8540 #ifdef FEAT_VREPLACE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8541 if (!(State & VREPLACE_FLAG)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8542 || curwin->w_cursor.lnum > orig_line_count)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8543 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8544 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8545 temp = gchar_cursor(); /* remember current char */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8546 --curwin->w_cursor.lnum;
278
a7e59720a155 updated for version 7.0074
vimboss
parents: 274
diff changeset
8547
a7e59720a155 updated for version 7.0074
vimboss
parents: 274
diff changeset
8548 /* When "aw" is in 'formatoptions' we must delete the space at
a7e59720a155 updated for version 7.0074
vimboss
parents: 274
diff changeset
8549 * the end of the line, otherwise the line will be broken
a7e59720a155 updated for version 7.0074
vimboss
parents: 274
diff changeset
8550 * again when auto-formatting. */
a7e59720a155 updated for version 7.0074
vimboss
parents: 274
diff changeset
8551 if (has_format_option(FO_AUTO)
a7e59720a155 updated for version 7.0074
vimboss
parents: 274
diff changeset
8552 && has_format_option(FO_WHITE_PAR))
a7e59720a155 updated for version 7.0074
vimboss
parents: 274
diff changeset
8553 {
a7e59720a155 updated for version 7.0074
vimboss
parents: 274
diff changeset
8554 char_u *ptr = ml_get_buf(curbuf, curwin->w_cursor.lnum,
a7e59720a155 updated for version 7.0074
vimboss
parents: 274
diff changeset
8555 TRUE);
a7e59720a155 updated for version 7.0074
vimboss
parents: 274
diff changeset
8556 int len;
a7e59720a155 updated for version 7.0074
vimboss
parents: 274
diff changeset
8557
835
8bebcabccc2c updated for version 7.0e01
vimboss
parents: 829
diff changeset
8558 len = (int)STRLEN(ptr);
278
a7e59720a155 updated for version 7.0074
vimboss
parents: 274
diff changeset
8559 if (len > 0 && ptr[len - 1] == ' ')
a7e59720a155 updated for version 7.0074
vimboss
parents: 274
diff changeset
8560 ptr[len - 1] = NUL;
a7e59720a155 updated for version 7.0074
vimboss
parents: 274
diff changeset
8561 }
a7e59720a155 updated for version 7.0074
vimboss
parents: 274
diff changeset
8562
2294
2209060c340d Make joining a range of lines much faster. (Milan Vancura)
Bram Moolenaar <bram@vim.org>
parents: 2282
diff changeset
8563 (void)do_join(2, FALSE, FALSE);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8564 if (temp == NUL && gchar_cursor() != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8565 inc_cursor();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8566 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8567 #ifdef FEAT_VREPLACE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8568 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8569 dec_cursor();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8570 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8571
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8572 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8573 * In REPLACE mode we have to put back the text that was replaced
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8574 * by the NL. On the replace stack is first a NUL-terminated
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8575 * sequence of characters that were deleted and then the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8576 * characters that NL replaced.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8577 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8578 if (State & REPLACE_FLAG)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8579 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8580 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8581 * Do the next ins_char() in NORMAL state, to
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8582 * prevent ins_char() from replacing characters and
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8583 * avoiding showmatch().
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8584 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8585 oldState = State;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8586 State = NORMAL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8587 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8588 * restore characters (blanks) deleted after cursor
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8589 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8590 while (cc > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8591 {
1872
f13849167330 updated for version 7.2-169
vimboss
parents: 1869
diff changeset
8592 save_col = curwin->w_cursor.col;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8593 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8594 mb_replace_pop_ins(cc);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8595 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8596 ins_char(cc);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8597 #endif
1872
f13849167330 updated for version 7.2-169
vimboss
parents: 1869
diff changeset
8598 curwin->w_cursor.col = save_col;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8599 cc = replace_pop();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8600 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8601 /* restore the characters that NL replaced */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8602 replace_pop_ins();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8603 State = oldState;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8604 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8605 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8606 did_ai = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8607 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8608 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8609 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8610 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8611 * Delete character(s) before the cursor.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8612 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8613 #ifdef FEAT_RIGHTLEFT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8614 if (revins_on) /* put cursor on last inserted char */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8615 dec_cursor();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8616 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8617 mincol = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8618 /* keep indent */
1085
f299f0bf32d7 updated for version 7.0-211
vimboss
parents: 1074
diff changeset
8619 if (mode == BACKSPACE_LINE
f299f0bf32d7 updated for version 7.0-211
vimboss
parents: 1074
diff changeset
8620 && (curbuf->b_p_ai
f299f0bf32d7 updated for version 7.0-211
vimboss
parents: 1074
diff changeset
8621 #ifdef FEAT_CINDENT
2004
9e554211caf5 updated for version 7.2-301
vimboss
parents: 1988
diff changeset
8622 || cindent_on()
1085
f299f0bf32d7 updated for version 7.0-211
vimboss
parents: 1074
diff changeset
8623 #endif
f299f0bf32d7 updated for version 7.0-211
vimboss
parents: 1074
diff changeset
8624 )
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8625 #ifdef FEAT_RIGHTLEFT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8626 && !revins_on
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8627 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8628 )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8629 {
1872
f13849167330 updated for version 7.2-169
vimboss
parents: 1869
diff changeset
8630 save_col = curwin->w_cursor.col;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8631 beginline(BL_WHITE);
1988
e5145ff9c9b0 updated for version 7.2-285
vimboss
parents: 1927
diff changeset
8632 if (curwin->w_cursor.col < save_col)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8633 mincol = curwin->w_cursor.col;
1872
f13849167330 updated for version 7.2-169
vimboss
parents: 1869
diff changeset
8634 curwin->w_cursor.col = save_col;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8635 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8636
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8637 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8638 * Handle deleting one 'shiftwidth' or 'softtabstop'.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8639 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8640 if ( mode == BACKSPACE_CHAR
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8641 && ((p_sta && in_indent)
648
9032e4668296 updated for version 7.0189
vimboss
parents: 644
diff changeset
8642 || (curbuf->b_p_sts != 0
1497
f14f7aab5187 updated for version 7.1-212
vimboss
parents: 1496
diff changeset
8643 && curwin->w_cursor.col > 0
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8644 && (*(ml_get_cursor() - 1) == TAB
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8645 || (*(ml_get_cursor() - 1) == ' '
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8646 && (!*inserted_space_p
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8647 || arrow_used))))))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8648 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8649 int ts;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8650 colnr_T vcol;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8651 colnr_T want_vcol;
1460
b0dabd584b8f updated for version 7.1-175
vimboss
parents: 1446
diff changeset
8652 colnr_T start_vcol;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8653
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8654 *inserted_space_p = FALSE;
648
9032e4668296 updated for version 7.0189
vimboss
parents: 644
diff changeset
8655 if (p_sta && in_indent)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8656 ts = curbuf->b_p_sw;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8657 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8658 ts = curbuf->b_p_sts;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8659 /* Compute the virtual column where we want to be. Since
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8660 * 'showbreak' may get in the way, need to get the last column of
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8661 * the previous character. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8662 getvcol(curwin, &curwin->w_cursor, &vcol, NULL, NULL);
1460
b0dabd584b8f updated for version 7.1-175
vimboss
parents: 1446
diff changeset
8663 start_vcol = vcol;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8664 dec_cursor();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8665 getvcol(curwin, &curwin->w_cursor, NULL, NULL, &want_vcol);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8666 inc_cursor();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8667 want_vcol = (want_vcol / ts) * ts;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8668
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8669 /* delete characters until we are at or before want_vcol */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8670 while (vcol > want_vcol
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8671 && (cc = *(ml_get_cursor() - 1), vim_iswhite(cc)))
1460
b0dabd584b8f updated for version 7.1-175
vimboss
parents: 1446
diff changeset
8672 ins_bs_one(&vcol);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8673
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8674 /* insert extra spaces until we are at want_vcol */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8675 while (vcol < want_vcol)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8676 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8677 /* Remember the first char we inserted */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8678 if (curwin->w_cursor.lnum == Insstart.lnum
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8679 && curwin->w_cursor.col < Insstart.col)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8680 Insstart.col = curwin->w_cursor.col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8681
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8682 #ifdef FEAT_VREPLACE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8683 if (State & VREPLACE_FLAG)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8684 ins_char(' ');
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8685 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8686 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8687 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8688 ins_str((char_u *)" ");
1460
b0dabd584b8f updated for version 7.1-175
vimboss
parents: 1446
diff changeset
8689 if ((State & REPLACE_FLAG))
b0dabd584b8f updated for version 7.1-175
vimboss
parents: 1446
diff changeset
8690 replace_push(NUL);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8691 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8692 getvcol(curwin, &curwin->w_cursor, &vcol, NULL, NULL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8693 }
1460
b0dabd584b8f updated for version 7.1-175
vimboss
parents: 1446
diff changeset
8694
b0dabd584b8f updated for version 7.1-175
vimboss
parents: 1446
diff changeset
8695 /* If we are now back where we started delete one character. Can
b0dabd584b8f updated for version 7.1-175
vimboss
parents: 1446
diff changeset
8696 * happen when using 'sts' and 'linebreak'. */
b0dabd584b8f updated for version 7.1-175
vimboss
parents: 1446
diff changeset
8697 if (vcol >= start_vcol)
b0dabd584b8f updated for version 7.1-175
vimboss
parents: 1446
diff changeset
8698 ins_bs_one(&vcol);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8699 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8700
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8701 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8702 * Delete upto starting point, start of line or previous word.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8703 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8704 else do
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8705 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8706 #ifdef FEAT_RIGHTLEFT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8707 if (!revins_on) /* put cursor on char to be deleted */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8708 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8709 dec_cursor();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8710
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8711 /* start of word? */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8712 if (mode == BACKSPACE_WORD && !vim_isspace(gchar_cursor()))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8713 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8714 mode = BACKSPACE_WORD_NOT_SPACE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8715 temp = vim_iswordc(gchar_cursor());
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8716 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8717 /* end of word? */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8718 else if (mode == BACKSPACE_WORD_NOT_SPACE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8719 && (vim_isspace(cc = gchar_cursor())
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8720 || vim_iswordc(cc) != temp))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8721 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8722 #ifdef FEAT_RIGHTLEFT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8723 if (!revins_on)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8724 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8725 inc_cursor();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8726 #ifdef FEAT_RIGHTLEFT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8727 else if (State & REPLACE_FLAG)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8728 dec_cursor();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8729 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8730 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8731 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8732 if (State & REPLACE_FLAG)
1782
12cecc379574 updated for version 7.2-080
vimboss
parents: 1698
diff changeset
8733 replace_do_bs(-1);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8734 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8735 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8736 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8737 if (enc_utf8 && p_deco)
714
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 712
diff changeset
8738 (void)utfc_ptr2char(ml_get_cursor(), cpc);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8739 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8740 (void)del_char(FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8741 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8742 /*
714
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 712
diff changeset
8743 * If there are combining characters and 'delcombine' is set
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 712
diff changeset
8744 * move the cursor back. Don't back up before the base
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8745 * character.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8746 */
714
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 712
diff changeset
8747 if (enc_utf8 && p_deco && cpc[0] != NUL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8748 inc_cursor();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8749 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8750 #ifdef FEAT_RIGHTLEFT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8751 if (revins_chars)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8752 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8753 revins_chars--;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8754 revins_legal++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8755 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8756 if (revins_on && gchar_cursor() == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8757 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8758 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8759 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8760 /* Just a single backspace?: */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8761 if (mode == BACKSPACE_CHAR)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8762 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8763 } while (
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8764 #ifdef FEAT_RIGHTLEFT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8765 revins_on ||
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8766 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8767 (curwin->w_cursor.col > mincol
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8768 && (curwin->w_cursor.lnum != Insstart.lnum
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8769 || curwin->w_cursor.col != Insstart.col)));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8770 did_backspace = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8771 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8772 #ifdef FEAT_SMARTINDENT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8773 did_si = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8774 can_si = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8775 can_si_back = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8776 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8777 if (curwin->w_cursor.col <= 1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8778 did_ai = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8779 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8780 * It's a little strange to put backspaces into the redo
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8781 * buffer, but it makes auto-indent a lot easier to deal
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8782 * with.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8783 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8784 AppendCharToRedobuff(c);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8785
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8786 /* If deleted before the insertion point, adjust it */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8787 if (curwin->w_cursor.lnum == Insstart.lnum
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8788 && curwin->w_cursor.col < Insstart.col)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8789 Insstart.col = curwin->w_cursor.col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8790
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8791 /* vi behaviour: the cursor moves backward but the character that
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8792 * was there remains visible
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8793 * Vim behaviour: the cursor moves backward and the character that
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8794 * was there is erased from the screen.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8795 * We can emulate the vi behaviour by pretending there is a dollar
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8796 * displayed even when there isn't.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8797 * --pkv Sun Jan 19 01:56:40 EST 2003 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8798 if (vim_strchr(p_cpo, CPO_BACKSPACE) != NULL && dollar_vcol == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8799 dollar_vcol = curwin->w_virtcol;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8800
1514
8a22a90c964a updated for version 7.1-229
vimboss
parents: 1506
diff changeset
8801 #ifdef FEAT_FOLDING
8a22a90c964a updated for version 7.1-229
vimboss
parents: 1506
diff changeset
8802 /* When deleting a char the cursor line must never be in a closed fold.
8a22a90c964a updated for version 7.1-229
vimboss
parents: 1506
diff changeset
8803 * E.g., when 'foldmethod' is indent and deleting the first non-white
8a22a90c964a updated for version 7.1-229
vimboss
parents: 1506
diff changeset
8804 * char before a Tab. */
8a22a90c964a updated for version 7.1-229
vimboss
parents: 1506
diff changeset
8805 if (did_backspace)
8a22a90c964a updated for version 7.1-229
vimboss
parents: 1506
diff changeset
8806 foldOpenCursor();
8a22a90c964a updated for version 7.1-229
vimboss
parents: 1506
diff changeset
8807 #endif
8a22a90c964a updated for version 7.1-229
vimboss
parents: 1506
diff changeset
8808
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8809 return did_backspace;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8810 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8811
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8812 #ifdef FEAT_MOUSE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8813 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8814 ins_mouse(c)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8815 int c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8816 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8817 pos_T tpos;
840
2c885fab04e3 updated for version 7.0e06
vimboss
parents: 836
diff changeset
8818 win_T *old_curwin = curwin;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8819
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8820 # ifdef FEAT_GUI
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8821 /* When GUI is active, also move/paste when 'mouse' is empty */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8822 if (!gui.in_use)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8823 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8824 if (!mouse_has(MOUSE_INSERT))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8825 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8826
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8827 undisplay_dollar();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8828 tpos = curwin->w_cursor;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8829 if (do_mouse(NULL, c, BACKWARD, 1L, 0))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8830 {
840
2c885fab04e3 updated for version 7.0e06
vimboss
parents: 836
diff changeset
8831 #ifdef FEAT_WINDOWS
2c885fab04e3 updated for version 7.0e06
vimboss
parents: 836
diff changeset
8832 win_T *new_curwin = curwin;
2c885fab04e3 updated for version 7.0e06
vimboss
parents: 836
diff changeset
8833
2c885fab04e3 updated for version 7.0e06
vimboss
parents: 836
diff changeset
8834 if (curwin != old_curwin && win_valid(old_curwin))
2c885fab04e3 updated for version 7.0e06
vimboss
parents: 836
diff changeset
8835 {
2c885fab04e3 updated for version 7.0e06
vimboss
parents: 836
diff changeset
8836 /* Mouse took us to another window. We need to go back to the
2c885fab04e3 updated for version 7.0e06
vimboss
parents: 836
diff changeset
8837 * previous one to stop insert there properly. */
2c885fab04e3 updated for version 7.0e06
vimboss
parents: 836
diff changeset
8838 curwin = old_curwin;
2c885fab04e3 updated for version 7.0e06
vimboss
parents: 836
diff changeset
8839 curbuf = curwin->w_buffer;
2c885fab04e3 updated for version 7.0e06
vimboss
parents: 836
diff changeset
8840 }
2c885fab04e3 updated for version 7.0e06
vimboss
parents: 836
diff changeset
8841 #endif
2c885fab04e3 updated for version 7.0e06
vimboss
parents: 836
diff changeset
8842 start_arrow(curwin == old_curwin ? &tpos : NULL);
2c885fab04e3 updated for version 7.0e06
vimboss
parents: 836
diff changeset
8843 #ifdef FEAT_WINDOWS
2c885fab04e3 updated for version 7.0e06
vimboss
parents: 836
diff changeset
8844 if (curwin != new_curwin && win_valid(new_curwin))
2c885fab04e3 updated for version 7.0e06
vimboss
parents: 836
diff changeset
8845 {
2c885fab04e3 updated for version 7.0e06
vimboss
parents: 836
diff changeset
8846 curwin = new_curwin;
2c885fab04e3 updated for version 7.0e06
vimboss
parents: 836
diff changeset
8847 curbuf = curwin->w_buffer;
2c885fab04e3 updated for version 7.0e06
vimboss
parents: 836
diff changeset
8848 }
2c885fab04e3 updated for version 7.0e06
vimboss
parents: 836
diff changeset
8849 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8850 # ifdef FEAT_CINDENT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8851 can_cindent = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8852 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8853 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8854
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8855 #ifdef FEAT_WINDOWS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8856 /* redraw status lines (in case another window became active) */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8857 redraw_statuslines();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8858 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8859 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8860
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8861 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8862 ins_mousescroll(up)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8863 int up;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8864 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8865 pos_T tpos;
1434
40aa7ae37901 updated for version 7.1-149
vimboss
parents: 1430
diff changeset
8866 # if defined(FEAT_WINDOWS)
40aa7ae37901 updated for version 7.1-149
vimboss
parents: 1430
diff changeset
8867 win_T *old_curwin = curwin;
40aa7ae37901 updated for version 7.1-149
vimboss
parents: 1430
diff changeset
8868 # endif
40aa7ae37901 updated for version 7.1-149
vimboss
parents: 1430
diff changeset
8869 # ifdef FEAT_INS_EXPAND
40aa7ae37901 updated for version 7.1-149
vimboss
parents: 1430
diff changeset
8870 int did_scroll = FALSE;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8871 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8872
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8873 tpos = curwin->w_cursor;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8874
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8875 # if defined(FEAT_GUI) && defined(FEAT_WINDOWS)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8876 /* Currently the mouse coordinates are only known in the GUI. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8877 if (gui.in_use && mouse_row >= 0 && mouse_col >= 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8878 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8879 int row, col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8880
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8881 row = mouse_row;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8882 col = mouse_col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8883
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8884 /* find the window at the pointer coordinates */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8885 curwin = mouse_find_win(&row, &col);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8886 curbuf = curwin->w_buffer;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8887 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8888 if (curwin == old_curwin)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8889 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8890 undisplay_dollar();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8891
1434
40aa7ae37901 updated for version 7.1-149
vimboss
parents: 1430
diff changeset
8892 # ifdef FEAT_INS_EXPAND
40aa7ae37901 updated for version 7.1-149
vimboss
parents: 1430
diff changeset
8893 /* Don't scroll the window in which completion is being done. */
40aa7ae37901 updated for version 7.1-149
vimboss
parents: 1430
diff changeset
8894 if (!pum_visible()
40aa7ae37901 updated for version 7.1-149
vimboss
parents: 1430
diff changeset
8895 # if defined(FEAT_WINDOWS)
40aa7ae37901 updated for version 7.1-149
vimboss
parents: 1430
diff changeset
8896 || curwin != old_curwin
40aa7ae37901 updated for version 7.1-149
vimboss
parents: 1430
diff changeset
8897 # endif
40aa7ae37901 updated for version 7.1-149
vimboss
parents: 1430
diff changeset
8898 )
40aa7ae37901 updated for version 7.1-149
vimboss
parents: 1430
diff changeset
8899 # endif
40aa7ae37901 updated for version 7.1-149
vimboss
parents: 1430
diff changeset
8900 {
40aa7ae37901 updated for version 7.1-149
vimboss
parents: 1430
diff changeset
8901 if (mod_mask & (MOD_MASK_SHIFT | MOD_MASK_CTRL))
40aa7ae37901 updated for version 7.1-149
vimboss
parents: 1430
diff changeset
8902 scroll_redraw(up, (long)(curwin->w_botline - curwin->w_topline));
40aa7ae37901 updated for version 7.1-149
vimboss
parents: 1430
diff changeset
8903 else
40aa7ae37901 updated for version 7.1-149
vimboss
parents: 1430
diff changeset
8904 scroll_redraw(up, 3L);
40aa7ae37901 updated for version 7.1-149
vimboss
parents: 1430
diff changeset
8905 # ifdef FEAT_INS_EXPAND
40aa7ae37901 updated for version 7.1-149
vimboss
parents: 1430
diff changeset
8906 did_scroll = TRUE;
40aa7ae37901 updated for version 7.1-149
vimboss
parents: 1430
diff changeset
8907 # endif
40aa7ae37901 updated for version 7.1-149
vimboss
parents: 1430
diff changeset
8908 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8909
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8910 # if defined(FEAT_GUI) && defined(FEAT_WINDOWS)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8911 curwin->w_redr_status = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8912
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8913 curwin = old_curwin;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8914 curbuf = curwin->w_buffer;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8915 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8916
1434
40aa7ae37901 updated for version 7.1-149
vimboss
parents: 1430
diff changeset
8917 # ifdef FEAT_INS_EXPAND
40aa7ae37901 updated for version 7.1-149
vimboss
parents: 1430
diff changeset
8918 /* The popup menu may overlay the window, need to redraw it.
40aa7ae37901 updated for version 7.1-149
vimboss
parents: 1430
diff changeset
8919 * TODO: Would be more efficient to only redraw the windows that are
40aa7ae37901 updated for version 7.1-149
vimboss
parents: 1430
diff changeset
8920 * overlapped by the popup menu. */
40aa7ae37901 updated for version 7.1-149
vimboss
parents: 1430
diff changeset
8921 if (pum_visible() && did_scroll)
40aa7ae37901 updated for version 7.1-149
vimboss
parents: 1430
diff changeset
8922 {
40aa7ae37901 updated for version 7.1-149
vimboss
parents: 1430
diff changeset
8923 redraw_all_later(NOT_VALID);
40aa7ae37901 updated for version 7.1-149
vimboss
parents: 1430
diff changeset
8924 ins_compl_show_pum();
40aa7ae37901 updated for version 7.1-149
vimboss
parents: 1430
diff changeset
8925 }
40aa7ae37901 updated for version 7.1-149
vimboss
parents: 1430
diff changeset
8926 # endif
40aa7ae37901 updated for version 7.1-149
vimboss
parents: 1430
diff changeset
8927
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8928 if (!equalpos(curwin->w_cursor, tpos))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8929 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8930 start_arrow(&tpos);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8931 # ifdef FEAT_CINDENT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8932 can_cindent = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8933 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8934 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8935 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8936 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8937
692
a28f83d37113 updated for version 7.0208
vimboss
parents: 683
diff changeset
8938 #if defined(FEAT_GUI_TABLINE) || defined(PROTO)
724
a35dce0cabc5 updated for version 7.0220
vimboss
parents: 716
diff changeset
8939 static void
692
a28f83d37113 updated for version 7.0208
vimboss
parents: 683
diff changeset
8940 ins_tabline(c)
a28f83d37113 updated for version 7.0208
vimboss
parents: 683
diff changeset
8941 int c;
a28f83d37113 updated for version 7.0208
vimboss
parents: 683
diff changeset
8942 {
a28f83d37113 updated for version 7.0208
vimboss
parents: 683
diff changeset
8943 /* We will be leaving the current window, unless closing another tab. */
a28f83d37113 updated for version 7.0208
vimboss
parents: 683
diff changeset
8944 if (c != K_TABMENU || current_tabmenu != TABLINE_MENU_CLOSE
a28f83d37113 updated for version 7.0208
vimboss
parents: 683
diff changeset
8945 || (current_tab != 0 && current_tab != tabpage_index(curtab)))
a28f83d37113 updated for version 7.0208
vimboss
parents: 683
diff changeset
8946 {
a28f83d37113 updated for version 7.0208
vimboss
parents: 683
diff changeset
8947 undisplay_dollar();
a28f83d37113 updated for version 7.0208
vimboss
parents: 683
diff changeset
8948 start_arrow(&curwin->w_cursor);
a28f83d37113 updated for version 7.0208
vimboss
parents: 683
diff changeset
8949 # ifdef FEAT_CINDENT
a28f83d37113 updated for version 7.0208
vimboss
parents: 683
diff changeset
8950 can_cindent = TRUE;
a28f83d37113 updated for version 7.0208
vimboss
parents: 683
diff changeset
8951 # endif
a28f83d37113 updated for version 7.0208
vimboss
parents: 683
diff changeset
8952 }
a28f83d37113 updated for version 7.0208
vimboss
parents: 683
diff changeset
8953
a28f83d37113 updated for version 7.0208
vimboss
parents: 683
diff changeset
8954 if (c == K_TABLINE)
a28f83d37113 updated for version 7.0208
vimboss
parents: 683
diff changeset
8955 goto_tabpage(current_tab);
a28f83d37113 updated for version 7.0208
vimboss
parents: 683
diff changeset
8956 else
846
db44f7b81373 updated for version 7.0f03
vimboss
parents: 844
diff changeset
8957 {
692
a28f83d37113 updated for version 7.0208
vimboss
parents: 683
diff changeset
8958 handle_tabmenu();
846
db44f7b81373 updated for version 7.0f03
vimboss
parents: 844
diff changeset
8959 redraw_statuslines(); /* will redraw the tabline when needed */
db44f7b81373 updated for version 7.0f03
vimboss
parents: 844
diff changeset
8960 }
692
a28f83d37113 updated for version 7.0208
vimboss
parents: 683
diff changeset
8961 }
a28f83d37113 updated for version 7.0208
vimboss
parents: 683
diff changeset
8962 #endif
a28f83d37113 updated for version 7.0208
vimboss
parents: 683
diff changeset
8963
a28f83d37113 updated for version 7.0208
vimboss
parents: 683
diff changeset
8964 #if defined(FEAT_GUI) || defined(PROTO)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8965 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8966 ins_scroll()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8967 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8968 pos_T tpos;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8969
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8970 undisplay_dollar();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8971 tpos = curwin->w_cursor;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8972 if (gui_do_scroll())
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8973 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8974 start_arrow(&tpos);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8975 # ifdef FEAT_CINDENT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8976 can_cindent = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8977 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8978 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8979 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8980
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8981 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8982 ins_horscroll()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8983 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8984 pos_T tpos;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8985
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8986 undisplay_dollar();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8987 tpos = curwin->w_cursor;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8988 if (gui_do_horiz_scroll())
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8989 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8990 start_arrow(&tpos);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8991 # ifdef FEAT_CINDENT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8992 can_cindent = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8993 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8994 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8995 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8996 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8997
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8998 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8999 ins_left()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9000 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9001 pos_T tpos;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9002
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9003 #ifdef FEAT_FOLDING
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9004 if ((fdo_flags & FDO_HOR) && KeyTyped)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9005 foldOpenCursor();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9006 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9007 undisplay_dollar();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9008 tpos = curwin->w_cursor;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9009 if (oneleft() == OK)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9010 {
941
d95676480093 updated for version 7.0-067
vimboss
parents: 938
diff changeset
9011 #if defined(FEAT_XIM) && defined(FEAT_GUI_GTK)
d95676480093 updated for version 7.0-067
vimboss
parents: 938
diff changeset
9012 /* Only call start_arrow() when not busy with preediting, it will
d95676480093 updated for version 7.0-067
vimboss
parents: 938
diff changeset
9013 * break undo. K_LEFT is inserted in im_correct_cursor(). */
d95676480093 updated for version 7.0-067
vimboss
parents: 938
diff changeset
9014 if (!im_is_preediting())
d95676480093 updated for version 7.0-067
vimboss
parents: 938
diff changeset
9015 #endif
d95676480093 updated for version 7.0-067
vimboss
parents: 938
diff changeset
9016 start_arrow(&tpos);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9017 #ifdef FEAT_RIGHTLEFT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9018 /* If exit reversed string, position is fixed */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9019 if (revins_scol != -1 && (int)curwin->w_cursor.col >= revins_scol)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9020 revins_legal++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9021 revins_chars++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9022 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9023 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9024
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9025 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9026 * if 'whichwrap' set for cursor in insert mode may go to
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9027 * previous line
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9028 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9029 else if (vim_strchr(p_ww, '[') != NULL && curwin->w_cursor.lnum > 1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9030 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9031 start_arrow(&tpos);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9032 --(curwin->w_cursor.lnum);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9033 coladvance((colnr_T)MAXCOL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9034 curwin->w_set_curswant = TRUE; /* so we stay at the end */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9035 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9036 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9037 vim_beep();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9038 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9039
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9040 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9041 ins_home(c)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9042 int c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9043 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9044 pos_T tpos;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9045
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9046 #ifdef FEAT_FOLDING
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9047 if ((fdo_flags & FDO_HOR) && KeyTyped)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9048 foldOpenCursor();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9049 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9050 undisplay_dollar();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9051 tpos = curwin->w_cursor;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9052 if (c == K_C_HOME)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9053 curwin->w_cursor.lnum = 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9054 curwin->w_cursor.col = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9055 #ifdef FEAT_VIRTUALEDIT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9056 curwin->w_cursor.coladd = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9057 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9058 curwin->w_curswant = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9059 start_arrow(&tpos);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9060 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9061
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9062 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9063 ins_end(c)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9064 int c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9065 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9066 pos_T tpos;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9067
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9068 #ifdef FEAT_FOLDING
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9069 if ((fdo_flags & FDO_HOR) && KeyTyped)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9070 foldOpenCursor();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9071 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9072 undisplay_dollar();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9073 tpos = curwin->w_cursor;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9074 if (c == K_C_END)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9075 curwin->w_cursor.lnum = curbuf->b_ml.ml_line_count;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9076 coladvance((colnr_T)MAXCOL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9077 curwin->w_curswant = MAXCOL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9078
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9079 start_arrow(&tpos);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9080 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9081
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9082 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9083 ins_s_left()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9084 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9085 #ifdef FEAT_FOLDING
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9086 if ((fdo_flags & FDO_HOR) && KeyTyped)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9087 foldOpenCursor();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9088 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9089 undisplay_dollar();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9090 if (curwin->w_cursor.lnum > 1 || curwin->w_cursor.col > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9091 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9092 start_arrow(&curwin->w_cursor);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9093 (void)bck_word(1L, FALSE, FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9094 curwin->w_set_curswant = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9095 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9096 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9097 vim_beep();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9098 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9099
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9100 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9101 ins_right()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9102 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9103 #ifdef FEAT_FOLDING
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9104 if ((fdo_flags & FDO_HOR) && KeyTyped)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9105 foldOpenCursor();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9106 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9107 undisplay_dollar();
1877
b5c1cb6f8d56 updated for version 7.2-174
vimboss
parents: 1876
diff changeset
9108 if (gchar_cursor() != NUL
b5c1cb6f8d56 updated for version 7.2-174
vimboss
parents: 1876
diff changeset
9109 #ifdef FEAT_VIRTUALEDIT
b5c1cb6f8d56 updated for version 7.2-174
vimboss
parents: 1876
diff changeset
9110 || virtual_active()
b5c1cb6f8d56 updated for version 7.2-174
vimboss
parents: 1876
diff changeset
9111 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9112 )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9113 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9114 start_arrow(&curwin->w_cursor);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9115 curwin->w_set_curswant = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9116 #ifdef FEAT_VIRTUALEDIT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9117 if (virtual_active())
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9118 oneright();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9119 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9120 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9121 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9122 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9123 if (has_mbyte)
474
a5fcf36ef512 updated for version 7.0127
vimboss
parents: 470
diff changeset
9124 curwin->w_cursor.col += (*mb_ptr2len)(ml_get_cursor());
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9125 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9126 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9127 ++curwin->w_cursor.col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9128 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9129
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9130 #ifdef FEAT_RIGHTLEFT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9131 revins_legal++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9132 if (revins_chars)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9133 revins_chars--;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9134 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9135 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9136 /* if 'whichwrap' set for cursor in insert mode, may move the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9137 * cursor to the next line */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9138 else if (vim_strchr(p_ww, ']') != NULL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9139 && curwin->w_cursor.lnum < curbuf->b_ml.ml_line_count)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9140 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9141 start_arrow(&curwin->w_cursor);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9142 curwin->w_set_curswant = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9143 ++curwin->w_cursor.lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9144 curwin->w_cursor.col = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9145 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9146 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9147 vim_beep();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9148 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9149
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9150 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9151 ins_s_right()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9152 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9153 #ifdef FEAT_FOLDING
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9154 if ((fdo_flags & FDO_HOR) && KeyTyped)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9155 foldOpenCursor();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9156 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9157 undisplay_dollar();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9158 if (curwin->w_cursor.lnum < curbuf->b_ml.ml_line_count
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9159 || gchar_cursor() != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9160 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9161 start_arrow(&curwin->w_cursor);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9162 (void)fwd_word(1L, FALSE, 0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9163 curwin->w_set_curswant = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9164 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9165 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9166 vim_beep();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9167 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9168
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9169 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9170 ins_up(startcol)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9171 int startcol; /* when TRUE move to Insstart.col */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9172 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9173 pos_T tpos;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9174 linenr_T old_topline = curwin->w_topline;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9175 #ifdef FEAT_DIFF
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9176 int old_topfill = curwin->w_topfill;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9177 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9178
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9179 undisplay_dollar();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9180 tpos = curwin->w_cursor;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9181 if (cursor_up(1L, TRUE) == OK)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9182 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9183 if (startcol)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9184 coladvance(getvcol_nolist(&Insstart));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9185 if (old_topline != curwin->w_topline
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9186 #ifdef FEAT_DIFF
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9187 || old_topfill != curwin->w_topfill
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9188 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9189 )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9190 redraw_later(VALID);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9191 start_arrow(&tpos);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9192 #ifdef FEAT_CINDENT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9193 can_cindent = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9194 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9195 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9196 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9197 vim_beep();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9198 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9199
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9200 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9201 ins_pageup()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9202 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9203 pos_T tpos;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9204
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9205 undisplay_dollar();
828
01583c79d5f4 updated for version 7.0d03
vimboss
parents: 826
diff changeset
9206
01583c79d5f4 updated for version 7.0d03
vimboss
parents: 826
diff changeset
9207 #ifdef FEAT_WINDOWS
01583c79d5f4 updated for version 7.0d03
vimboss
parents: 826
diff changeset
9208 if (mod_mask & MOD_MASK_CTRL)
01583c79d5f4 updated for version 7.0d03
vimboss
parents: 826
diff changeset
9209 {
01583c79d5f4 updated for version 7.0d03
vimboss
parents: 826
diff changeset
9210 /* <C-PageUp>: tab page back */
1013
61e5d40135d0 updated for version 7.0-139
vimboss
parents: 1007
diff changeset
9211 if (first_tabpage->tp_next != NULL)
61e5d40135d0 updated for version 7.0-139
vimboss
parents: 1007
diff changeset
9212 {
61e5d40135d0 updated for version 7.0-139
vimboss
parents: 1007
diff changeset
9213 start_arrow(&curwin->w_cursor);
61e5d40135d0 updated for version 7.0-139
vimboss
parents: 1007
diff changeset
9214 goto_tabpage(-1);
61e5d40135d0 updated for version 7.0-139
vimboss
parents: 1007
diff changeset
9215 }
828
01583c79d5f4 updated for version 7.0d03
vimboss
parents: 826
diff changeset
9216 return;
01583c79d5f4 updated for version 7.0d03
vimboss
parents: 826
diff changeset
9217 }
01583c79d5f4 updated for version 7.0d03
vimboss
parents: 826
diff changeset
9218 #endif
01583c79d5f4 updated for version 7.0d03
vimboss
parents: 826
diff changeset
9219
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9220 tpos = curwin->w_cursor;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9221 if (onepage(BACKWARD, 1L) == OK)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9222 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9223 start_arrow(&tpos);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9224 #ifdef FEAT_CINDENT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9225 can_cindent = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9226 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9227 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9228 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9229 vim_beep();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9230 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9231
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9232 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9233 ins_down(startcol)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9234 int startcol; /* when TRUE move to Insstart.col */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9235 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9236 pos_T tpos;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9237 linenr_T old_topline = curwin->w_topline;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9238 #ifdef FEAT_DIFF
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9239 int old_topfill = curwin->w_topfill;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9240 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9241
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9242 undisplay_dollar();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9243 tpos = curwin->w_cursor;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9244 if (cursor_down(1L, TRUE) == OK)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9245 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9246 if (startcol)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9247 coladvance(getvcol_nolist(&Insstart));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9248 if (old_topline != curwin->w_topline
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9249 #ifdef FEAT_DIFF
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9250 || old_topfill != curwin->w_topfill
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9251 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9252 )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9253 redraw_later(VALID);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9254 start_arrow(&tpos);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9255 #ifdef FEAT_CINDENT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9256 can_cindent = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9257 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9258 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9259 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9260 vim_beep();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9261 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9262
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9263 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9264 ins_pagedown()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9265 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9266 pos_T tpos;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9267
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9268 undisplay_dollar();
828
01583c79d5f4 updated for version 7.0d03
vimboss
parents: 826
diff changeset
9269
01583c79d5f4 updated for version 7.0d03
vimboss
parents: 826
diff changeset
9270 #ifdef FEAT_WINDOWS
01583c79d5f4 updated for version 7.0d03
vimboss
parents: 826
diff changeset
9271 if (mod_mask & MOD_MASK_CTRL)
01583c79d5f4 updated for version 7.0d03
vimboss
parents: 826
diff changeset
9272 {
01583c79d5f4 updated for version 7.0d03
vimboss
parents: 826
diff changeset
9273 /* <C-PageDown>: tab page forward */
1013
61e5d40135d0 updated for version 7.0-139
vimboss
parents: 1007
diff changeset
9274 if (first_tabpage->tp_next != NULL)
61e5d40135d0 updated for version 7.0-139
vimboss
parents: 1007
diff changeset
9275 {
61e5d40135d0 updated for version 7.0-139
vimboss
parents: 1007
diff changeset
9276 start_arrow(&curwin->w_cursor);
61e5d40135d0 updated for version 7.0-139
vimboss
parents: 1007
diff changeset
9277 goto_tabpage(0);
61e5d40135d0 updated for version 7.0-139
vimboss
parents: 1007
diff changeset
9278 }
828
01583c79d5f4 updated for version 7.0d03
vimboss
parents: 826
diff changeset
9279 return;
01583c79d5f4 updated for version 7.0d03
vimboss
parents: 826
diff changeset
9280 }
01583c79d5f4 updated for version 7.0d03
vimboss
parents: 826
diff changeset
9281 #endif
01583c79d5f4 updated for version 7.0d03
vimboss
parents: 826
diff changeset
9282
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9283 tpos = curwin->w_cursor;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9284 if (onepage(FORWARD, 1L) == OK)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9285 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9286 start_arrow(&tpos);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9287 #ifdef FEAT_CINDENT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9288 can_cindent = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9289 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9290 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9291 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9292 vim_beep();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9293 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9294
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9295 #ifdef FEAT_DND
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9296 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9297 ins_drop()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9298 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9299 do_put('~', BACKWARD, 1L, PUT_CURSEND);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9300 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9301 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9302
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9303 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9304 * Handle TAB in Insert or Replace mode.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9305 * Return TRUE when the TAB needs to be inserted like a normal character.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9306 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9307 static int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9308 ins_tab()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9309 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9310 int ind;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9311 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9312 int temp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9313
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9314 if (Insstart_blank_vcol == MAXCOL && curwin->w_cursor.lnum == Insstart.lnum)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9315 Insstart_blank_vcol = get_nolist_virtcol();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9316 if (echeck_abbr(TAB + ABBR_OFF))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9317 return FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9318
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9319 ind = inindent(0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9320 #ifdef FEAT_CINDENT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9321 if (ind)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9322 can_cindent = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9323 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9324
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9325 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9326 * When nothing special, insert TAB like a normal character
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9327 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9328 if (!curbuf->b_p_et
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9329 && !(p_sta && ind && curbuf->b_p_ts != curbuf->b_p_sw)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9330 && curbuf->b_p_sts == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9331 return TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9332
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9333 if (stop_arrow() == FAIL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9334 return TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9335
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9336 did_ai = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9337 #ifdef FEAT_SMARTINDENT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9338 did_si = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9339 can_si = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9340 can_si_back = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9341 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9342 AppendToRedobuff((char_u *)"\t");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9343
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9344 if (p_sta && ind) /* insert tab in indent, use 'shiftwidth' */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9345 temp = (int)curbuf->b_p_sw;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9346 else if (curbuf->b_p_sts > 0) /* use 'softtabstop' when set */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9347 temp = (int)curbuf->b_p_sts;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9348 else /* otherwise use 'tabstop' */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9349 temp = (int)curbuf->b_p_ts;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9350 temp -= get_nolist_virtcol() % temp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9351
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9352 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9353 * Insert the first space with ins_char(). It will delete one char in
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9354 * replace mode. Insert the rest with ins_str(); it will not delete any
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9355 * chars. For VREPLACE mode, we use ins_char() for all characters.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9356 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9357 ins_char(' ');
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9358 while (--temp > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9359 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9360 #ifdef FEAT_VREPLACE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9361 if (State & VREPLACE_FLAG)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9362 ins_char(' ');
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9363 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9364 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9365 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9366 ins_str((char_u *)" ");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9367 if (State & REPLACE_FLAG) /* no char replaced */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9368 replace_push(NUL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9369 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9370 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9371
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9372 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9373 * When 'expandtab' not set: Replace spaces by TABs where possible.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9374 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9375 if (!curbuf->b_p_et && (curbuf->b_p_sts || (p_sta && ind)))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9376 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9377 char_u *ptr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9378 #ifdef FEAT_VREPLACE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9379 char_u *saved_line = NULL; /* init for GCC */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9380 pos_T pos;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9381 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9382 pos_T fpos;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9383 pos_T *cursor;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9384 colnr_T want_vcol, vcol;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9385 int change_col = -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9386 int save_list = curwin->w_p_list;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9387
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9388 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9389 * Get the current line. For VREPLACE mode, don't make real changes
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9390 * yet, just work on a copy of the line.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9391 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9392 #ifdef FEAT_VREPLACE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9393 if (State & VREPLACE_FLAG)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9394 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9395 pos = curwin->w_cursor;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9396 cursor = &pos;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9397 saved_line = vim_strsave(ml_get_curline());
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9398 if (saved_line == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9399 return FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9400 ptr = saved_line + pos.col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9401 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9402 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9403 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9404 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9405 ptr = ml_get_cursor();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9406 cursor = &curwin->w_cursor;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9407 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9408
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9409 /* When 'L' is not in 'cpoptions' a tab always takes up 'ts' spaces. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9410 if (vim_strchr(p_cpo, CPO_LISTWM) == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9411 curwin->w_p_list = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9412
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9413 /* Find first white before the cursor */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9414 fpos = curwin->w_cursor;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9415 while (fpos.col > 0 && vim_iswhite(ptr[-1]))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9416 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9417 --fpos.col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9418 --ptr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9419 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9420
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9421 /* In Replace mode, don't change characters before the insert point. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9422 if ((State & REPLACE_FLAG)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9423 && fpos.lnum == Insstart.lnum
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9424 && fpos.col < Insstart.col)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9425 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9426 ptr += Insstart.col - fpos.col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9427 fpos.col = Insstart.col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9428 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9429
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9430 /* compute virtual column numbers of first white and cursor */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9431 getvcol(curwin, &fpos, &vcol, NULL, NULL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9432 getvcol(curwin, cursor, &want_vcol, NULL, NULL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9433
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9434 /* Use as many TABs as possible. Beware of 'showbreak' and
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9435 * 'linebreak' adding extra virtual columns. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9436 while (vim_iswhite(*ptr))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9437 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9438 i = lbr_chartabsize((char_u *)"\t", vcol);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9439 if (vcol + i > want_vcol)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9440 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9441 if (*ptr != TAB)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9442 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9443 *ptr = TAB;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9444 if (change_col < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9445 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9446 change_col = fpos.col; /* Column of first change */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9447 /* May have to adjust Insstart */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9448 if (fpos.lnum == Insstart.lnum && fpos.col < Insstart.col)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9449 Insstart.col = fpos.col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9450 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9451 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9452 ++fpos.col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9453 ++ptr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9454 vcol += i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9455 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9456
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9457 if (change_col >= 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9458 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9459 int repl_off = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9460
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9461 /* Skip over the spaces we need. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9462 while (vcol < want_vcol && *ptr == ' ')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9463 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9464 vcol += lbr_chartabsize(ptr, vcol);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9465 ++ptr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9466 ++repl_off;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9467 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9468 if (vcol > want_vcol)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9469 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9470 /* Must have a char with 'showbreak' just before it. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9471 --ptr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9472 --repl_off;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9473 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9474 fpos.col += repl_off;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9475
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9476 /* Delete following spaces. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9477 i = cursor->col - fpos.col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9478 if (i > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9479 {
1622
149d8b46404c updated for version 7.2a
vimboss
parents: 1563
diff changeset
9480 STRMOVE(ptr, ptr + i);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9481 /* correct replace stack. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9482 if ((State & REPLACE_FLAG)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9483 #ifdef FEAT_VREPLACE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9484 && !(State & VREPLACE_FLAG)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9485 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9486 )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9487 for (temp = i; --temp >= 0; )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9488 replace_join(repl_off);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9489 }
33
f6033dcbaf31 updated for version 7.0020
vimboss
parents: 20
diff changeset
9490 #ifdef FEAT_NETBEANS_INTG
2210
8c6a66e2b3cc Add :nbstart and :nbclose.
Bram Moolenaar <bram@vim.org>
parents: 2209
diff changeset
9491 if (netbeans_active())
33
f6033dcbaf31 updated for version 7.0020
vimboss
parents: 20
diff changeset
9492 {
2209
d0ddf7ba1630 Included the patch to support netbeans in a terminal.
Bram Moolenaar <bram@vim.org>
parents: 2178
diff changeset
9493 netbeans_removed(curbuf, fpos.lnum, cursor->col, (long)(i + 1));
33
f6033dcbaf31 updated for version 7.0020
vimboss
parents: 20
diff changeset
9494 netbeans_inserted(curbuf, fpos.lnum, cursor->col,
f6033dcbaf31 updated for version 7.0020
vimboss
parents: 20
diff changeset
9495 (char_u *)"\t", 1);
f6033dcbaf31 updated for version 7.0020
vimboss
parents: 20
diff changeset
9496 }
f6033dcbaf31 updated for version 7.0020
vimboss
parents: 20
diff changeset
9497 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9498 cursor->col -= i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9499
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9500 #ifdef FEAT_VREPLACE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9501 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9502 * In VREPLACE mode, we haven't changed anything yet. Do it now by
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9503 * backspacing over the changed spacing and then inserting the new
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9504 * spacing.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9505 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9506 if (State & VREPLACE_FLAG)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9507 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9508 /* Backspace from real cursor to change_col */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9509 backspace_until_column(change_col);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9510
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9511 /* Insert each char in saved_line from changed_col to
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9512 * ptr-cursor */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9513 ins_bytes_len(saved_line + change_col,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9514 cursor->col - change_col);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9515 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9516 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9517 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9518
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9519 #ifdef FEAT_VREPLACE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9520 if (State & VREPLACE_FLAG)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9521 vim_free(saved_line);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9522 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9523 curwin->w_p_list = save_list;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9524 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9525
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9526 return FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9527 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9528
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9529 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9530 * Handle CR or NL in insert mode.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9531 * Return TRUE when out of memory or can't undo.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9532 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9533 static int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9534 ins_eol(c)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9535 int c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9536 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9537 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9538
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9539 if (echeck_abbr(c + ABBR_OFF))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9540 return FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9541 if (stop_arrow() == FAIL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9542 return TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9543 undisplay_dollar();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9544
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9545 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9546 * Strange Vi behaviour: In Replace mode, typing a NL will not delete the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9547 * character under the cursor. Only push a NUL on the replace stack,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9548 * nothing to put back when the NL is deleted.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9549 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9550 if ((State & REPLACE_FLAG)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9551 #ifdef FEAT_VREPLACE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9552 && !(State & VREPLACE_FLAG)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9553 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9554 )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9555 replace_push(NUL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9556
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9557 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9558 * In VREPLACE mode, a NL replaces the rest of the line, and starts
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9559 * replacing the next line, so we push all of the characters left on the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9560 * line onto the replace stack. This is not done here though, it is done
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9561 * in open_line().
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9562 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9563
844
d3bbb5dd3913 updated for version 7.0f02
vimboss
parents: 842
diff changeset
9564 #ifdef FEAT_VIRTUALEDIT
d3bbb5dd3913 updated for version 7.0f02
vimboss
parents: 842
diff changeset
9565 /* Put cursor on NUL if on the last char and coladd is 1 (happens after
d3bbb5dd3913 updated for version 7.0f02
vimboss
parents: 842
diff changeset
9566 * CTRL-O). */
d3bbb5dd3913 updated for version 7.0f02
vimboss
parents: 842
diff changeset
9567 if (virtual_active() && curwin->w_cursor.coladd > 0)
d3bbb5dd3913 updated for version 7.0f02
vimboss
parents: 842
diff changeset
9568 coladvance(getviscol());
d3bbb5dd3913 updated for version 7.0f02
vimboss
parents: 842
diff changeset
9569 #endif
d3bbb5dd3913 updated for version 7.0f02
vimboss
parents: 842
diff changeset
9570
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9571 #ifdef FEAT_RIGHTLEFT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9572 # ifdef FEAT_FKMAP
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9573 if (p_altkeymap && p_fkmap)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9574 fkmap(NL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9575 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9576 /* NL in reverse insert will always start in the end of
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9577 * current line. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9578 if (revins_on)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9579 curwin->w_cursor.col += (colnr_T)STRLEN(ml_get_cursor());
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9580 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9581
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9582 AppendToRedobuff(NL_STR);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9583 i = open_line(FORWARD,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9584 #ifdef FEAT_COMMENTS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9585 has_format_option(FO_RET_COMS) ? OPENLINE_DO_COM :
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9586 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9587 0, old_indent);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9588 old_indent = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9589 #ifdef FEAT_CINDENT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9590 can_cindent = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9591 #endif
1032
e6aed39f1264 updated for version 7.0-158
vimboss
parents: 1013
diff changeset
9592 #ifdef FEAT_FOLDING
e6aed39f1264 updated for version 7.0-158
vimboss
parents: 1013
diff changeset
9593 /* When inserting a line the cursor line must never be in a closed fold. */
e6aed39f1264 updated for version 7.0-158
vimboss
parents: 1013
diff changeset
9594 foldOpenCursor();
e6aed39f1264 updated for version 7.0-158
vimboss
parents: 1013
diff changeset
9595 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9596
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9597 return (!i);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9598 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9599
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9600 #ifdef FEAT_DIGRAPHS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9601 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9602 * Handle digraph in insert mode.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9603 * Returns character still to be inserted, or NUL when nothing remaining to be
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9604 * done.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9605 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9606 static int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9607 ins_digraph()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9608 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9609 int c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9610 int cc;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9611
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9612 pc_status = PC_STATUS_UNSET;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9613 if (redrawing() && !char_avail())
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9614 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9615 /* may need to redraw when no more chars available now */
661
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 659
diff changeset
9616 ins_redraw(FALSE);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9617
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9618 edit_putchar('?', TRUE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9619 #ifdef FEAT_CMDL_INFO
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9620 add_to_showcmd_c(Ctrl_K);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9621 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9622 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9623
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9624 #ifdef USE_ON_FLY_SCROLL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9625 dont_scroll = TRUE; /* disallow scrolling here */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9626 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9627
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9628 /* don't map the digraph chars. This also prevents the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9629 * mode message to be deleted when ESC is hit */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9630 ++no_mapping;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9631 ++allow_keys;
1389
bdcfe793d49f updated for version 7.1-104
vimboss
parents: 1353
diff changeset
9632 c = plain_vgetc();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9633 --no_mapping;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9634 --allow_keys;
2319
c79ccf947487 Fix: When entering a digraph or special character after a line that fits the
Bram Moolenaar <bram@vim.org>
parents: 2297
diff changeset
9635 edit_unputchar(); /* when line fits in 'columns' the '?' is at the start
c79ccf947487 Fix: When entering a digraph or special character after a line that fits the
Bram Moolenaar <bram@vim.org>
parents: 2297
diff changeset
9636 of the next line and will not be redrawn */
c79ccf947487 Fix: When entering a digraph or special character after a line that fits the
Bram Moolenaar <bram@vim.org>
parents: 2297
diff changeset
9637
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9638 if (IS_SPECIAL(c) || mod_mask) /* special key */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9639 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9640 #ifdef FEAT_CMDL_INFO
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9641 clear_showcmd();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9642 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9643 insert_special(c, TRUE, FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9644 return NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9645 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9646 if (c != ESC)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9647 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9648 if (redrawing() && !char_avail())
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9649 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9650 /* may need to redraw when no more chars available now */
661
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 659
diff changeset
9651 ins_redraw(FALSE);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9652
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9653 if (char2cells(c) == 1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9654 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9655 /* first remove the '?', otherwise it's restored when typing
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9656 * an ESC next */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9657 edit_unputchar();
661
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 659
diff changeset
9658 ins_redraw(FALSE);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9659 edit_putchar(c, TRUE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9660 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9661 #ifdef FEAT_CMDL_INFO
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9662 add_to_showcmd_c(c);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9663 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9664 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9665 ++no_mapping;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9666 ++allow_keys;
1389
bdcfe793d49f updated for version 7.1-104
vimboss
parents: 1353
diff changeset
9667 cc = plain_vgetc();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9668 --no_mapping;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9669 --allow_keys;
2319
c79ccf947487 Fix: When entering a digraph or special character after a line that fits the
Bram Moolenaar <bram@vim.org>
parents: 2297
diff changeset
9670 edit_unputchar(); /* when line fits in 'columns' the '?' is at the
c79ccf947487 Fix: When entering a digraph or special character after a line that fits the
Bram Moolenaar <bram@vim.org>
parents: 2297
diff changeset
9671 start of the next line and will not be redrawn */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9672 if (cc != ESC)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9673 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9674 AppendToRedobuff((char_u *)CTRL_V_STR);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9675 c = getdigraph(c, cc, TRUE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9676 #ifdef FEAT_CMDL_INFO
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9677 clear_showcmd();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9678 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9679 return c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9680 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9681 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9682 #ifdef FEAT_CMDL_INFO
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9683 clear_showcmd();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9684 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9685 return NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9686 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9687 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9688
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9689 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9690 * Handle CTRL-E and CTRL-Y in Insert mode: copy char from other line.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9691 * Returns the char to be inserted, or NUL if none found.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9692 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9693 static int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9694 ins_copychar(lnum)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9695 linenr_T lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9696 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9697 int c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9698 int temp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9699 char_u *ptr, *prev_ptr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9700
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9701 if (lnum < 1 || lnum > curbuf->b_ml.ml_line_count)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9702 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9703 vim_beep();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9704 return NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9705 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9706
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9707 /* try to advance to the cursor column */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9708 temp = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9709 ptr = ml_get(lnum);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9710 prev_ptr = ptr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9711 validate_virtcol();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9712 while ((colnr_T)temp < curwin->w_virtcol && *ptr != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9713 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9714 prev_ptr = ptr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9715 temp += lbr_chartabsize_adv(&ptr, (colnr_T)temp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9716 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9717 if ((colnr_T)temp > curwin->w_virtcol)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9718 ptr = prev_ptr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9719
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9720 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9721 c = (*mb_ptr2char)(ptr);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9722 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9723 c = *ptr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9724 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9725 if (c == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9726 vim_beep();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9727 return c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9728 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9729
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
9730 /*
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
9731 * CTRL-Y or CTRL-E typed in Insert mode.
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
9732 */
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
9733 static int
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
9734 ins_ctrl_ey(tc)
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
9735 int tc;
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
9736 {
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
9737 int c = tc;
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
9738
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
9739 #ifdef FEAT_INS_EXPAND
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
9740 if (ctrl_x_mode == CTRL_X_SCROLL)
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
9741 {
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
9742 if (c == Ctrl_Y)
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
9743 scrolldown_clamp();
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
9744 else
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
9745 scrollup_clamp();
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
9746 redraw_later(VALID);
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
9747 }
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
9748 else
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
9749 #endif
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
9750 {
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
9751 c = ins_copychar(curwin->w_cursor.lnum + (c == Ctrl_Y ? -1 : 1));
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
9752 if (c != NUL)
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
9753 {
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
9754 long tw_save;
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
9755
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
9756 /* The character must be taken literally, insert like it
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
9757 * was typed after a CTRL-V, and pretend 'textwidth'
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
9758 * wasn't set. Digits, 'o' and 'x' are special after a
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
9759 * CTRL-V, don't use it for these. */
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
9760 if (c < 256 && !isalnum(c))
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
9761 AppendToRedobuff((char_u *)CTRL_V_STR); /* CTRL-V */
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
9762 tw_save = curbuf->b_p_tw;
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
9763 curbuf->b_p_tw = -1;
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
9764 insert_special(c, TRUE, FALSE);
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
9765 curbuf->b_p_tw = tw_save;
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
9766 #ifdef FEAT_RIGHTLEFT
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
9767 revins_chars++;
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
9768 revins_legal++;
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
9769 #endif
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
9770 c = Ctrl_V; /* pretend CTRL-V is last character */
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
9771 auto_format(FALSE, TRUE);
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
9772 }
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
9773 }
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
9774 return c;
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
9775 }
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 431
diff changeset
9776
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9777 #ifdef FEAT_SMARTINDENT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9778 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9779 * Try to do some very smart auto-indenting.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9780 * Used when inserting a "normal" character.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9781 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9782 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9783 ins_try_si(c)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9784 int c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9785 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9786 pos_T *pos, old_pos;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9787 char_u *ptr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9788 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9789 int temp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9790
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9791 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9792 * do some very smart indenting when entering '{' or '}'
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9793 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9794 if (((did_si || can_si_back) && c == '{') || (can_si && c == '}'))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9795 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9796 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9797 * for '}' set indent equal to indent of line containing matching '{'
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9798 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9799 if (c == '}' && (pos = findmatch(NULL, '{')) != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9800 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9801 old_pos = curwin->w_cursor;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9802 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9803 * If the matching '{' has a ')' immediately before it (ignoring
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9804 * white-space), then line up with the start of the line
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9805 * containing the matching '(' if there is one. This handles the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9806 * case where an "if (..\n..) {" statement continues over multiple
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9807 * lines -- webb
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9808 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9809 ptr = ml_get(pos->lnum);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9810 i = pos->col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9811 if (i > 0) /* skip blanks before '{' */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9812 while (--i > 0 && vim_iswhite(ptr[i]))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9813 ;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9814 curwin->w_cursor.lnum = pos->lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9815 curwin->w_cursor.col = i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9816 if (ptr[i] == ')' && (pos = findmatch(NULL, '(')) != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9817 curwin->w_cursor = *pos;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9818 i = get_indent();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9819 curwin->w_cursor = old_pos;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9820 #ifdef FEAT_VREPLACE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9821 if (State & VREPLACE_FLAG)
1516
ee9d2d24ea9b updated for version 7.1-231
vimboss
parents: 1514
diff changeset
9822 change_indent(INDENT_SET, i, FALSE, NUL, TRUE);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9823 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9824 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9825 (void)set_indent(i, SIN_CHANGED);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9826 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9827 else if (curwin->w_cursor.col > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9828 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9829 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9830 * when inserting '{' after "O" reduce indent, but not
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9831 * more than indent of previous line
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9832 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9833 temp = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9834 if (c == '{' && can_si_back && curwin->w_cursor.lnum > 1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9835 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9836 old_pos = curwin->w_cursor;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9837 i = get_indent();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9838 while (curwin->w_cursor.lnum > 1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9839 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9840 ptr = skipwhite(ml_get(--(curwin->w_cursor.lnum)));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9841
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9842 /* ignore empty lines and lines starting with '#'. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9843 if (*ptr != '#' && *ptr != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9844 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9845 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9846 if (get_indent() >= i)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9847 temp = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9848 curwin->w_cursor = old_pos;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9849 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9850 if (temp)
1516
ee9d2d24ea9b updated for version 7.1-231
vimboss
parents: 1514
diff changeset
9851 shift_line(TRUE, FALSE, 1, TRUE);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9852 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9853 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9854
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9855 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9856 * set indent of '#' always to 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9857 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9858 if (curwin->w_cursor.col > 0 && can_si && c == '#')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9859 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9860 /* remember current indent for next line */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9861 old_indent = get_indent();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9862 (void)set_indent(0, SIN_CHANGED);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9863 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9864
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9865 /* Adjust ai_col, the char at this position can be deleted. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9866 if (ai_col > curwin->w_cursor.col)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9867 ai_col = curwin->w_cursor.col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9868 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9869 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9870
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9871 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9872 * Get the value that w_virtcol would have when 'list' is off.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9873 * Unless 'cpo' contains the 'L' flag.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9874 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9875 static colnr_T
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9876 get_nolist_virtcol()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9877 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9878 if (curwin->w_p_list && vim_strchr(p_cpo, CPO_LISTWM) == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9879 return getvcol_nolist(&curwin->w_cursor);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9880 validate_virtcol();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9881 return curwin->w_virtcol;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9882 }