Bram Moolenaar | 06fe74a | 2019-08-31 16:20:32 +0200 | [diff] [blame] | 1 | *insert.txt* For Vim version 8.1. Last change: 2019 Aug 21 |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 2 | |
| 3 | |
| 4 | VIM REFERENCE MANUAL by Bram Moolenaar |
| 5 | |
| 6 | |
| 7 | *Insert* *Insert-mode* |
| 8 | Inserting and replacing text *mode-ins-repl* |
| 9 | |
| 10 | Most of this file is about Insert and Replace mode. At the end are a few |
| 11 | commands for inserting text in other ways. |
| 12 | |
| 13 | An overview of the most often used commands can be found in chapter 24 of the |
| 14 | user manual |usr_24.txt|. |
| 15 | |
| 16 | 1. Special keys |ins-special-keys| |
| 17 | 2. Special special keys |ins-special-special| |
| 18 | 3. 'textwidth' and 'wrapmargin' options |ins-textwidth| |
| 19 | 4. 'expandtab', 'smarttab' and 'softtabstop' options |ins-expandtab| |
| 20 | 5. Replace mode |Replace-mode| |
| 21 | 6. Virtual Replace mode |Virtual-Replace-mode| |
| 22 | 7. Insert mode completion |ins-completion| |
| 23 | 8. Insert mode commands |inserting| |
| 24 | 9. Ex insert commands |inserting-ex| |
| 25 | 10. Inserting a file |inserting-file| |
| 26 | |
| 27 | Also see 'virtualedit', for moving the cursor to positions where there is no |
| 28 | character. Useful for editing a table. |
| 29 | |
| 30 | ============================================================================== |
| 31 | 1. Special keys *ins-special-keys* |
| 32 | |
| 33 | In Insert and Replace mode, the following characters have a special meaning; |
| 34 | other characters are inserted directly. To insert one of these special |
| 35 | characters into the buffer, precede it with CTRL-V. To insert a <Nul> |
| 36 | character use "CTRL-V CTRL-@" or "CTRL-V 000". On some systems, you have to |
| 37 | use "CTRL-V 003" to insert a CTRL-C. Note: When CTRL-V is mapped you can |
| 38 | often use CTRL-Q instead |i_CTRL-Q|. |
| 39 | |
| 40 | If you are working in a special language mode when inserting text, see the |
| 41 | 'langmap' option, |'langmap'|, on how to avoid switching this mode on and off |
| 42 | all the time. |
| 43 | |
| 44 | If you have 'insertmode' set, <Esc> and a few other keys get another meaning. |
| 45 | See |'insertmode'|. |
| 46 | |
| 47 | char action ~ |
| 48 | ----------------------------------------------------------------------- |
| 49 | *i_CTRL-[* *i_<Esc>* |
| 50 | <Esc> or CTRL-[ End insert or Replace mode, go back to Normal mode. Finish |
| 51 | abbreviation. |
| 52 | Note: If your <Esc> key is hard to hit on your keyboard, train |
| 53 | yourself to use CTRL-[. |
Bram Moolenaar | fb53927 | 2014-08-22 19:21:47 +0200 | [diff] [blame] | 54 | If Esc doesn't work and you are using a Mac, try CTRL-Esc. |
| 55 | Or disable Listening under Accessibility preferences. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 56 | *i_CTRL-C* |
| 57 | CTRL-C Quit insert mode, go back to Normal mode. Do not check for |
Bram Moolenaar | 677ee68 | 2005-01-27 14:41:15 +0000 | [diff] [blame] | 58 | abbreviations. Does not trigger the |InsertLeave| autocommand |
| 59 | event. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 60 | |
| 61 | *i_CTRL-@* |
Bram Moolenaar | a6c27c4 | 2019-05-09 19:16:22 +0200 | [diff] [blame] | 62 | CTRL-@ Insert previously inserted text and stop insert. |
| 63 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 64 | *i_CTRL-A* |
Bram Moolenaar | 25c9c68 | 2019-05-05 18:13:34 +0200 | [diff] [blame] | 65 | CTRL-A Insert previously inserted text. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 66 | |
| 67 | *i_CTRL-H* *i_<BS>* *i_BS* |
| 68 | <BS> or CTRL-H Delete the character before the cursor (see |i_backspacing| |
| 69 | about joining lines). |
| 70 | See |:fixdel| if your <BS> key does not do what you want. |
Bram Moolenaar | a6c27c4 | 2019-05-09 19:16:22 +0200 | [diff] [blame] | 71 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 72 | *i_<Del>* *i_DEL* |
| 73 | <Del> Delete the character under the cursor. If the cursor is at |
| 74 | the end of the line, and the 'backspace' option includes |
| 75 | "eol", delete the <EOL>; the next line is appended after the |
| 76 | current one. |
| 77 | See |:fixdel| if your <Del> key does not do what you want. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 78 | *i_CTRL-W* |
| 79 | CTRL-W Delete the word before the cursor (see |i_backspacing| about |
| 80 | joining lines). See the section "word motions", |
| 81 | |word-motions|, for the definition of a word. |
| 82 | *i_CTRL-U* |
Bram Moolenaar | f2571c6 | 2015-06-09 19:44:55 +0200 | [diff] [blame] | 83 | CTRL-U Delete all entered characters before the cursor in the current |
Bram Moolenaar | 979243b | 2015-06-26 19:35:49 +0200 | [diff] [blame] | 84 | line. If there are no newly entered characters and |
| 85 | 'backspace' is not empty, delete all characters before the |
Bram Moolenaar | f2571c6 | 2015-06-09 19:44:55 +0200 | [diff] [blame] | 86 | cursor in the current line. |
| 87 | See |i_backspacing| about joining lines. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 88 | *i_CTRL-I* *i_<Tab>* *i_Tab* |
| 89 | <Tab> or CTRL-I Insert a tab. If the 'expandtab' option is on, the |
| 90 | equivalent number of spaces is inserted (use CTRL-V <Tab> to |
| 91 | avoid the expansion; use CTRL-Q <Tab> if CTRL-V is mapped |
| 92 | |i_CTRL-Q|). See also the 'smarttab' option and |
| 93 | |ins-expandtab|. |
| 94 | *i_CTRL-J* *i_<NL>* |
| 95 | <NL> or CTRL-J Begin new line. |
| 96 | *i_CTRL-M* *i_<CR>* |
| 97 | <CR> or CTRL-M Begin new line. |
| 98 | *i_CTRL-K* |
| 99 | CTRL-K {char1} [char2] |
| 100 | Enter digraph (see |digraphs|). When {char1} is a special |
| 101 | key, the code for that key is inserted in <> form. For |
| 102 | example, the string "<S-Space>" can be entered by typing |
| 103 | <C-K><S-Space> (two keys). Neither char is considered for |
Bram Moolenaar | 25c9c68 | 2019-05-05 18:13:34 +0200 | [diff] [blame] | 104 | mapping. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 105 | |
Bram Moolenaar | 25c9c68 | 2019-05-05 18:13:34 +0200 | [diff] [blame] | 106 | CTRL-N Find next keyword (see |i_CTRL-N|). |
| 107 | CTRL-P Find previous keyword (see |i_CTRL-P|). |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 108 | |
| 109 | CTRL-R {0-9a-z"%#*+:.-=} *i_CTRL-R* |
| 110 | Insert the contents of a register. Between typing CTRL-R and |
| 111 | the second character, '"' will be displayed to indicate that |
| 112 | you are expected to enter the name of a register. |
| 113 | The text is inserted as if you typed it, but mappings and |
| 114 | abbreviations are not used. If you have options like |
| 115 | 'textwidth', 'formatoptions', or 'autoindent' set, this will |
| 116 | influence what will be inserted. This is different from what |
| 117 | happens with the "p" command and pasting with the mouse. |
| 118 | Special registers: |
| 119 | '"' the unnamed register, containing the text of |
| 120 | the last delete or yank |
| 121 | '%' the current file name |
| 122 | '#' the alternate file name |
| 123 | '*' the clipboard contents (X11: primary selection) |
| 124 | '+' the clipboard contents |
| 125 | '/' the last search pattern |
| 126 | ':' the last command-line |
| 127 | '.' the last inserted text |
| 128 | '-' the last small (less than a line) delete |
Bram Moolenaar | 8f3f58f | 2010-01-06 20:52:26 +0100 | [diff] [blame] | 129 | *i_CTRL-R_=* |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 130 | '=' the expression register: you are prompted to |
| 131 | enter an expression (see |expression|) |
Bram Moolenaar | 293ee4d | 2004-12-09 21:34:53 +0000 | [diff] [blame] | 132 | Note that 0x80 (128 decimal) is used for |
Bram Moolenaar | 1d2ba7f | 2006-02-14 22:29:30 +0000 | [diff] [blame] | 133 | special keys. E.g., you can use this to move |
| 134 | the cursor up: |
| 135 | CTRL-R ="\<Up>" |
| 136 | Use CTRL-R CTRL-R to insert text literally. |
Bram Moolenaar | 362e1a3 | 2006-03-06 23:29:24 +0000 | [diff] [blame] | 137 | When the result is a |List| the items are used |
| 138 | as lines. They can have line breaks inside |
| 139 | too. |
Bram Moolenaar | 8f3f58f | 2010-01-06 20:52:26 +0100 | [diff] [blame] | 140 | When the result is a Float it's automatically |
| 141 | converted to a String. |
Bram Moolenaar | 94f76b7 | 2013-07-04 22:50:40 +0200 | [diff] [blame] | 142 | When append() or setline() is invoked the undo |
| 143 | sequence will be broken. |
Bram Moolenaar | 25c9c68 | 2019-05-05 18:13:34 +0200 | [diff] [blame] | 144 | See |registers| about registers. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 145 | |
| 146 | CTRL-R CTRL-R {0-9a-z"%#*+/:.-=} *i_CTRL-R_CTRL-R* |
| 147 | Insert the contents of a register. Works like using a single |
| 148 | CTRL-R, but the text is inserted literally, not as if typed. |
| 149 | This differs when the register contains characters like <BS>. |
| 150 | Example, where register a contains "ab^Hc": > |
| 151 | CTRL-R a results in "ac". |
| 152 | CTRL-R CTRL-R a results in "ab^Hc". |
| 153 | < Options 'textwidth', 'formatoptions', etc. still apply. If |
Bram Moolenaar | ca63501 | 2015-09-25 20:34:21 +0200 | [diff] [blame] | 154 | you also want to avoid these, use CTRL-R CTRL-O, see below. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 155 | The '.' register (last inserted text) is still inserted as |
Bram Moolenaar | 25c9c68 | 2019-05-05 18:13:34 +0200 | [diff] [blame] | 156 | typed. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 157 | |
| 158 | CTRL-R CTRL-O {0-9a-z"%#*+/:.-=} *i_CTRL-R_CTRL-O* |
| 159 | Insert the contents of a register literally and don't |
| 160 | auto-indent. Does the same as pasting with the mouse |
Bram Moolenaar | cd5c8f8 | 2017-04-09 20:11:58 +0200 | [diff] [blame] | 161 | |<MiddleMouse>|. When the register is linewise this will |
| 162 | insert the text above the current line, like with `P`. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 163 | Does not replace characters! |
| 164 | The '.' register (last inserted text) is still inserted as |
Bram Moolenaar | 25c9c68 | 2019-05-05 18:13:34 +0200 | [diff] [blame] | 165 | typed. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 166 | |
| 167 | CTRL-R CTRL-P {0-9a-z"%#*+/:.-=} *i_CTRL-R_CTRL-P* |
| 168 | Insert the contents of a register literally and fix the |
| 169 | indent, like |[<MiddleMouse>|. |
| 170 | Does not replace characters! |
| 171 | The '.' register (last inserted text) is still inserted as |
Bram Moolenaar | 25c9c68 | 2019-05-05 18:13:34 +0200 | [diff] [blame] | 172 | typed. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 173 | |
| 174 | *i_CTRL-T* |
| 175 | CTRL-T Insert one shiftwidth of indent at the start of the current |
| 176 | line. The indent is always rounded to a 'shiftwidth' (this is |
Bram Moolenaar | a6c27c4 | 2019-05-09 19:16:22 +0200 | [diff] [blame] | 177 | vi compatible). |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 178 | *i_CTRL-D* |
| 179 | CTRL-D Delete one shiftwidth of indent at the start of the current |
| 180 | line. The indent is always rounded to a 'shiftwidth' (this is |
Bram Moolenaar | a6c27c4 | 2019-05-09 19:16:22 +0200 | [diff] [blame] | 181 | vi compatible). |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 182 | *i_0_CTRL-D* |
Bram Moolenaar | a6c27c4 | 2019-05-09 19:16:22 +0200 | [diff] [blame] | 183 | 0 CTRL-D Delete all indent in the current line. |
| 184 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 185 | *i_^_CTRL-D* |
| 186 | ^ CTRL-D Delete all indent in the current line. The indent is |
| 187 | restored in the next line. This is useful when inserting a |
Bram Moolenaar | a6c27c4 | 2019-05-09 19:16:22 +0200 | [diff] [blame] | 188 | label. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 189 | |
| 190 | *i_CTRL-V* |
| 191 | CTRL-V Insert next non-digit literally. For special keys, the |
| 192 | terminal code is inserted. It's also possible to enter the |
| 193 | decimal, octal or hexadecimal value of a character |
| 194 | |i_CTRL-V_digit|. |
| 195 | The characters typed right after CTRL-V are not considered for |
Bram Moolenaar | a6c27c4 | 2019-05-09 19:16:22 +0200 | [diff] [blame] | 196 | mapping. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 197 | Note: When CTRL-V is mapped (e.g., to paste text) you can |
| 198 | often use CTRL-Q instead |i_CTRL-Q|. |
| 199 | |
| 200 | *i_CTRL-Q* |
| 201 | CTRL-Q Same as CTRL-V. |
| 202 | Note: Some terminal connections may eat CTRL-Q, it doesn't |
| 203 | work then. It does work in the GUI. |
| 204 | |
| 205 | CTRL-X Enter CTRL-X mode. This is a sub-mode where commands can |
Bram Moolenaar | 402d2fe | 2005-04-15 21:00:38 +0000 | [diff] [blame] | 206 | be given to complete words or scroll the window. See |
Bram Moolenaar | 25c9c68 | 2019-05-05 18:13:34 +0200 | [diff] [blame] | 207 | |i_CTRL-X| and |ins-completion|. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 208 | |
| 209 | *i_CTRL-E* |
Bram Moolenaar | 25c9c68 | 2019-05-05 18:13:34 +0200 | [diff] [blame] | 210 | CTRL-E Insert the character which is below the cursor. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 211 | *i_CTRL-Y* |
Bram Moolenaar | 25c9c68 | 2019-05-05 18:13:34 +0200 | [diff] [blame] | 212 | CTRL-Y Insert the character which is above the cursor. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 213 | Note that for CTRL-E and CTRL-Y 'textwidth' is not used, to be |
| 214 | able to copy characters from a long line. |
| 215 | |
| 216 | *i_CTRL-_* |
| 217 | CTRL-_ Switch between languages, as follows: |
| 218 | - When in a rightleft window, revins and nohkmap are toggled, |
| 219 | since English will likely be inserted in this case. |
| 220 | - When in a norightleft window, revins and hkmap are toggled, |
| 221 | since Hebrew will likely be inserted in this case. |
| 222 | |
| 223 | CTRL-_ moves the cursor to the end of the typed text. |
| 224 | |
| 225 | This command is only available when the 'allowrevins' option |
| 226 | is set. |
| 227 | Please refer to |rileft.txt| for more information about |
| 228 | right-to-left mode. |
Bram Moolenaar | 9964e46 | 2007-05-05 17:54:07 +0000 | [diff] [blame] | 229 | Only if compiled with the |+rightleft| feature. |
| 230 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 231 | *i_CTRL-^* |
| 232 | CTRL-^ Toggle the use of typing language characters. |
| 233 | When language |:lmap| mappings are defined: |
| 234 | - If 'iminsert' is 1 (langmap mappings used) it becomes 0 (no |
| 235 | langmap mappings used). |
| 236 | - If 'iminsert' has another value it becomes 1, thus langmap |
| 237 | mappings are enabled. |
| 238 | When no language mappings are defined: |
| 239 | - If 'iminsert' is 2 (Input Method used) it becomes 0 (no |
| 240 | Input Method used). |
| 241 | - If 'iminsert' has another value it becomes 2, thus the Input |
| 242 | Method is enabled. |
| 243 | When set to 1, the value of the "b:keymap_name" variable, the |
| 244 | 'keymap' option or "<lang>" appears in the status line. |
| 245 | The language mappings are normally used to type characters |
| 246 | that are different from what the keyboard produces. The |
| 247 | 'keymap' option can be used to install a whole number of them. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 248 | |
| 249 | *i_CTRL-]* |
Bram Moolenaar | 25c9c68 | 2019-05-05 18:13:34 +0200 | [diff] [blame] | 250 | CTRL-] Trigger abbreviation, without inserting a character. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 251 | |
| 252 | *i_<Insert>* |
Bram Moolenaar | 25c9c68 | 2019-05-05 18:13:34 +0200 | [diff] [blame] | 253 | <Insert> Toggle between Insert and Replace mode. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 254 | ----------------------------------------------------------------------- |
| 255 | |
| 256 | *i_backspacing* |
| 257 | The effect of the <BS>, CTRL-W, and CTRL-U depend on the 'backspace' option |
| 258 | (unless 'revins' is set). This is a comma separated list of items: |
| 259 | |
| 260 | item action ~ |
| 261 | indent allow backspacing over autoindent |
| 262 | eol allow backspacing over end-of-line (join lines) |
| 263 | start allow backspacing over the start position of insert; CTRL-W and |
| 264 | CTRL-U stop once at the start position |
| 265 | |
| 266 | When 'backspace' is empty, Vi compatible backspacing is used. You cannot |
| 267 | backspace over autoindent, before column 1 or before where insert started. |
| 268 | |
| 269 | For backwards compatibility the values "0", "1" and "2" are also allowed, see |
| 270 | |'backspace'|. |
| 271 | |
| 272 | If the 'backspace' option does contain "eol" and the cursor is in column 1 |
| 273 | when one of the three keys is used, the current line is joined with the |
| 274 | previous line. This effectively deletes the <EOL> in front of the cursor. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 275 | |
| 276 | *i_CTRL-V_digit* |
| 277 | With CTRL-V the decimal, octal or hexadecimal value of a character can be |
| 278 | entered directly. This way you can enter any character, except a line break |
| 279 | (<NL>, value 10). There are five ways to enter the character value: |
| 280 | |
| 281 | first char mode max nr of chars max value ~ |
| 282 | (none) decimal 3 255 |
Bram Moolenaar | 402d2fe | 2005-04-15 21:00:38 +0000 | [diff] [blame] | 283 | o or O octal 3 377 (255) |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 284 | x or X hexadecimal 2 ff (255) |
| 285 | u hexadecimal 4 ffff (65535) |
| 286 | U hexadecimal 8 7fffffff (2147483647) |
| 287 | |
| 288 | Normally you would type the maximum number of characters. Thus to enter a |
| 289 | space (value 32) you would type <C-V>032. You can omit the leading zero, in |
| 290 | which case the character typed after the number must be a non-digit. This |
| 291 | happens for the other modes as well: As soon as you type a character that is |
| 292 | invalid for the mode, the value before it will be used and the "invalid" |
| 293 | character is dealt with in the normal way. |
| 294 | |
| 295 | If you enter a value of 10, it will end up in the file as a 0. The 10 is a |
| 296 | <NL>, which is used internally to represent the <Nul> character. When writing |
| 297 | the buffer to a file, the <NL> character is translated into <Nul>. The <NL> |
| 298 | character is written at the end of each line. Thus if you want to insert a |
| 299 | <NL> character in a file you will have to make a line break. |
| 300 | |
| 301 | *i_CTRL-X* *insert_expand* |
| 302 | CTRL-X enters a sub-mode where several commands can be used. Most of these |
Bram Moolenaar | e2c453d | 2019-08-21 14:37:09 +0200 | [diff] [blame] | 303 | commands do keyword completion; see |ins-completion|. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 304 | |
| 305 | Two commands can be used to scroll the window up or down, without exiting |
| 306 | insert mode: |
| 307 | |
| 308 | *i_CTRL-X_CTRL-E* |
| 309 | CTRL-X CTRL-E scroll window one line up. |
Bram Moolenaar | d2cec5b | 2006-03-28 21:08:56 +0000 | [diff] [blame] | 310 | When doing completion look here: |complete_CTRL-E| |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 311 | |
| 312 | *i_CTRL-X_CTRL-Y* |
| 313 | CTRL-X CTRL-Y scroll window one line down. |
Bram Moolenaar | d2cec5b | 2006-03-28 21:08:56 +0000 | [diff] [blame] | 314 | When doing completion look here: |complete_CTRL-Y| |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 315 | |
| 316 | After CTRL-X is pressed, each CTRL-E (CTRL-Y) scrolls the window up (down) by |
| 317 | one line unless that would cause the cursor to move from its current position |
| 318 | in the file. As soon as another key is pressed, CTRL-X mode is exited and |
| 319 | that key is interpreted as in Insert mode. |
| 320 | |
| 321 | |
| 322 | ============================================================================== |
| 323 | 2. Special special keys *ins-special-special* |
| 324 | |
| 325 | The following keys are special. They stop the current insert, do something, |
| 326 | and then restart insertion. This means you can do something without getting |
| 327 | out of Insert mode. This is very handy if you prefer to use the Insert mode |
| 328 | all the time, just like editors that don't have a separate Normal mode. You |
| 329 | may also want to set the 'backspace' option to "indent,eol,start" and set the |
| 330 | 'insertmode' option. You can use CTRL-O if you want to map a function key to |
| 331 | a command. |
| 332 | |
| 333 | The changes (inserted or deleted characters) before and after these keys can |
| 334 | be undone separately. Only the last change can be redone and always behaves |
| 335 | like an "i" command. |
| 336 | |
| 337 | char action ~ |
| 338 | ----------------------------------------------------------------------- |
| 339 | <Up> cursor one line up *i_<Up>* |
| 340 | <Down> cursor one line down *i_<Down>* |
| 341 | CTRL-G <Up> cursor one line up, insert start column *i_CTRL-G_<Up>* |
| 342 | CTRL-G k cursor one line up, insert start column *i_CTRL-G_k* |
| 343 | CTRL-G CTRL-K cursor one line up, insert start column *i_CTRL-G_CTRL-K* |
| 344 | CTRL-G <Down> cursor one line down, insert start column *i_CTRL-G_<Down>* |
| 345 | CTRL-G j cursor one line down, insert start column *i_CTRL-G_j* |
| 346 | CTRL-G CTRL-J cursor one line down, insert start column *i_CTRL-G_CTRL-J* |
| 347 | <Left> cursor one character left *i_<Left>* |
| 348 | <Right> cursor one character right *i_<Right>* |
| 349 | <S-Left> cursor one word back (like "b" command) *i_<S-Left>* |
| 350 | <C-Left> cursor one word back (like "b" command) *i_<C-Left>* |
| 351 | <S-Right> cursor one word forward (like "w" command) *i_<S-Right>* |
| 352 | <C-Right> cursor one word forward (like "w" command) *i_<C-Right>* |
| 353 | <Home> cursor to first char in the line *i_<Home>* |
| 354 | <End> cursor to after last char in the line *i_<End>* |
| 355 | <C-Home> cursor to first char in the file *i_<C-Home>* |
| 356 | <C-End> cursor to after last char in the file *i_<C-End>* |
| 357 | <LeftMouse> cursor to position of mouse click *i_<LeftMouse>* |
| 358 | <S-Up> move window one page up *i_<S-Up>* |
| 359 | <PageUp> move window one page up *i_<PageUp>* |
| 360 | <S-Down> move window one page down *i_<S-Down>* |
| 361 | <PageDown> move window one page down *i_<PageDown>* |
Bram Moolenaar | 8d9b40e | 2010-07-25 15:49:07 +0200 | [diff] [blame] | 362 | <ScrollWheelDown> move window three lines down *i_<ScrollWheelDown>* |
| 363 | <S-ScrollWheelDown> move window one page down *i_<S-ScrollWheelDown>* |
| 364 | <ScrollWheelUp> move window three lines up *i_<ScrollWheelUp>* |
| 365 | <S-ScrollWheelUp> move window one page up *i_<S-ScrollWheelUp>* |
| 366 | <ScrollWheelLeft> move window six columns left *i_<ScrollWheelLeft>* |
| 367 | <S-ScrollWheelLeft> move window one page left *i_<S-ScrollWheelLeft>* |
| 368 | <ScrollWheelRight> move window six columns right *i_<ScrollWheelRight>* |
| 369 | <S-ScrollWheelRight> move window one page right *i_<S-ScrollWheelRight>* |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 370 | CTRL-O execute one command, return to Insert mode *i_CTRL-O* |
Bram Moolenaar | 4770d09 | 2006-01-12 23:22:24 +0000 | [diff] [blame] | 371 | CTRL-\ CTRL-O like CTRL-O but don't move the cursor *i_CTRL-\_CTRL-O* |
Bram Moolenaar | 488c651 | 2005-08-11 20:09:58 +0000 | [diff] [blame] | 372 | CTRL-L when 'insertmode' is set: go to Normal mode *i_CTRL-L* |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 373 | CTRL-G u break undo sequence, start new change *i_CTRL-G_u* |
Bram Moolenaar | 8b5f65a | 2015-09-01 19:26:12 +0200 | [diff] [blame] | 374 | CTRL-G U don't break undo with next left/right cursor *i_CTRL-G_U* |
Bram Moolenaar | fd13332 | 2019-03-29 12:20:27 +0100 | [diff] [blame] | 375 | movement, if the cursor stays within |
| 376 | same the line |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 377 | ----------------------------------------------------------------------- |
| 378 | |
| 379 | Note: If the cursor keys take you out of Insert mode, check the 'noesckeys' |
| 380 | option. |
| 381 | |
| 382 | The CTRL-O command sometimes has a side effect: If the cursor was beyond the |
| 383 | end of the line, it will be put on the last character in the line. In |
| 384 | mappings it's often better to use <Esc> (first put an "x" in the text, <Esc> |
Bram Moolenaar | 488c651 | 2005-08-11 20:09:58 +0000 | [diff] [blame] | 385 | will then always put the cursor on it). Or use CTRL-\ CTRL-O, but then |
Bram Moolenaar | a3e6bc9 | 2013-01-30 14:18:00 +0100 | [diff] [blame] | 386 | beware of the cursor possibly being beyond the end of the line. Note that the |
| 387 | command following CTRL-\ CTRL-O can still move the cursor, it is not restored |
| 388 | to its original position. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 389 | |
Bram Moolenaar | 0536570 | 2010-10-27 18:34:44 +0200 | [diff] [blame] | 390 | The CTRL-O command takes you to Normal mode. If you then use a command enter |
Bram Moolenaar | d38b055 | 2012-04-25 19:07:41 +0200 | [diff] [blame] | 391 | Insert mode again it normally doesn't nest. Thus when typing "a<C-O>a" and |
| 392 | then <Esc> takes you back to Normal mode, you do not need to type <Esc> twice. |
| 393 | An exception is when not typing the command, e.g. when executing a mapping or |
| 394 | sourcing a script. This makes mappings work that briefly switch to Insert |
| 395 | mode. |
Bram Moolenaar | 0536570 | 2010-10-27 18:34:44 +0200 | [diff] [blame] | 396 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 397 | The shifted cursor keys are not available on all terminals. |
| 398 | |
| 399 | Another side effect is that a count specified before the "i" or "a" command is |
| 400 | ignored. That is because repeating the effect of the command after CTRL-O is |
| 401 | too complicated. |
| 402 | |
| 403 | An example for using CTRL-G u: > |
| 404 | |
| 405 | :inoremap <C-H> <C-G>u<C-H> |
| 406 | |
| 407 | This redefines the backspace key to start a new undo sequence. You can now |
| 408 | undo the effect of the backspace key, without changing what you typed before |
Bram Moolenaar | 5b435d6 | 2012-04-05 17:33:26 +0200 | [diff] [blame] | 409 | that, with CTRL-O u. Another example: > |
| 410 | |
| 411 | :inoremap <CR> <C-]><C-G>u<CR> |
| 412 | |
| 413 | This breaks undo at each line break. It also expands abbreviations before |
| 414 | this. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 415 | |
Bram Moolenaar | 8b5f65a | 2015-09-01 19:26:12 +0200 | [diff] [blame] | 416 | An example for using CTRL-G U: > |
| 417 | |
| 418 | inoremap <Left> <C-G>U<Left> |
| 419 | inoremap <Right> <C-G>U<Right> |
| 420 | inoremap <expr> <Home> col('.') == match(getline('.'), '\S') + 1 ? |
| 421 | \ repeat('<C-G>U<Left>', col('.') - 1) : |
| 422 | \ (col('.') < match(getline('.'), '\S') ? |
| 423 | \ repeat('<C-G>U<Right>', match(getline('.'), '\S') + 0) : |
| 424 | \ repeat('<C-G>U<Left>', col('.') - 1 - match(getline('.'), '\S'))) |
| 425 | inoremap <expr> <End> repeat('<C-G>U<Right>', col('$') - col('.')) |
| 426 | inoremap ( ()<C-G>U<Left> |
| 427 | |
| 428 | This makes it possible to use the cursor keys in Insert mode, without breaking |
Bram Moolenaar | 40962ec | 2018-01-28 22:47:25 +0100 | [diff] [blame] | 429 | the undo sequence and therefore using |.| (redo) will work as expected. |
Bram Moolenaar | d2f3a8b | 2018-06-19 14:35:59 +0200 | [diff] [blame] | 430 | Also entering a text like (with the "(" mapping from above): |
Bram Moolenaar | 8b5f65a | 2015-09-01 19:26:12 +0200 | [diff] [blame] | 431 | |
| 432 | Lorem ipsum (dolor |
| 433 | |
Bram Moolenaar | d2f3a8b | 2018-06-19 14:35:59 +0200 | [diff] [blame] | 434 | will be repeatable by using |.| to the expected |
Bram Moolenaar | 8b5f65a | 2015-09-01 19:26:12 +0200 | [diff] [blame] | 435 | |
| 436 | Lorem ipsum (dolor) |
| 437 | |
Bram Moolenaar | f4b8e57 | 2004-06-24 15:53:16 +0000 | [diff] [blame] | 438 | Using CTRL-O splits undo: the text typed before and after it is undone |
| 439 | separately. If you want to avoid this (e.g., in a mapping) you might be able |
| 440 | to use CTRL-R = |i_CTRL-R|. E.g., to call a function: > |
| 441 | :imap <F2> <C-R>=MyFunc()<CR> |
| 442 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 443 | When the 'whichwrap' option is set appropriately, the <Left> and <Right> |
| 444 | keys on the first/last character in the line make the cursor wrap to the |
| 445 | previous/next line. |
| 446 | |
| 447 | The CTRL-G j and CTRL-G k commands can be used to insert text in front of a |
| 448 | column. Example: > |
| 449 | int i; |
| 450 | int j; |
Bram Moolenaar | 402d2fe | 2005-04-15 21:00:38 +0000 | [diff] [blame] | 451 | Position the cursor on the first "int", type "istatic <C-G>j ". The |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 452 | result is: > |
| 453 | static int i; |
| 454 | int j; |
| 455 | When inserting the same text in front of the column in every line, use the |
| 456 | Visual blockwise command "I" |v_b_I|. |
| 457 | |
| 458 | ============================================================================== |
| 459 | 3. 'textwidth' and 'wrapmargin' options *ins-textwidth* |
| 460 | |
| 461 | The 'textwidth' option can be used to automatically break a line before it |
| 462 | gets too long. Set the 'textwidth' option to the desired maximum line |
| 463 | length. If you then type more characters (not spaces or tabs), the |
| 464 | last word will be put on a new line (unless it is the only word on the |
| 465 | line). If you set 'textwidth' to 0, this feature is disabled. |
| 466 | |
| 467 | The 'wrapmargin' option does almost the same. The difference is that |
| 468 | 'textwidth' has a fixed width while 'wrapmargin' depends on the width of the |
| 469 | screen. When using 'wrapmargin' this is equal to using 'textwidth' with a |
| 470 | value equal to (columns - 'wrapmargin'), where columns is the width of the |
| 471 | screen. |
| 472 | |
| 473 | When 'textwidth' and 'wrapmargin' are both set, 'textwidth' is used. |
| 474 | |
| 475 | If you don't really want to break the line, but view the line wrapped at a |
| 476 | convenient place, see the 'linebreak' option. |
| 477 | |
Bram Moolenaar | 1d2ba7f | 2006-02-14 22:29:30 +0000 | [diff] [blame] | 478 | The line is only broken automatically when using Insert mode, or when |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 479 | appending to a line. When in replace mode and the line length is not |
| 480 | changed, the line will not be broken. |
| 481 | |
| 482 | Long lines are broken if you enter a non-white character after the margin. |
| 483 | The situations where a line will be broken can be restricted by adding |
| 484 | characters to the 'formatoptions' option: |
| 485 | "l" Only break a line if it was not longer than 'textwidth' when the insert |
| 486 | started. |
| 487 | "v" Only break at a white character that has been entered during the |
| 488 | current insert command. This is mostly Vi-compatible. |
| 489 | "lv" Only break if the line was not longer than 'textwidth' when the insert |
| 490 | started and only at a white character that has been entered during the |
| 491 | current insert command. Only differs from "l" when entering non-white |
| 492 | characters while crossing the 'textwidth' boundary. |
| 493 | |
Bram Moolenaar | 1d2ba7f | 2006-02-14 22:29:30 +0000 | [diff] [blame] | 494 | Normally an internal function will be used to decide where to break the line. |
| 495 | If you want to do it in a different way set the 'formatexpr' option to an |
| 496 | expression that will take care of the line break. |
| 497 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 498 | If you want to format a block of text, you can use the "gq" operator. Type |
| 499 | "gq" and a movement command to move the cursor to the end of the block. In |
| 500 | many cases, the command "gq}" will do what you want (format until the end of |
| 501 | paragraph). Alternatively, you can use "gqap", which will format the whole |
| 502 | paragraph, no matter where the cursor currently is. Or you can use Visual |
| 503 | mode: hit "v", move to the end of the block, and type "gq". See also |gq|. |
| 504 | |
| 505 | ============================================================================== |
| 506 | 4. 'expandtab', 'smarttab' and 'softtabstop' options *ins-expandtab* |
| 507 | |
| 508 | If the 'expandtab' option is on, spaces will be used to fill the amount of |
| 509 | whitespace of the tab. If you want to enter a real <Tab>, type CTRL-V first |
| 510 | (use CTRL-Q when CTRL-V is mapped |i_CTRL-Q|). |
| 511 | The 'expandtab' option is off by default. Note that in Replace mode, a single |
| 512 | character is replaced with several spaces. The result of this is that the |
| 513 | number of characters in the line increases. Backspacing will delete one |
| 514 | space at a time. The original character will be put back for only one space |
Bram Moolenaar | 25c9c68 | 2019-05-05 18:13:34 +0200 | [diff] [blame] | 515 | that you backspace over (the last one). |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 516 | |
| 517 | *ins-smarttab* |
| 518 | When the 'smarttab' option is on, a <Tab> inserts 'shiftwidth' positions at |
| 519 | the beginning of a line and 'tabstop' positions in other places. This means |
Bram Moolenaar | 30b6581 | 2012-07-12 22:01:11 +0200 | [diff] [blame] | 520 | that often spaces instead of a <Tab> character are inserted. When 'smarttab' |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 521 | is off, a <Tab> always inserts 'tabstop' positions, and 'shiftwidth' is only |
Bram Moolenaar | 25c9c68 | 2019-05-05 18:13:34 +0200 | [diff] [blame] | 522 | used for ">>" and the like. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 523 | |
| 524 | *ins-softtabstop* |
| 525 | When the 'softtabstop' option is non-zero, a <Tab> inserts 'softtabstop' |
| 526 | positions, and a <BS> used to delete white space, will delete 'softtabstop' |
| 527 | positions. This feels like 'tabstop' was set to 'softtabstop', but a real |
| 528 | <Tab> character still takes 'tabstop' positions, so your file will still look |
| 529 | correct when used by other applications. |
| 530 | |
| 531 | If 'softtabstop' is non-zero, a <BS> will try to delete as much white space to |
| 532 | move to the previous 'softtabstop' position, except when the previously |
| 533 | inserted character is a space, then it will only delete the character before |
| 534 | the cursor. Otherwise you cannot always delete a single character before the |
| 535 | cursor. You will have to delete 'softtabstop' characters first, and then type |
| 536 | extra spaces to get where you want to be. |
| 537 | |
| 538 | ============================================================================== |
| 539 | 5. Replace mode *Replace* *Replace-mode* *mode-replace* |
| 540 | |
| 541 | Enter Replace mode with the "R" command in normal mode. |
| 542 | |
| 543 | In Replace mode, one character in the line is deleted for every character you |
| 544 | type. If there is no character to delete (at the end of the line), the |
| 545 | typed character is appended (as in Insert mode). Thus the number of |
| 546 | characters in a line stays the same until you get to the end of the line. |
| 547 | If a <NL> is typed, a line break is inserted and no character is deleted. |
| 548 | |
| 549 | Be careful with <Tab> characters. If you type a normal printing character in |
| 550 | its place, the number of characters is still the same, but the number of |
| 551 | columns will become smaller. |
| 552 | |
| 553 | If you delete characters in Replace mode (with <BS>, CTRL-W, or CTRL-U), what |
| 554 | happens is that you delete the changes. The characters that were replaced |
| 555 | are restored. If you had typed past the existing text, the characters you |
| 556 | added are deleted. This is effectively a character-at-a-time undo. |
| 557 | |
| 558 | If the 'expandtab' option is on, a <Tab> will replace one character with |
| 559 | several spaces. The result of this is that the number of characters in the |
| 560 | line increases. Backspacing will delete one space at a time. The original |
| 561 | character will be put back for only one space that you backspace over (the |
Bram Moolenaar | 25c9c68 | 2019-05-05 18:13:34 +0200 | [diff] [blame] | 562 | last one). |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 563 | |
| 564 | ============================================================================== |
| 565 | 6. Virtual Replace mode *vreplace-mode* *Virtual-Replace-mode* |
| 566 | |
| 567 | Enter Virtual Replace mode with the "gR" command in normal mode. |
Bram Moolenaar | db84e45 | 2010-08-15 13:50:43 +0200 | [diff] [blame] | 568 | {not available when compiled without the |+vreplace| feature} |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 569 | |
| 570 | Virtual Replace mode is similar to Replace mode, but instead of replacing |
| 571 | actual characters in the file, you are replacing screen real estate, so that |
| 572 | characters further on in the file never appear to move. |
| 573 | |
| 574 | So if you type a <Tab> it may replace several normal characters, and if you |
| 575 | type a letter on top of a <Tab> it may not replace anything at all, since the |
| 576 | <Tab> will still line up to the same place as before. |
| 577 | |
| 578 | Typing a <NL> still doesn't cause characters later in the file to appear to |
| 579 | move. The rest of the current line will be replaced by the <NL> (that is, |
| 580 | they are deleted), and replacing continues on the next line. A new line is |
| 581 | NOT inserted unless you go past the end of the file. |
| 582 | |
| 583 | Interesting effects are seen when using CTRL-T and CTRL-D. The characters |
| 584 | before the cursor are shifted sideways as normal, but characters later in the |
| 585 | line still remain still. CTRL-T will hide some of the old line under the |
| 586 | shifted characters, but CTRL-D will reveal them again. |
| 587 | |
| 588 | As with Replace mode, using <BS> etc will bring back the characters that were |
| 589 | replaced. This still works in conjunction with 'smartindent', CTRL-T and |
| 590 | CTRL-D, 'expandtab', 'smarttab', 'softtabstop', etc. |
| 591 | |
| 592 | In 'list' mode, Virtual Replace mode acts as if it was not in 'list' mode, |
| 593 | unless "L" is in 'cpoptions'. |
| 594 | |
Bram Moolenaar | 24ea3ba | 2010-09-19 19:01:21 +0200 | [diff] [blame] | 595 | Note that the only situations for which characters beyond the cursor should |
| 596 | appear to move are in List mode |'list'|, and occasionally when 'wrap' is set |
| 597 | (and the line changes length to become shorter or wider than the width of the |
| 598 | screen). In other cases spaces may be inserted to avoid following characters |
| 599 | to move. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 600 | |
| 601 | This mode is very useful for editing <Tab> separated columns in tables, for |
| 602 | entering new data while keeping all the columns aligned. |
| 603 | |
| 604 | ============================================================================== |
| 605 | 7. Insert mode completion *ins-completion* |
| 606 | |
Bram Moolenaar | 4be06f9 | 2005-07-29 22:36:03 +0000 | [diff] [blame] | 607 | In Insert and Replace mode, there are several commands to complete part of a |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 608 | keyword or line that has been typed. This is useful if you are using |
| 609 | complicated keywords (e.g., function names with capitals and underscores). |
| 610 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 611 | Completion can be done for: |
| 612 | |
| 613 | 1. Whole lines |i_CTRL-X_CTRL-L| |
| 614 | 2. keywords in the current file |i_CTRL-X_CTRL-N| |
| 615 | 3. keywords in 'dictionary' |i_CTRL-X_CTRL-K| |
| 616 | 4. keywords in 'thesaurus', thesaurus-style |i_CTRL-X_CTRL-T| |
| 617 | 5. keywords in the current and included files |i_CTRL-X_CTRL-I| |
| 618 | 6. tags |i_CTRL-X_CTRL-]| |
| 619 | 7. file names |i_CTRL-X_CTRL-F| |
| 620 | 8. definitions or macros |i_CTRL-X_CTRL-D| |
| 621 | 9. Vim command-line |i_CTRL-X_CTRL-V| |
Bram Moolenaar | 4be06f9 | 2005-07-29 22:36:03 +0000 | [diff] [blame] | 622 | 10. User defined completion |i_CTRL-X_CTRL-U| |
Bram Moolenaar | f75a963 | 2005-09-13 21:20:47 +0000 | [diff] [blame] | 623 | 11. omni completion |i_CTRL-X_CTRL-O| |
Bram Moolenaar | 488c651 | 2005-08-11 20:09:58 +0000 | [diff] [blame] | 624 | 12. Spelling suggestions |i_CTRL-X_s| |
Bram Moolenaar | 6aa8cea | 2017-06-05 14:44:35 +0200 | [diff] [blame] | 625 | 13. keywords in 'complete' |i_CTRL-N| |i_CTRL-P| |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 626 | |
Bram Moolenaar | 6aa8cea | 2017-06-05 14:44:35 +0200 | [diff] [blame] | 627 | All these, except CTRL-N and CTRL-P, are done in CTRL-X mode. This is a |
| 628 | sub-mode of Insert and Replace modes. You enter CTRL-X mode by typing CTRL-X |
| 629 | and one of the CTRL-X commands. You exit CTRL-X mode by typing a key that is |
| 630 | not a valid CTRL-X mode command. Valid keys are the CTRL-X command itself, |
| 631 | CTRL-N (next), and CTRL-P (previous). |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 632 | |
Bram Moolenaar | fd13332 | 2019-03-29 12:20:27 +0100 | [diff] [blame] | 633 | To get the current completion information, |complete_info()| can be used. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 634 | Also see the 'infercase' option if you want to adjust the case of the match. |
| 635 | |
Bram Moolenaar | d2cec5b | 2006-03-28 21:08:56 +0000 | [diff] [blame] | 636 | *complete_CTRL-E* |
| 637 | When completion is active you can use CTRL-E to stop it and go back to the |
Bram Moolenaar | 551dbcc | 2006-04-25 22:13:59 +0000 | [diff] [blame] | 638 | originally typed text. The CTRL-E will not be inserted. |
Bram Moolenaar | d2cec5b | 2006-03-28 21:08:56 +0000 | [diff] [blame] | 639 | |
| 640 | *complete_CTRL-Y* |
| 641 | When the popup menu is displayed you can use CTRL-Y to stop completion and |
| 642 | accept the currently selected entry. The CTRL-Y is not inserted. Typing a |
| 643 | space, Enter, or some other unprintable character will leave completion mode |
| 644 | and insert that typed character. |
| 645 | |
Bram Moolenaar | 9e54a0e | 2006-04-14 20:42:25 +0000 | [diff] [blame] | 646 | When the popup menu is displayed there are a few more special keys, see |
| 647 | |popupmenu-keys|. |
| 648 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 649 | Note: The keys that are valid in CTRL-X mode are not mapped. This allows for |
| 650 | ":map ^F ^X^F" to work (where ^F is CTRL-F and ^X is CTRL-X). The key that |
| 651 | ends CTRL-X mode (any key that is not a valid CTRL-X mode command) is mapped. |
| 652 | Also, when doing completion with 'complete' mappings apply as usual. |
| 653 | |
Bram Moolenaar | f193fff | 2006-04-27 00:02:13 +0000 | [diff] [blame] | 654 | Note: While completion is active Insert mode can't be used recursively. |
| 655 | Mappings that somehow invoke ":normal i.." will generate an E523 error. |
| 656 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 657 | The following mappings are suggested to make typing the completion commands |
| 658 | a bit easier (although they will hide other commands): > |
| 659 | :inoremap ^] ^X^] |
| 660 | :inoremap ^F ^X^F |
| 661 | :inoremap ^D ^X^D |
| 662 | :inoremap ^L ^X^L |
| 663 | |
| 664 | As a special case, typing CTRL-R to perform register insertion (see |
| 665 | |i_CTRL-R|) will not exit CTRL-X mode. This is primarily to allow the use of |
| 666 | the '=' register to call some function to determine the next operation. If |
| 667 | the contents of the register (or result of the '=' register evaluation) are |
| 668 | not valid CTRL-X mode keys, then CTRL-X mode will be exited as if those keys |
| 669 | had been typed. |
| 670 | |
| 671 | For example, the following will map <Tab> to either actually insert a <Tab> if |
| 672 | the current line is currently only whitespace, or start/continue a CTRL-N |
| 673 | completion operation: > |
| 674 | |
| 675 | function! CleverTab() |
| 676 | if strpart( getline('.'), 0, col('.')-1 ) =~ '^\s*$' |
| 677 | return "\<Tab>" |
| 678 | else |
| 679 | return "\<C-N>" |
Bram Moolenaar | b52073a | 2010-03-17 20:02:06 +0100 | [diff] [blame] | 680 | endif |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 681 | endfunction |
| 682 | inoremap <Tab> <C-R>=CleverTab()<CR> |
| 683 | |
| 684 | |
| 685 | |
| 686 | Completing whole lines *compl-whole-line* |
| 687 | |
| 688 | *i_CTRL-X_CTRL-L* |
| 689 | CTRL-X CTRL-L Search backwards for a line that starts with the |
Bram Moolenaar | 83bab71 | 2005-08-01 21:58:57 +0000 | [diff] [blame] | 690 | same characters as those in the current line before |
| 691 | the cursor. Indent is ignored. The matching line is |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 692 | inserted in front of the cursor. |
Bram Moolenaar | 83bab71 | 2005-08-01 21:58:57 +0000 | [diff] [blame] | 693 | The 'complete' option is used to decide which buffers |
Bram Moolenaar | 1d2ba7f | 2006-02-14 22:29:30 +0000 | [diff] [blame] | 694 | are searched for a match. Both loaded and unloaded |
| 695 | buffers are used. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 696 | CTRL-L or |
| 697 | CTRL-P Search backwards for next matching line. This line |
| 698 | replaces the previous matching line. |
| 699 | |
| 700 | CTRL-N Search forward for next matching line. This line |
| 701 | replaces the previous matching line. |
| 702 | |
| 703 | CTRL-X CTRL-L After expanding a line you can additionally get the |
| 704 | line next to it by typing CTRL-X CTRL-L again, unless |
Bram Moolenaar | 8f3f58f | 2010-01-06 20:52:26 +0100 | [diff] [blame] | 705 | a double CTRL-X is used. Only works for loaded |
| 706 | buffers. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 707 | |
| 708 | Completing keywords in current file *compl-current* |
| 709 | |
| 710 | *i_CTRL-X_CTRL-P* |
| 711 | *i_CTRL-X_CTRL-N* |
| 712 | CTRL-X CTRL-N Search forwards for words that start with the keyword |
| 713 | in front of the cursor. The found keyword is inserted |
| 714 | in front of the cursor. |
| 715 | |
| 716 | CTRL-X CTRL-P Search backwards for words that start with the keyword |
| 717 | in front of the cursor. The found keyword is inserted |
| 718 | in front of the cursor. |
| 719 | |
| 720 | CTRL-N Search forward for next matching keyword. This |
| 721 | keyword replaces the previous matching keyword. |
| 722 | |
| 723 | CTRL-P Search backwards for next matching keyword. This |
| 724 | keyword replaces the previous matching keyword. |
| 725 | |
| 726 | CTRL-X CTRL-N or |
| 727 | CTRL-X CTRL-P Further use of CTRL-X CTRL-N or CTRL-X CTRL-P will |
| 728 | copy the words following the previous expansion in |
| 729 | other contexts unless a double CTRL-X is used. |
| 730 | |
| 731 | If there is a keyword in front of the cursor (a name made out of alphabetic |
| 732 | characters and characters in 'iskeyword'), it is used as the search pattern, |
| 733 | with "\<" prepended (meaning: start of a word). Otherwise "\<\k\k" is used |
| 734 | as search pattern (start of any keyword of at least two characters). |
| 735 | |
| 736 | In Replace mode, the number of characters that are replaced depends on the |
| 737 | length of the matched string. This works like typing the characters of the |
| 738 | matched string in Replace mode. |
| 739 | |
| 740 | If there is not a valid keyword character before the cursor, any keyword of |
| 741 | at least two characters is matched. |
| 742 | e.g., to get: |
| 743 | printf("(%g, %g, %g)", vector[0], vector[1], vector[2]); |
| 744 | just type: |
| 745 | printf("(%g, %g, %g)", vector[0], ^P[1], ^P[2]); |
| 746 | |
Bram Moolenaar | f75a963 | 2005-09-13 21:20:47 +0000 | [diff] [blame] | 747 | The search wraps around the end of the file, the value of 'wrapscan' is not |
| 748 | used here. |
| 749 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 750 | Multiple repeats of the same completion are skipped; thus a different match |
| 751 | will be inserted at each CTRL-N and CTRL-P (unless there is only one |
| 752 | matching keyword). |
| 753 | |
| 754 | Single character matches are never included, as they usually just get in |
| 755 | the way of what you were really after. |
| 756 | e.g., to get: |
| 757 | printf("name = %s\n", name); |
| 758 | just type: |
| 759 | printf("name = %s\n", n^P); |
| 760 | or even: |
| 761 | printf("name = %s\n", ^P); |
| 762 | The 'n' in '\n' is skipped. |
| 763 | |
| 764 | After expanding a word, you can use CTRL-X CTRL-P or CTRL-X CTRL-N to get the |
| 765 | word following the expansion in other contexts. These sequences search for |
| 766 | the text just expanded and further expand by getting an extra word. This is |
| 767 | useful if you need to repeat a sequence of complicated words. Although CTRL-P |
| 768 | and CTRL-N look just for strings of at least two characters, CTRL-X CTRL-P and |
| 769 | CTRL-X CTRL-N can be used to expand words of just one character. |
| 770 | e.g., to get: |
| 771 | México |
| 772 | you can type: |
| 773 | M^N^P^X^P^X^P |
| 774 | CTRL-N starts the expansion and then CTRL-P takes back the single character |
| 775 | "M", the next two CTRL-X CTRL-P's get the words "é" and ";xico". |
| 776 | |
| 777 | If the previous expansion was split, because it got longer than 'textwidth', |
| 778 | then just the text in the current line will be used. |
| 779 | |
| 780 | If the match found is at the end of a line, then the first word in the next |
| 781 | line will be inserted and the message "word from next line" displayed, if |
| 782 | this word is accepted the next CTRL-X CTRL-P or CTRL-X CTRL-N will search |
| 783 | for those lines starting with this word. |
| 784 | |
| 785 | |
| 786 | Completing keywords in 'dictionary' *compl-dictionary* |
| 787 | |
| 788 | *i_CTRL-X_CTRL-K* |
| 789 | CTRL-X CTRL-K Search the files given with the 'dictionary' option |
| 790 | for words that start with the keyword in front of the |
| 791 | cursor. This is like CTRL-N, but only the dictionary |
| 792 | files are searched, not the current file. The found |
| 793 | keyword is inserted in front of the cursor. This |
| 794 | could potentially be pretty slow, since all matches |
| 795 | are found before the first match is used. By default, |
| 796 | the 'dictionary' option is empty. |
| 797 | For suggestions where to find a list of words, see the |
| 798 | 'dictionary' option. |
| 799 | |
| 800 | CTRL-K or |
| 801 | CTRL-N Search forward for next matching keyword. This |
| 802 | keyword replaces the previous matching keyword. |
| 803 | |
| 804 | CTRL-P Search backwards for next matching keyword. This |
| 805 | keyword replaces the previous matching keyword. |
| 806 | |
| 807 | *i_CTRL-X_CTRL-T* |
Bram Moolenaar | 402d2fe | 2005-04-15 21:00:38 +0000 | [diff] [blame] | 808 | CTRL-X CTRL-T Works as CTRL-X CTRL-K, but in a special way. It uses |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 809 | the 'thesaurus' option instead of 'dictionary'. If a |
| 810 | match is found in the thesaurus file, all the |
| 811 | remaining words on the same line are included as |
| 812 | matches, even though they don't complete the word. |
| 813 | Thus a word can be completely replaced. |
| 814 | |
| 815 | For an example, imagine the 'thesaurus' file has a |
| 816 | line like this: > |
| 817 | angry furious mad enraged |
| 818 | < Placing the cursor after the letters "ang" and typing |
| 819 | CTRL-X CTRL-T would complete the word "angry"; |
| 820 | subsequent presses would change the word to "furious", |
| 821 | "mad" etc. |
| 822 | Other uses include translation between two languages, |
| 823 | or grouping API functions by keyword. |
| 824 | |
| 825 | CTRL-T or |
| 826 | CTRL-N Search forward for next matching keyword. This |
| 827 | keyword replaces the previous matching keyword. |
| 828 | |
| 829 | CTRL-P Search backwards for next matching keyword. This |
| 830 | keyword replaces the previous matching keyword. |
| 831 | |
| 832 | |
| 833 | Completing keywords in the current and included files *compl-keyword* |
| 834 | |
| 835 | The 'include' option is used to specify a line that contains an include file |
| 836 | name. The 'path' option is used to search for include files. |
| 837 | |
| 838 | *i_CTRL-X_CTRL-I* |
| 839 | CTRL-X CTRL-I Search for the first keyword in the current and |
| 840 | included files that starts with the same characters |
| 841 | as those before the cursor. The matched keyword is |
| 842 | inserted in front of the cursor. |
| 843 | |
| 844 | CTRL-N Search forwards for next matching keyword. This |
| 845 | keyword replaces the previous matching keyword. |
| 846 | Note: CTRL-I is the same as <Tab>, which is likely to |
| 847 | be typed after a successful completion, therefore |
| 848 | CTRL-I is not used for searching for the next match. |
| 849 | |
| 850 | CTRL-P Search backward for previous matching keyword. This |
| 851 | keyword replaces the previous matching keyword. |
| 852 | |
| 853 | CTRL-X CTRL-I Further use of CTRL-X CTRL-I will copy the words |
| 854 | following the previous expansion in other contexts |
| 855 | unless a double CTRL-X is used. |
| 856 | |
| 857 | Completing tags *compl-tag* |
| 858 | *i_CTRL-X_CTRL-]* |
| 859 | CTRL-X CTRL-] Search for the first tag that starts with the same |
| 860 | characters as before the cursor. The matching tag is |
| 861 | inserted in front of the cursor. Alphabetic |
| 862 | characters and characters in 'iskeyword' are used |
| 863 | to decide which characters are included in the tag |
| 864 | name (same as for a keyword). See also |CTRL-]|. |
| 865 | The 'showfulltag' option can be used to add context |
| 866 | from around the tag definition. |
| 867 | CTRL-] or |
| 868 | CTRL-N Search forwards for next matching tag. This tag |
| 869 | replaces the previous matching tag. |
| 870 | |
| 871 | CTRL-P Search backward for previous matching tag. This tag |
| 872 | replaces the previous matching tag. |
| 873 | |
| 874 | |
| 875 | Completing file names *compl-filename* |
| 876 | *i_CTRL-X_CTRL-F* |
| 877 | CTRL-X CTRL-F Search for the first file name that starts with the |
| 878 | same characters as before the cursor. The matching |
| 879 | file name is inserted in front of the cursor. |
| 880 | Alphabetic characters and characters in 'isfname' |
| 881 | are used to decide which characters are included in |
| 882 | the file name. Note: the 'path' option is not used |
| 883 | here (yet). |
| 884 | CTRL-F or |
| 885 | CTRL-N Search forwards for next matching file name. This |
| 886 | file name replaces the previous matching file name. |
| 887 | |
| 888 | CTRL-P Search backward for previous matching file name. |
| 889 | This file name replaces the previous matching file |
| 890 | name. |
| 891 | |
| 892 | |
| 893 | Completing definitions or macros *compl-define* |
| 894 | |
| 895 | The 'define' option is used to specify a line that contains a definition. |
| 896 | The 'include' option is used to specify a line that contains an include file |
| 897 | name. The 'path' option is used to search for include files. |
| 898 | |
| 899 | *i_CTRL-X_CTRL-D* |
| 900 | CTRL-X CTRL-D Search in the current and included files for the |
| 901 | first definition (or macro) name that starts with |
| 902 | the same characters as before the cursor. The found |
| 903 | definition name is inserted in front of the cursor. |
| 904 | CTRL-D or |
| 905 | CTRL-N Search forwards for next matching macro name. This |
| 906 | macro name replaces the previous matching macro |
| 907 | name. |
| 908 | |
| 909 | CTRL-P Search backward for previous matching macro name. |
| 910 | This macro name replaces the previous matching macro |
| 911 | name. |
| 912 | |
| 913 | CTRL-X CTRL-D Further use of CTRL-X CTRL-D will copy the words |
| 914 | following the previous expansion in other contexts |
| 915 | unless a double CTRL-X is used. |
| 916 | |
| 917 | |
| 918 | Completing Vim commands *compl-vim* |
| 919 | |
| 920 | Completion is context-sensitive. It works like on the Command-line. It |
Bram Moolenaar | 4be06f9 | 2005-07-29 22:36:03 +0000 | [diff] [blame] | 921 | completes an Ex command as well as its arguments. This is useful when writing |
| 922 | a Vim script. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 923 | |
| 924 | *i_CTRL-X_CTRL-V* |
| 925 | CTRL-X CTRL-V Guess what kind of item is in front of the cursor and |
| 926 | find the first match for it. |
| 927 | Note: When CTRL-V is mapped you can often use CTRL-Q |
Bram Moolenaar | 3577c6f | 2008-06-24 21:16:56 +0000 | [diff] [blame] | 928 | instead of |i_CTRL-Q|. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 929 | CTRL-V or |
| 930 | CTRL-N Search forwards for next match. This match replaces |
| 931 | the previous one. |
| 932 | |
Bram Moolenaar | 3577c6f | 2008-06-24 21:16:56 +0000 | [diff] [blame] | 933 | CTRL-P Search backwards for previous match. This match |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 934 | replaces the previous one. |
| 935 | |
| 936 | CTRL-X CTRL-V Further use of CTRL-X CTRL-V will do the same as |
| 937 | CTRL-V. This allows mapping a key to do Vim command |
| 938 | completion, for example: > |
| 939 | :imap <Tab> <C-X><C-V> |
| 940 | |
Bram Moolenaar | 4be06f9 | 2005-07-29 22:36:03 +0000 | [diff] [blame] | 941 | User defined completion *compl-function* |
Bram Moolenaar | cfbc5ee | 2004-07-02 15:38:35 +0000 | [diff] [blame] | 942 | |
| 943 | Completion is done by a function that can be defined by the user with the |
Bram Moolenaar | 280f126 | 2006-01-30 00:14:18 +0000 | [diff] [blame] | 944 | 'completefunc' option. See below for how the function is called and an |
| 945 | example |complete-functions|. |
Bram Moolenaar | cfbc5ee | 2004-07-02 15:38:35 +0000 | [diff] [blame] | 946 | |
| 947 | *i_CTRL-X_CTRL-U* |
| 948 | CTRL-X CTRL-U Guess what kind of item is in front of the cursor and |
| 949 | find the first match for it. |
| 950 | CTRL-U or |
| 951 | CTRL-N Use the next match. This match replaces the previous |
| 952 | one. |
| 953 | |
| 954 | CTRL-P Use the previous match. This match replaces the |
| 955 | previous one. |
| 956 | |
| 957 | |
Bram Moolenaar | f75a963 | 2005-09-13 21:20:47 +0000 | [diff] [blame] | 958 | Omni completion *compl-omni* |
Bram Moolenaar | 4be06f9 | 2005-07-29 22:36:03 +0000 | [diff] [blame] | 959 | |
Bram Moolenaar | e344bea | 2005-09-01 20:46:49 +0000 | [diff] [blame] | 960 | Completion is done by a function that can be defined by the user with the |
Bram Moolenaar | f75a963 | 2005-09-13 21:20:47 +0000 | [diff] [blame] | 961 | 'omnifunc' option. This is to be used for filetype-specific completion. |
Bram Moolenaar | e344bea | 2005-09-01 20:46:49 +0000 | [diff] [blame] | 962 | |
Bram Moolenaar | 280f126 | 2006-01-30 00:14:18 +0000 | [diff] [blame] | 963 | See below for how the function is called and an example |complete-functions|. |
Bram Moolenaar | f75a963 | 2005-09-13 21:20:47 +0000 | [diff] [blame] | 964 | For remarks about specific filetypes see |compl-omni-filetypes|. |
Bram Moolenaar | 9c10238 | 2006-05-03 21:26:49 +0000 | [diff] [blame] | 965 | More completion scripts will appear, check www.vim.org. Currently there is a |
| 966 | first version for C++. |
Bram Moolenaar | 4be06f9 | 2005-07-29 22:36:03 +0000 | [diff] [blame] | 967 | |
| 968 | *i_CTRL-X_CTRL-O* |
| 969 | CTRL-X CTRL-O Guess what kind of item is in front of the cursor and |
| 970 | find the first match for it. |
| 971 | CTRL-O or |
| 972 | CTRL-N Use the next match. This match replaces the previous |
| 973 | one. |
| 974 | |
| 975 | CTRL-P Use the previous match. This match replaces the |
| 976 | previous one. |
| 977 | |
| 978 | |
Bram Moolenaar | 488c651 | 2005-08-11 20:09:58 +0000 | [diff] [blame] | 979 | Spelling suggestions *compl-spelling* |
| 980 | |
Bram Moolenaar | 5195e45 | 2005-08-19 20:32:47 +0000 | [diff] [blame] | 981 | A word before or at the cursor is located and correctly spelled words are |
| 982 | suggested to replace it. If there is a badly spelled word in the line, before |
| 983 | or under the cursor, the cursor is moved to after it. Otherwise the word just |
| 984 | before the cursor is used for suggestions, even though it isn't badly spelled. |
| 985 | |
Bram Moolenaar | 488c651 | 2005-08-11 20:09:58 +0000 | [diff] [blame] | 986 | NOTE: CTRL-S suspends display in many Unix terminals. Use 's' instead. Type |
| 987 | CTRL-Q to resume displaying. |
| 988 | |
| 989 | *i_CTRL-X_CTRL-S* *i_CTRL-X_s* |
| 990 | CTRL-X CTRL-S or |
| 991 | CTRL-X s Locate the word in front of the cursor and find the |
| 992 | first spell suggestion for it. |
| 993 | CTRL-S or |
| 994 | CTRL-N Use the next suggestion. This replaces the previous |
| 995 | one. Note that you can't use 's' here. |
| 996 | |
| 997 | CTRL-P Use the previous suggestion. This replaces the |
| 998 | previous one. |
| 999 | |
| 1000 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1001 | Completing keywords from different sources *compl-generic* |
| 1002 | |
| 1003 | *i_CTRL-N* |
| 1004 | CTRL-N Find next match for words that start with the |
| 1005 | keyword in front of the cursor, looking in places |
| 1006 | specified with the 'complete' option. The found |
| 1007 | keyword is inserted in front of the cursor. |
| 1008 | |
| 1009 | *i_CTRL-P* |
| 1010 | CTRL-P Find previous match for words that start with the |
| 1011 | keyword in front of the cursor, looking in places |
| 1012 | specified with the 'complete' option. The found |
| 1013 | keyword is inserted in front of the cursor. |
| 1014 | |
| 1015 | CTRL-N Search forward for next matching keyword. This |
| 1016 | keyword replaces the previous matching keyword. |
| 1017 | |
| 1018 | CTRL-P Search backwards for next matching keyword. This |
| 1019 | keyword replaces the previous matching keyword. |
| 1020 | |
| 1021 | CTRL-X CTRL-N or |
| 1022 | CTRL-X CTRL-P Further use of CTRL-X CTRL-N or CTRL-X CTRL-P will |
| 1023 | copy the words following the previous expansion in |
| 1024 | other contexts unless a double CTRL-X is used. |
| 1025 | |
Bram Moolenaar | 578b49e | 2005-09-10 19:22:57 +0000 | [diff] [blame] | 1026 | |
Bram Moolenaar | 280f126 | 2006-01-30 00:14:18 +0000 | [diff] [blame] | 1027 | FUNCTIONS FOR FINDING COMPLETIONS *complete-functions* |
| 1028 | |
| 1029 | This applies to 'completefunc' and 'omnifunc'. |
| 1030 | |
Bram Moolenaar | 8b6144b | 2006-02-08 09:20:24 +0000 | [diff] [blame] | 1031 | The function is called in two different ways: |
| 1032 | - First the function is called to find the start of the text to be completed. |
| 1033 | - Later the function is called to actually find the matches. |
Bram Moolenaar | 280f126 | 2006-01-30 00:14:18 +0000 | [diff] [blame] | 1034 | |
| 1035 | On the first invocation the arguments are: |
| 1036 | a:findstart 1 |
| 1037 | a:base empty |
| 1038 | |
Bram Moolenaar | 8b6144b | 2006-02-08 09:20:24 +0000 | [diff] [blame] | 1039 | The function must return the column where the completion starts. It must be a |
| 1040 | number between zero and the cursor column "col('.')". This involves looking |
| 1041 | at the characters just before the cursor and including those characters that |
| 1042 | could be part of the completed item. The text between this column and the |
Bram Moolenaar | fc65cab | 2018-08-28 22:58:02 +0200 | [diff] [blame] | 1043 | cursor column will be replaced with the matches. If the returned value is |
| 1044 | larger than the cursor column, the cursor column is used. |
Bram Moolenaar | 8e52a59 | 2012-05-18 21:49:28 +0200 | [diff] [blame] | 1045 | |
Bram Moolenaar | fc65cab | 2018-08-28 22:58:02 +0200 | [diff] [blame] | 1046 | Negative return values: |
| 1047 | -2 To cancel silently and stay in completion mode. |
| 1048 | -3 To cancel silently and leave completion mode. |
| 1049 | Another negative value: completion starts at the cursor column |
Bram Moolenaar | 280f126 | 2006-01-30 00:14:18 +0000 | [diff] [blame] | 1050 | |
| 1051 | On the second invocation the arguments are: |
| 1052 | a:findstart 0 |
Bram Moolenaar | 8b6144b | 2006-02-08 09:20:24 +0000 | [diff] [blame] | 1053 | a:base the text with which matches should match; the text that was |
Bram Moolenaar | 280f126 | 2006-01-30 00:14:18 +0000 | [diff] [blame] | 1054 | located in the first call (can be empty) |
| 1055 | |
| 1056 | The function must return a List with the matching words. These matches |
| 1057 | usually include the "a:base" text. When there are no matches return an empty |
Bram Moolenaar | 8b6144b | 2006-02-08 09:20:24 +0000 | [diff] [blame] | 1058 | List. |
Bram Moolenaar | 5302d9e | 2011-09-14 17:55:08 +0200 | [diff] [blame] | 1059 | |
| 1060 | In order to return more information than the matching words, return a Dict |
| 1061 | that contains the List. The Dict can have these items: |
| 1062 | words The List of matching words (mandatory). |
| 1063 | refresh A string to control re-invocation of the function |
| 1064 | (optional). |
| 1065 | The only value currently recognized is "always", the |
| 1066 | effect is that the function is called whenever the |
| 1067 | leading text is changed. |
Bram Moolenaar | cee9bc2 | 2019-01-11 13:02:23 +0100 | [diff] [blame] | 1068 | |
| 1069 | If you want to suppress the warning message for an empty result, return |
Bram Moolenaar | 314dd79 | 2019-02-03 15:27:20 +0100 | [diff] [blame] | 1070 | |v:none|. This is useful to implement asynchronous completion with |
| 1071 | |complete()|. |
Bram Moolenaar | cee9bc2 | 2019-01-11 13:02:23 +0100 | [diff] [blame] | 1072 | |
Bram Moolenaar | 5302d9e | 2011-09-14 17:55:08 +0200 | [diff] [blame] | 1073 | Other items are ignored. |
| 1074 | |
Bram Moolenaar | 30b6581 | 2012-07-12 22:01:11 +0200 | [diff] [blame] | 1075 | For acting upon end of completion, see the |CompleteDone| autocommand event. |
| 1076 | |
Bram Moolenaar | 5302d9e | 2011-09-14 17:55:08 +0200 | [diff] [blame] | 1077 | For example, the function can contain this: > |
| 1078 | let matches = ... list of words ... |
| 1079 | return {'words': matches, 'refresh': 'always'} |
| 1080 | < |
Bram Moolenaar | 5c4bab0 | 2006-03-10 21:37:46 +0000 | [diff] [blame] | 1081 | *complete-items* |
Bram Moolenaar | 8b6144b | 2006-02-08 09:20:24 +0000 | [diff] [blame] | 1082 | Each list item can either be a string or a Dictionary. When it is a string it |
| 1083 | is used as the completion. When it is a Dictionary it can contain these |
| 1084 | items: |
Bram Moolenaar | 910f66f | 2006-04-05 20:41:53 +0000 | [diff] [blame] | 1085 | word the text that will be inserted, mandatory |
| 1086 | abbr abbreviation of "word"; when not empty it is used in |
| 1087 | the menu instead of "word" |
Bram Moolenaar | 8dff818 | 2006-04-06 20:18:50 +0000 | [diff] [blame] | 1088 | menu extra text for the popup menu, displayed after "word" |
| 1089 | or "abbr" |
Bram Moolenaar | 910f66f | 2006-04-05 20:41:53 +0000 | [diff] [blame] | 1090 | info more information about the item, can be displayed in a |
Bram Moolenaar | 62a0cb4 | 2019-08-18 16:35:23 +0200 | [diff] [blame] | 1091 | preview or popup window |
Bram Moolenaar | 8b6144b | 2006-02-08 09:20:24 +0000 | [diff] [blame] | 1092 | kind single letter indicating the type of completion |
Bram Moolenaar | 91170f8 | 2006-05-05 21:15:17 +0000 | [diff] [blame] | 1093 | icase when non-zero case is to be ignored when comparing |
| 1094 | items to be equal; when omitted zero is used, thus |
| 1095 | items that only differ in case are added |
Bram Moolenaar | 73655cf | 2019-04-06 13:45:55 +0200 | [diff] [blame] | 1096 | equal when non-zero, always treat this item to be equal when |
| 1097 | comparing. Which means, "equal=1" disables filtering |
| 1098 | of this item. |
Bram Moolenaar | 4a85b41 | 2006-04-23 22:40:29 +0000 | [diff] [blame] | 1099 | dup when non-zero this match will be added even when an |
| 1100 | item with the same word is already present. |
Bram Moolenaar | 166af9b | 2010-11-16 20:34:40 +0100 | [diff] [blame] | 1101 | empty when non-zero this match will be added even when it is |
| 1102 | an empty string |
Bram Moolenaar | 9b56a57 | 2018-02-10 16:19:32 +0100 | [diff] [blame] | 1103 | user_data custom data which is associated with the item and |
| 1104 | available in |v:completed_item| |
Bram Moolenaar | 8b6144b | 2006-02-08 09:20:24 +0000 | [diff] [blame] | 1105 | |
Bram Moolenaar | 73655cf | 2019-04-06 13:45:55 +0200 | [diff] [blame] | 1106 | All of these except "icase", "equal", "dup" and "empty" must be a string. If |
| 1107 | an item does not meet these requirements then an error message is given and |
| 1108 | further items in the list are not used. You can mix string and Dictionary |
| 1109 | items in the returned list. |
Bram Moolenaar | 8b6144b | 2006-02-08 09:20:24 +0000 | [diff] [blame] | 1110 | |
| 1111 | The "menu" item is used in the popup menu and may be truncated, thus it should |
Bram Moolenaar | 0b598c2 | 2006-03-11 21:22:53 +0000 | [diff] [blame] | 1112 | be relatively short. The "info" item can be longer, it will be displayed in |
Bram Moolenaar | 62a0cb4 | 2019-08-18 16:35:23 +0200 | [diff] [blame] | 1113 | the preview window when "preview" appears in 'completeopt' or in a popup |
| 1114 | window when "popup" appears in 'completeopt'. In the preview window the |
| 1115 | "info" item will also remain displayed after the popup menu has been removed. |
| 1116 | This is useful for function arguments. Use a single space for "info" to |
| 1117 | remove existing text in the preview window. The size of the preview window is |
| 1118 | three lines, but 'previewheight' is used when it has a value of 1 or 2. |
| 1119 | |
| 1120 | *complete-popup* |
| 1121 | When "popup" is in 'completeopt' a popup window is used to display the "info". |
Bram Moolenaar | 06fe74a | 2019-08-31 16:20:32 +0200 | [diff] [blame] | 1122 | Then the 'completepopup' option specifies the properties of the popup. This |
| 1123 | is used when the info popup is created. The option is a comma separated list |
| 1124 | of values: |
Bram Moolenaar | 62a0cb4 | 2019-08-18 16:35:23 +0200 | [diff] [blame] | 1125 | height maximum height of the popup |
| 1126 | width maximum width of the popup |
| 1127 | highlight highlight group of the popup (default is Pmenu) |
Bram Moolenaar | 258cef5 | 2019-08-21 17:29:29 +0200 | [diff] [blame] | 1128 | align "item" (default) or "menu" |
| 1129 | border "on" (default) or "off" |
Bram Moolenaar | 62a0cb4 | 2019-08-18 16:35:23 +0200 | [diff] [blame] | 1130 | Example: > |
| 1131 | :set completepopup=height:10,width:60,highlight:InfoPopup |
Bram Moolenaar | 8b6144b | 2006-02-08 09:20:24 +0000 | [diff] [blame] | 1132 | |
Bram Moolenaar | 06fe74a | 2019-08-31 16:20:32 +0200 | [diff] [blame] | 1133 | When the "align" value is "item" then the popup is positioned close to the |
Bram Moolenaar | 258cef5 | 2019-08-21 17:29:29 +0200 | [diff] [blame] | 1134 | selected item. Changing the selection will also move the popup. When "align" |
| 1135 | is "menu" then the popup is aligned with the top of the menu if the menu is |
| 1136 | below the text, and the bottom of the menu otherwise. |
| 1137 | |
Bram Moolenaar | 06fe74a | 2019-08-31 16:20:32 +0200 | [diff] [blame] | 1138 | After the info popup is created it can be found with |popup_findinfo()| and |
| 1139 | properties can be changed with |popup_setoptions()|. |
| 1140 | |
Bram Moolenaar | 8b6144b | 2006-02-08 09:20:24 +0000 | [diff] [blame] | 1141 | The "kind" item uses a single letter to indicate the kind of completion. This |
| 1142 | may be used to show the completion differently (different color or icon). |
| 1143 | Currently these types can be used: |
| 1144 | v variable |
| 1145 | f function or method |
Bram Moolenaar | 0b598c2 | 2006-03-11 21:22:53 +0000 | [diff] [blame] | 1146 | m member of a struct or class |
| 1147 | t typedef |
| 1148 | d #define or macro |
Bram Moolenaar | 280f126 | 2006-01-30 00:14:18 +0000 | [diff] [blame] | 1149 | |
| 1150 | When searching for matches takes some time call |complete_add()| to add each |
| 1151 | match to the total list. These matches should then not appear in the returned |
| 1152 | list! Call |complete_check()| now and then to allow the user to press a key |
| 1153 | while still searching for matches. Stop searching when it returns non-zero. |
| 1154 | |
Bram Moolenaar | 166af9b | 2010-11-16 20:34:40 +0100 | [diff] [blame] | 1155 | *E839* *E840* |
| 1156 | The function is allowed to move the cursor, it is restored afterwards. |
| 1157 | The function is not allowed to move to another window or delete text. |
Bram Moolenaar | 280f126 | 2006-01-30 00:14:18 +0000 | [diff] [blame] | 1158 | |
| 1159 | An example that completes the names of the months: > |
| 1160 | fun! CompleteMonths(findstart, base) |
| 1161 | if a:findstart |
| 1162 | " locate the start of the word |
| 1163 | let line = getline('.') |
| 1164 | let start = col('.') - 1 |
| 1165 | while start > 0 && line[start - 1] =~ '\a' |
| 1166 | let start -= 1 |
| 1167 | endwhile |
| 1168 | return start |
| 1169 | else |
| 1170 | " find months matching with "a:base" |
| 1171 | let res = [] |
| 1172 | for m in split("Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec") |
| 1173 | if m =~ '^' . a:base |
| 1174 | call add(res, m) |
| 1175 | endif |
| 1176 | endfor |
| 1177 | return res |
| 1178 | endif |
| 1179 | endfun |
| 1180 | set completefunc=CompleteMonths |
| 1181 | < |
| 1182 | The same, but now pretending searching for matches is slow: > |
| 1183 | fun! CompleteMonths(findstart, base) |
| 1184 | if a:findstart |
| 1185 | " locate the start of the word |
| 1186 | let line = getline('.') |
| 1187 | let start = col('.') - 1 |
| 1188 | while start > 0 && line[start - 1] =~ '\a' |
| 1189 | let start -= 1 |
| 1190 | endwhile |
| 1191 | return start |
| 1192 | else |
| 1193 | " find months matching with "a:base" |
| 1194 | for m in split("Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec") |
| 1195 | if m =~ '^' . a:base |
| 1196 | call complete_add(m) |
| 1197 | endif |
| 1198 | sleep 300m " simulate searching for next match |
| 1199 | if complete_check() |
| 1200 | break |
| 1201 | endif |
| 1202 | endfor |
| 1203 | return [] |
| 1204 | endif |
| 1205 | endfun |
| 1206 | set completefunc=CompleteMonths |
| 1207 | < |
| 1208 | |
Bram Moolenaar | 1c7715d | 2005-10-03 22:02:18 +0000 | [diff] [blame] | 1209 | INSERT COMPLETION POPUP MENU *ins-completion-menu* |
Bram Moolenaar | ebefac6 | 2005-12-28 22:39:57 +0000 | [diff] [blame] | 1210 | *popupmenu-completion* |
Bram Moolenaar | 1c7715d | 2005-10-03 22:02:18 +0000 | [diff] [blame] | 1211 | Vim can display the matches in a simplistic popup menu. |
| 1212 | |
| 1213 | The menu is used when: |
Bram Moolenaar | a203182 | 2006-03-07 22:29:51 +0000 | [diff] [blame] | 1214 | - The 'completeopt' option contains "menu" or "menuone". |
Bram Moolenaar | 1c7715d | 2005-10-03 22:02:18 +0000 | [diff] [blame] | 1215 | - The terminal supports at least 8 colors. |
Bram Moolenaar | d68071d | 2006-05-02 22:08:30 +0000 | [diff] [blame] | 1216 | - There are at least two matches. One if "menuone" is used. |
Bram Moolenaar | 1c7715d | 2005-10-03 22:02:18 +0000 | [diff] [blame] | 1217 | |
Bram Moolenaar | 5671873 | 2006-03-15 22:53:57 +0000 | [diff] [blame] | 1218 | The 'pumheight' option can be used to set a maximum height. The default is to |
| 1219 | use all space available. |
Bram Moolenaar | 9b56a57 | 2018-02-10 16:19:32 +0100 | [diff] [blame] | 1220 | The 'pumwidth' option can be used to set a minimum width. The default is 15 |
| 1221 | characters. |
Bram Moolenaar | 5671873 | 2006-03-15 22:53:57 +0000 | [diff] [blame] | 1222 | |
Bram Moolenaar | 779b74b | 2006-04-10 14:55:34 +0000 | [diff] [blame] | 1223 | There are three states: |
| 1224 | 1. A complete match has been inserted, e.g., after using CTRL-N or CTRL-P. |
| 1225 | 2. A cursor key has been used to select another match. The match was not |
| 1226 | inserted then, only the entry in the popup menu is highlighted. |
| 1227 | 3. Only part of a match has been inserted and characters were typed or the |
| 1228 | backspace key was used. The list of matches was then adjusted for what is |
| 1229 | in front of the cursor. |
Bram Moolenaar | c7453f5 | 2006-02-10 23:20:28 +0000 | [diff] [blame] | 1230 | |
Bram Moolenaar | 80a94a5 | 2006-02-23 21:26:58 +0000 | [diff] [blame] | 1231 | You normally start in the first state, with the first match being inserted. |
Bram Moolenaar | 1d2ba7f | 2006-02-14 22:29:30 +0000 | [diff] [blame] | 1232 | When "longest" is in 'completeopt' and there is more than one match you start |
Bram Moolenaar | 779b74b | 2006-04-10 14:55:34 +0000 | [diff] [blame] | 1233 | in the third state. |
Bram Moolenaar | c7453f5 | 2006-02-10 23:20:28 +0000 | [diff] [blame] | 1234 | |
Bram Moolenaar | 779b74b | 2006-04-10 14:55:34 +0000 | [diff] [blame] | 1235 | If you select another match, e.g., with CTRL-N or CTRL-P, you go to the first |
| 1236 | state. This doesn't change the list of matches. |
Bram Moolenaar | 80a94a5 | 2006-02-23 21:26:58 +0000 | [diff] [blame] | 1237 | |
Bram Moolenaar | 779b74b | 2006-04-10 14:55:34 +0000 | [diff] [blame] | 1238 | When you are back at the original text then you are in the third state. To |
Bram Moolenaar | a203182 | 2006-03-07 22:29:51 +0000 | [diff] [blame] | 1239 | get there right away you can use a mapping that uses CTRL-P right after |
| 1240 | starting the completion: > |
| 1241 | :imap <F7> <C-N><C-P> |
Bram Moolenaar | 76916e6 | 2006-03-21 21:23:25 +0000 | [diff] [blame] | 1242 | < |
| 1243 | *popupmenu-keys* |
Bram Moolenaar | 1d2ba7f | 2006-02-14 22:29:30 +0000 | [diff] [blame] | 1244 | In the first state these keys have a special meaning: |
| 1245 | <BS> and CTRL-H Delete one character, find the matches for the word before |
| 1246 | the cursor. This reduces the list of matches, often to one |
Bram Moolenaar | 80a94a5 | 2006-02-23 21:26:58 +0000 | [diff] [blame] | 1247 | entry, and switches to the second state. |
Bram Moolenaar | 779b74b | 2006-04-10 14:55:34 +0000 | [diff] [blame] | 1248 | Any non-special character: |
| 1249 | Stop completion without changing the match and insert the |
| 1250 | typed character. |
Bram Moolenaar | 1d2ba7f | 2006-02-14 22:29:30 +0000 | [diff] [blame] | 1251 | |
Bram Moolenaar | 779b74b | 2006-04-10 14:55:34 +0000 | [diff] [blame] | 1252 | In the second and third state these keys have a special meaning: |
Bram Moolenaar | 8b6144b | 2006-02-08 09:20:24 +0000 | [diff] [blame] | 1253 | <BS> and CTRL-H Delete one character, find the matches for the shorter word |
| 1254 | before the cursor. This may find more matches. |
| 1255 | CTRL-L Add one character from the current match, may reduce the |
Bram Moolenaar | 1d2ba7f | 2006-02-14 22:29:30 +0000 | [diff] [blame] | 1256 | number of matches. |
Bram Moolenaar | 80a94a5 | 2006-02-23 21:26:58 +0000 | [diff] [blame] | 1257 | any printable, non-white character: |
| 1258 | Add this character and reduce the number of matches. |
Bram Moolenaar | c7453f5 | 2006-02-10 23:20:28 +0000 | [diff] [blame] | 1259 | |
Bram Moolenaar | 779b74b | 2006-04-10 14:55:34 +0000 | [diff] [blame] | 1260 | In all three states these can be used: |
Bram Moolenaar | d2cec5b | 2006-03-28 21:08:56 +0000 | [diff] [blame] | 1261 | CTRL-Y Yes: Accept the currently selected match and stop completion. |
Bram Moolenaar | 9964e46 | 2007-05-05 17:54:07 +0000 | [diff] [blame] | 1262 | CTRL-E End completion, go back to what was there before selecting a |
| 1263 | match (what was typed or longest common string). |
Bram Moolenaar | 80a94a5 | 2006-02-23 21:26:58 +0000 | [diff] [blame] | 1264 | <PageUp> Select a match several entries back, but don't insert it. |
| 1265 | <PageDown> Select a match several entries further, but don't insert it. |
Bram Moolenaar | 1d2ba7f | 2006-02-14 22:29:30 +0000 | [diff] [blame] | 1266 | <Up> Select the previous match, as if CTRL-P was used, but don't |
Bram Moolenaar | 80a94a5 | 2006-02-23 21:26:58 +0000 | [diff] [blame] | 1267 | insert it. |
Bram Moolenaar | 1d2ba7f | 2006-02-14 22:29:30 +0000 | [diff] [blame] | 1268 | <Down> Select the next match, as if CTRL-N was used, but don't |
Bram Moolenaar | 80a94a5 | 2006-02-23 21:26:58 +0000 | [diff] [blame] | 1269 | insert it. |
Bram Moolenaar | 9964e46 | 2007-05-05 17:54:07 +0000 | [diff] [blame] | 1270 | <Space> or <Tab> Stop completion without changing the match and insert the |
Bram Moolenaar | 779b74b | 2006-04-10 14:55:34 +0000 | [diff] [blame] | 1271 | typed character. |
| 1272 | |
Bram Moolenaar | 044b68f | 2007-05-10 17:39:52 +0000 | [diff] [blame] | 1273 | The behavior of the <Enter> key depends on the state you are in: |
Bram Moolenaar | 779b74b | 2006-04-10 14:55:34 +0000 | [diff] [blame] | 1274 | first state: Use the text as it is and insert a line break. |
| 1275 | second state: Insert the currently selected match. |
| 1276 | third state: Use the text as it is and insert a line break. |
| 1277 | |
| 1278 | In other words: If you used the cursor keys to select another entry in the |
Bram Moolenaar | 044b68f | 2007-05-10 17:39:52 +0000 | [diff] [blame] | 1279 | list of matches then the <Enter> key inserts that match. If you typed |
| 1280 | something else then <Enter> inserts a line break. |
Bram Moolenaar | 1d2ba7f | 2006-02-14 22:29:30 +0000 | [diff] [blame] | 1281 | |
Bram Moolenaar | 1c7715d | 2005-10-03 22:02:18 +0000 | [diff] [blame] | 1282 | |
| 1283 | The colors of the menu can be changed with these highlight groups: |
| 1284 | Pmenu normal item |hl-Pmenu| |
| 1285 | PmenuSel selected item |hl-PmenuSel| |
| 1286 | PmenuSbar scrollbar |hl-PmenuSbar| |
| 1287 | PmenuThumb thumb of the scrollbar |hl-PmenuThumb| |
| 1288 | |
Bram Moolenaar | 1d2ba7f | 2006-02-14 22:29:30 +0000 | [diff] [blame] | 1289 | There are no special mappings for when the popup menu is visible. However, |
| 1290 | you can use an Insert mode mapping that checks the |pumvisible()| function to |
| 1291 | do something different. Example: > |
| 1292 | :inoremap <Down> <C-R>=pumvisible() ? "\<lt>C-N>" : "\<lt>Down>"<CR> |
Bram Moolenaar | 1c7715d | 2005-10-03 22:02:18 +0000 | [diff] [blame] | 1293 | |
Bram Moolenaar | 5c4bab0 | 2006-03-10 21:37:46 +0000 | [diff] [blame] | 1294 | You can use of <expr> in mapping to have the popup menu used when typing a |
| 1295 | character and some condition is met. For example, for typing a dot: > |
| 1296 | inoremap <expr> . MayComplete() |
| 1297 | func MayComplete() |
| 1298 | if (can complete) |
| 1299 | return ".\<C-X>\<C-O>" |
| 1300 | endif |
| 1301 | return '.' |
| 1302 | endfunc |
| 1303 | |
| 1304 | See |:map-<expr>| for more info. |
| 1305 | |
Bram Moolenaar | 1d2ba7f | 2006-02-14 22:29:30 +0000 | [diff] [blame] | 1306 | |
| 1307 | FILETYPE-SPECIFIC REMARKS FOR OMNI COMPLETION *compl-omni-filetypes* |
| 1308 | |
| 1309 | The file used for {filetype} should be autoload/{filetype}complete.vim |
| 1310 | in 'runtimepath'. Thus for "java" it is autoload/javacomplete.vim. |
Bram Moolenaar | 578b49e | 2005-09-10 19:22:57 +0000 | [diff] [blame] | 1311 | |
Bram Moolenaar | a5792f5 | 2005-11-23 21:25:05 +0000 | [diff] [blame] | 1312 | |
Bram Moolenaar | f75a963 | 2005-09-13 21:20:47 +0000 | [diff] [blame] | 1313 | C *ft-c-omni* |
Bram Moolenaar | 578b49e | 2005-09-10 19:22:57 +0000 | [diff] [blame] | 1314 | |
Bram Moolenaar | f75a963 | 2005-09-13 21:20:47 +0000 | [diff] [blame] | 1315 | Completion of C code requires a tags file. You should use Exuberant ctags, |
| 1316 | because it adds extra information that is needed for completion. You can find |
Bram Moolenaar | 9964e46 | 2007-05-05 17:54:07 +0000 | [diff] [blame] | 1317 | it here: http://ctags.sourceforge.net/ Version 5.6 or later is recommended. |
| 1318 | |
Bram Moolenaar | f75a963 | 2005-09-13 21:20:47 +0000 | [diff] [blame] | 1319 | For version 5.5.4 you should add a patch that adds the "typename:" field: |
Bram Moolenaar | 36fc535 | 2006-03-04 21:49:37 +0000 | [diff] [blame] | 1320 | ftp://ftp.vim.org/pub/vim/unstable/patches/ctags-5.5.4.patch |
Bram Moolenaar | 8b6144b | 2006-02-08 09:20:24 +0000 | [diff] [blame] | 1321 | A compiled .exe for MS-Windows can be found at: |
Bram Moolenaar | 2f05849 | 2017-11-30 20:27:52 +0100 | [diff] [blame] | 1322 | http://ctags.sourceforge.net/ |
| 1323 | https://github.com/universal-ctags/ctags-win32 |
Bram Moolenaar | 578b49e | 2005-09-10 19:22:57 +0000 | [diff] [blame] | 1324 | |
| 1325 | If you want to complete system functions you can do something like this. Use |
| 1326 | ctags to generate a tags file for all the system header files: > |
| 1327 | % ctags -R -f ~/.vim/systags /usr/include /usr/local/include |
| 1328 | In your vimrc file add this tags file to the 'tags' option: > |
| 1329 | set tags+=~/.vim/systags |
| 1330 | |
| 1331 | When using CTRL-X CTRL-O after a name without any "." or "->" it is completed |
| 1332 | from the tags file directly. This works for any identifier, also function |
| 1333 | names. If you want to complete a local variable name, which does not appear |
| 1334 | in the tags file, use CTRL-P instead. |
| 1335 | |
| 1336 | When using CTRL-X CTRL-O after something that has "." or "->" Vim will attempt |
| 1337 | to recognize the type of the variable and figure out what members it has. |
| 1338 | This means only members valid for the variable will be listed. |
| 1339 | |
Bram Moolenaar | f75a963 | 2005-09-13 21:20:47 +0000 | [diff] [blame] | 1340 | When a member name already was complete, CTRL-X CTRL-O will add a "." or |
| 1341 | "->" for composite types. |
| 1342 | |
Bram Moolenaar | 578b49e | 2005-09-10 19:22:57 +0000 | [diff] [blame] | 1343 | Vim doesn't include a C compiler, only the most obviously formatted |
| 1344 | declarations are recognized. Preprocessor stuff may cause confusion. |
| 1345 | When the same structure name appears in multiple places all possible members |
| 1346 | are included. |
| 1347 | |
Bram Moolenaar | 6b730e1 | 2005-09-16 21:47:57 +0000 | [diff] [blame] | 1348 | |
Bram Moolenaar | 4770d09 | 2006-01-12 23:22:24 +0000 | [diff] [blame] | 1349 | CSS *ft-css-omni* |
Bram Moolenaar | a5792f5 | 2005-11-23 21:25:05 +0000 | [diff] [blame] | 1350 | |
| 1351 | Complete properties and their appropriate values according to CSS 2.1 |
Bram Moolenaar | e2f98b9 | 2006-03-29 21:18:24 +0000 | [diff] [blame] | 1352 | specification. |
Bram Moolenaar | a5792f5 | 2005-11-23 21:25:05 +0000 | [diff] [blame] | 1353 | |
| 1354 | |
Bram Moolenaar | e2f98b9 | 2006-03-29 21:18:24 +0000 | [diff] [blame] | 1355 | HTML *ft-html-omni* |
| 1356 | XHTML *ft-xhtml-omni* |
Bram Moolenaar | 6b730e1 | 2005-09-16 21:47:57 +0000 | [diff] [blame] | 1357 | |
Bram Moolenaar | 1d2ba7f | 2006-02-14 22:29:30 +0000 | [diff] [blame] | 1358 | CTRL-X CTRL-O provides completion of various elements of (X)HTML files. It is |
Bram Moolenaar | db6ea06 | 2014-07-10 22:01:47 +0200 | [diff] [blame] | 1359 | designed to support writing of XHTML 1.0 Strict files but will also work for |
Bram Moolenaar | 1d2ba7f | 2006-02-14 22:29:30 +0000 | [diff] [blame] | 1360 | other versions of HTML. Features: |
Bram Moolenaar | 6b730e1 | 2005-09-16 21:47:57 +0000 | [diff] [blame] | 1361 | |
Bram Moolenaar | 1d2ba7f | 2006-02-14 22:29:30 +0000 | [diff] [blame] | 1362 | - after "<" complete tag name depending on context (no div suggestion inside |
| 1363 | of an a tag); '/>' indicates empty tags |
| 1364 | - inside of tag complete proper attributes (no width attribute for an a tag); |
| 1365 | show also type of attribute; '*' indicates required attributes |
| 1366 | - when attribute has limited number of possible values help to complete them |
Bram Moolenaar | a5792f5 | 2005-11-23 21:25:05 +0000 | [diff] [blame] | 1367 | - complete names of entities |
Bram Moolenaar | 1e01546 | 2005-09-25 22:16:38 +0000 | [diff] [blame] | 1368 | - complete values of "class" and "id" attributes with data obtained from |
Bram Moolenaar | 1d2ba7f | 2006-02-14 22:29:30 +0000 | [diff] [blame] | 1369 | <style> tag and included CSS files |
Bram Moolenaar | 8b6144b | 2006-02-08 09:20:24 +0000 | [diff] [blame] | 1370 | - when completing value of "style" attribute or working inside of "style" tag |
Bram Moolenaar | 1e01546 | 2005-09-25 22:16:38 +0000 | [diff] [blame] | 1371 | switch to |ft-css-omni| completion |
Bram Moolenaar | 1d2ba7f | 2006-02-14 22:29:30 +0000 | [diff] [blame] | 1372 | - when completing values of events attributes or working inside of "script" |
| 1373 | tag switch to |ft-javascript-omni| completion |
Bram Moolenaar | 1e01546 | 2005-09-25 22:16:38 +0000 | [diff] [blame] | 1374 | - when used after "</" CTRL-X CTRL-O will close the last opened tag |
Bram Moolenaar | 6b730e1 | 2005-09-16 21:47:57 +0000 | [diff] [blame] | 1375 | |
Bram Moolenaar | a5792f5 | 2005-11-23 21:25:05 +0000 | [diff] [blame] | 1376 | Note: When used first time completion menu will be shown with little delay |
Bram Moolenaar | e2f98b9 | 2006-03-29 21:18:24 +0000 | [diff] [blame] | 1377 | - this is time needed for loading of data file. |
Bram Moolenaar | 8b6144b | 2006-02-08 09:20:24 +0000 | [diff] [blame] | 1378 | Note: Completion may fail in badly formatted documents. In such case try to |
| 1379 | run |:make| command to detect formatting problems. |
Bram Moolenaar | a5792f5 | 2005-11-23 21:25:05 +0000 | [diff] [blame] | 1380 | |
| 1381 | |
Bram Moolenaar | c1e3790 | 2006-04-18 21:55:01 +0000 | [diff] [blame] | 1382 | HTML flavor *html-flavor* |
| 1383 | |
Bram Moolenaar | 9c10238 | 2006-05-03 21:26:49 +0000 | [diff] [blame] | 1384 | The default HTML completion depends on the filetype. For HTML files it is |
| 1385 | HTML 4.01 Transitional ('filetype' is "html"), for XHTML it is XHTML 1.0 |
| 1386 | Strict ('filetype' is "xhtml"). |
Bram Moolenaar | c1e3790 | 2006-04-18 21:55:01 +0000 | [diff] [blame] | 1387 | |
Bram Moolenaar | 9c10238 | 2006-05-03 21:26:49 +0000 | [diff] [blame] | 1388 | When doing completion outside of any other tag you will have possibility to |
| 1389 | choose DOCTYPE and the appropriate data file will be loaded and used for all |
| 1390 | next completions. |
Bram Moolenaar | c1e3790 | 2006-04-18 21:55:01 +0000 | [diff] [blame] | 1391 | |
Bram Moolenaar | 9c10238 | 2006-05-03 21:26:49 +0000 | [diff] [blame] | 1392 | More about format of data file in |xml-omni-datafile|. Some of the data files |
| 1393 | may be found on the Vim website (|www|). |
Bram Moolenaar | c1e3790 | 2006-04-18 21:55:01 +0000 | [diff] [blame] | 1394 | |
Bram Moolenaar | 9c10238 | 2006-05-03 21:26:49 +0000 | [diff] [blame] | 1395 | Note that b:html_omni_flavor may point to a file with any XML data. This |
| 1396 | makes possible to mix PHP (|ft-php-omni|) completion with any XML dialect |
| 1397 | (assuming you have data file for it). Without setting that variable XHTML 1.0 |
| 1398 | Strict will be used. |
Bram Moolenaar | c1e3790 | 2006-04-18 21:55:01 +0000 | [diff] [blame] | 1399 | |
| 1400 | |
Bram Moolenaar | e2f98b9 | 2006-03-29 21:18:24 +0000 | [diff] [blame] | 1401 | JAVASCRIPT *ft-javascript-omni* |
Bram Moolenaar | b8a7b56 | 2006-02-01 21:47:16 +0000 | [diff] [blame] | 1402 | |
Bram Moolenaar | 8b6144b | 2006-02-08 09:20:24 +0000 | [diff] [blame] | 1403 | Completion of most elements of JavaScript language and DOM elements. |
Bram Moolenaar | b8a7b56 | 2006-02-01 21:47:16 +0000 | [diff] [blame] | 1404 | |
| 1405 | Complete: |
| 1406 | |
| 1407 | - variables |
Bram Moolenaar | 1d2ba7f | 2006-02-14 22:29:30 +0000 | [diff] [blame] | 1408 | - function name; show function arguments |
Bram Moolenaar | b8a7b56 | 2006-02-01 21:47:16 +0000 | [diff] [blame] | 1409 | - function arguments |
| 1410 | - properties of variables trying to detect type of variable |
Bram Moolenaar | 8b6144b | 2006-02-08 09:20:24 +0000 | [diff] [blame] | 1411 | - complete DOM objects and properties depending on context |
Bram Moolenaar | b8a7b56 | 2006-02-01 21:47:16 +0000 | [diff] [blame] | 1412 | - keywords of language |
| 1413 | |
Bram Moolenaar | 8b6144b | 2006-02-08 09:20:24 +0000 | [diff] [blame] | 1414 | Completion works in separate JavaScript files (&ft==javascript), inside of |
| 1415 | <script> tag of (X)HTML and in values of event attributes (including scanning |
Bram Moolenaar | 9ba7e17 | 2013-07-17 22:37:26 +0200 | [diff] [blame] | 1416 | of external files). |
Bram Moolenaar | e2f98b9 | 2006-03-29 21:18:24 +0000 | [diff] [blame] | 1417 | |
Bram Moolenaar | b8a7b56 | 2006-02-01 21:47:16 +0000 | [diff] [blame] | 1418 | DOM compatibility |
| 1419 | |
| 1420 | At the moment (beginning of 2006) there are two main browsers - MS Internet |
| 1421 | Explorer and Mozilla Firefox. These two applications are covering over 90% of |
| 1422 | market. Theoretically standards are created by W3C organisation |
| 1423 | (http://www.w3c.org) but they are not always followed/implemented. |
| 1424 | |
Bram Moolenaar | e2f98b9 | 2006-03-29 21:18:24 +0000 | [diff] [blame] | 1425 | IE FF W3C Omni completion ~ |
| 1426 | +/- +/- + + ~ |
| 1427 | + + - + ~ |
| 1428 | + - - - ~ |
| 1429 | - + - - ~ |
Bram Moolenaar | b8a7b56 | 2006-02-01 21:47:16 +0000 | [diff] [blame] | 1430 | |
| 1431 | Regardless from state of implementation in browsers but if element is defined |
| 1432 | in standards, completion plugin will place element in suggestion list. When |
| 1433 | both major engines implemented element, even if this is not in standards it |
| 1434 | will be suggested. All other elements are not placed in suggestion list. |
| 1435 | |
| 1436 | |
Bram Moolenaar | e2f98b9 | 2006-03-29 21:18:24 +0000 | [diff] [blame] | 1437 | PHP *ft-php-omni* |
Bram Moolenaar | 362e1a3 | 2006-03-06 23:29:24 +0000 | [diff] [blame] | 1438 | |
Bram Moolenaar | 9964e46 | 2007-05-05 17:54:07 +0000 | [diff] [blame] | 1439 | Completion of PHP code requires a tags file for completion of data from |
| 1440 | external files and for class aware completion. You should use Exuberant ctags |
| 1441 | version 5.5.4 or newer. You can find it here: http://ctags.sourceforge.net/ |
Bram Moolenaar | 362e1a3 | 2006-03-06 23:29:24 +0000 | [diff] [blame] | 1442 | |
| 1443 | Script completes: |
| 1444 | |
| 1445 | - after $ variables name |
Bram Moolenaar | 0b598c2 | 2006-03-11 21:22:53 +0000 | [diff] [blame] | 1446 | - if variable was declared as object add "->", if tags file is available show |
| 1447 | name of class |
Bram Moolenaar | 910f66f | 2006-04-05 20:41:53 +0000 | [diff] [blame] | 1448 | - after "->" complete only function and variable names specific for given |
| 1449 | class. To find class location and contents tags file is required. Because |
| 1450 | PHP isn't strongly typed language user can use @var tag to declare class: > |
| 1451 | |
Bram Moolenaar | c9b4b05 | 2006-04-30 18:54:39 +0000 | [diff] [blame] | 1452 | /* @var $myVar myClass */ |
Bram Moolenaar | 910f66f | 2006-04-05 20:41:53 +0000 | [diff] [blame] | 1453 | $myVar-> |
| 1454 | < |
| 1455 | Still, to find myClass contents tags file is required. |
Bram Moolenaar | 0b598c2 | 2006-03-11 21:22:53 +0000 | [diff] [blame] | 1456 | |
Bram Moolenaar | 551dbcc | 2006-04-25 22:13:59 +0000 | [diff] [blame] | 1457 | - function names with additional info: |
Bram Moolenaar | 0b598c2 | 2006-03-11 21:22:53 +0000 | [diff] [blame] | 1458 | - in case of built-in functions list of possible arguments and after | type |
| 1459 | data returned by function |
Bram Moolenaar | 06b5d51 | 2010-05-22 15:37:44 +0200 | [diff] [blame] | 1460 | - in case of user function arguments and name of file where function was |
Bram Moolenaar | 0b598c2 | 2006-03-11 21:22:53 +0000 | [diff] [blame] | 1461 | defined (if it is not current file) |
| 1462 | |
| 1463 | - constants names |
| 1464 | - class names after "new" declaration |
| 1465 | |
Bram Moolenaar | 362e1a3 | 2006-03-06 23:29:24 +0000 | [diff] [blame] | 1466 | |
| 1467 | Note: when doing completion first time Vim will load all necessary data into |
| 1468 | memory. It may take several seconds. After next use of completion delay |
Bram Moolenaar | 0b598c2 | 2006-03-11 21:22:53 +0000 | [diff] [blame] | 1469 | should not be noticeable. |
Bram Moolenaar | 362e1a3 | 2006-03-06 23:29:24 +0000 | [diff] [blame] | 1470 | |
| 1471 | Script detects if cursor is inside <?php ?> tags. If it is outside it will |
| 1472 | automatically switch to HTML/CSS/JavaScript completion. Note: contrary to |
| 1473 | original HTML files completion of tags (and only tags) isn't context aware. |
| 1474 | |
| 1475 | |
Bram Moolenaar | c9b4b05 | 2006-04-30 18:54:39 +0000 | [diff] [blame] | 1476 | RUBY *ft-ruby-omni* |
Bram Moolenaar | fc1421e | 2006-04-20 22:17:20 +0000 | [diff] [blame] | 1477 | |
| 1478 | Completion of Ruby code requires that vim be built with |+ruby|. |
| 1479 | |
| 1480 | Ruby completion will parse your buffer on demand in order to provide a list of |
| 1481 | completions. These completions will be drawn from modules loaded by 'require' |
| 1482 | and modules defined in the current buffer. |
| 1483 | |
| 1484 | The completions provided by CTRL-X CTRL-O are sensitive to the context: |
| 1485 | |
Bram Moolenaar | c9b4b05 | 2006-04-30 18:54:39 +0000 | [diff] [blame] | 1486 | CONTEXT COMPLETIONS PROVIDED ~ |
Bram Moolenaar | fc1421e | 2006-04-20 22:17:20 +0000 | [diff] [blame] | 1487 | |
| 1488 | 1. Not inside a class definition Classes, constants and globals |
| 1489 | |
Bram Moolenaar | c9b4b05 | 2006-04-30 18:54:39 +0000 | [diff] [blame] | 1490 | 2. Inside a class definition Methods or constants defined in the class |
Bram Moolenaar | fc1421e | 2006-04-20 22:17:20 +0000 | [diff] [blame] | 1491 | |
Bram Moolenaar | c9b4b05 | 2006-04-30 18:54:39 +0000 | [diff] [blame] | 1492 | 3. After '.', '::' or ':' Methods applicable to the object being |
| 1493 | dereferenced |
Bram Moolenaar | fc1421e | 2006-04-20 22:17:20 +0000 | [diff] [blame] | 1494 | |
Bram Moolenaar | c9b4b05 | 2006-04-30 18:54:39 +0000 | [diff] [blame] | 1495 | 4. After ':' or ':foo' Symbol name (beginning with 'foo') |
Bram Moolenaar | fc1421e | 2006-04-20 22:17:20 +0000 | [diff] [blame] | 1496 | |
| 1497 | Notes: |
| 1498 | - Vim will load/evaluate code in order to provide completions. This may |
Bram Moolenaar | 40962ec | 2018-01-28 22:47:25 +0100 | [diff] [blame] | 1499 | cause some code execution, which may be a concern. This is no longer |
Bram Moolenaar | 9964e46 | 2007-05-05 17:54:07 +0000 | [diff] [blame] | 1500 | enabled by default, to enable this feature add > |
| 1501 | let g:rubycomplete_buffer_loading = 1 |
| 1502 | <- In context 1 above, Vim can parse the entire buffer to add a list of |
Bram Moolenaar | 551dbcc | 2006-04-25 22:13:59 +0000 | [diff] [blame] | 1503 | classes to the completion results. This feature is turned off by default, |
| 1504 | to enable it add > |
| 1505 | let g:rubycomplete_classes_in_global = 1 |
| 1506 | < to your vimrc |
Bram Moolenaar | fc1421e | 2006-04-20 22:17:20 +0000 | [diff] [blame] | 1507 | - In context 2 above, anonymous classes are not supported. |
| 1508 | - In context 3 above, Vim will attempt to determine the methods supported by |
| 1509 | the object. |
| 1510 | - Vim can detect and load the Rails environment for files within a rails |
| 1511 | project. The feature is disabled by default, to enable it add > |
Bram Moolenaar | 551dbcc | 2006-04-25 22:13:59 +0000 | [diff] [blame] | 1512 | let g:rubycomplete_rails = 1 |
| 1513 | < to your vimrc |
Bram Moolenaar | fc1421e | 2006-04-20 22:17:20 +0000 | [diff] [blame] | 1514 | |
| 1515 | |
Bram Moolenaar | 4770d09 | 2006-01-12 23:22:24 +0000 | [diff] [blame] | 1516 | SYNTAX *ft-syntax-omni* |
| 1517 | |
Bram Moolenaar | 9964e46 | 2007-05-05 17:54:07 +0000 | [diff] [blame] | 1518 | Vim has the ability to color syntax highlight nearly 500 languages. Part of |
| 1519 | this highlighting includes knowing what keywords are part of a language. Many |
| 1520 | filetypes already have custom completion scripts written for them, the |
| 1521 | syntaxcomplete plugin provides basic completion for all other filetypes. It |
| 1522 | does this by populating the omni completion list with the text Vim already |
| 1523 | knows how to color highlight. It can be used for any filetype and provides a |
| 1524 | minimal language-sensitive completion. |
Bram Moolenaar | 4770d09 | 2006-01-12 23:22:24 +0000 | [diff] [blame] | 1525 | |
Bram Moolenaar | c06ac34 | 2006-03-02 22:43:39 +0000 | [diff] [blame] | 1526 | To enable syntax code completion you can run: > |
Bram Moolenaar | ec7944a | 2013-06-12 21:29:15 +0200 | [diff] [blame] | 1527 | setlocal omnifunc=syntaxcomplete#Complete |
Bram Moolenaar | 4770d09 | 2006-01-12 23:22:24 +0000 | [diff] [blame] | 1528 | |
Bram Moolenaar | ec7944a | 2013-06-12 21:29:15 +0200 | [diff] [blame] | 1529 | You can automate this by placing the following in your |.vimrc| (after any |
Bram Moolenaar | c06ac34 | 2006-03-02 22:43:39 +0000 | [diff] [blame] | 1530 | ":filetype" command): > |
| 1531 | if has("autocmd") && exists("+omnifunc") |
Bram Moolenaar | e2f98b9 | 2006-03-29 21:18:24 +0000 | [diff] [blame] | 1532 | autocmd Filetype * |
| 1533 | \ if &omnifunc == "" | |
| 1534 | \ setlocal omnifunc=syntaxcomplete#Complete | |
| 1535 | \ endif |
Bram Moolenaar | c06ac34 | 2006-03-02 22:43:39 +0000 | [diff] [blame] | 1536 | endif |
Bram Moolenaar | 4770d09 | 2006-01-12 23:22:24 +0000 | [diff] [blame] | 1537 | |
Bram Moolenaar | c06ac34 | 2006-03-02 22:43:39 +0000 | [diff] [blame] | 1538 | The above will set completion to this script only if a specific plugin does |
| 1539 | not already exist for that filetype. |
| 1540 | |
| 1541 | Each filetype can have a wide range of syntax items. The plugin allows you to |
| 1542 | customize which syntax groups to include or exclude from the list. Let's have |
| 1543 | a look at the PHP filetype to see how this works. |
| 1544 | |
| 1545 | If you edit a file called, index.php, run the following command: > |
Bram Moolenaar | ec7944a | 2013-06-12 21:29:15 +0200 | [diff] [blame] | 1546 | syntax list |
Bram Moolenaar | c06ac34 | 2006-03-02 22:43:39 +0000 | [diff] [blame] | 1547 | |
Bram Moolenaar | 06b5d51 | 2010-05-22 15:37:44 +0200 | [diff] [blame] | 1548 | The first thing you will notice is that there are many different syntax groups. |
| 1549 | The PHP language can include elements from different languages like HTML, |
Bram Moolenaar | c06ac34 | 2006-03-02 22:43:39 +0000 | [diff] [blame] | 1550 | JavaScript and many more. The syntax plugin will only include syntax groups |
| 1551 | that begin with the filetype, "php", in this case. For example these syntax |
| 1552 | groups are included by default with the PHP: phpEnvVar, phpIntVar, |
| 1553 | phpFunctions. |
| 1554 | |
Bram Moolenaar | 40962ec | 2018-01-28 22:47:25 +0100 | [diff] [blame] | 1555 | If you wish non-filetype syntax items to also be included, you can use a |
| 1556 | regular expression syntax (added in version 13.0 of |
Bram Moolenaar | 6dc819b | 2018-07-03 16:42:19 +0200 | [diff] [blame] | 1557 | autoload/syntaxcomplete.vim) to add items. Looking at the output from |
Bram Moolenaar | 40962ec | 2018-01-28 22:47:25 +0100 | [diff] [blame] | 1558 | ":syntax list" while editing a PHP file I can see some of these entries: > |
Bram Moolenaar | ec7944a | 2013-06-12 21:29:15 +0200 | [diff] [blame] | 1559 | htmlArg,htmlTag,htmlTagName,javaScriptStatement,javaScriptGlobalObjects |
Bram Moolenaar | c06ac34 | 2006-03-02 22:43:39 +0000 | [diff] [blame] | 1560 | |
Bram Moolenaar | ec7944a | 2013-06-12 21:29:15 +0200 | [diff] [blame] | 1561 | To pick up any JavaScript and HTML keyword syntax groups while editing a PHP |
Bram Moolenaar | 40962ec | 2018-01-28 22:47:25 +0100 | [diff] [blame] | 1562 | file, you can use 3 different regexs, one for each language. Or you can |
| 1563 | simply restrict the include groups to a particular value, without using |
Bram Moolenaar | ec7944a | 2013-06-12 21:29:15 +0200 | [diff] [blame] | 1564 | a regex string: > |
| 1565 | let g:omni_syntax_group_include_php = 'php\w\+,javaScript\w\+,html\w\+' |
| 1566 | let g:omni_syntax_group_include_php = 'phpFunctions,phpMethods' |
| 1567 | < |
| 1568 | The basic form of this variable is: > |
| 1569 | let g:omni_syntax_group_include_{filetype} = 'regex,comma,separated' |
| 1570 | |
| 1571 | The PHP language has an enormous number of items which it knows how to syntax |
Bram Moolenaar | 9ba7e17 | 2013-07-17 22:37:26 +0200 | [diff] [blame] | 1572 | highlight. These items will be available within the omni completion list. |
Bram Moolenaar | ec7944a | 2013-06-12 21:29:15 +0200 | [diff] [blame] | 1573 | |
| 1574 | Some people may find this list unwieldy or are only interested in certain |
| 1575 | items. There are two ways to prune this list (if necessary). If you find |
Bram Moolenaar | 40962ec | 2018-01-28 22:47:25 +0100 | [diff] [blame] | 1576 | certain syntax groups you do not wish displayed you can use two different |
| 1577 | methods to identify these groups. The first specifically lists the syntax |
| 1578 | groups by name. The second uses a regular expression to identify both |
Bram Moolenaar | ec7944a | 2013-06-12 21:29:15 +0200 | [diff] [blame] | 1579 | syntax groups. Simply add one the following to your vimrc: > |
| 1580 | let g:omni_syntax_group_exclude_php = 'phpCoreConstant,phpConstant' |
| 1581 | let g:omni_syntax_group_exclude_php = 'php\w*Constant' |
Bram Moolenaar | c06ac34 | 2006-03-02 22:43:39 +0000 | [diff] [blame] | 1582 | |
| 1583 | Add as many syntax groups to this list by comma separating them. The basic |
| 1584 | form of this variable is: > |
Bram Moolenaar | ec7944a | 2013-06-12 21:29:15 +0200 | [diff] [blame] | 1585 | let g:omni_syntax_group_exclude_{filetype} = 'regex,comma,separated' |
Bram Moolenaar | c06ac34 | 2006-03-02 22:43:39 +0000 | [diff] [blame] | 1586 | |
| 1587 | You can create as many of these variables as you need, varying only the |
| 1588 | filetype at the end of the variable name. |
Bram Moolenaar | 4770d09 | 2006-01-12 23:22:24 +0000 | [diff] [blame] | 1589 | |
Bram Moolenaar | 9964e46 | 2007-05-05 17:54:07 +0000 | [diff] [blame] | 1590 | The plugin uses the isKeyword option to determine where word boundaries are |
| 1591 | for the syntax items. For example, in the Scheme language completion should |
| 1592 | include the "-", call-with-output-file. Depending on your filetype, this may |
| 1593 | not provide the words you are expecting. Setting the |
| 1594 | g:omni_syntax_use_iskeyword option to 0 will force the syntax plugin to break |
| 1595 | on word characters. This can be controlled adding the following to your |
| 1596 | vimrc: > |
| 1597 | let g:omni_syntax_use_iskeyword = 0 |
| 1598 | |
Bram Moolenaar | 8b68277 | 2010-07-30 21:49:40 +0200 | [diff] [blame] | 1599 | For plugin developers, the plugin exposes a public function OmniSyntaxList. |
| 1600 | This function can be used to request a List of syntax items. When editing a |
Bram Moolenaar | 40962ec | 2018-01-28 22:47:25 +0100 | [diff] [blame] | 1601 | SQL file (:e syntax.sql) you can use the ":syntax list" command to see the |
Bram Moolenaar | 8b68277 | 2010-07-30 21:49:40 +0200 | [diff] [blame] | 1602 | various groups and syntax items. For example: > |
Bram Moolenaar | 40962ec | 2018-01-28 22:47:25 +0100 | [diff] [blame] | 1603 | syntax list |
Bram Moolenaar | 8b68277 | 2010-07-30 21:49:40 +0200 | [diff] [blame] | 1604 | |
Bram Moolenaar | 40962ec | 2018-01-28 22:47:25 +0100 | [diff] [blame] | 1605 | Yields data similar to this: |
| 1606 | sqlOperator xxx some prior all like and any escape exists in is not ~ |
| 1607 | or intersect minus between distinct ~ |
| 1608 | links to Operator ~ |
| 1609 | sqlType xxx varbit varchar nvarchar bigint int uniqueidentifier ~ |
| 1610 | date money long tinyint unsigned xml text smalldate ~ |
| 1611 | double datetime nchar smallint numeric time bit char ~ |
| 1612 | varbinary binary smallmoney ~ |
| 1613 | image float integer timestamp real decimal ~ |
Bram Moolenaar | 8b68277 | 2010-07-30 21:49:40 +0200 | [diff] [blame] | 1614 | |
| 1615 | There are two syntax groups listed here: sqlOperator and sqlType. To retrieve |
Bram Moolenaar | 40962ec | 2018-01-28 22:47:25 +0100 | [diff] [blame] | 1616 | a List of syntax items you can call OmniSyntaxList a number of different |
Bram Moolenaar | 8b68277 | 2010-07-30 21:49:40 +0200 | [diff] [blame] | 1617 | ways. To retrieve all syntax items regardless of syntax group: > |
| 1618 | echo OmniSyntaxList( [] ) |
| 1619 | |
| 1620 | To retrieve only the syntax items for the sqlOperator syntax group: > |
| 1621 | echo OmniSyntaxList( ['sqlOperator'] ) |
| 1622 | |
| 1623 | To retrieve all syntax items for both the sqlOperator and sqlType groups: > |
| 1624 | echo OmniSyntaxList( ['sqlOperator', 'sqlType'] ) |
| 1625 | |
Bram Moolenaar | ec7944a | 2013-06-12 21:29:15 +0200 | [diff] [blame] | 1626 | A regular expression can also be used: > |
| 1627 | echo OmniSyntaxList( ['sql\w\+'] ) |
| 1628 | |
Bram Moolenaar | 8b68277 | 2010-07-30 21:49:40 +0200 | [diff] [blame] | 1629 | From within a plugin, you would typically assign the output to a List: > |
| 1630 | let myKeywords = [] |
| 1631 | let myKeywords = OmniSyntaxList( ['sqlKeyword'] ) |
| 1632 | |
Bram Moolenaar | 4770d09 | 2006-01-12 23:22:24 +0000 | [diff] [blame] | 1633 | |
Bram Moolenaar | e2f98b9 | 2006-03-29 21:18:24 +0000 | [diff] [blame] | 1634 | SQL *ft-sql-omni* |
| 1635 | |
| 1636 | Completion for the SQL language includes statements, functions, keywords. |
| 1637 | It will also dynamically complete tables, procedures, views and column lists |
| 1638 | with data pulled directly from within a database. For detailed instructions |
| 1639 | and a tutorial see |omni-sql-completion|. |
| 1640 | |
Bram Moolenaar | 910f66f | 2006-04-05 20:41:53 +0000 | [diff] [blame] | 1641 | The SQL completion plugin can be used in conjunction with other completion |
Bram Moolenaar | 8f3f58f | 2010-01-06 20:52:26 +0100 | [diff] [blame] | 1642 | plugins. For example, the PHP filetype has its own completion plugin. |
Bram Moolenaar | 910f66f | 2006-04-05 20:41:53 +0000 | [diff] [blame] | 1643 | Since PHP is often used to generate dynamic website by accessing a database, |
| 1644 | the SQL completion plugin can also be enabled. This allows you to complete |
| 1645 | PHP code and SQL code at the same time. |
| 1646 | |
Bram Moolenaar | e2f98b9 | 2006-03-29 21:18:24 +0000 | [diff] [blame] | 1647 | |
Bram Moolenaar | 4770d09 | 2006-01-12 23:22:24 +0000 | [diff] [blame] | 1648 | XML *ft-xml-omni* |
Bram Moolenaar | a5792f5 | 2005-11-23 21:25:05 +0000 | [diff] [blame] | 1649 | |
Bram Moolenaar | 9c10238 | 2006-05-03 21:26:49 +0000 | [diff] [blame] | 1650 | Vim 7 provides a mechanism for context aware completion of XML files. It |
| 1651 | depends on a special |xml-omni-datafile| and two commands: |:XMLns| and |
| 1652 | |:XMLent|. Features are: |
Bram Moolenaar | a5792f5 | 2005-11-23 21:25:05 +0000 | [diff] [blame] | 1653 | |
Bram Moolenaar | 9c10238 | 2006-05-03 21:26:49 +0000 | [diff] [blame] | 1654 | - after "<" complete the tag name, depending on context |
| 1655 | - inside of a tag complete proper attributes |
| 1656 | - when an attribute has a limited number of possible values help to complete |
Bram Moolenaar | a5792f5 | 2005-11-23 21:25:05 +0000 | [diff] [blame] | 1657 | them |
Bram Moolenaar | 9c10238 | 2006-05-03 21:26:49 +0000 | [diff] [blame] | 1658 | - complete names of entities (defined in |xml-omni-datafile| and in the |
| 1659 | current file with "<!ENTITY" declarations) |
Bram Moolenaar | a5792f5 | 2005-11-23 21:25:05 +0000 | [diff] [blame] | 1660 | - when used after "</" CTRL-X CTRL-O will close the last opened tag |
| 1661 | |
Bram Moolenaar | 4770d09 | 2006-01-12 23:22:24 +0000 | [diff] [blame] | 1662 | Format of XML data file *xml-omni-datafile* |
Bram Moolenaar | a5792f5 | 2005-11-23 21:25:05 +0000 | [diff] [blame] | 1663 | |
Bram Moolenaar | 9c10238 | 2006-05-03 21:26:49 +0000 | [diff] [blame] | 1664 | XML data files are stored in the "autoload/xml" directory in 'runtimepath'. |
| 1665 | Vim distribution provides examples of data files in the |
| 1666 | "$VIMRUNTIME/autoload/xml" directory. They have a meaningful name which will |
| 1667 | be used in commands. It should be a unique name which will not create |
| 1668 | conflicts. For example, the name xhtml10s.vim means it is the data file for |
| 1669 | XHTML 1.0 Strict. |
Bram Moolenaar | a5792f5 | 2005-11-23 21:25:05 +0000 | [diff] [blame] | 1670 | |
Bram Moolenaar | 9c10238 | 2006-05-03 21:26:49 +0000 | [diff] [blame] | 1671 | Each file contains a variable with a name like g:xmldata_xhtml10s . It is |
| 1672 | a compound from two parts: |
Bram Moolenaar | a5792f5 | 2005-11-23 21:25:05 +0000 | [diff] [blame] | 1673 | |
Bram Moolenaar | 9c10238 | 2006-05-03 21:26:49 +0000 | [diff] [blame] | 1674 | 1. "g:xmldata_" general prefix, constant for all data files |
| 1675 | 2. "xhtml10s" the name of the file and the name of the described XML |
| 1676 | dialect; it will be used as an argument for the |:XMLns| |
| 1677 | command |
Bram Moolenaar | a5792f5 | 2005-11-23 21:25:05 +0000 | [diff] [blame] | 1678 | |
| 1679 | Part two must be exactly the same as name of file. |
| 1680 | |
Bram Moolenaar | 9c10238 | 2006-05-03 21:26:49 +0000 | [diff] [blame] | 1681 | The variable is a |Dictionary|. Keys are tag names and each value is a two |
| 1682 | element |List|. The first element of the List is also a List with the names |
| 1683 | of possible children. The second element is a |Dictionary| with the names of |
| 1684 | attributes as keys and the possible values of attributes as values. Example: > |
Bram Moolenaar | a5792f5 | 2005-11-23 21:25:05 +0000 | [diff] [blame] | 1685 | |
Bram Moolenaar | 9c10238 | 2006-05-03 21:26:49 +0000 | [diff] [blame] | 1686 | let g:xmldata_crippled = { |
| 1687 | \ "vimxmlentities": ["amp", "lt", "gt", "apos", "quot"], |
| 1688 | \ 'vimxmlroot': ['tag1'], |
| 1689 | \ 'tag1': |
| 1690 | \ [ ['childoftag1a', 'childoftag1b'], {'attroftag1a': [], |
| 1691 | \ 'attroftag1b': ['valueofattr1', 'valueofattr2']}], |
| 1692 | \ 'childoftag1a': |
| 1693 | \ [ [], {'attrofchild': ['attrofchild']}], |
| 1694 | \ 'childoftag1b': |
| 1695 | \ [ ['childoftag1a'], {'attrofchild': []}], |
Bram Moolenaar | 1d2ba7f | 2006-02-14 22:29:30 +0000 | [diff] [blame] | 1696 | \ "vimxmltaginfo": { |
Bram Moolenaar | 9c10238 | 2006-05-03 21:26:49 +0000 | [diff] [blame] | 1697 | \ 'tag1': ['Menu info', 'Long information visible in preview window']}, |
| 1698 | \ 'vimxmlattrinfo': { |
| 1699 | \ 'attrofchild': ['Menu info', 'Long information visible in preview window']}} |
Bram Moolenaar | a5792f5 | 2005-11-23 21:25:05 +0000 | [diff] [blame] | 1700 | |
Bram Moolenaar | 9c10238 | 2006-05-03 21:26:49 +0000 | [diff] [blame] | 1701 | This example would be put in the "autoload/xml/crippled.vim" file and could |
| 1702 | help to write this file: > |
Bram Moolenaar | a5792f5 | 2005-11-23 21:25:05 +0000 | [diff] [blame] | 1703 | |
Bram Moolenaar | 9c10238 | 2006-05-03 21:26:49 +0000 | [diff] [blame] | 1704 | <tag1 attroftag1b="valueofattr1"> |
| 1705 | <childoftag1a attrofchild> |
| 1706 | & < |
| 1707 | </childoftag1a> |
| 1708 | <childoftag1b attrofchild="5"> |
| 1709 | <childoftag1a> |
| 1710 | > ' " |
| 1711 | </childoftag1a> |
| 1712 | </childoftag1b> |
| 1713 | </tag1> |
Bram Moolenaar | a5792f5 | 2005-11-23 21:25:05 +0000 | [diff] [blame] | 1714 | |
Bram Moolenaar | 9c10238 | 2006-05-03 21:26:49 +0000 | [diff] [blame] | 1715 | In the example four special elements are visible: |
| 1716 | |
| 1717 | 1. "vimxmlentities" - a special key with List containing entities of this XML |
Bram Moolenaar | a5792f5 | 2005-11-23 21:25:05 +0000 | [diff] [blame] | 1718 | dialect. |
Bram Moolenaar | 9c10238 | 2006-05-03 21:26:49 +0000 | [diff] [blame] | 1719 | 2. If the list containing possible values of attributes has one element and |
| 1720 | this element is equal to the name of the attribute this attribute will be |
| 1721 | treated as boolean and inserted as 'attrname' and not as 'attrname="' |
| 1722 | 3. "vimxmltaginfo" - a special key with a Dictionary containing tag |
| 1723 | names as keys and two element List as values, for additional menu info and |
| 1724 | the long description. |
| 1725 | 4. "vimxmlattrinfo" - special key with Dictionary containing attribute names |
| 1726 | as keys and two element List as values, for additional menu info and long |
Bram Moolenaar | 1d2ba7f | 2006-02-14 22:29:30 +0000 | [diff] [blame] | 1727 | description. |
Bram Moolenaar | a5792f5 | 2005-11-23 21:25:05 +0000 | [diff] [blame] | 1728 | |
Bram Moolenaar | 9c10238 | 2006-05-03 21:26:49 +0000 | [diff] [blame] | 1729 | Note: Tag names in the data file MUST not contain a namespace description. |
| 1730 | Check xsl.vim for an example. |
| 1731 | Note: All data and functions are publicly available as global |
| 1732 | variables/functions and can be used for personal editing functions. |
Bram Moolenaar | a5792f5 | 2005-11-23 21:25:05 +0000 | [diff] [blame] | 1733 | |
Bram Moolenaar | 1d2ba7f | 2006-02-14 22:29:30 +0000 | [diff] [blame] | 1734 | |
Bram Moolenaar | c9b4b05 | 2006-04-30 18:54:39 +0000 | [diff] [blame] | 1735 | DTD -> Vim *dtd2vim* |
Bram Moolenaar | c1e3790 | 2006-04-18 21:55:01 +0000 | [diff] [blame] | 1736 | |
Bram Moolenaar | 9c10238 | 2006-05-03 21:26:49 +0000 | [diff] [blame] | 1737 | On |www| is the script |dtd2vim| which parses DTD and creates an XML data file |
Bram Moolenaar | c1e3790 | 2006-04-18 21:55:01 +0000 | [diff] [blame] | 1738 | for Vim XML omni completion. |
| 1739 | |
| 1740 | dtd2vim: http://www.vim.org/scripts/script.php?script_id=1462 |
| 1741 | |
Bram Moolenaar | 9c10238 | 2006-05-03 21:26:49 +0000 | [diff] [blame] | 1742 | Check the beginning of that file for usage details. |
| 1743 | The script requires perl and: |
Bram Moolenaar | c1e3790 | 2006-04-18 21:55:01 +0000 | [diff] [blame] | 1744 | |
| 1745 | perlSGML: http://savannah.nongnu.org/projects/perlsgml |
| 1746 | |
| 1747 | |
Bram Moolenaar | a5792f5 | 2005-11-23 21:25:05 +0000 | [diff] [blame] | 1748 | Commands |
| 1749 | |
Bram Moolenaar | 4770d09 | 2006-01-12 23:22:24 +0000 | [diff] [blame] | 1750 | :XMLns {name} [{namespace}] *:XMLns* |
Bram Moolenaar | a5792f5 | 2005-11-23 21:25:05 +0000 | [diff] [blame] | 1751 | |
Bram Moolenaar | 9c10238 | 2006-05-03 21:26:49 +0000 | [diff] [blame] | 1752 | Vim has to know which data file should be used and with which namespace. For |
| 1753 | loading of the data file and connecting data with the proper namespace use |
| 1754 | |:XMLns| command. The first (obligatory) argument is the name of the data |
| 1755 | (xhtml10s, xsl). The second argument is the code of namespace (h, xsl). When |
| 1756 | used without a second argument the dialect will be used as default - without |
| 1757 | namespace declaration. For example to use XML completion in .xsl files: > |
Bram Moolenaar | a5792f5 | 2005-11-23 21:25:05 +0000 | [diff] [blame] | 1758 | |
| 1759 | :XMLns xhtml10s |
| 1760 | :XMLns xsl xsl |
| 1761 | |
| 1762 | |
Bram Moolenaar | 4770d09 | 2006-01-12 23:22:24 +0000 | [diff] [blame] | 1763 | :XMLent {name} *:XMLent* |
Bram Moolenaar | a5792f5 | 2005-11-23 21:25:05 +0000 | [diff] [blame] | 1764 | |
Bram Moolenaar | 9c10238 | 2006-05-03 21:26:49 +0000 | [diff] [blame] | 1765 | By default entities will be completed from the data file of the default |
| 1766 | namespace. The XMLent command should be used in case when there is no default |
| 1767 | namespace: > |
Bram Moolenaar | a5792f5 | 2005-11-23 21:25:05 +0000 | [diff] [blame] | 1768 | |
Bram Moolenaar | 4770d09 | 2006-01-12 23:22:24 +0000 | [diff] [blame] | 1769 | :XMLent xhtml10s |
Bram Moolenaar | a5792f5 | 2005-11-23 21:25:05 +0000 | [diff] [blame] | 1770 | |
| 1771 | Usage |
| 1772 | |
Bram Moolenaar | 9c10238 | 2006-05-03 21:26:49 +0000 | [diff] [blame] | 1773 | While used in this situation (after declarations from previous part, | is |
Bram Moolenaar | a5792f5 | 2005-11-23 21:25:05 +0000 | [diff] [blame] | 1774 | cursor position): > |
| 1775 | |
Bram Moolenaar | 4770d09 | 2006-01-12 23:22:24 +0000 | [diff] [blame] | 1776 | <| |
Bram Moolenaar | a5792f5 | 2005-11-23 21:25:05 +0000 | [diff] [blame] | 1777 | |
Bram Moolenaar | 9c10238 | 2006-05-03 21:26:49 +0000 | [diff] [blame] | 1778 | Will complete to an appropriate XHTML tag, and in this situation: > |
Bram Moolenaar | a5792f5 | 2005-11-23 21:25:05 +0000 | [diff] [blame] | 1779 | |
Bram Moolenaar | 4770d09 | 2006-01-12 23:22:24 +0000 | [diff] [blame] | 1780 | <xsl:| |
Bram Moolenaar | a5792f5 | 2005-11-23 21:25:05 +0000 | [diff] [blame] | 1781 | |
Bram Moolenaar | 9c10238 | 2006-05-03 21:26:49 +0000 | [diff] [blame] | 1782 | Will complete to an appropriate XSL tag. |
Bram Moolenaar | a5792f5 | 2005-11-23 21:25:05 +0000 | [diff] [blame] | 1783 | |
Bram Moolenaar | 9c10238 | 2006-05-03 21:26:49 +0000 | [diff] [blame] | 1784 | |
| 1785 | The script xmlcomplete.vim, provided through the |autoload| mechanism, |
| 1786 | has the xmlcomplete#GetLastOpenTag() function which can be used in XML files |
| 1787 | to get the name of the last open tag (b:unaryTagsStack has to be defined): > |
Bram Moolenaar | 6b730e1 | 2005-09-16 21:47:57 +0000 | [diff] [blame] | 1788 | |
Bram Moolenaar | 4770d09 | 2006-01-12 23:22:24 +0000 | [diff] [blame] | 1789 | :echo xmlcomplete#GetLastOpenTag("b:unaryTagsStack") |
Bram Moolenaar | bfd8fc0 | 2005-09-20 23:22:24 +0000 | [diff] [blame] | 1790 | |
Bram Moolenaar | 6b730e1 | 2005-09-16 21:47:57 +0000 | [diff] [blame] | 1791 | |
Bram Moolenaar | 1e01546 | 2005-09-25 22:16:38 +0000 | [diff] [blame] | 1792 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1793 | ============================================================================== |
| 1794 | 8. Insert mode commands *inserting* |
| 1795 | |
| 1796 | The following commands can be used to insert new text into the buffer. They |
| 1797 | can all be undone and repeated with the "." command. |
| 1798 | |
| 1799 | *a* |
| 1800 | a Append text after the cursor [count] times. If the |
| 1801 | cursor is in the first column of an empty line Insert |
| 1802 | starts there. But not when 'virtualedit' is set! |
| 1803 | |
| 1804 | *A* |
| 1805 | A Append text at the end of the line [count] times. |
| 1806 | |
| 1807 | <insert> or *i* *insert* *<Insert>* |
| 1808 | i Insert text before the cursor [count] times. |
| 1809 | When using CTRL-O in Insert mode |i_CTRL-O| the count |
| 1810 | is not supported. |
| 1811 | |
| 1812 | *I* |
| 1813 | I Insert text before the first non-blank in the line |
| 1814 | [count] times. |
Bram Moolenaar | 4399ef4 | 2005-02-12 14:29:27 +0000 | [diff] [blame] | 1815 | When the 'H' flag is present in 'cpoptions' and the |
| 1816 | line only contains blanks, insert start just before |
| 1817 | the last blank. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1818 | |
| 1819 | *gI* |
Bram Moolenaar | 25c9c68 | 2019-05-05 18:13:34 +0200 | [diff] [blame] | 1820 | gI Insert text in column 1 [count] times. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1821 | |
| 1822 | *gi* |
| 1823 | gi Insert text in the same position as where Insert mode |
| 1824 | was stopped last time in the current buffer. |
| 1825 | This uses the |'^| mark. It's different from "`^i" |
| 1826 | when the mark is past the end of the line. |
| 1827 | The position is corrected for inserted/deleted lines, |
| 1828 | but NOT for inserted/deleted characters. |
| 1829 | When the |:keepjumps| command modifier is used the |'^| |
Bram Moolenaar | 69a7cb4 | 2004-06-20 12:51:53 +0000 | [diff] [blame] | 1830 | mark won't be changed. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1831 | |
| 1832 | *o* |
| 1833 | o Begin a new line below the cursor and insert text, |
Bram Moolenaar | a6c27c4 | 2019-05-09 19:16:22 +0200 | [diff] [blame] | 1834 | repeat [count] times. |
Bram Moolenaar | 4399ef4 | 2005-02-12 14:29:27 +0000 | [diff] [blame] | 1835 | When the '#' flag is in 'cpoptions' the count is |
| 1836 | ignored. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1837 | |
| 1838 | *O* |
| 1839 | O Begin a new line above the cursor and insert text, |
Bram Moolenaar | a6c27c4 | 2019-05-09 19:16:22 +0200 | [diff] [blame] | 1840 | repeat [count] times. |
Bram Moolenaar | 4399ef4 | 2005-02-12 14:29:27 +0000 | [diff] [blame] | 1841 | When the '#' flag is in 'cpoptions' the count is |
| 1842 | ignored. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1843 | |
| 1844 | These commands are used to start inserting text. You can end insert mode with |
| 1845 | <Esc>. See |mode-ins-repl| for the other special characters in Insert mode. |
| 1846 | The effect of [count] takes place after Insert mode is exited. |
| 1847 | |
| 1848 | When 'autoindent' is on, the indent for a new line is obtained from the |
| 1849 | previous line. When 'smartindent' or 'cindent' is on, the indent for a line |
| 1850 | is automatically adjusted for C programs. |
| 1851 | |
| 1852 | 'textwidth' can be set to the maximum width for a line. When a line becomes |
| 1853 | too long when appending characters a line break is automatically inserted. |
| 1854 | |
| 1855 | |
| 1856 | ============================================================================== |
| 1857 | 9. Ex insert commands *inserting-ex* |
| 1858 | |
| 1859 | *:a* *:append* |
Bram Moolenaar | df177f6 | 2005-02-22 08:39:57 +0000 | [diff] [blame] | 1860 | :{range}a[ppend][!] Insert several lines of text below the specified |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1861 | line. If the {range} is missing, the text will be |
| 1862 | inserted after the current line. |
Bram Moolenaar | df177f6 | 2005-02-22 08:39:57 +0000 | [diff] [blame] | 1863 | Adding [!] toggles 'autoindent' for the time this |
| 1864 | command is executed. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1865 | |
| 1866 | *:i* *:in* *:insert* |
Bram Moolenaar | df177f6 | 2005-02-22 08:39:57 +0000 | [diff] [blame] | 1867 | :{range}i[nsert][!] Insert several lines of text above the specified |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1868 | line. If the {range} is missing, the text will be |
| 1869 | inserted before the current line. |
Bram Moolenaar | df177f6 | 2005-02-22 08:39:57 +0000 | [diff] [blame] | 1870 | Adding [!] toggles 'autoindent' for the time this |
| 1871 | command is executed. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1872 | |
| 1873 | These two commands will keep on asking for lines, until you type a line |
| 1874 | containing only a ".". Watch out for lines starting with a backslash, see |
| 1875 | |line-continuation|. |
Bram Moolenaar | 8f3f58f | 2010-01-06 20:52:26 +0100 | [diff] [blame] | 1876 | |
Bram Moolenaar | 4a74803 | 2010-09-30 21:47:56 +0200 | [diff] [blame] | 1877 | When in Ex mode (see |-e|) a backslash at the end of the line can be used to |
| 1878 | insert a NUL character. To be able to have a line ending in a backslash use |
| 1879 | two backslashes. This means that the number of backslashes is halved, but |
| 1880 | only at the end of the line. |
| 1881 | |
Bram Moolenaar | 8f3f58f | 2010-01-06 20:52:26 +0100 | [diff] [blame] | 1882 | NOTE: These commands cannot be used with |:global| or |:vglobal|. |
| 1883 | ":append" and ":insert" don't work properly in between ":if" and |
Bram Moolenaar | 06fb435 | 2005-01-05 22:10:30 +0000 | [diff] [blame] | 1884 | ":endif", ":for" and ":endfor", ":while" and ":endwhile". |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1885 | |
| 1886 | *:start* *:startinsert* |
| 1887 | :star[tinsert][!] Start Insert mode just after executing this command. |
| 1888 | Works like typing "i" in Normal mode. When the ! is |
| 1889 | included it works like "A", append to the line. |
| 1890 | Otherwise insertion starts at the cursor position. |
| 1891 | Note that when using this command in a function or |
| 1892 | script, the insertion only starts after the function |
| 1893 | or script is finished. |
Bram Moolenaar | 87e25fd | 2005-07-27 21:13:01 +0000 | [diff] [blame] | 1894 | This command does not work from |:normal|. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1895 | |
| 1896 | *:stopi* *:stopinsert* |
| 1897 | :stopi[nsert] Stop Insert mode as soon as possible. Works like |
| 1898 | typing <Esc> in Insert mode. |
| 1899 | Can be used in an autocommand, example: > |
| 1900 | :au BufEnter scratch stopinsert |
Bram Moolenaar | 325b7a2 | 2004-07-05 15:58:32 +0000 | [diff] [blame] | 1901 | < |
| 1902 | *replacing-ex* *:startreplace* |
| 1903 | :startr[eplace][!] Start Replace mode just after executing this command. |
| 1904 | Works just like typing "R" in Normal mode. When the |
| 1905 | ! is included it acts just like "$R" had been typed |
| 1906 | (ie. begin replace mode at the end-of-line). Other- |
| 1907 | wise replacement begins at the cursor position. |
| 1908 | Note that when using this command in a function or |
| 1909 | script that the replacement will only start after |
| 1910 | the function or script is finished. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1911 | |
Bram Moolenaar | 61da498 | 2005-12-14 22:02:18 +0000 | [diff] [blame] | 1912 | *:startgreplace* |
| 1913 | :startg[replace][!] Just like |:startreplace|, but use Virtual Replace |
| 1914 | mode, like with |gR|. |
Bram Moolenaar | 61da498 | 2005-12-14 22:02:18 +0000 | [diff] [blame] | 1915 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1916 | ============================================================================== |
| 1917 | 10. Inserting a file *inserting-file* |
| 1918 | |
| 1919 | *:r* *:re* *:read* |
Bram Moolenaar | 910f66f | 2006-04-05 20:41:53 +0000 | [diff] [blame] | 1920 | :r[ead] [++opt] [name] |
| 1921 | Insert the file [name] (default: current file) below |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1922 | the cursor. |
Bram Moolenaar | 910f66f | 2006-04-05 20:41:53 +0000 | [diff] [blame] | 1923 | See |++opt| for the possible values of [++opt]. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1924 | |
Bram Moolenaar | 910f66f | 2006-04-05 20:41:53 +0000 | [diff] [blame] | 1925 | :{range}r[ead] [++opt] [name] |
| 1926 | Insert the file [name] (default: current file) below |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1927 | the specified line. |
Bram Moolenaar | 910f66f | 2006-04-05 20:41:53 +0000 | [diff] [blame] | 1928 | See |++opt| for the possible values of [++opt]. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1929 | |
| 1930 | *:r!* *:read!* |
Bram Moolenaar | 0187ca0 | 2013-04-12 15:09:51 +0200 | [diff] [blame] | 1931 | :[range]r[ead] [++opt] !{cmd} |
| 1932 | Execute {cmd} and insert its standard output below |
Bram Moolenaar | 9964e46 | 2007-05-05 17:54:07 +0000 | [diff] [blame] | 1933 | the cursor or the specified line. A temporary file is |
| 1934 | used to store the output of the command which is then |
| 1935 | read into the buffer. 'shellredir' is used to save |
| 1936 | the output of the command, which can be set to include |
| 1937 | stderr or not. {cmd} is executed like with ":!{cmd}", |
| 1938 | any '!' is replaced with the previous command |:!|. |
Bram Moolenaar | 0187ca0 | 2013-04-12 15:09:51 +0200 | [diff] [blame] | 1939 | See |++opt| for the possible values of [++opt]. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1940 | |
| 1941 | These commands insert the contents of a file, or the output of a command, |
| 1942 | into the buffer. They can be undone. They cannot be repeated with the "." |
| 1943 | command. They work on a line basis, insertion starts below the line in which |
| 1944 | the cursor is, or below the specified line. To insert text above the first |
| 1945 | line use the command ":0r {name}". |
| 1946 | |
| 1947 | After the ":read" command, the cursor is left on the first non-blank in the |
| 1948 | first new line. Unless in Ex mode, then the cursor is left on the last new |
| 1949 | line (sorry, this is Vi compatible). |
| 1950 | |
| 1951 | If a file name is given with ":r", it becomes the alternate file. This can be |
| 1952 | used, for example, when you want to edit that file instead: ":e! #". This can |
| 1953 | be switched off by removing the 'a' flag from the 'cpoptions' option. |
| 1954 | |
Bram Moolenaar | 910f66f | 2006-04-05 20:41:53 +0000 | [diff] [blame] | 1955 | Of the [++opt] arguments one is specifically for ":read", the ++edit argument. |
| 1956 | This is useful when the ":read" command is actually used to read a file into |
| 1957 | the buffer as if editing that file. Use this command in an empty buffer: > |
| 1958 | :read ++edit filename |
| 1959 | The effect is that the 'fileformat', 'fileencoding', 'bomb', etc. options are |
| 1960 | set to what has been detected for "filename". Note that a single empty line |
| 1961 | remains, you may want to delete it. |
| 1962 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1963 | *file-read* |
| 1964 | The 'fileformat' option sets the <EOL> style for a file: |
| 1965 | 'fileformat' characters name ~ |
| 1966 | "dos" <CR><NL> or <NL> DOS format |
| 1967 | "unix" <NL> Unix format |
| 1968 | "mac" <CR> Mac format |
| 1969 | Previously 'textmode' was used. It is obsolete now. |
| 1970 | |
| 1971 | If 'fileformat' is "dos", a <CR> in front of an <NL> is ignored and a CTRL-Z |
| 1972 | at the end of the file is ignored. |
| 1973 | |
| 1974 | If 'fileformat' is "mac", a <NL> in the file is internally represented by a |
| 1975 | <CR>. This is to avoid confusion with a <NL> which is used to represent a |
| 1976 | <NUL>. See |CR-used-for-NL|. |
| 1977 | |
| 1978 | If the 'fileformats' option is not empty Vim tries to recognize the type of |
| 1979 | <EOL> (see |file-formats|). However, the 'fileformat' option will not be |
| 1980 | changed, the detected format is only used while reading the file. |
| 1981 | A similar thing happens with 'fileencodings'. |
| 1982 | |
| 1983 | On non-MS-DOS, Win32, and OS/2 systems the message "[dos format]" is shown if |
| 1984 | a file is read in DOS format, to remind you that something unusual is done. |
| 1985 | On Macintosh, MS-DOS, Win32, and OS/2 the message "[unix format]" is shown if |
| 1986 | a file is read in Unix format. |
| 1987 | On non-Macintosh systems, the message "[Mac format]" is shown if a file is |
| 1988 | read in Mac format. |
| 1989 | |
| 1990 | An example on how to use ":r !": > |
| 1991 | :r !uuencode binfile binfile |
| 1992 | This command reads "binfile", uuencodes it and reads it into the current |
| 1993 | buffer. Useful when you are editing e-mail and want to include a binary |
| 1994 | file. |
| 1995 | |
| 1996 | *read-messages* |
| 1997 | When reading a file Vim will display a message with information about the read |
| 1998 | file. In the table is an explanation for some of the items. The others are |
| 1999 | self explanatory. Using the long or the short version depends on the |
| 2000 | 'shortmess' option. |
| 2001 | |
| 2002 | long short meaning ~ |
| 2003 | [readonly] {RO} the file is write protected |
| 2004 | [fifo/socket] using a stream |
| 2005 | [fifo] using a fifo stream |
| 2006 | [socket] using a socket stream |
| 2007 | [CR missing] reading with "dos" 'fileformat' and a |
| 2008 | NL without a preceding CR was found. |
| 2009 | [NL found] reading with "mac" 'fileformat' and a |
| 2010 | NL was found (could be "unix" format) |
| 2011 | [long lines split] at least one line was split in two |
| 2012 | [NOT converted] conversion from 'fileencoding' to |
| 2013 | 'encoding' was desired but not |
| 2014 | possible |
| 2015 | [converted] conversion from 'fileencoding' to |
| 2016 | 'encoding' done |
| 2017 | [crypted] file was decrypted |
| 2018 | [READ ERRORS] not all of the file could be read |
| 2019 | |
| 2020 | |
Bram Moolenaar | 91f84f6 | 2018-07-29 15:07:52 +0200 | [diff] [blame] | 2021 | vim:tw=78:ts=8:noet:ft=help:norl: |