I use quite a lot cw to change a word. I put the cursor on the start of the word, then cw followed by the new word and then <esc>.

So far, so good. My problem is that after that the cursor is at the end of the (new) word. I know I can move back with b, but it's possible to define a modified version of cw so that the movement is automatic at the end of the insert?

  • By the way, I discovered that that was a case of XY problem --- what I really want here is to learn about ciw (change inner word). – Rmano Mar 16 '17 at 10:11

You can use a :help :map-expression that defines a fire-once autocmd on InsertLeave (i.e. when you're done with the change) to move back the cursor. I've used `[; instead of the b motion, because that also handles multiple inserted words. Since I wouldn't want to override cw, I've chosen c,w:

function! ToStartOfChange()
    augroup ToStartOfChange
        autocmd ToStartOfChange InsertLeave * execute 'normal! g`[' | autocmd! ToStartOfChange
    augroup END
    return 'cw'
nnoremap <expr> c,w ToStartOfChange()
  • +1 and thanks, it works; but it has a problem: if I repeat the change after the first one with . the "going back" is not repeated. I am accepting the answer because I really did not specify that thing... – Rmano Mar 17 '15 at 13:50
  • 1
    You need to use the repeat.vim plugin to make repeat work. Unfortunately, that requires some more boilerplate code, like <Plug> mappings. – Ingo Karkat Mar 17 '15 at 19:01

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.