What would be the best way to set Vim up to always put the cursor in insert mode at the end of the first line (to account for commit message templates) when running git commit? This would basically do something identical to pressing ggA every time. Ideally this should be a Vim configuration (presumably in ~/.vim/after/ftplugin/gitcommit.vim), because I rely on $VISUAL rather than configuring editors for everything separately.

This almost works:

call feedkeys('ggA', 'int')

However, when running echo 'some text' >/tmp/COMMIT_EDITMSG && vim -Nu NONE --cmd 'filetype plugin on' /tmp/COMMIT_EDITMSG the cursor is on the status line until I press something:

Vim with missing cursor

1 | startinsert! works for echo 'some text' >/tmp/COMMIT_EDITMSG && vim -Nu NONE --cmd 'filetype plugin on' /tmp/COMMIT_EDITMSG, but when running git commit -t /tmp/COMMIT_EDITMSG it breaks completely - the commit message is not shown and the commit template is shown below the status line:

<code>git commit</code> broken view

After pressing right arrow the commit message and cursor shows up, and the editor is in insert mode, but the cursor is at the second character rather than at the end of line:

<code>git commit</code> after moving cursor

Do I need to add something to the configuration to tell Vim to show the actual contents of the buffer?

  • 1
    Do you have a line in your config that activates this behaviour for all files? If so, you could make an exception for git.
    – jasonwryan
    Oct 12 '18 at 23:24
  • 3
    I'm pretty sure you have to configure it as it does not ship like that.
    – jasonwryan
    Oct 12 '18 at 23:29
  • I'll cheat: vim.wikia.com/wiki/… - you can adjust the actual postion on the line to fit your default line length (presumably 78).
    – jasonwryan
    Oct 12 '18 at 23:36
  • That's the page I got the idea from :) I wanted to make it work exactly like pressing ggA every time I commit. It's really frustrating how I can't just put that string in a configuration file, but instead have to learn a completely and weirdly documented new language.
    – l0b0
    Oct 12 '18 at 23:41
  • @user938271 That's weird: It works, but the cursor is invisible before I start typing or moving it somehow.
    – l0b0
    Oct 12 '18 at 23:56

Adapting one of the autocommands given in the Vim Wikia, this seems to work fine with git commit -t /tmp/COMMIT_EDITMSG for me:

" ~/.vim/ftplugin/gitcommit.vim
au! VimEnter COMMIT_EDITMSG exec 'norm gg' | startinsert!

I used exec 'norm gg' | instead 1 | because :1 | is equivalent to :1p | and there's a small delay as the line is printed.

  • Fantastic! It's weird how such a simple command is so hard to automate.
    – l0b0
    Oct 23 '18 at 7:06

You can tell git to invoke vim with the startinsert command. Put this in your ~/.bashrc file:

export GIT_EDITOR="vim -c 'startinsert'"

But be warned that having to press escape when you have to commit a merge gets annoying, because there's already a generated commit message for those.

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.