Andrea Pappacoda | 34e271b | 2024-12-31 10:46:22 +0100 | [diff] [blame] | 1 | *term.txt* For Vim version 9.1. Last change: 2024 Dec 31 |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 2 | |
| 3 | |
| 4 | VIM REFERENCE MANUAL by Bram Moolenaar |
| 5 | |
| 6 | |
| 7 | Terminal information *terminal-info* |
| 8 | |
| 9 | Vim uses information about the terminal you are using to fill the screen and |
| 10 | recognize what keys you hit. If this information is not correct, the screen |
| 11 | may be messed up or keys may not be recognized. The actions which have to be |
| 12 | performed on the screen are accomplished by outputting a string of |
| 13 | characters. Special keys produce a string of characters. These strings are |
| 14 | stored in the terminal options, see |terminal-options|. |
| 15 | |
| 16 | NOTE: Most of this is not used when running the |GUI|. |
| 17 | |
| 18 | 1. Startup |startup-terminal| |
| 19 | 2. Terminal options |terminal-options| |
| 20 | 3. Window size |window-size| |
| 21 | 4. Slow and fast terminals |slow-fast-terminal| |
| 22 | 5. Using the mouse |mouse-using| |
| 23 | |
| 24 | ============================================================================== |
| 25 | 1. Startup *startup-terminal* |
| 26 | |
| 27 | When Vim is started a default terminal type is assumed. For the Amiga this is |
Bram Moolenaar | 5666fcd | 2019-12-26 14:35:26 +0100 | [diff] [blame] | 28 | a standard CLI window, for MS-Windows the pc terminal, for Unix an ansi |
| 29 | terminal. A few other terminal types are always available, see below |
| 30 | |builtin-terms|. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 31 | |
| 32 | You can give the terminal name with the '-T' Vim argument. If it is not given |
| 33 | Vim will try to get the name from the TERM environment variable. |
| 34 | |
| 35 | *termcap* *terminfo* *E557* *E558* *E559* |
| 36 | On Unix the terminfo database or termcap file is used. This is referred to as |
| 37 | "termcap" in all the documentation. At compile time, when running configure, |
| 38 | the choice whether to use terminfo or termcap is done automatically. When |
| 39 | running Vim the output of ":version" will show |+terminfo| if terminfo is |
| 40 | used. Also see |xterm-screens|. |
| 41 | |
| 42 | On non-Unix systems a termcap is only available if Vim was compiled with |
| 43 | TERMCAP defined. |
| 44 | |
| 45 | *builtin-terms* *builtin_terms* |
Bram Moolenaar | 2ee347f | 2022-08-26 17:53:44 +0100 | [diff] [blame] | 46 | A number of builtin terminals are available. Since patch 9.0.0280 there is no |
| 47 | difference between Vim versions. You can see a list of available builtin |
| 48 | terminals in the error message you get for `:set term=xxx` (when not running |
Bram Moolenaar | 7dd5432 | 2022-08-26 18:01:12 +0100 | [diff] [blame] | 49 | the GUI). Also see |++builtin_terms|. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 50 | |
| 51 | If the termcap code is included Vim will try to get the strings for the |
| 52 | terminal you are using from the termcap file and the builtin termcaps. Both |
| 53 | are always used, if an entry for the terminal you are using is present. Which |
| 54 | one is used first depends on the 'ttybuiltin' option: |
| 55 | |
| 56 | 'ttybuiltin' on 1: builtin termcap 2: external termcap |
| 57 | 'ttybuiltin' off 1: external termcap 2: builtin termcap |
| 58 | |
| 59 | If an option is missing in one of them, it will be obtained from the other |
| 60 | one. If an option is present in both, the one first encountered is used. |
| 61 | |
| 62 | Which external termcap file is used varies from system to system and may |
| 63 | depend on the environment variables "TERMCAP" and "TERMPATH". See "man |
| 64 | tgetent". |
| 65 | |
| 66 | Settings depending on terminal *term-dependent-settings* |
| 67 | |
| 68 | If you want to set options or mappings, depending on the terminal name, you |
| 69 | can do this best in your .vimrc. Example: > |
| 70 | |
| 71 | if &term == "xterm" |
| 72 | ... xterm maps and settings ... |
| 73 | elseif &term =~ "vt10." |
| 74 | ... vt100, vt102 maps and settings ... |
| 75 | endif |
| 76 | < |
| 77 | *raw-terminal-mode* |
| 78 | For normal editing the terminal will be put into "raw" mode. The strings |
Bram Moolenaar | 171a921 | 2019-10-12 21:08:59 +0200 | [diff] [blame] | 79 | defined with 't_ti', 't_TI' and 't_ks' will be sent to the terminal. Normally |
| 80 | this puts the terminal in a state where the termcap codes are valid and |
| 81 | activates the cursor and function keys. |
| 82 | When Vim exits the terminal will be put back into the mode it was before Vim |
| 83 | started. The strings defined with 't_te', 't_TE' and 't_ke' will be sent to |
| 84 | the terminal. On the Amiga, with commands that execute an external command |
| 85 | (e.g., "!!"), the terminal will be put into Normal mode for a moment. This |
| 86 | means that you can stop the output to the screen by hitting a printing key. |
| 87 | Output resumes when you hit <BS>. |
| 88 | |
| 89 | Note: When 't_ti' is not empty, Vim assumes that it causes switching to the |
| 90 | alternate screen. This may slightly change what happens when executing a |
Bram Moolenaar | f1dcd14 | 2022-12-31 15:30:45 +0000 | [diff] [blame] | 91 | shell command or exiting Vim. To avoid this use 't_TI' and 't_TE' (but make |
| 92 | sure to add to them, not overwrite). |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 93 | |
Bram Moolenaar | 733a69b | 2022-12-01 12:03:47 +0000 | [diff] [blame] | 94 | Vim will try to detect what keyboard protocol the terminal is using with the |
| 95 | 't_RK' termcap entry. This is sent after 't_TI', but only when there is no |
| 96 | work to do (no typeahead and no pending commands). That is to avoid the |
| 97 | response to end up in a shell command or arrive after Vim exits. |
| 98 | |
Bram Moolenaar | ec2da36 | 2017-01-21 20:04:22 +0100 | [diff] [blame] | 99 | *xterm-bracketed-paste* |
| 100 | When the 't_BE' option is set then 't_BE' will be sent to the |
| 101 | terminal when entering "raw" mode and 't_BD' when leaving "raw" mode. The |
| 102 | terminal is then expected to put 't_PS' before pasted text and 't_PE' after |
| 103 | pasted text. This way Vim can separate text that is pasted from characters |
| 104 | that are typed. The pasted text is handled like when the middle mouse button |
Bram Moolenaar | fd8983b | 2017-02-02 22:21:29 +0100 | [diff] [blame] | 105 | is used, it is inserted literally and not interpreted as commands. |
| 106 | |
Christian Brabandt | 5f5131d | 2023-10-25 21:44:26 +0200 | [diff] [blame] | 107 | Please note: while bracketed paste is trying to prevent nasty side-effects |
| 108 | from pasting (like the CTRL-C or <ESC> key), it's not a guaranteed security |
| 109 | measure because different terminals may implement this mode slightly |
| 110 | differently. You should still be careful with what you paste into Vim. |
| 111 | |
Bram Moolenaar | fd8983b | 2017-02-02 22:21:29 +0100 | [diff] [blame] | 112 | When the cursor is in the first column, the pasted text will be inserted |
| 113 | before it. Otherwise the pasted text is appended after the cursor position. |
| 114 | This means one cannot paste after the first column. Unfortunately Vim does |
| 115 | not have a way to tell where the mouse pointer was. |
Bram Moolenaar | ec2da36 | 2017-01-21 20:04:22 +0100 | [diff] [blame] | 116 | |
| 117 | Note that in some situations Vim will not recognize the bracketed paste and |
| 118 | you will get the raw text. In other situations Vim will only get the first |
Bram Moolenaar | 690afe1 | 2017-01-28 18:34:47 +0100 | [diff] [blame] | 119 | pasted character and drop the rest, e.g. when using the "r" command. If you |
| 120 | have a problem with this, disable bracketed paste by putting this in your |
| 121 | .vimrc: > |
| 122 | set t_BE= |
| 123 | If this is done while Vim is running the 't_BD' will be sent to the terminal |
| 124 | to disable bracketed paste. |
Bram Moolenaar | ec2da36 | 2017-01-21 20:04:22 +0100 | [diff] [blame] | 125 | |
Bram Moolenaar | fc966c1 | 2023-01-01 18:04:33 +0000 | [diff] [blame] | 126 | If |t_PS| or |t_PE| is not set, then |t_BE| will not be used. This is to make |
| 127 | sure that bracketed paste is not enabled when the escape codes surrounding |
| 128 | pasted text cannot be recognized. |
| 129 | |
Christian Brabandt | 5f5131d | 2023-10-25 21:44:26 +0200 | [diff] [blame] | 130 | Note: bracketed paste mode will be disabled, when the 'esckeys' option is not |
| 131 | set (also when the 'compatible' option is set). |
| 132 | |
Bram Moolenaar | d2f3a8b | 2018-06-19 14:35:59 +0200 | [diff] [blame] | 133 | If your terminal supports bracketed paste, but the options are not set |
| 134 | automatically, you can try using something like this: > |
| 135 | |
| 136 | if &term =~ "screen" |
| 137 | let &t_BE = "\e[?2004h" |
| 138 | let &t_BD = "\e[?2004l" |
| 139 | exec "set t_PS=\e[200~" |
| 140 | exec "set t_PE=\e[201~" |
| 141 | endif |
Bram Moolenaar | f1dcd14 | 2022-12-31 15:30:45 +0000 | [diff] [blame] | 142 | |
| 143 | The terminfo entries "BE", "BD", "PS" and "PE" were added in ncurses version |
| 144 | 6.4, early 2023, for some terminals. If you have this version then you may |
| 145 | not have to manually configure your terminal. |
| 146 | |
Bram Moolenaar | 89a9c15 | 2021-08-29 21:55:35 +0200 | [diff] [blame] | 147 | *tmux-integration* |
| 148 | If you experience issues when running Vim inside tmux, here are a few hints. |
| 149 | You can comment-out parts if something doesn't work (it may depend on the |
| 150 | terminal that tmux is running in): > |
| 151 | |
| 152 | if !has('gui_running') && &term =~ '^\%(screen\|tmux\)' |
| 153 | " Better mouse support, see :help 'ttymouse' |
| 154 | set ttymouse=sgr |
| 155 | |
| 156 | " Enable true colors, see :help xterm-true-color |
| 157 | let &termguicolors = v:true |
| 158 | let &t_8f = "\<Esc>[38;2;%lu;%lu;%lum" |
| 159 | let &t_8b = "\<Esc>[48;2;%lu;%lu;%lum" |
| 160 | |
| 161 | " Enable bracketed paste mode, see :help xterm-bracketed-paste |
| 162 | let &t_BE = "\<Esc>[?2004h" |
| 163 | let &t_BD = "\<Esc>[?2004l" |
| 164 | let &t_PS = "\<Esc>[200~" |
| 165 | let &t_PE = "\<Esc>[201~" |
| 166 | |
| 167 | " Enable focus event tracking, see :help xterm-focus-event |
| 168 | let &t_fe = "\<Esc>[?1004h" |
| 169 | let &t_fd = "\<Esc>[?1004l" |
Bram Moolenaar | 0e6adf8 | 2021-12-16 14:41:10 +0000 | [diff] [blame] | 170 | execute "set <FocusGained>=\<Esc>[I" |
| 171 | execute "set <FocusLost>=\<Esc>[O" |
Bram Moolenaar | 89a9c15 | 2021-08-29 21:55:35 +0200 | [diff] [blame] | 172 | |
Bram Moolenaar | 4700398 | 2021-12-05 21:54:04 +0000 | [diff] [blame] | 173 | " Enable modified arrow keys, see :help arrow_modifiers |
Bram Moolenaar | 89a9c15 | 2021-08-29 21:55:35 +0200 | [diff] [blame] | 174 | execute "silent! set <xUp>=\<Esc>[@;*A" |
| 175 | execute "silent! set <xDown>=\<Esc>[@;*B" |
| 176 | execute "silent! set <xRight>=\<Esc>[@;*C" |
| 177 | execute "silent! set <xLeft>=\<Esc>[@;*D" |
| 178 | endif |
| 179 | < |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 180 | *cs7-problem* |
| 181 | Note: If the terminal settings are changed after running Vim, you might have |
| 182 | an illegal combination of settings. This has been reported on Solaris 2.5 |
| 183 | with "stty cs8 parenb", which is restored as "stty cs7 parenb". Use |
| 184 | "stty cs8 -parenb -istrip" instead, this is restored correctly. |
| 185 | |
| 186 | Some termcap entries are wrong in the sense that after sending 't_ks' the |
| 187 | cursor keys send codes different from the codes defined in the termcap. To |
| 188 | avoid this you can set 't_ks' (and 't_ke') to empty strings. This must be |
| 189 | done during initialization (see |initialization|), otherwise it's too late. |
| 190 | |
| 191 | Some termcap entries assume that the highest bit is always reset. For |
| 192 | example: The cursor-up entry for the Amiga could be ":ku=\E[A:". But the |
| 193 | Amiga really sends "\233A". This works fine if the highest bit is reset, |
| 194 | e.g., when using an Amiga over a serial line. If the cursor keys don't work, |
| 195 | try the entry ":ku=\233A:". |
| 196 | |
| 197 | Some termcap entries have the entry ":ku=\E[A:". But the Amiga really sends |
| 198 | "\233A". On output "\E[" and "\233" are often equivalent, on input they |
| 199 | aren't. You will have to change the termcap entry, or change the key code with |
| 200 | the :set command to fix this. |
| 201 | |
| 202 | Many cursor key codes start with an <Esc>. Vim must find out if this is a |
| 203 | single hit of the <Esc> key or the start of a cursor key sequence. It waits |
| 204 | for a next character to arrive. If it does not arrive within one second a |
| 205 | single <Esc> is assumed. On very slow systems this may fail, causing cursor |
| 206 | keys not to work sometimes. If you discover this problem reset the 'timeout' |
| 207 | option. Vim will wait for the next character to arrive after an <Esc>. If |
| 208 | you want to enter a single <Esc> you must type it twice. Resetting the |
| 209 | 'esckeys' option avoids this problem in Insert mode, but you lose the |
| 210 | possibility to use cursor and function keys in Insert mode. |
| 211 | |
| 212 | On the Amiga the recognition of window resizing is activated only when the |
| 213 | terminal name is "amiga" or "builtin_amiga". |
| 214 | |
| 215 | Some terminals have confusing codes for the cursor keys. The televideo 925 is |
| 216 | such a terminal. It sends a CTRL-H for cursor-left. This would make it |
| 217 | impossible to distinguish a backspace and cursor-left. To avoid this problem |
| 218 | CTRL-H is never recognized as cursor-left. |
| 219 | |
| 220 | *vt100-cursor-keys* *xterm-cursor-keys* |
| 221 | Other terminals (e.g., vt100 and xterm) have cursor keys that send <Esc>OA, |
| 222 | <Esc>OB, etc. Unfortunately these are valid commands in insert mode: Stop |
| 223 | insert, Open a new line above the new one, start inserting 'A', 'B', etc. |
| 224 | Instead of performing these commands Vim will erroneously recognize this typed |
| 225 | key sequence as a cursor key movement. To avoid this and make Vim do what you |
| 226 | want in either case you could use these settings: > |
| 227 | :set notimeout " don't timeout on mappings |
| 228 | :set ttimeout " do timeout on terminal key codes |
| 229 | :set timeoutlen=100 " timeout after 100 msec |
Bram Moolenaar | 446cb83 | 2008-06-24 21:56:24 +0000 | [diff] [blame] | 230 | This requires the key-codes to be sent within 100 msec in order to recognize |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 231 | them as a cursor key. When you type you normally are not that fast, so they |
| 232 | are recognized as individual typed commands, even though Vim receives the same |
| 233 | sequence of bytes. |
| 234 | |
| 235 | *vt100-function-keys* *xterm-function-keys* |
| 236 | An xterm can send function keys F1 to F4 in two modes: vt100 compatible or |
Bram Moolenaar | 19a09a1 | 2005-03-04 23:39:37 +0000 | [diff] [blame] | 237 | not. Because Vim may not know what the xterm is sending, both types of keys |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 238 | are recognized. The same happens for the <Home> and <End> keys. |
| 239 | normal vt100 ~ |
| 240 | <F1> t_k1 <Esc>[11~ <xF1> <Esc>OP *<xF1>-xterm* |
| 241 | <F2> t_k2 <Esc>[12~ <xF2> <Esc>OQ *<xF2>-xterm* |
| 242 | <F3> t_k3 <Esc>[13~ <xF3> <Esc>OR *<xF3>-xterm* |
| 243 | <F4> t_k4 <Esc>[14~ <xF4> <Esc>OS *<xF4>-xterm* |
| 244 | <Home> t_kh <Esc>[7~ <xHome> <Esc>OH *<xHome>-xterm* |
| 245 | <End> t_@7 <Esc>[4~ <xEnd> <Esc>OF *<xEnd>-xterm* |
| 246 | |
| 247 | When Vim starts, <xF1> is mapped to <F1>, <xF2> to <F2> etc. This means that |
| 248 | by default both codes do the same thing. If you make a mapping for <xF2>, |
| 249 | because your terminal does have two keys, the default mapping is overwritten, |
| 250 | thus you can use the <F2> and <xF2> keys for something different. |
| 251 | |
| 252 | *xterm-shifted-keys* |
| 253 | Newer versions of xterm support shifted function keys and special keys. Vim |
| 254 | recognizes most of them. Use ":set termcap" to check which are supported and |
| 255 | what the codes are. Mostly these are not in a termcap, they are only |
| 256 | supported by the builtin_xterm termcap. |
| 257 | |
Bram Moolenaar | 19a09a1 | 2005-03-04 23:39:37 +0000 | [diff] [blame] | 258 | *xterm-modifier-keys* |
| 259 | Newer versions of xterm support Alt and Ctrl for most function keys. To avoid |
| 260 | having to add all combinations of Alt, Ctrl and Shift for every key a special |
| 261 | sequence is recognized at the end of a termcap entry: ";*X". The "X" can be |
| 262 | any character, often '~' is used. The ";*" stands for an optional modifier |
| 263 | argument. ";2" is Shift, ";3" is Alt, ";5" is Ctrl and ";9" is Meta (when |
| 264 | it's different from Alt). They can be combined. Examples: > |
| 265 | :set <F8>=^[[19;*~ |
| 266 | :set <Home>=^[[1;*H |
| 267 | Another speciality about these codes is that they are not overwritten by |
| 268 | another code. That is to avoid that the codes obtained from xterm directly |
| 269 | |t_RV| overwrite them. |
Bram Moolenaar | 4d8c96d | 2020-12-29 20:53:33 +0100 | [diff] [blame] | 270 | |
| 271 | Another special value is a termcap entry ending in "@;*X". This is for cursor |
| 272 | keys, which either use "CSI X" or "CSI 1 ; modifier X". Thus the "@" |
| 273 | stands for either "1" if a modifier follows, or nothing. |
Bram Moolenaar | 4700398 | 2021-12-05 21:54:04 +0000 | [diff] [blame] | 274 | *arrow_modifiers* |
| 275 | Several terminal emulators (alacritty, gnome, konsole, etc.) send special |
| 276 | codes for keys with modifiers, but these do not have an entry in the |
| 277 | termcap/terminfo database. You can make them work by adding a few lines in |
| 278 | your vimrc. For example, to make the Control modifier work with arrow keys |
| 279 | for the gnome terminal: > |
| 280 | if &term =~ 'gnome' |
| 281 | execute "set <xUp>=\<Esc>[@;*A" |
| 282 | execute "set <xDown>=\<Esc>[@;*B" |
| 283 | execute "set <xRight>=\<Esc>[@;*C" |
| 284 | execute "set <xLeft>=\<Esc>[@;*D" |
| 285 | endif |
| 286 | < *xterm-scroll-region* |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 287 | The default termcap entry for xterm on Sun and other platforms does not |
| 288 | contain the entry for scroll regions. Add ":cs=\E[%i%d;%dr:" to the xterm |
| 289 | entry in /etc/termcap and everything should work. |
| 290 | |
| 291 | *xterm-end-home-keys* |
| 292 | On some systems (at least on FreeBSD with XFree86 3.1.2) the codes that the |
| 293 | <End> and <Home> keys send contain a <Nul> character. To make these keys send |
| 294 | the proper key code, add these lines to your ~/.Xdefaults file: |
Milly | 89872f5 | 2024-10-05 17:16:18 +0200 | [diff] [blame] | 295 | > |
| 296 | *VT100.Translations: #override \n\ |
| 297 | <Key>Home: string("0x1b") string("[7~") \n\ |
| 298 | <Key>End: string("0x1b") string("[8~") |
| 299 | < |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 300 | *xterm-8bit* *xterm-8-bit* |
| 301 | Xterm can be run in a mode where it uses 8-bit escape sequences. The CSI code |
| 302 | is used instead of <Esc>[. The advantage is that an <Esc> can quickly be |
| 303 | recognized in Insert mode, because it can't be confused with the start of a |
| 304 | special key. |
| 305 | For the builtin termcap entries, Vim checks if the 'term' option contains |
| 306 | "8bit" anywhere. It then uses 8-bit characters for the termcap entries, the |
| 307 | mouse and a few other things. You would normally set $TERM in your shell to |
| 308 | "xterm-8bit" and Vim picks this up and adjusts to the 8-bit setting |
| 309 | automatically. |
| 310 | When Vim receives a response to the |t_RV| (request version) sequence and it |
| 311 | starts with CSI, it assumes that the terminal is in 8-bit mode and will |
| 312 | convert all key sequences to their 8-bit variants. |
| 313 | |
Bram Moolenaar | f1dcd14 | 2022-12-31 15:30:45 +0000 | [diff] [blame] | 314 | *xterm-terminfo-entries* |
| 315 | For some time the terminfo entries were insufficient to describe all the |
zeertzjq | 61e984e | 2023-12-09 15:18:33 +0800 | [diff] [blame] | 316 | features that Vim can use. The builtin xterm termcap entries did have these, |
Bram Moolenaar | f1dcd14 | 2022-12-31 15:30:45 +0000 | [diff] [blame] | 317 | with the result that several terminals that were similar enough to xterm took |
| 318 | advantage of these by prefixing "xterm-" to the terminal name in $TERM. |
| 319 | |
| 320 | This leads to problems, because quite often these terminals are not 100% |
| 321 | compatible with xterm. At the start of 2023 several entries have been added |
| 322 | to the terminfo database to make it possible to use these features without |
| 323 | using the "xterm" workaround. These are the relevant entries (so far): |
| 324 | |
| 325 | name xterm value description ~ |
| 326 | RV "\033[>c" Request version |t_RV| |
| 327 | |
| 328 | BE "\033[?2004h" enable bracketed paste mode |t_BE| |
| 329 | BD "\033[?2004l" disable bracketed paste mode |t_BD| |
| 330 | PS "\033[200~" pasted text start |t_PS| |
| 331 | PE "\033[201~" pasted text end |t_PE| |
| 332 | |
Bram Moolenaar | be4e016 | 2023-02-02 13:59:48 +0000 | [diff] [blame] | 333 | XM "\033[?1006;1004;1000%?%p1%{1}%=%th%el%;" |
Bram Moolenaar | 1b5f03e | 2023-01-09 20:12:45 +0000 | [diff] [blame] | 334 | mouse enable / disable |t_XM| |
Christian Brabandt | 08b1c61 | 2023-11-04 10:03:52 +0100 | [diff] [blame] | 335 | FE "\033[?1004h" enable focus event tracking |t_fe| |
| 336 | FD "\033[?1004l" disable focus event tracking |t_fd| |
Bram Moolenaar | 1b5f03e | 2023-01-09 20:12:45 +0000 | [diff] [blame] | 337 | |
Bram Moolenaar | be4e016 | 2023-02-02 13:59:48 +0000 | [diff] [blame] | 338 | The "XM" entry includes "1006" to enable SGR style mouse reporting. This |
| 339 | supports columns above 223. It also includes "1004" which enables focus |
Christian Brabandt | 08b1c61 | 2023-11-04 10:03:52 +0100 | [diff] [blame] | 340 | reporting. |
| 341 | Note: As of 2023, the "1004" is currently not used by Vim itself, instead |
| 342 | it is recommended to set focus reporting independently of mouse tracking by |
| 343 | the |t_fe| and |t_fd| entries, as ncurses also starts to use with the latest |
| 344 | versions (and will then also end up in terminfo/termcap). |
Bram Moolenaar | be4e016 | 2023-02-02 13:59:48 +0000 | [diff] [blame] | 345 | |
Bram Moolenaar | 731d007 | 2022-12-18 17:47:18 +0000 | [diff] [blame] | 346 | *xterm-kitty* *kitty-terminal* |
Bram Moolenaar | f1dcd14 | 2022-12-31 15:30:45 +0000 | [diff] [blame] | 347 | The Kitty terminal is a special case. Mainly because it works differently |
elig0n | b1289f1 | 2024-02-28 21:45:48 +0100 | [diff] [blame] | 348 | from most other terminals, but also because, instead of trying to fit in and |
Bram Moolenaar | f1dcd14 | 2022-12-31 15:30:45 +0000 | [diff] [blame] | 349 | make it behave like other terminals by default, it dictates how applications |
| 350 | need to work when using Kitty. This makes it very difficult for Vim to work |
| 351 | in a Kitty terminal. Some exceptions have been hard coded, but it is not at |
| 352 | all nice to have to make exceptions for one specific terminal. |
Bram Moolenaar | 731d007 | 2022-12-18 17:47:18 +0000 | [diff] [blame] | 353 | |
| 354 | One of the problems is that the value for $TERM is set to "xterm-kitty". For |
| 355 | Vim this is an indication that the terminal is xterm-compatible and the |
| 356 | builtin xterm termcap entries should be used. Many other terminals depend on |
| 357 | this. However, Kitty is not fully xterm compatible. The author suggested to |
Bram Moolenaar | afa3f1c | 2022-12-19 18:56:48 +0000 | [diff] [blame] | 358 | ignore the "xterm-" prefix and use the terminfo entry anyway, so that is what |
| 359 | happens now, the builtin xterm termcap entries are not used. However, the |
| 360 | t_RV is set, otherwise other things would not work, such as automatically |
Bram Moolenaar | 1b5f03e | 2023-01-09 20:12:45 +0000 | [diff] [blame] | 361 | setting 'ttymouse' to "sgr" (at least until |t_XM| is being used for this). |
Bram Moolenaar | afa3f1c | 2022-12-19 18:56:48 +0000 | [diff] [blame] | 362 | |
| 363 | It is not clear why kitty sets $TERM to "xterm-kitty", the terminal isn't |
| 364 | really xterm compatible. "kitty" would be more appropriate, but a terminfo |
| 365 | entry with that name is not widespread. |
Bram Moolenaar | 731d007 | 2022-12-18 17:47:18 +0000 | [diff] [blame] | 366 | |
| 367 | Note that using the kitty keyboard protocol is a separate feature, see |
| 368 | |kitty-keyboard-protocol|. |
| 369 | |
| 370 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 371 | ============================================================================== |
Bram Moolenaar | 1d2ba7f | 2006-02-14 22:29:30 +0000 | [diff] [blame] | 372 | 2. Terminal options *terminal-options* *termcap-options* *E436* |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 373 | |
| 374 | The terminal options can be set just like normal options. But they are not |
| 375 | shown with the ":set all" command. Instead use ":set termcap". |
| 376 | |
| 377 | It is always possible to change individual strings by setting the |
| 378 | appropriate option. For example: > |
| 379 | :set t_ce=^V^[[K (CTRL-V, <Esc>, [, K) |
| 380 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 381 | The options are listed below. The associated termcap code is always equal to |
| 382 | the last two characters of the option name. Only one termcap code is |
| 383 | required: Cursor motion, 't_cm'. |
| 384 | |
h-east | 53753f6 | 2024-05-05 18:42:31 +0200 | [diff] [blame] | 385 | The options 't_da', 't_db', 't_ms', 't_xs', 't_xn', 't_xo' represent flags in |
| 386 | the termcap. When the termcap flag is present, the option will be set to "y". |
Bram Moolenaar | 494838a | 2015-02-10 19:20:37 +0100 | [diff] [blame] | 387 | But any non-empty string means that the flag is set. An empty string means |
| 388 | that the flag is not set. 't_CS' works like this too, but it isn't a termcap |
| 389 | flag. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 390 | |
Bram Moolenaar | 214641f | 2017-03-05 17:04:09 +0100 | [diff] [blame] | 391 | OUTPUT CODES *terminal-output-codes* |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 392 | option meaning ~ |
| 393 | |
| 394 | t_AB set background color (ANSI) *t_AB* *'t_AB'* |
| 395 | t_AF set foreground color (ANSI) *t_AF* *'t_AF'* |
| 396 | t_AL add number of blank lines *t_AL* *'t_AL'* |
| 397 | t_al add new blank line *t_al* *'t_al'* |
| 398 | t_bc backspace character *t_bc* *'t_bc'* |
| 399 | t_cd clear to end of screen *t_cd* *'t_cd'* |
| 400 | t_ce clear to end of line *t_ce* *'t_ce'* |
| 401 | t_cl clear screen *t_cl* *'t_cl'* |
| 402 | t_cm cursor motion (required!) *E437* *t_cm* *'t_cm'* |
| 403 | t_Co number of colors *t_Co* *'t_Co'* |
| 404 | t_CS if non-empty, cursor relative to scroll region *t_CS* *'t_CS'* |
| 405 | t_cs define scrolling region *t_cs* *'t_cs'* |
| 406 | t_CV define vertical scrolling region *t_CV* *'t_CV'* |
| 407 | t_da if non-empty, lines from above scroll down *t_da* *'t_da'* |
| 408 | t_db if non-empty, lines from below scroll up *t_db* *'t_db'* |
| 409 | t_DL delete number of lines *t_DL* *'t_DL'* |
| 410 | t_dl delete line *t_dl* *'t_dl'* |
| 411 | t_fs set window title end (from status line) *t_fs* *'t_fs'* |
| 412 | t_ke exit "keypad transmit" mode *t_ke* *'t_ke'* |
| 413 | t_ks start "keypad transmit" mode *t_ks* *'t_ks'* |
| 414 | t_le move cursor one char left *t_le* *'t_le'* |
| 415 | t_mb blinking mode *t_mb* *'t_mb'* |
| 416 | t_md bold mode *t_md* *'t_md'* |
| 417 | t_me Normal mode (undoes t_mr, t_mb, t_md and color) *t_me* *'t_me'* |
| 418 | t_mr reverse (invert) mode *t_mr* *'t_mr'* |
| 419 | *t_ms* *'t_ms'* |
| 420 | t_ms if non-empty, cursor can be moved in standout/inverse mode |
| 421 | t_nd non destructive space character *t_nd* *'t_nd'* |
| 422 | t_op reset to original color pair *t_op* *'t_op'* |
| 423 | t_RI cursor number of chars right *t_RI* *'t_RI'* |
| 424 | t_Sb set background color *t_Sb* *'t_Sb'* |
| 425 | t_Sf set foreground color *t_Sf* *'t_Sf'* |
| 426 | t_se standout end *t_se* *'t_se'* |
| 427 | t_so standout mode *t_so* *'t_so'* |
| 428 | t_sr scroll reverse (backward) *t_sr* *'t_sr'* |
Bram Moolenaar | 171a921 | 2019-10-12 21:08:59 +0200 | [diff] [blame] | 429 | t_te end of "termcap" mode *t_te* *'t_te'* |
| 430 | t_ti put terminal into "termcap" mode *t_ti* *'t_ti'* |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 431 | t_ts set window title start (to status line) *t_ts* *'t_ts'* |
| 432 | t_ue underline end *t_ue* *'t_ue'* |
| 433 | t_us underline mode *t_us* *'t_us'* |
| 434 | t_ut clearing uses the current background color *t_ut* *'t_ut'* |
| 435 | t_vb visual bell *t_vb* *'t_vb'* |
| 436 | t_ve cursor visible *t_ve* *'t_ve'* |
| 437 | t_vi cursor invisible *t_vi* *'t_vi'* |
Bram Moolenaar | c572da5 | 2017-08-27 16:52:01 +0200 | [diff] [blame] | 438 | t_vs cursor very visible (blink) *t_vs* *'t_vs'* |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 439 | *t_xs* *'t_xs'* |
| 440 | t_xs if non-empty, standout not erased by overwriting (hpterm) |
Bram Moolenaar | 494838a | 2015-02-10 19:20:37 +0100 | [diff] [blame] | 441 | *t_xn* *'t_xn'* |
Bram Moolenaar | 2b8388b | 2015-02-28 13:11:45 +0100 | [diff] [blame] | 442 | t_xn if non-empty, writing a character at the last screen cell |
| 443 | does not cause scrolling |
Anton Sharonov | 49528da | 2024-04-14 20:02:24 +0200 | [diff] [blame] | 444 | *t_xo* *'t_xo'* |
| 445 | t_xo if non-empty, terminal uses xon/xoff handshaking, mapping |
| 446 | CTRL-S will not be possible then, since it is used for flow |
| 447 | control (used by vt420 terminal). Setting this flag has only |
| 448 | an effect when starting Vim. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 449 | t_ZH italics mode *t_ZH* *'t_ZH'* |
| 450 | t_ZR italics end *t_ZR* *'t_ZR'* |
| 451 | |
| 452 | Added by Vim (there are no standard codes for these): |
Bram Moolenaar | e023e88 | 2020-05-31 16:42:30 +0200 | [diff] [blame] | 453 | t_AU set underline color (ANSI) *t_AU* *'t_AU'* |
Bram Moolenaar | 84f5463 | 2022-06-29 18:39:11 +0100 | [diff] [blame] | 454 | t_Ce undercurl and underline end *t_Ce* *'t_Ce'* |
| 455 | t_Cs undercurl (curly underline) mode *t_Cs* *'t_Cs'* |
PMunch | a606f3a | 2023-11-15 15:35:49 +0100 | [diff] [blame] | 456 | t_CF set alternate font (using index 0 - 10) *t_CF* *'t_CF'* |
Bram Moolenaar | 84f5463 | 2022-06-29 18:39:11 +0100 | [diff] [blame] | 457 | t_Us double underline mode *t_Us* *'t_Us'* |
| 458 | t_ds dotted underline mode *t_ds* *'t_ds'* |
| 459 | t_Ds dashed underline mode *t_Ds* *'t_Ds'* |
Bram Moolenaar | 37c64c7 | 2017-09-19 22:06:03 +0200 | [diff] [blame] | 460 | t_Te strikethrough end *t_Te* *'t_Te'* |
| 461 | t_Ts strikethrough mode *t_Ts* *'t_Ts'* |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 462 | t_IS set icon text start *t_IS* *'t_IS'* |
| 463 | t_IE set icon text end *t_IE* *'t_IE'* |
| 464 | t_WP set window position (Y, X) in pixels *t_WP* *'t_WP'* |
Bram Moolenaar | 9423749 | 2017-04-23 18:40:21 +0200 | [diff] [blame] | 465 | t_GP get window position (Y, X) in pixels *t_GP* *'t_GP'* |
Bram Moolenaar | b6e0ec6 | 2017-07-23 22:12:20 +0200 | [diff] [blame] | 466 | t_WS set window size (height, width in cells) *t_WS* *'t_WS'* |
Bram Moolenaar | c572da5 | 2017-08-27 16:52:01 +0200 | [diff] [blame] | 467 | t_VS cursor normally visible (no blink) *t_VS* *'t_VS'* |
Bram Moolenaar | c9b4b05 | 2006-04-30 18:54:39 +0000 | [diff] [blame] | 468 | t_SI start insert mode (bar cursor shape) *t_SI* *'t_SI'* |
Bram Moolenaar | 1e7813a | 2015-03-31 18:31:03 +0200 | [diff] [blame] | 469 | t_SR start replace mode (underline cursor shape) *t_SR* *'t_SR'* |
| 470 | t_EI end insert or replace mode (block cursor shape) *t_EI* *'t_EI'* |
Bram Moolenaar | ac6e65f | 2005-08-29 22:25:38 +0000 | [diff] [blame] | 471 | |termcap-cursor-shape| |
Bram Moolenaar | ce001a3 | 2022-04-27 15:25:03 +0100 | [diff] [blame] | 472 | t_RV request terminal version string (works for *t_RV* *'t_RV'* |
| 473 | xterm and other terminal emulators) The |
| 474 | response is stored in |v:termresponse| |xterm-8bit| |
| 475 | |'ttymouse'| |xterm-codes| |
Bram Moolenaar | 1b5f03e | 2023-01-09 20:12:45 +0000 | [diff] [blame] | 476 | t_XM enable/disable mouse reporting, *t_XM* *'t_XM'* |
| 477 | see |mouse-reporting| below |
Bram Moolenaar | 733a69b | 2022-12-01 12:03:47 +0000 | [diff] [blame] | 478 | t_RK request terminal keyboard protocol state; *t_RK* *'t_RK'* |
| 479 | sent after |t_TI| |
Bram Moolenaar | ac7bd63 | 2013-03-19 11:35:58 +0100 | [diff] [blame] | 480 | t_u7 request cursor position (for xterm) *t_u7* *'t_u7'* |
| 481 | see |'ambiwidth'| |
Bram Moolenaar | 2a953fc | 2019-01-26 17:41:47 +0100 | [diff] [blame] | 482 | The response is stored in |v:termu7resp| |
Bram Moolenaar | 01164a6 | 2017-11-02 22:58:42 +0100 | [diff] [blame] | 483 | t_RF request terminal foreground color *t_RF* *'t_RF'* |
Bram Moolenaar | 2a953fc | 2019-01-26 17:41:47 +0100 | [diff] [blame] | 484 | The response is stored in |v:termrfgresp| |
Bram Moolenaar | 979243b | 2015-06-26 19:35:49 +0200 | [diff] [blame] | 485 | t_RB request terminal background color *t_RB* *'t_RB'* |
Bram Moolenaar | 2a953fc | 2019-01-26 17:41:47 +0100 | [diff] [blame] | 486 | The response is stored in |v:termrbgresp| |
Bram Moolenaar | 8a633e3 | 2016-04-21 21:10:14 +0200 | [diff] [blame] | 487 | t_8f set foreground color (R, G, B) *t_8f* *'t_8f'* |
| 488 | |xterm-true-color| |
| 489 | t_8b set background color (R, G, B) *t_8b* *'t_8b'* |
| 490 | |xterm-true-color| |
Bram Moolenaar | e023e88 | 2020-05-31 16:42:30 +0200 | [diff] [blame] | 491 | t_8u set underline color (R, G, B) *t_8u* *'t_8u'* |
Bram Moolenaar | ec2da36 | 2017-01-21 20:04:22 +0100 | [diff] [blame] | 492 | t_BE enable bracketed paste mode *t_BE* *'t_BE'* |
| 493 | |xterm-bracketed-paste| |
| 494 | t_BD disable bracketed paste mode *t_BD* *'t_BD'* |
| 495 | |xterm-bracketed-paste| |
Bram Moolenaar | c572da5 | 2017-08-27 16:52:01 +0200 | [diff] [blame] | 496 | t_SC set cursor color start *t_SC* *'t_SC'* |
| 497 | t_EC set cursor color end *t_EC* *'t_EC'* |
| 498 | t_SH set cursor shape *t_SH* *'t_SH'* |
Bram Moolenaar | 37c64c7 | 2017-09-19 22:06:03 +0200 | [diff] [blame] | 499 | t_RC request terminal cursor blinking *t_RC* *'t_RC'* |
Bram Moolenaar | 2a953fc | 2019-01-26 17:41:47 +0100 | [diff] [blame] | 500 | The response is stored in |v:termblinkresp| |
Bram Moolenaar | c572da5 | 2017-08-27 16:52:01 +0200 | [diff] [blame] | 501 | t_RS request terminal cursor style *t_RS* *'t_RS'* |
Bram Moolenaar | 2a953fc | 2019-01-26 17:41:47 +0100 | [diff] [blame] | 502 | The response is stored in |v:termstyleresp| |
Bram Moolenaar | 40385db | 2018-08-07 22:31:44 +0200 | [diff] [blame] | 503 | t_ST save window title to stack *t_ST* *'t_ST'* |
| 504 | t_RT restore window title from stack *t_RT* *'t_RT'* |
| 505 | t_Si save icon text to stack *t_Si* *'t_Si'* |
| 506 | t_Ri restore icon text from stack *t_Ri* *'t_Ri'* |
Bram Moolenaar | 171a921 | 2019-10-12 21:08:59 +0200 | [diff] [blame] | 507 | t_TE end of "raw" mode *t_TE* *'t_TE'* |
Bram Moolenaar | f1dcd14 | 2022-12-31 15:30:45 +0000 | [diff] [blame] | 508 | t_TI put terminal into "raw" mode *t_TI* *'t_TI'* |
| 509 | t_fe enable focus-event tracking *t_fe* *'t_fe'* |
Bram Moolenaar | 681fc3f | 2021-01-14 17:35:21 +0100 | [diff] [blame] | 510 | |xterm-focus-event| |
Bram Moolenaar | f1dcd14 | 2022-12-31 15:30:45 +0000 | [diff] [blame] | 511 | t_fd disable focus-event tracking *t_fd* *'t_fd'* |
Bram Moolenaar | 2346a63 | 2021-06-13 19:02:49 +0200 | [diff] [blame] | 512 | |xterm-focus-event| |
Bram Moolenaar | c572da5 | 2017-08-27 16:52:01 +0200 | [diff] [blame] | 513 | |
| 514 | Some codes have a start, middle and end part. The start and end are defined |
| 515 | by the termcap option, the middle part is text. |
| 516 | set title text: t_ts {title text} t_fs |
| 517 | set icon text: t_IS {icon text} t_IE |
| 518 | set cursor color: t_SC {color name} t_EC |
| 519 | |
| 520 | t_SH must take one argument: |
Bram Moolenaar | f1dcd14 | 2022-12-31 15:30:45 +0000 | [diff] [blame] | 521 | 0, 1 or none blinking block cursor |
| 522 | 2 block cursor |
Bram Moolenaar | c572da5 | 2017-08-27 16:52:01 +0200 | [diff] [blame] | 523 | 3 blinking underline cursor |
| 524 | 4 underline cursor |
| 525 | 5 blinking vertical bar cursor |
| 526 | 6 vertical bar cursor |
| 527 | |
| 528 | t_RS is sent only if the response to t_RV has been received. It is not used |
| 529 | on Mac OS when Terminal.app could be recognized from the termresponse. |
| 530 | |
Bram Moolenaar | 1b5f03e | 2023-01-09 20:12:45 +0000 | [diff] [blame] | 531 | *mouse-reporting* |
| 532 | Many terminals can report mouse clicks and some can report mouse movement and |
| 533 | dragging. Vim needs to know what codes are being used for this. |
| 534 | |
| 535 | The "XM" terminfo/termcap entry is used for this. Vim also has the 'ttymouse' |
| 536 | option to specify the mouse protocol being used. See the option for the |
| 537 | possible values. |
| 538 | |
| 539 | If Vim can read the "XM" terminfo/termcap entry then it will be used for |
| 540 | enabling and disabling the mouse reporting. If it is missing, then the value |
| 541 | from 'ttymouse' is used to decide how to do this. |
| 542 | |
| 543 | If the "XM" entry exists and the first number is "1006" then 'ttymouse' will |
| 544 | be set to "sgr", unless it was already set earlier. |
| 545 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 546 | |
Bram Moolenaar | 214641f | 2017-03-05 17:04:09 +0100 | [diff] [blame] | 547 | KEY CODES *terminal-key-codes* |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 548 | Note: Use the <> form if possible |
| 549 | |
| 550 | option name meaning ~ |
| 551 | |
| 552 | t_ku <Up> arrow up *t_ku* *'t_ku'* |
| 553 | t_kd <Down> arrow down *t_kd* *'t_kd'* |
| 554 | t_kr <Right> arrow right *t_kr* *'t_kr'* |
| 555 | t_kl <Left> arrow left *t_kl* *'t_kl'* |
Bram Moolenaar | bc7aa85 | 2005-03-06 23:38:09 +0000 | [diff] [blame] | 556 | <xUp> alternate arrow up *<xUp>* |
| 557 | <xDown> alternate arrow down *<xDown>* |
| 558 | <xRight> alternate arrow right *<xRight>* |
| 559 | <xLeft> alternate arrow left *<xLeft>* |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 560 | <S-Up> shift arrow up |
| 561 | <S-Down> shift arrow down |
| 562 | t_%i <S-Right> shift arrow right *t_%i* *'t_%i'* |
| 563 | t_#4 <S-Left> shift arrow left *t_#4* *'t_#4'* |
| 564 | t_k1 <F1> function key 1 *t_k1* *'t_k1'* |
| 565 | <xF1> alternate F1 *<xF1>* |
| 566 | t_k2 <F2> function key 2 *<F2>* *t_k2* *'t_k2'* |
| 567 | <xF2> alternate F2 *<xF2>* |
| 568 | t_k3 <F3> function key 3 *<F3>* *t_k3* *'t_k3'* |
| 569 | <xF3> alternate F3 *<xF3>* |
| 570 | t_k4 <F4> function key 4 *<F4>* *t_k4* *'t_k4'* |
| 571 | <xF4> alternate F4 *<xF4>* |
| 572 | t_k5 <F5> function key 5 *<F5>* *t_k5* *'t_k5'* |
| 573 | t_k6 <F6> function key 6 *<F6>* *t_k6* *'t_k6'* |
| 574 | t_k7 <F7> function key 7 *<F7>* *t_k7* *'t_k7'* |
| 575 | t_k8 <F8> function key 8 *<F8>* *t_k8* *'t_k8'* |
| 576 | t_k9 <F9> function key 9 *<F9>* *t_k9* *'t_k9'* |
| 577 | t_k; <F10> function key 10 *<F10>* *t_k;* *'t_k;'* |
Bram Moolenaar | ad3b366 | 2013-05-17 18:14:19 +0200 | [diff] [blame] | 578 | t_F1 <F11> function key 11 *<F11>* *t_F1* *'t_F1'* |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 579 | t_F2 <F12> function key 12 *<F12>* *t_F2* *'t_F2'* |
| 580 | t_F3 <F13> function key 13 *<F13>* *t_F3* *'t_F3'* |
| 581 | t_F4 <F14> function key 14 *<F14>* *t_F4* *'t_F4'* |
| 582 | t_F5 <F15> function key 15 *<F15>* *t_F5* *'t_F5'* |
| 583 | t_F6 <F16> function key 16 *<F16>* *t_F6* *'t_F6'* |
| 584 | t_F7 <F17> function key 17 *<F17>* *t_F7* *'t_F7'* |
| 585 | t_F8 <F18> function key 18 *<F18>* *t_F8* *'t_F8'* |
| 586 | t_F9 <F19> function key 19 *<F19>* *t_F9* *'t_F9'* |
| 587 | <S-F1> shifted function key 1 |
| 588 | <S-xF1> alternate <S-F1> *<S-xF1>* |
| 589 | <S-F2> shifted function key 2 *<S-F2>* |
| 590 | <S-xF2> alternate <S-F2> *<S-xF2>* |
| 591 | <S-F3> shifted function key 3 *<S-F3>* |
| 592 | <S-xF3> alternate <S-F3> *<S-xF3>* |
| 593 | <S-F4> shifted function key 4 *<S-F4>* |
| 594 | <S-xF4> alternate <S-F4> *<S-xF4>* |
| 595 | <S-F5> shifted function key 5 *<S-F5>* |
| 596 | <S-F6> shifted function key 6 *<S-F6>* |
| 597 | <S-F7> shifted function key 7 *<S-F7>* |
| 598 | <S-F8> shifted function key 8 *<S-F8>* |
| 599 | <S-F9> shifted function key 9 *<S-F9>* |
| 600 | <S-F10> shifted function key 10 *<S-F10>* |
| 601 | <S-F11> shifted function key 11 *<S-F11>* |
| 602 | <S-F12> shifted function key 12 *<S-F12>* |
| 603 | t_%1 <Help> help key *t_%1* *'t_%1'* |
| 604 | t_&8 <Undo> undo key *t_&8* *'t_&8'* |
| 605 | t_kI <Insert> insert key *t_kI* *'t_kI'* |
Bram Moolenaar | f1dcd14 | 2022-12-31 15:30:45 +0000 | [diff] [blame] | 606 | <kInsert> keypad insert key |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 607 | t_kD <Del> delete key *t_kD* *'t_kD'* |
| 608 | t_kb <BS> backspace key *t_kb* *'t_kb'* |
Bram Moolenaar | ad3b366 | 2013-05-17 18:14:19 +0200 | [diff] [blame] | 609 | t_kB <S-Tab> back-tab (shift-tab) *<S-Tab>* *t_kB* *'t_kB'* |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 610 | t_kh <Home> home key *t_kh* *'t_kh'* |
Bram Moolenaar | ad3b366 | 2013-05-17 18:14:19 +0200 | [diff] [blame] | 611 | t_#2 <S-Home> shifted home key *<S-Home>* *t_#2* *'t_#2'* |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 612 | <xHome> alternate home key *<xHome>* |
| 613 | t_@7 <End> end key *t_@7* *'t_@7'* |
| 614 | t_*7 <S-End> shifted end key *<S-End>* *t_star7* *'t_star7'* |
| 615 | <xEnd> alternate end key *<xEnd>* |
| 616 | t_kP <PageUp> page-up key *t_kP* *'t_kP'* |
| 617 | t_kN <PageDown> page-down key *t_kN* *'t_kN'* |
| 618 | t_K1 <kHome> keypad home key *t_K1* *'t_K1'* |
| 619 | t_K4 <kEnd> keypad end key *t_K4* *'t_K4'* |
| 620 | t_K3 <kPageUp> keypad page-up key *t_K3* *'t_K3'* |
| 621 | t_K5 <kPageDown> keypad page-down key *t_K5* *'t_K5'* |
| 622 | t_K6 <kPlus> keypad plus key *<kPlus>* *t_K6* *'t_K6'* |
| 623 | t_K7 <kMinus> keypad minus key *<kMinus>* *t_K7* *'t_K7'* |
Bram Moolenaar | ad3b366 | 2013-05-17 18:14:19 +0200 | [diff] [blame] | 624 | t_K8 <kDivide> keypad divide *<kDivide>* *t_K8* *'t_K8'* |
| 625 | t_K9 <kMultiply> keypad multiply *<kMultiply>* *t_K9* *'t_K9'* |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 626 | t_KA <kEnter> keypad enter key *<kEnter>* *t_KA* *'t_KA'* |
| 627 | t_KB <kPoint> keypad decimal point *<kPoint>* *t_KB* *'t_KB'* |
| 628 | t_KC <k0> keypad 0 *<k0>* *t_KC* *'t_KC'* |
| 629 | t_KD <k1> keypad 1 *<k1>* *t_KD* *'t_KD'* |
| 630 | t_KE <k2> keypad 2 *<k2>* *t_KE* *'t_KE'* |
| 631 | t_KF <k3> keypad 3 *<k3>* *t_KF* *'t_KF'* |
| 632 | t_KG <k4> keypad 4 *<k4>* *t_KG* *'t_KG'* |
| 633 | t_KH <k5> keypad 5 *<k5>* *t_KH* *'t_KH'* |
| 634 | t_KI <k6> keypad 6 *<k6>* *t_KI* *'t_KI'* |
| 635 | t_KJ <k7> keypad 7 *<k7>* *t_KJ* *'t_KJ'* |
| 636 | t_KK <k8> keypad 8 *<k8>* *t_KK* *'t_KK'* |
| 637 | t_KL <k9> keypad 9 *<k9>* *t_KL* *'t_KL'* |
| 638 | <Mouse> leader of mouse code *<Mouse>* |
Bram Moolenaar | f1dcd14 | 2022-12-31 15:30:45 +0000 | [diff] [blame] | 639 | |
| 640 | t_PS <PasteStart> start of bracketed paste *t_PS* *'t_PS'* |
| 641 | |xterm-bracketed-paste| |
| 642 | t_PE <PasteEnd> end of bracketed paste *t_PE* *'t_PE'* |
| 643 | |xterm-bracketed-paste| |
| 644 | <FocusGained> Vim window got focus (internal only) |
| 645 | <FocusLost> Vim window lost focus (internal only) |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 646 | |
| 647 | Note about t_so and t_mr: When the termcap entry "so" is not present the |
| 648 | entry for "mr" is used. And vice versa. The same is done for "se" and "me". |
| 649 | If your terminal supports both inversion and standout mode, you can see two |
| 650 | different modes. If your terminal supports only one of the modes, both will |
| 651 | look the same. |
| 652 | |
Bram Moolenaar | 009b259 | 2004-10-24 19:18:58 +0000 | [diff] [blame] | 653 | *keypad-comma* |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 654 | The keypad keys, when they are not mapped, behave like the equivalent normal |
Bram Moolenaar | 009b259 | 2004-10-24 19:18:58 +0000 | [diff] [blame] | 655 | key. There is one exception: if you have a comma on the keypad instead of a |
| 656 | decimal point, Vim will use a dot anyway. Use these mappings to fix that: > |
| 657 | :noremap <kPoint> , |
| 658 | :noremap! <kPoint> , |
| 659 | < *xterm-codes* |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 660 | There is a special trick to obtain the key codes which currently only works |
| 661 | for xterm. When |t_RV| is defined and a response is received which indicates |
| 662 | an xterm with patchlevel 141 or higher, Vim uses special escape sequences to |
| 663 | request the key codes directly from the xterm. The responses are used to |
| 664 | adjust the various t_ codes. This avoids the problem that the xterm can |
| 665 | produce different codes, depending on the mode it is in (8-bit, VT102, |
| 666 | VT220, etc.). The result is that codes like <xF1> are no longer needed. |
Bram Moolenaar | 6f79e61 | 2021-12-21 09:12:23 +0000 | [diff] [blame] | 667 | |
| 668 | One of the codes that can change is 't_Co', the number of colors. This will |
| 669 | trigger a redraw. If this is a problem, reset the 'xtermcodes' option as |
| 670 | early as possible: > |
| 671 | set noxtermcodes |
| 672 | |
| 673 | Note: Requesting the key codes is only done on startup. If the xterm options |
| 674 | are changed after Vim has started, the escape sequences may not be recognized |
| 675 | anymore. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 676 | |
Bram Moolenaar | 8a633e3 | 2016-04-21 21:10:14 +0200 | [diff] [blame] | 677 | *xterm-true-color* |
| 678 | Vim supports using true colors in the terminal (taken from |highlight-guifg| |
Bram Moolenaar | 664f3cf | 2019-12-07 16:03:51 +0100 | [diff] [blame] | 679 | and |highlight-guibg|), given that the terminal supports this. To make this |
Bram Moolenaar | 61be73b | 2016-04-29 22:59:22 +0200 | [diff] [blame] | 680 | work the 'termguicolors' option needs to be set. |
Bram Moolenaar | 6ebe4f9 | 2022-10-28 20:47:54 +0100 | [diff] [blame] | 681 | See https://github.com/termstandard/colors for a list of terminals that |
Bram Moolenaar | 64d8e25 | 2016-09-06 22:12:34 +0200 | [diff] [blame] | 682 | support true colors. |
Bram Moolenaar | 8a633e3 | 2016-04-21 21:10:14 +0200 | [diff] [blame] | 683 | |
Bram Moolenaar | f1dcd14 | 2022-12-31 15:30:45 +0000 | [diff] [blame] | 684 | For telling the terminal what RGB color to use the |t_8f| and |t_8b| termcap |
| 685 | entries are used. These are set by default to values that work for most |
| 686 | terminals. If that does not work for your terminal you can set them manually. |
| 687 | The default values are set like this: > |
| 688 | let &t_8f = "\<Esc>[38;2;%lu;%lu;%lum" |
| 689 | let &t_8b = "\<Esc>[48;2;%lu;%lu;%lum" |
| 690 | |
Andrea Pappacoda | 34e271b | 2024-12-31 10:46:22 +0100 | [diff] [blame] | 691 | Some terminals accept similar sequences, with semicolons replaced by colons |
| 692 | and an extra colon after the number 2 (this is conformant to the ISO 8613-6 |
| 693 | standard, but less widely supported): > |
| 694 | let &t_8f = "\<Esc>[38:2::%lu:%lu:%lum" |
| 695 | let &t_8b = "\<Esc>[48:2::%lu:%lu:%lum" |
Bram Moolenaar | 61be73b | 2016-04-29 22:59:22 +0200 | [diff] [blame] | 696 | |
| 697 | These options contain printf strings, with |printf()| (actually, its C |
| 698 | equivalent hence `l` modifier) invoked with the t_ option value and three |
| 699 | unsigned long integers that may have any value between 0 and 255 (inclusive) |
| 700 | representing red, green and blue colors respectively. |
Bram Moolenaar | 8a633e3 | 2016-04-21 21:10:14 +0200 | [diff] [blame] | 701 | |
Bram Moolenaar | 8f3f58f | 2010-01-06 20:52:26 +0100 | [diff] [blame] | 702 | *xterm-resize* |
| 703 | Window resizing with xterm only works if the allowWindowOps resource is |
| 704 | enabled. On some systems and versions of xterm it's disabled by default |
| 705 | because someone thought it would be a security issue. It's not clear if this |
| 706 | is actually the case. |
| 707 | |
| 708 | To overrule the default, put this line in your ~/.Xdefaults or |
| 709 | ~/.Xresources: |
| 710 | > |
Bram Moolenaar | f1dcd14 | 2022-12-31 15:30:45 +0000 | [diff] [blame] | 711 | XTerm*allowWindowOps: true |
Bram Moolenaar | 8f3f58f | 2010-01-06 20:52:26 +0100 | [diff] [blame] | 712 | |
| 713 | And run "xrdb -merge .Xresources" to make it effective. You can check the |
| 714 | value with the context menu (right mouse button while CTRL key is pressed), |
| 715 | there should be a tick at allow-window-ops. |
| 716 | |
Bram Moolenaar | 681fc3f | 2021-01-14 17:35:21 +0100 | [diff] [blame] | 717 | *xterm-focus-event* |
| 718 | Some terminals including xterm support the focus event tracking feature. |
| 719 | If this feature is enabled by the 't_fe' sequence, special key sequences are |
| 720 | sent from the terminal to Vim every time the terminal gains or loses focus. |
| 721 | Vim fires focus events (|FocusGained|/|FocusLost|) by handling them accordingly. |
| 722 | Focus event tracking is disabled by a 't_fd' sequence when exiting "raw" mode. |
Milly | 89872f5 | 2024-10-05 17:16:18 +0200 | [diff] [blame] | 723 | If you would like to disable this feature, add the following to your .vimrc: > |
| 724 | set t_fd= |
| 725 | set t_fe= |
Bram Moolenaar | 89a9c15 | 2021-08-29 21:55:35 +0200 | [diff] [blame] | 726 | If your terminal does support this but Vim does not recognize the terminal, |
| 727 | you may have to set the options yourself: > |
| 728 | let &t_fe = "\<Esc>[?1004h" |
| 729 | let &t_fd = "\<Esc>[?1004l" |
Bram Moolenaar | 0e6adf8 | 2021-12-16 14:41:10 +0000 | [diff] [blame] | 730 | execute "set <FocusGained>=\<Esc>[I" |
| 731 | execute "set <FocusLost>=\<Esc>[O" |
Bram Moolenaar | 89a9c15 | 2021-08-29 21:55:35 +0200 | [diff] [blame] | 732 | If this causes garbage to show when Vim starts up then it doesn't work. |
Bram Moolenaar | 681fc3f | 2021-01-14 17:35:21 +0100 | [diff] [blame] | 733 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 734 | *termcap-colors* |
| 735 | Note about colors: The 't_Co' option tells Vim the number of colors available. |
| 736 | When it is non-zero, the 't_AB' and 't_AF' options are used to set the color. |
| 737 | If one of these is not available, 't_Sb' and 't_Sf' are used. 't_me' is used |
Bram Moolenaar | 911ead1 | 2019-04-21 00:03:35 +0200 | [diff] [blame] | 738 | to reset to the default colors. Also see 'termguicolors'. |
Bram Moolenaar | 2c7f8c5 | 2020-04-20 19:52:53 +0200 | [diff] [blame] | 739 | When the GUI is running 't_Co' is set to 16777216. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 740 | |
Bram Moolenaar | 293ee4d | 2004-12-09 21:34:53 +0000 | [diff] [blame] | 741 | *termcap-cursor-shape* *termcap-cursor-color* |
Bram Moolenaar | 1e7813a | 2015-03-31 18:31:03 +0200 | [diff] [blame] | 742 | When Vim enters Insert mode the 't_SI' escape sequence is sent. When Vim |
| 743 | enters Replace mode the 't_SR' escape sequence is sent if it is set, otherwise |
Bram Moolenaar | 5ed1153 | 2022-07-06 13:18:11 +0100 | [diff] [blame] | 744 | 't_SI' is sent. When leaving Insert mode or Replace mode 't_EI' is used. |
| 745 | Note: When 't_EI' is not set then 't_SI' and 't_SR' will not be sent. And |
| 746 | when 't_SI' or 't_SR' is not set then 't_EI' is sent only once. |
| 747 | |
| 748 | This can be used to change the shape or color of the cursor in Insert or |
| 749 | Replace mode. These are not standard termcap/terminfo entries, you need to set |
| 750 | them yourself. |
Bram Moolenaar | 293ee4d | 2004-12-09 21:34:53 +0000 | [diff] [blame] | 751 | Example for an xterm, this changes the color of the cursor: > |
| 752 | if &term =~ "xterm" |
| 753 | let &t_SI = "\<Esc>]12;purple\x7" |
Bram Moolenaar | 1e7813a | 2015-03-31 18:31:03 +0200 | [diff] [blame] | 754 | let &t_SR = "\<Esc>]12;red\x7" |
Bram Moolenaar | 293ee4d | 2004-12-09 21:34:53 +0000 | [diff] [blame] | 755 | let &t_EI = "\<Esc>]12;blue\x7" |
| 756 | endif |
| 757 | NOTE: When Vim exits the shape for Normal mode will remain. The shape from |
| 758 | before Vim started will not be restored. |
K.Takata | df5320c | 2022-09-01 13:20:16 +0100 | [diff] [blame] | 759 | |
| 760 | For Windows Terminal you can use something like this: > |
| 761 | " Note: This should be set after `set termguicolors` or `set t_Co=256`. |
| 762 | if &term =~ 'xterm' || &term == 'win32' |
| 763 | " Use DECSCUSR escape sequences |
| 764 | let &t_SI = "\e[5 q" " blink bar |
| 765 | let &t_SR = "\e[3 q" " blink underline |
| 766 | let &t_EI = "\e[1 q" " blink block |
h_east | 596a9f2 | 2023-11-21 21:24:23 +0900 | [diff] [blame] | 767 | let &t_ti ..= "\e[1 q" " blink block |
| 768 | let &t_te ..= "\e[0 q" " default (depends on terminal, normally blink |
| 769 | " block) |
K.Takata | df5320c | 2022-09-01 13:20:16 +0100 | [diff] [blame] | 770 | endif |
| 771 | |
Bram Moolenaar | db84e45 | 2010-08-15 13:50:43 +0200 | [diff] [blame] | 772 | {not available when compiled without the |+cursorshape| feature} |
Bram Moolenaar | 293ee4d | 2004-12-09 21:34:53 +0000 | [diff] [blame] | 773 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 774 | *termcap-title* |
| 775 | The 't_ts' and 't_fs' options are used to set the window title if the terminal |
| 776 | allows title setting via sending strings. They are sent before and after the |
| 777 | title string, respectively. Similar 't_IS' and 't_IE' are used to set the |
| 778 | icon text. These are Vim-internal extensions of the Unix termcap, so they |
| 779 | cannot be obtained from an external termcap. However, the builtin termcap |
| 780 | contains suitable entries for xterm and iris-ansi, so you don't need to set |
| 781 | them here. |
| 782 | *hpterm* |
| 783 | If inversion or other highlighting does not work correctly, try setting the |
| 784 | 't_xs' option to a non-empty string. This makes the 't_ce' code be used to |
| 785 | remove highlighting from a line. This is required for "hpterm". Setting the |
| 786 | 'weirdinvert' option has the same effect as making 't_xs' non-empty, and vice |
| 787 | versa. |
| 788 | |
| 789 | *scroll-region* |
Bram Moolenaar | 8024f93 | 2020-01-14 19:29:13 +0100 | [diff] [blame] | 790 | Some termcaps do not include an entry for "cs" (scroll region), although the |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 791 | terminal does support it. For example: xterm on a Sun. You can use the |
| 792 | builtin_xterm or define t_cs yourself. For example: > |
| 793 | :set t_cs=^V^[[%i%d;%dr |
| 794 | Where ^V is CTRL-V and ^[ is <Esc>. |
| 795 | |
| 796 | The vertical scroll region t_CV is not a standard termcap code. Vim uses it |
| 797 | internally in the GUI. But it can also be defined for a terminal, if you can |
| 798 | find one that supports it. The two arguments are the left and right column of |
| 799 | the region which to restrict the scrolling to. Just like t_cs defines the top |
| 800 | and bottom lines. Defining t_CV will make scrolling in vertically split |
| 801 | windows a lot faster. Don't set t_CV when t_da or t_db is set (text isn't |
| 802 | cleared when scrolling). |
| 803 | |
| 804 | Unfortunately it is not possible to deduce from the termcap how cursor |
| 805 | positioning should be done when using a scrolling region: Relative to the |
| 806 | beginning of the screen or relative to the beginning of the scrolling region. |
Bram Moolenaar | 8024f93 | 2020-01-14 19:29:13 +0100 | [diff] [blame] | 807 | Most terminals use the first method. The 't_CS' option should be set to any |
| 808 | string when cursor positioning is relative to the start of the scrolling |
| 809 | region. It should be set to an empty string otherwise. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 810 | |
| 811 | Note for xterm users: The shifted cursor keys normally don't work. You can |
| 812 | make them work with the xmodmap command and some mappings in Vim. |
| 813 | |
Milly | 89872f5 | 2024-10-05 17:16:18 +0200 | [diff] [blame] | 814 | Give these commands in the xterm: > |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 815 | xmodmap -e "keysym Up = Up F13" |
| 816 | xmodmap -e "keysym Down = Down F16" |
| 817 | xmodmap -e "keysym Left = Left F18" |
| 818 | xmodmap -e "keysym Right = Right F19" |
Milly | 89872f5 | 2024-10-05 17:16:18 +0200 | [diff] [blame] | 819 | < |
| 820 | And use these mappings in Vim: > |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 821 | :map <t_F3> <S-Up> |
| 822 | :map! <t_F3> <S-Up> |
| 823 | :map <t_F6> <S-Down> |
| 824 | :map! <t_F6> <S-Down> |
| 825 | :map <t_F8> <S-Left> |
| 826 | :map! <t_F8> <S-Left> |
| 827 | :map <t_F9> <S-Right> |
| 828 | :map! <t_F9> <S-Right> |
| 829 | |
| 830 | Instead of, say, <S-Up> you can use any other command that you want to use the |
| 831 | shift-cursor-up key for. (Note: To help people that have a Sun keyboard with |
| 832 | left side keys F14 is not used because it is confused with the undo key; F15 |
| 833 | is not used, because it does a window-to-front; F17 is not used, because it |
| 834 | closes the window. On other systems you can probably use them.) |
| 835 | |
| 836 | ============================================================================== |
| 837 | 3. Window size *window-size* |
| 838 | |
| 839 | [This is about the size of the whole window Vim is using, not a window that is |
| 840 | created with the ":split" command.] |
| 841 | |
| 842 | If you are running Vim on an Amiga and the terminal name is "amiga" or |
| 843 | "builtin_amiga", the amiga-specific window resizing will be enabled. On Unix |
| 844 | systems three methods are tried to get the window size: |
| 845 | |
| 846 | - an ioctl call (TIOCGSIZE or TIOCGWINSZ, depends on your system) |
| 847 | - the environment variables "LINES" and "COLUMNS" |
| 848 | - from the termcap entries "li" and "co" |
| 849 | |
| 850 | If everything fails a default size of 24 lines and 80 columns is assumed. If |
| 851 | a window-resize signal is received the size will be set again. If the window |
| 852 | size is wrong you can use the 'lines' and 'columns' options to set the |
| 853 | correct values. |
| 854 | |
| 855 | One command can be used to set the screen size: |
Bram Moolenaar | aa3b15d | 2016-04-21 08:53:19 +0200 | [diff] [blame] | 856 | *:mod* *:mode* *E359* |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 857 | :mod[e] [mode] |
| 858 | |
| 859 | Without argument this only detects the screen size and redraws the screen. |
Bram Moolenaar | 1588bc8 | 2022-03-08 21:35:07 +0000 | [diff] [blame] | 860 | [mode] was used on MS-DOS, but it doesn't work anymore. In |Vim9| this |
| 861 | command is not supported. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 862 | |
| 863 | ============================================================================== |
| 864 | 4. Slow and fast terminals *slow-fast-terminal* |
| 865 | *slow-terminal* |
| 866 | |
| 867 | If you have a fast terminal you may like to set the 'ruler' option. The |
| 868 | cursor position is shown in the status line. If you are using horizontal |
| 869 | scrolling ('wrap' option off) consider setting 'sidescroll' to a small |
| 870 | number. |
| 871 | |
| 872 | If you have a slow terminal you may want to reset the 'showcmd' option. |
| 873 | The command characters will not be shown in the status line. If the terminal |
| 874 | scrolls very slowly, set the 'scrolljump' to 5 or so. If the cursor is moved |
| 875 | off the screen (e.g., with "j") Vim will scroll 5 lines at a time. Another |
| 876 | possibility is to reduce the number of lines that Vim uses with the command |
| 877 | "z{height}<CR>". |
| 878 | |
| 879 | If the characters from the terminal are arriving with more than 1 second |
| 880 | between them you might want to set the 'timeout' and/or 'ttimeout' option. |
| 881 | See the "Options" chapter |options|. |
| 882 | |
| 883 | If your terminal does not support a scrolling region, but it does support |
| 884 | insert/delete line commands, scrolling with multiple windows may make the |
Bram Moolenaar | c1cf4c9 | 2022-11-25 15:09:35 +0000 | [diff] [blame] | 885 | lines jump up and down. This would happen if the 'ttyfast' option has been |
| 886 | reset. Check that with: > |
| 887 | verbose set ttyfast? |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 888 | |
| 889 | If your terminal scrolls very slowly, but redrawing is not slow, set the |
| 890 | 'ttyscroll' option to a small number, e.g., 3. This will make Vim redraw the |
| 891 | screen instead of scrolling, when there are more than 3 lines to be scrolled. |
| 892 | |
| 893 | If you are using a color terminal that is slow, use this command: > |
| 894 | hi NonText cterm=NONE ctermfg=NONE |
| 895 | This avoids that spaces are sent when they have different attributes. On most |
| 896 | terminals you can't see this anyway. |
| 897 | |
| 898 | If you are using Vim over a slow serial line, you might want to try running |
| 899 | Vim inside the "screen" program. Screen will optimize the terminal I/O quite |
| 900 | a bit. |
| 901 | |
Bram Moolenaar | 5666fcd | 2019-12-26 14:35:26 +0100 | [diff] [blame] | 902 | If you are testing termcap options, but you cannot see what is happening, you |
| 903 | might want to set the 'writedelay' option. When non-zero, one character is |
| 904 | sent to the terminal at a time. This makes the screen updating a lot slower, |
| 905 | making it possible to see what is happening. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 906 | |
| 907 | ============================================================================== |
| 908 | 5. Using the mouse *mouse-using* |
| 909 | |
| 910 | This section is about using the mouse on a terminal or a terminal window. How |
| 911 | to use the mouse in a GUI window is explained in |gui-mouse|. For scrolling |
| 912 | with a mouse wheel see |scroll-mouse-wheel|. |
| 913 | |
Bram Moolenaar | 06b5d51 | 2010-05-22 15:37:44 +0200 | [diff] [blame] | 914 | Don't forget to enable the mouse with this command: > |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 915 | :set mouse=a |
| 916 | Otherwise Vim won't recognize the mouse in all modes (See 'mouse'). |
| 917 | |
Bram Moolenaar | 446cb83 | 2008-06-24 21:56:24 +0000 | [diff] [blame] | 918 | Currently the mouse is supported for Unix in an xterm window, in a *BSD |
Bram Moolenaar | 5666fcd | 2019-12-26 14:35:26 +0100 | [diff] [blame] | 919 | console with |sysmouse|, in a Linux console (with GPM |gpm-mouse|), and |
| 920 | in a Windows console. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 921 | Mouse clicks can be used to position the cursor, select an area and paste. |
| 922 | |
| 923 | These characters in the 'mouse' option tell in which situations the mouse will |
| 924 | be used by Vim: |
| 925 | n Normal mode |
| 926 | v Visual mode |
| 927 | i Insert mode |
| 928 | c Command-line mode |
| 929 | h all previous modes when in a help file |
| 930 | a all previous modes |
| 931 | r for |hit-enter| prompt |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 932 | |
| 933 | The default for 'mouse' is empty, the mouse is not used. Normally you would |
| 934 | do: > |
| 935 | :set mouse=a |
| 936 | to start using the mouse (this is equivalent to setting 'mouse' to "nvich"). |
| 937 | If you only want to use the mouse in a few modes or also want to use it for |
| 938 | the two questions you will have to concatenate the letters for those modes. |
| 939 | For example: > |
| 940 | :set mouse=nv |
| 941 | Will make the mouse work in Normal mode and Visual mode. > |
| 942 | :set mouse=h |
| 943 | Will make the mouse work in help files only (so you can use "g<LeftMouse>" to |
| 944 | jump to tags). |
| 945 | |
| 946 | Whether the selection that is started with the mouse is in Visual mode or |
| 947 | Select mode depends on whether "mouse" is included in the 'selectmode' |
| 948 | option. |
Bram Moolenaar | 5b41899 | 2019-10-27 18:50:25 +0100 | [diff] [blame] | 949 | *terminal-mouse* |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 950 | In an xterm, with the currently active mode included in the 'mouse' option, |
| 951 | normal mouse clicks are used by Vim, mouse clicks with the shift or ctrl key |
| 952 | pressed go to the xterm. With the currently active mode not included in |
| 953 | 'mouse' all mouse clicks go to the xterm. |
| 954 | |
Bram Moolenaar | 5b41899 | 2019-10-27 18:50:25 +0100 | [diff] [blame] | 955 | For terminals where it is not possible to have the mouse events be used by the |
| 956 | terminal itself by using a modifier, a workaround is to not use mouse events |
| 957 | for Vim in command-line mode: > |
| 958 | :set mouse=nvi |
| 959 | Then to select text with the terminal, use ":" to go to command-line mode, |
| 960 | select and copy the text to the system, then press Esc. |
| 961 | |
| 962 | Another way is to temporarily use ":sh" to run a shell, copy the text, then |
| 963 | exit the shell. 'mouse' can remain set to "a" then. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 964 | *xterm-clipboard* |
Bram Moolenaar | cbaff5e | 2022-04-08 17:45:08 +0100 | [diff] [blame] | 965 | In the Motif GUI version, when running in a terminal and there is |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 966 | access to the X-server (DISPLAY is set), the copy and paste will behave like |
| 967 | in the GUI. If not, the middle mouse button will insert the unnamed register. |
| 968 | In that case, here is how you copy and paste a piece of text: |
| 969 | |
| 970 | Copy/paste with the mouse and Visual mode ('mouse' option must be set, see |
| 971 | above): |
| 972 | 1. Press left mouse button on first letter of text, move mouse pointer to last |
| 973 | letter of the text and release the button. This will start Visual mode and |
| 974 | highlight the selected area. |
| 975 | 2. Press "y" to yank the Visual text in the unnamed register. |
| 976 | 3. Click the left mouse button at the insert position. |
| 977 | 4. Click the middle mouse button. |
| 978 | |
| 979 | Shortcut: If the insert position is on the screen at the same time as the |
| 980 | Visual text, you can do 2, 3 and 4 all in one: Click the middle mouse button |
| 981 | at the insert position. |
| 982 | |
| 983 | Note: When the |-X| command line argument is used, Vim will not connect to the |
| 984 | X server and copy/paste to the X clipboard (selection) will not work. Use the |
| 985 | shift key with the mouse buttons to let the xterm do the selection. |
| 986 | |
| 987 | *xterm-command-server* |
| 988 | When the X-server clipboard is available, the command server described in |
| 989 | |x11-clientserver| can be enabled with the --servername command line argument. |
| 990 | |
| 991 | *xterm-copy-paste* |
| 992 | NOTE: In some (older) xterms, it's not possible to move the cursor past column |
Bram Moolenaar | e968e36 | 2014-05-13 20:23:24 +0200 | [diff] [blame] | 993 | 95 or 223. This is an xterm problem, not Vim's. Get a newer xterm |
| 994 | |color-xterm|. Also see |'ttymouse'|. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 995 | |
| 996 | Copy/paste in xterm with (current mode NOT included in 'mouse'): |
| 997 | 1. Press left mouse button on first letter of text, move mouse pointer to last |
| 998 | letter of the text and release the button. |
| 999 | 2. Use normal Vim commands to put the cursor at the insert position. |
| 1000 | 3. Press "a" to start Insert mode. |
| 1001 | 4. Click the middle mouse button. |
| 1002 | 5. Press ESC to end Insert mode. |
| 1003 | (The same can be done with anything in 'mouse' if you keep the shift key |
| 1004 | pressed while using the mouse.) |
| 1005 | |
| 1006 | Note: if you lose the 8th bit when pasting (special characters are translated |
| 1007 | into other characters), you may have to do "stty cs8 -istrip -parenb" in your |
| 1008 | shell before starting Vim. |
| 1009 | |
| 1010 | Thus in an xterm the shift and ctrl keys cannot be used with the mouse. Mouse |
| 1011 | commands requiring the CTRL modifier can be simulated by typing the "g" key |
| 1012 | before using the mouse: |
| 1013 | "g<LeftMouse>" is "<C-LeftMouse> (jump to tag under mouse click) |
| 1014 | "g<RightMouse>" is "<C-RightMouse> ("CTRL-T") |
| 1015 | |
| 1016 | *mouse-mode-table* *mouse-overview* |
| 1017 | A short overview of what the mouse buttons do, when 'mousemodel' is "extend": |
| 1018 | |
| 1019 | Normal Mode: |
| 1020 | event position selection change action ~ |
| 1021 | cursor window ~ |
| 1022 | <LeftMouse> yes end yes |
| 1023 | <C-LeftMouse> yes end yes "CTRL-]" (2) |
| 1024 | <S-LeftMouse> yes no change yes "*" (2) *<S-LeftMouse>* |
| 1025 | <LeftDrag> yes start or extend (1) no *<LeftDrag>* |
| 1026 | <LeftRelease> yes start or extend (1) no |
| 1027 | <MiddleMouse> yes if not active no put |
| 1028 | <MiddleMouse> yes if active no yank and put |
| 1029 | <RightMouse> yes start or extend yes |
Bram Moolenaar | 38f1825 | 2005-12-14 22:04:43 +0000 | [diff] [blame] | 1030 | <A-RightMouse> yes start or extend blockw. yes *<A-RightMouse>* |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1031 | <S-RightMouse> yes no change yes "#" (2) *<S-RightMouse>* |
| 1032 | <C-RightMouse> no no change no "CTRL-T" |
| 1033 | <RightDrag> yes extend no *<RightDrag>* |
| 1034 | <RightRelease> yes extend no *<RightRelease>* |
| 1035 | |
| 1036 | Insert or Replace Mode: |
| 1037 | event position selection change action ~ |
| 1038 | cursor window ~ |
| 1039 | <LeftMouse> yes (cannot be active) yes |
| 1040 | <C-LeftMouse> yes (cannot be active) yes "CTRL-O^]" (2) |
| 1041 | <S-LeftMouse> yes (cannot be active) yes "CTRL-O*" (2) |
| 1042 | <LeftDrag> yes start or extend (1) no like CTRL-O (1) |
| 1043 | <LeftRelease> yes start or extend (1) no like CTRL-O (1) |
| 1044 | <MiddleMouse> no (cannot be active) no put register |
| 1045 | <RightMouse> yes start or extend yes like CTRL-O |
Bram Moolenaar | 38f1825 | 2005-12-14 22:04:43 +0000 | [diff] [blame] | 1046 | <A-RightMouse> yes start or extend blockw. yes |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1047 | <S-RightMouse> yes (cannot be active) yes "CTRL-O#" (2) |
| 1048 | <C-RightMouse> no (cannot be active) no "CTRL-O CTRL-T" |
| 1049 | |
| 1050 | In a help window: |
| 1051 | event position selection change action ~ |
| 1052 | cursor window ~ |
| 1053 | <2-LeftMouse> yes (cannot be active) no "^]" (jump to help tag) |
| 1054 | |
| 1055 | When 'mousemodel' is "popup", these are different: |
| 1056 | |
| 1057 | Normal Mode: |
| 1058 | event position selection change action ~ |
| 1059 | cursor window ~ |
| 1060 | <S-LeftMouse> yes start or extend (1) no |
Bram Moolenaar | 38f1825 | 2005-12-14 22:04:43 +0000 | [diff] [blame] | 1061 | <A-LeftMouse> yes start or extend blockw. no *<A-LeftMouse>* |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1062 | <RightMouse> no popup menu no |
| 1063 | |
| 1064 | Insert or Replace Mode: |
| 1065 | event position selection change action ~ |
| 1066 | cursor window ~ |
| 1067 | <S-LeftMouse> yes start or extend (1) no like CTRL-O (1) |
Bram Moolenaar | 38f1825 | 2005-12-14 22:04:43 +0000 | [diff] [blame] | 1068 | <A-LeftMouse> yes start or extend blockw. no |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1069 | <RightMouse> no popup menu no |
| 1070 | |
| 1071 | (1) only if mouse pointer moved since press |
| 1072 | (2) only if click is in same buffer |
| 1073 | |
| 1074 | Clicking the left mouse button causes the cursor to be positioned. If the |
| 1075 | click is in another window that window is made the active window. When |
| 1076 | editing the command-line the cursor can only be positioned on the |
| 1077 | command-line. When in Insert mode Vim remains in Insert mode. If 'scrolloff' |
| 1078 | is set, and the cursor is positioned within 'scrolloff' lines from the window |
| 1079 | border, the text is scrolled. |
| 1080 | |
| 1081 | A selection can be started by pressing the left mouse button on the first |
| 1082 | character, moving the mouse to the last character, then releasing the mouse |
| 1083 | button. You will not always see the selection until you release the button, |
Bram Moolenaar | 5666fcd | 2019-12-26 14:35:26 +0100 | [diff] [blame] | 1084 | only in some versions (GUI, Win32) will the dragging be shown immediately. |
| 1085 | Note that you can make the text scroll by moving the mouse at least one |
| 1086 | character in the first/last line in the window when 'scrolloff' is non-zero. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1087 | |
| 1088 | In Normal, Visual and Select mode clicking the right mouse button causes the |
| 1089 | Visual area to be extended. When 'mousemodel' is "popup", the left button has |
| 1090 | to be used while keeping the shift key pressed. When clicking in a window |
| 1091 | which is editing another buffer, the Visual or Select mode is stopped. |
| 1092 | |
Bram Moolenaar | 38f1825 | 2005-12-14 22:04:43 +0000 | [diff] [blame] | 1093 | In Normal, Visual and Select mode clicking the right mouse button with the alt |
Bram Moolenaar | 9964e46 | 2007-05-05 17:54:07 +0000 | [diff] [blame] | 1094 | key pressed causes the Visual area to become blockwise. When 'mousemodel' is |
Bram Moolenaar | 38f1825 | 2005-12-14 22:04:43 +0000 | [diff] [blame] | 1095 | "popup" the left button has to be used with the alt key. Note that this won't |
Bram Moolenaar | 06a89a5 | 2006-04-29 22:01:03 +0000 | [diff] [blame] | 1096 | work on systems where the window manager consumes the mouse events when the |
| 1097 | alt key is pressed (it may move the window). |
Bram Moolenaar | 38f1825 | 2005-12-14 22:04:43 +0000 | [diff] [blame] | 1098 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1099 | *double-click* |
Bram Moolenaar | 5666fcd | 2019-12-26 14:35:26 +0100 | [diff] [blame] | 1100 | Double, triple and quadruple clicks are supported when the GUI is active, for |
| 1101 | Win32, and for an xterm (if the gettimeofday() function is available). For |
| 1102 | selecting text, extra clicks extend the selection: |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1103 | click select ~ |
| 1104 | double word or % match *<2-LeftMouse>* |
| 1105 | triple line *<3-LeftMouse>* |
| 1106 | quadruple rectangular block *<4-LeftMouse>* |
| 1107 | Exception: In a Help window a double click jumps to help for the word that is |
| 1108 | clicked on. |
| 1109 | A double click on a word selects that word. 'iskeyword' is used to specify |
| 1110 | which characters are included in a word. A double click on a character |
| 1111 | that has a match selects until that match (like using "v%"). If the match is |
| 1112 | an #if/#else/#endif block, the selection becomes linewise. |
Bram Moolenaar | 8024f93 | 2020-01-14 19:29:13 +0100 | [diff] [blame] | 1113 | For MS-Windows and xterm the time for double clicking can be set with the |
| 1114 | 'mousetime' option. For the other systems this time is defined outside of Vim. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1115 | An example, for using a double click to jump to the tag under the cursor: > |
Bram Moolenaar | c51cf03 | 2022-02-26 12:25:45 +0000 | [diff] [blame] | 1116 | :map <2-LeftMouse> :exe "tag " .. expand("<cword>")<CR> |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1117 | |
| 1118 | Dragging the mouse with a double click (button-down, button-up, button-down |
| 1119 | and then drag) will result in whole words to be selected. This continues |
| 1120 | until the button is released, at which point the selection is per character |
| 1121 | again. |
| 1122 | |
Bram Moolenaar | 6ebe4f9 | 2022-10-28 20:47:54 +0100 | [diff] [blame] | 1123 | For scrolling with the mouse see |scroll-mouse-wheel|. |
| 1124 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1125 | *gpm-mouse* |
| 1126 | The GPM mouse is only supported when the |+mouse_gpm| feature was enabled at |
| 1127 | compile time. The GPM mouse driver (Linux console) does not support quadruple |
| 1128 | clicks. |
| 1129 | |
| 1130 | In Insert mode, when a selection is started, Vim goes into Normal mode |
| 1131 | temporarily. When Visual or Select mode ends, it returns to Insert mode. |
| 1132 | This is like using CTRL-O in Insert mode. Select mode is used when the |
| 1133 | 'selectmode' option contains "mouse". |
Bram Moolenaar | 446cb83 | 2008-06-24 21:56:24 +0000 | [diff] [blame] | 1134 | *sysmouse* |
| 1135 | The sysmouse is only supported when the |+mouse_sysmouse| feature was enabled |
| 1136 | at compile time. The sysmouse driver (*BSD console) does not support keyboard |
| 1137 | modifiers. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1138 | |
| 1139 | *drag-status-line* |
| 1140 | When working with several windows, the size of the windows can be changed by |
| 1141 | dragging the status line with the mouse. Point the mouse at a status line, |
| 1142 | press the left button, move the mouse to the new position of the status line, |
| 1143 | release the button. Just clicking the mouse in a status line makes that window |
| 1144 | the current window, without moving the cursor. If by selecting a window it |
| 1145 | will change position or size, the dragging of the status line will look |
| 1146 | confusing, but it will work (just try it). |
| 1147 | |
| 1148 | *<MiddleRelease>* *<MiddleDrag>* |
| 1149 | Mouse clicks can be mapped. The codes for mouse clicks are: |
| 1150 | code mouse button normal action ~ |
| 1151 | <LeftMouse> left pressed set cursor position |
| 1152 | <LeftDrag> left moved while pressed extend selection |
| 1153 | <LeftRelease> left released set selection end |
| 1154 | <MiddleMouse> middle pressed paste text at cursor position |
| 1155 | <MiddleDrag> middle moved while pressed - |
| 1156 | <MiddleRelease> middle released - |
| 1157 | <RightMouse> right pressed extend selection |
| 1158 | <RightDrag> right moved while pressed extend selection |
| 1159 | <RightRelease> right released set selection end |
| 1160 | <X1Mouse> X1 button pressed - *X1Mouse* |
| 1161 | <X1Drag> X1 moved while pressed - *X1Drag* |
| 1162 | <X1Release> X1 button release - *X1Release* |
| 1163 | <X2Mouse> X2 button pressed - *X2Mouse* |
| 1164 | <X2Drag> X2 moved while pressed - *X2Drag* |
| 1165 | <X2Release> X2 button release - *X2Release* |
| 1166 | |
| 1167 | The X1 and X2 buttons refer to the extra buttons found on some mice. The |
| 1168 | 'Microsoft Explorer' mouse has these buttons available to the right thumb. |
Bram Moolenaar | d042dc8 | 2015-11-24 19:18:36 +0100 | [diff] [blame] | 1169 | Currently X1 and X2 only work on Win32 and X11 environments. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1170 | |
| 1171 | Examples: > |
| 1172 | :noremap <MiddleMouse> <LeftMouse><MiddleMouse> |
| 1173 | Paste at the position of the middle mouse button click (otherwise the paste |
| 1174 | would be done at the cursor position). > |
| 1175 | |
| 1176 | :noremap <LeftRelease> <LeftRelease>y |
| 1177 | Immediately yank the selection, when using Visual mode. |
| 1178 | |
| 1179 | Note the use of ":noremap" instead of "map" to avoid a recursive mapping. |
| 1180 | > |
| 1181 | :map <X1Mouse> <C-O> |
| 1182 | :map <X2Mouse> <C-I> |
| 1183 | Map the X1 and X2 buttons to go forwards and backwards in the jump list, see |
| 1184 | |CTRL-O| and |CTRL-I|. |
| 1185 | |
| 1186 | *mouse-swap-buttons* |
| 1187 | To swap the meaning of the left and right mouse buttons: > |
| 1188 | :noremap <LeftMouse> <RightMouse> |
| 1189 | :noremap <LeftDrag> <RightDrag> |
| 1190 | :noremap <LeftRelease> <RightRelease> |
| 1191 | :noremap <RightMouse> <LeftMouse> |
| 1192 | :noremap <RightDrag> <LeftDrag> |
| 1193 | :noremap <RightRelease> <LeftRelease> |
| 1194 | :noremap g<LeftMouse> <C-RightMouse> |
| 1195 | :noremap g<RightMouse> <C-LeftMouse> |
| 1196 | :noremap! <LeftMouse> <RightMouse> |
| 1197 | :noremap! <LeftDrag> <RightDrag> |
| 1198 | :noremap! <LeftRelease> <RightRelease> |
| 1199 | :noremap! <RightMouse> <LeftMouse> |
| 1200 | :noremap! <RightDrag> <LeftDrag> |
| 1201 | :noremap! <RightRelease> <LeftRelease> |
| 1202 | < |
Bram Moolenaar | 91f84f6 | 2018-07-29 15:07:52 +0200 | [diff] [blame] | 1203 | vim:tw=78:ts=8:noet:ft=help:norl: |