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