*term.txt* Nvim VIM REFERENCE MANUAL by Bram Moolenaar Terminal information *terminal-info* Vim uses information about the terminal you are using to fill the screen and recognize what keys you hit. If this information is not correct, the screen may be messed up or keys may not be recognized. The actions which have to be performed on the screen are accomplished by outputting a string of characters. ============================================================================== Startup *startup-terminal* When Vim is started a default terminal type is assumed. for MS-DOS this is the pc terminal, for Unix an ansi terminal. *termcap* *terminfo* *E557* *E558* *E559* On Unix the terminfo database or termcap file is used. This is referred to as "termcap" in all the documentation. Settings depending on terminal *term-dependent-settings* If you want to set options or mappings, depending on the terminal name, you can do this best in your vimrc. Example: > if &term == "xterm" ... xterm maps and settings ... elseif &term =~ "vt10." ... vt100, vt102 maps and settings ... endif < *cs7-problem* Note: If the terminal settings are changed after running Vim, you might have an illegal combination of settings. This has been reported on Solaris 2.5 with "stty cs8 parenb", which is restored as "stty cs7 parenb". Use "stty cs8 -parenb -istrip" instead, this is restored correctly. Many cursor key codes start with an . Vim must find out if this is a single hit of the key or the start of a cursor key sequence. It waits for a next character to arrive. If it does not arrive within one second a single is assumed. On very slow systems this may fail, causing cursor keys not to work sometimes. If you discover this problem reset the 'timeout' option. Vim will wait for the next character to arrive after an . If you want to enter a single you must type it twice. Some terminals have confusing codes for the cursor keys. The televideo 925 is such a terminal. It sends a CTRL-H for cursor-left. This would make it impossible to distinguish a backspace and cursor-left. To avoid this problem CTRL-H is never recognized as cursor-left. *vt100-cursor-keys* *xterm-cursor-keys* Other terminals (e.g., vt100 and xterm) have cursor keys that send OA, OB, etc. Unfortunately these are valid commands in insert mode: Stop insert, Open a new line above the new one, start inserting 'A', 'B', etc. Instead of performing these commands Vim will erroneously recognize this typed key sequence as a cursor key movement. To avoid this and make Vim do what you want in either case you could use these settings: > :set notimeout " don't timeout on mappings :set ttimeout " do timeout on terminal key codes :set timeoutlen=100 " timeout after 100 msec This requires the key-codes to be sent within 100 msec in order to recognize them as a cursor key. When you type you normally are not that fast, so they are recognized as individual typed commands, even though Vim receives the same sequence of bytes. *xterm-8bit* *xterm-8-bit* Xterm can be run in a mode where it uses 8-bit escape sequences. The CSI code is used instead of [. The advantage is that an can quickly be recognized in Insert mode, because it can't be confused with the start of a special key. For the builtin termcap entries, Vim checks if the 'term' option contains "8bit" anywhere. It then uses 8-bit characters for the termcap entries, the mouse and a few other things. You would normally set $TERM in your shell to "xterm-8bit" and Vim picks this up and adjusts to the 8-bit setting automatically. When Vim receives a response to the "request version" sequence and it starts with CSI, it assumes that the terminal is in 8-bit mode and will convert all key sequences to their 8-bit variants. ============================================================================== Window size *window-size* [This is about the size of the whole window Vim is using, not a window that is created with the ":split" command.] On Unix systems, three methods are tried to get the window size: - an ioctl call (TIOCGSIZE or TIOCGWINSZ, depends on your system) - the environment variables "LINES" and "COLUMNS" - from the termcap entries "li" and "co" If everything fails a default size of 24 lines and 80 columns is assumed. If a window-resize signal is received the size will be set again. If the window size is wrong you can use the 'lines' and 'columns' options to set the correct values. One command can be used to set the screen size: *:mod* *:mode* :mod[e] Detects the screen size and redraws the screen. ============================================================================== Slow and fast terminals *slow-fast-terminal* *slow-terminal* If you have a fast terminal you may like to set the 'ruler' option. The cursor position is shown in the status line. If you are using horizontal scrolling ('wrap' option off) consider setting 'sidescroll' to a small number. If you have a slow terminal you may want to reset the 'showcmd' option. The command characters will not be shown in the status line. If the terminal scrolls very slowly, set the 'scrolljump' to 5 or so. If the cursor is moved off the screen (e.g., with "j") Vim will scroll 5 lines at a time. Another possibility is to reduce the number of lines that Vim uses with the command "z{height}". If the characters from the terminal are arriving with more than 1 second between them you might want to set the 'timeout' and/or 'ttimeout' option. See the "Options" chapter |options|. If you are using a color terminal that is slow, use this command: > hi NonText cterm=NONE ctermfg=NONE This avoids that spaces are sent when they have different attributes. On most terminals you can't see this anyway. If you are using Vim over a slow serial line, you might want to try running Vim inside the "screen" program. Screen will optimize the terminal I/O quite a bit. If you are testing termcap options, but you cannot see what is happening, you might want to set the 'writedelay' option. When non-zero, one character is sent to the terminal at a time (does not work for MS-DOS). This makes the screen updating a lot slower, making it possible to see what is happening. ============================================================================== Using the mouse *mouse-using* This section is about using the mouse on a terminal or a terminal window. How to use the mouse in a GUI window is explained in |gui-mouse|. For scrolling with a mouse wheel see |scroll-mouse-wheel|. These characters in the 'mouse' option tell in which situations the mouse will be used by Vim: n Normal mode v Visual mode i Insert mode c Command-line mode h all previous modes when in a help file a all previous modes r for |hit-enter| prompt If you only want to use the mouse in a few modes or also want to use it for the two questions you will have to concatenate the letters for those modes. For example: > :set mouse=nv Will make the mouse work in Normal mode and Visual mode. > :set mouse=h Will make the mouse work in help files only (so you can use "g" to jump to tags). Whether the selection that is started with the mouse is in Visual mode or Select mode depends on whether "mouse" is included in the 'selectmode' option. In an xterm, with the currently active mode included in the 'mouse' option, normal mouse clicks are used by Vim, mouse clicks with the shift or ctrl key pressed go to the xterm. With the currently active mode not included in 'mouse' all mouse clicks go to the xterm. *xterm-clipboard* The middle mouse button will insert the unnamed register. In that case, here is how you copy and paste a piece of text: Copy/paste with the mouse and Visual mode ('mouse' option must be set, see above): 1. Press left mouse button on first letter of text, move mouse pointer to last letter of the text and release the button. This will start Visual mode and highlight the selected area. 2. Press "y" to yank the Visual text in the unnamed register. 3. Click the left mouse button at the insert position. 4. Click the middle mouse button. Shortcut: If the insert position is on the screen at the same time as the Visual text, you can do 2, 3 and 4 all in one: Click the middle mouse button at the insert position. *xterm-copy-paste* NOTE: In some (older) xterms, it's not possible to move the cursor past column 95 or 223. This is an xterm problem, not Vim's. Get a newer xterm |color-xterm|. Copy/paste in xterm with (current mode NOT included in 'mouse'): 1. Press left mouse button on first letter of text, move mouse pointer to last letter of the text and release the button. 2. Use normal Vim commands to put the cursor at the insert position. 3. Press "a" to start Insert mode. 4. Click the middle mouse button. 5. Press ESC to end Insert mode. (The same can be done with anything in 'mouse' if you keep the shift key pressed while using the mouse.) Note: if you lose the 8th bit when pasting (special characters are translated into other characters), you may have to do "stty cs8 -istrip -parenb" in your shell before starting Vim. Thus in an xterm the shift and ctrl keys cannot be used with the mouse. Mouse commands requiring the CTRL modifier can be simulated by typing the "g" key before using the mouse: "g" is " (jump to tag under mouse click) "g" is " ("CTRL-T") *bracketed-paste-mode* Bracketed paste mode allows terminal emulators to distinguish between typed text and pasted text. For terminal emulators that support it, this mode is enabled by default. Thus you can paste text without Nvim giving any special meaning to it, e.g. it will not auto-indent the pasted text. See https://cirw.in/blog/bracketed-paste for technical details. *mouse-mode-table* *mouse-overview* A short overview of what the mouse buttons do, when 'mousemodel' is "extend": Normal Mode: event position selection change action ~ cursor window ~ yes end yes yes end yes "CTRL-]" (2) yes no change yes "*" (2) ** yes start or extend (1) no ** yes start or extend (1) no yes if not active no put yes if active no yank and put yes start or extend yes yes start or extend blockw. yes ** yes no change yes "#" (2) ** no no change no "CTRL-T" yes extend no ** yes extend no ** Insert or Replace Mode: event position selection change action ~ cursor window ~ yes (cannot be active) yes yes (cannot be active) yes "CTRL-O^]" (2) yes (cannot be active) yes "CTRL-O*" (2) yes start or extend (1) no like CTRL-O (1) yes start or extend (1) no like CTRL-O (1) no (cannot be active) no put register yes start or extend yes like CTRL-O yes start or extend blockw. yes yes (cannot be active) yes "CTRL-O#" (2) no (cannot be active) no "CTRL-O CTRL-T" In a help window: event position selection change action ~ cursor window ~ <2-LeftMouse> yes (cannot be active) no "^]" (jump to help tag) When 'mousemodel' is "popup", these are different: Normal Mode: event position selection change action ~ cursor window ~ yes start or extend (1) no yes start or extend blockw. no ** no popup menu no Insert or Replace Mode: event position selection change action ~ cursor window ~ yes start or extend (1) no like CTRL-O (1) yes start or extend blockw. no no popup menu no (1) only if mouse pointer moved since press (2) only if click is in same buffer Clicking the left mouse button causes the cursor to be positioned. If the click is in another window that window is made the active window. When editing the command-line the cursor can only be positioned on the command-line. When in Insert mode Vim remains in Insert mode. If 'scrolloff' is set, and the cursor is positioned within 'scrolloff' lines from the window border, the text is scrolled. A selection can be started by pressing the left mouse button on the first character, moving the mouse to the last character, then releasing the mouse button. You will not always see the selection until you release the button, only in some versions (GUI, Windows) will the dragging be shown immediately. Note that you can make the text scroll by moving the mouse at least one character in the first/last line in the window when 'scrolloff' is non-zero. In Normal, Visual and Select mode clicking the right mouse button causes the Visual area to be extended. When 'mousemodel' is "popup", the left button has to be used while keeping the shift key pressed. When clicking in a window which is editing another buffer, the Visual or Select mode is stopped. In Normal, Visual and Select mode clicking the right mouse button with the alt key pressed causes the Visual area to become blockwise. When 'mousemodel' is "popup" the left button has to be used with the alt key. Note that this won't work on systems where the window manager consumes the mouse events when the alt key is pressed (it may move the window). *double-click* Double, triple and quadruple clicks are supported when the GUI is active, for Windows and for an xterm. For selecting text, extra clicks extend the selection: click select ~ double word or % match *<2-LeftMouse>* triple line *<3-LeftMouse>* quadruple rectangular block *<4-LeftMouse>* Exception: In a Help window a double click jumps to help for the word that is clicked on. A double click on a word selects that word. 'iskeyword' is used to specify which characters are included in a word. A double click on a character that has a match selects until that match (like using "v%"). If the match is an #if/#else/#endif block, the selection becomes linewise. For MS-DOS and xterm the time for double clicking can be set with the 'mousetime' option. For the other systems this time is defined outside of Vim. An example, for using a double click to jump to the tag under the cursor: > :map <2-LeftMouse> :exe "tag ". expand("") Dragging the mouse with a double click (button-down, button-up, button-down and then drag) will result in whole words to be selected. This continues until the button is released, at which point the selection is per character again. In Insert mode, when a selection is started, Vim goes into Normal mode temporarily. When Visual or Select mode ends, it returns to Insert mode. This is like using CTRL-O in Insert mode. Select mode is used when the 'selectmode' option contains "mouse". *drag-status-line* When working with several windows, the size of the windows can be changed by dragging the status line with the mouse. Point the mouse at a status line, press the left button, move the mouse to the new position of the status line, release the button. Just clicking the mouse in a status line makes that window the current window, without moving the cursor. If by selecting a window it will change position or size, the dragging of the status line will look confusing, but it will work (just try it). ** ** Mouse clicks can be mapped. The codes for mouse clicks are: code mouse button normal action ~ left pressed set cursor position left moved while pressed extend selection left released set selection end middle pressed paste text at cursor position middle moved while pressed - middle released - right pressed extend selection right moved while pressed extend selection right released set selection end X1 button pressed - *X1Mouse* X1 moved while pressed - *X1Drag* X1 button release - *X1Release* X2 button pressed - *X2Mouse* X2 moved while pressed - *X2Drag* X2 button release - *X2Release* The X1 and X2 buttons refer to the extra buttons found on some mice. The 'Microsoft Explorer' mouse has these buttons available to the right thumb. Currently X1 and X2 only work on Win32 and X11 environments. Examples: > :noremap Paste at the position of the middle mouse button click (otherwise the paste would be done at the cursor position). > :noremap y Immediately yank the selection, when using Visual mode. Note the use of ":noremap" instead of "map" to avoid a recursive mapping. > :map :map Map the X1 and X2 buttons to go forwards and backwards in the jump list, see |CTRL-O| and |CTRL-I|. *mouse-swap-buttons* To swap the meaning of the left and right mouse buttons: > :noremap :noremap :noremap :noremap :noremap :noremap :noremap g :noremap g :noremap! :noremap! :noremap! :noremap! :noremap! :noremap! < vim:tw=78:ts=8:ft=help:norl: