Vim move cursor one character in insert mode without arrow keys

8

This might seem a little too overboard, but I switched to vim and I so happy about the workflow now. I try to discipline myself not to use the arrow keys, as keeping the hands on the alfa-keys all the time is such a big thing when writing. So when I need to navigate I get out of insert mode, move in normal mode and get back in insert mode.

There is an exception where this is actually more disrupting: I use clang complete with snippets and super tab which is great. Except every time I get a function auto completed after I fill in the parameters I am left with the cursor before ) so to continue I have to move the cursor one character to the right. As you can imagine this happens very often.

The only options I have (as far as I know) are : Escla or , and I am not happy about neither of them. The first one makes me hit 3 keys for just a simple 1 character cursor move, the second one makes me move my hand to the arrow keys. A third option would be to map CTRL-L or smth to .

So what is the best way of doing this?


//snippets (clang complete + supertab):
foo($`param1`, $`param2`)

//after completion:
foo(var1, var2|)
              ^ ^
              | |
     I am here  |
                 Need to be here

| denotes cursor position

bolov

Posted 2014-08-24T10:26:40.373

Reputation: 199

With similar problem, I ended up hacking on completion script in order to make it just not echo closing ) if there is at least one argument in the function. So I type it by hand. Much more useful now. – Dmitry Frank – 2014-08-24T13:11:51.043

What happens when you type ) I bet it skips over with out actually inserting. (I don't use this plugin) – FDinoff – 2014-08-24T20:13:33.850

@FDinoff no, it just inserts another ) – bolov – 2014-08-24T20:14:05.207

1

@bolov thats disappointing. You might be able to extract the code which does that from auto-pairs. I have no idea if the plugins will conflict they might. The other option is to use <C-O>l to exit to normal mode for 1 normal mode command.

– FDinoff – 2014-08-24T20:16:56.600

Answers

5

Map ) to skip over the exisiting ) if it is a closing parenthesis

inoremap <expr> )  strpart(getline('.'), col('.')-1, 1) == ")" ? "\<Right>" : ")"

Taken from: http://vim.wikia.com/wiki/Automatically_append_closing_characters


Old Answer

:h i_CTRL-O execute one command, return to Insert mode.

Ctrl-ol will move you one character to the right then return you to insert mode.

Alternatively some of the bracket plugins allow you to just type the closing bracket ) and they will override the existing one.

Brett Y

Posted 2014-08-24T10:26:40.373

Reputation: 306

1this doesn’t work if ) is the last character on the line (and this happens often as you write code). CTRL-O a however does work. So I guess we saved one key. :) – bolov – 2014-08-24T21:07:16.797

True del ) is only two characters and will always put you after the closing parenthesis. – Brett Y – 2014-08-24T21:14:04.353

skipping over the ')' works like a charm, thank you – bolov – 2014-08-26T08:20:45.003

0

Type the following to find the control keys that are used in insert mode.

:help insert-index

ctrl-b is not used, but you may want to sacrifice some other key.

imap <c-b> <right>

This works to move the cursor right one char. Or map some double char.

imap jj <right>

broomdodger

Posted 2014-08-24T10:26:40.373

Reputation: 1 810