created 2003 · complexity basic · author John Wright · version 6.0
You can accidentally lose text that you're typing in – text that you can't recover with undo. This tip allows you to recover your lost text, and to avoid future problems with a mapping.
In insert mode, pressing Ctrl-u deletes text you've typed in the current line, and Ctrl-w deletes the word before the cursor. You can't undo these deletions. However, what you've typed is still in the . register. You can confirm that (after pressing Esc to return to normal mode) with the command :reg which will list all registers (or just :reg . to display the . register). You may be able to copy the missing text from the register display, for example, with the mouse.
Unfortunately, simply pasting the . register won't help because it will repeat the Ctrl-u or Ctrl-w and will delete the text again. However, you can use another register (register a in the following):
:let @a = @. "aP
The above will paste all the text you last inserted, including what was accidentally deleted.
To avoid the problem in the future, put the following in your vimrc:
inoremap <c-u> <c-g>u<c-u> inoremap <c-w> <c-g>u<c-w>
Now Ctrl-u and Ctrl-w will work as before, but they first use Ctrl-g u to start a new change, as far as undo is concerned. For example, in insert mode, you might type several lines then accidentally press Ctrl-u which deletes the last line. If you have used the above mapping, you can press Esc to return to normal mode, then u to undo, which will recover the last line.
The first mapping (for <C-U>) is now included by default in the vimrc_example.vim distributed with Vim.
Generally, when you insert text (after an i or o or other similar command) you make a single modification to the file that forms one undo block. Pressing Ctrl-u or Ctrl-w while in insert mode is just part of that single modification. After pressing Esc to return to Normal mode, if you press u you will undo all your typing. Therefore, you have lost text deleted with Ctrl-u or Ctrl-w.
However, some insert-mode commands break the undo block so the insertion consists of more than a single modification. One of those commands is Ctrl-g u.
- :help i_CTRL-U Insert mode: <c-u> deletes text entered in the current line.
- :help i_CTRL-W Insert mode: <c-w> deletes word before cursor.
- :help i_CTRL-G_u Insert mode: <c-g> u starts a new change.
- :help ins-special-special Insert mode: Commands which start a new change.
The following allows you to paste all of "., while using backspace to delete the Ctrl-u at the end (assuming you accidentally typed Ctrl-u):
The above command puts the '...' string following the expression register =. Using Ctrl-r twice inserts text from the following register literally.
Here are a few maps that'll let you use Ctrl-W to delete the previous word, Ctrl-U to delete a line, and Ctrl-Y to paste what you've deleted back, all while remaining in insert mode:
inoremap <silent> <C-W> <C-\><C-O>db inoremap <silent> <C-U> <C-\><C-O>d0 inoremap <silent> <C-Y> <C-R>"