21

In Vim (7.2), there is a normal mode command r to replace a single character with another. For example, typing rX will replace the one character under the cursor with X and then return you to normal mode.

Is there a normal-mode command to insert a single character and then return to normal mode?

6

MelBurslan is correct that this feature does not natively exist, but creating a user-defined command is not really the way to go about creating it. I tinkered for a few minutes and came up with this:

:nmap <silent> ,s "=nr2char(getchar())<cr>P

Which uses some Vim trickery involving "putting" text from a register, in this case the "expression" register. The expression being plugged into the register is "nr2char(getchar())" which will return a single character string.

The reason I built the mapping this way is that getting user input "midway through" a mapping is tricky and can behave unpredictably; even this mapping will drop the cursor down to the status area while waiting for the user to type a character.

5

Thanks to Johnny for giving us this terrific answer in the comments below:

":nmap <C-i> i_<Esc>r"

That maps Control + i to insert a single character, and it does it very concisely.

In your vimrc file, this will look like:

nnoremap <C-i> i_<Esc>r

I changed my mapping to use space, and you can change yours to your preferred key(s):

nnoremap <Space> i_<Esc>r
  • 1
    This is the most concise and simple answer. – Dylanthepiguy Sep 24 '17 at 21:06
4

As far as I know, there is no such function in any widely distributed incarnation of vi editor but, vim has a facility to create custom commands. It has previously been discussed here: in this thread

You might be able to create your custom command doing what you wish to do.

  • 3
    Here's the command to map Ctrl-I to insert a single character: ":nmap <C-i> i_<esc>r" – Johnny Apr 11 '13 at 19:40
0

A simple way to do this is using the Cut x and Put p commands. Say that * is the character you want to insert. Insert it using i * Esc. Then hit x. That will cut the character. Now, you can hit p to put the single character. If you need to insert that character 300 times, you can type: 300p.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.