86

Using Git, my editor for commits is Vim. I'm constantly doing a poor job of remembering to wrap lines and so I get long lines (see this answer for example). Is there a way using some git config or .vimrc magic that I can get Vim to automatically wrap lines at 72 columns?

Related question.

Community
  • 1
  • 1
mgilson
  • 300,191
  • 65
  • 633
  • 696
  • The question you link to suggests setting the `'textwidth'` option in your `.vimrc`. Does that not meet your needs? – Josh Lee Jun 13 '12 at 21:01
  • Perhaps http://stackoverflow.com/questions/5602905/auto-wrap-long-lines-in-vim is what you're looking for – Rem.co Jun 13 '12 at 21:01
  • @JoshLee -- I was under the impression that would globally set the maximum width. I only want to set the width when in a git-commit message. – mgilson Jun 13 '12 at 21:12
  • @RemcoOverdijk -- Ironically enough, that was the link I tried to post as a related question. I don't know how I got the other link (actually, when I followed it was the first time I remember seeing it)... Anyway, to be clear I **only want to force wrapping when in a git commit** and I'm not an expert in .vimrc formatting (It all looks like a foreign language to me). – mgilson Jun 13 '12 at 21:16

7 Answers7

109

Add this to your .vimrc:

au FileType gitcommit setlocal tw=72
Evan Carroll
  • 78,363
  • 46
  • 261
  • 468
Abe Voelker
  • 30,124
  • 14
  • 81
  • 98
  • 16
    That setting should already exist in `.../vim73/ftplugin/gitcommit.vim` unless you've set your own textwidth. – idbrii Aug 02 '12 at 00:49
  • 1
    This only works if `formatoption` `t` is set. Use `:set fo?` to check an `:set fo+=t` to correct. – Henning Mar 19 '16 at 23:54
  • 1
    To use this solution, you will need `:filetype on` in your .vimrc too. This enables vim to check filetypes and see you are editting a gitcommit file in this situation. @Henning is also correct you will need to have a fo with t included, to wrap on textwidth. However, as I understand it this is default—but still a point of failure. – Novice C Aug 28 '16 at 01:16
  • 16
    I had to say ``filetype plugin on`` in my .vimrc – Collin Anderson Sep 28 '16 at 19:29
  • 1
    This did not work for me. – Joe Previte Mar 16 '22 at 22:14
  • Can someone explain what the `au` is? I search for `vim au` or `vimrc au`, but I only get results relating to `autocommands`. Also, does `FileType` need to be capitalized? – joseville Jan 10 '23 at 03:43
29

Add this to your .vimrc:

filetype indent plugin on

From here.

Alex
  • 1,306
  • 3
  • 15
  • 25
  • 1
    This is the only thing that works for me, Vim 7.3 on os x 10.9 – m.kocikowski May 13 '14 at 16:48
  • Only thing that worked for my on Vim 7.4, OSX Sierra – Jared Knipp Feb 20 '17 at 19:17
  • This worked for me immediately on VI improved 8.2 on opensuse tumbleweed – Felipe Alvarez Feb 15 '22 at 07:44
  • 1
    Just to explain this answer a little bit: `indent` and `plugin` relates to `filetype` setting, which is turned `on`. vim with `filetype on` detects filetype and can upload some specific settings to it (like indent configurations and plugins for that filetype). vim is shipped with such git helpers since some version. For more info execute `:help :filetype-overview`. PS. `syntax on` option may not be set by default (eg. to colorize message title with limit); adding it in `.vimrc` won't hurt. – amordo Nov 24 '22 at 09:48
25

While the other answers solve this problem perfectly well, I highly recommend you install Tim Pope's fugitive.vim.

fugitive.vim is an excellent plugin that brings Git functionality to Vim. It has a whole host of features that aren't relevant to your question, but are worth checking out. However, it can also help you remember to keep your commit messages the proper length:

Sample commit message within Vim on fugitive

David Cain
  • 16,484
  • 14
  • 65
  • 75
16

2018 Update - Update vim

If you update vim, it will automatically highlight the first 50 characters of your title and wrap lines at 72 characters. It knows that you're editing a git commit file.


Mac users can use Homebrew:

brew install vim

If you still aren't seeing the syntax highlighting, make sure you have it enabled:

You need to have following settings in .vimrc file as per arch linux documentation

filetype plugin on
syntax on
JBallin
  • 8,481
  • 4
  • 46
  • 51
  • I use vim v8.2 (macos) and it has no wrapping git message body lines feature. It only highlights the title and leaves the body text without anything. It's needed to explicitly use `filetype indent plugin on` (`syntax on` won't be redundant too) setting in `.vimrc`. – amordo Nov 24 '22 at 09:53
4

In addition to other answers, use gqip to reformat a paragraph while editing.

See Vim Tips Wiki: Automatic formatting of paragraphs

cambunctious
  • 8,391
  • 5
  • 34
  • 53
2

Here's a git hook for auto-wrapping that will work with any editor: https://github.com/surabhigupta/AutoWrapSeventyTwo

sur
  • 51
  • 4
1

Several of the options from the earlier posts work, except I noticed inconsistencies between different systems.

Fedora 28 (recently upgraded from F26) was easy once I realised :version inside git-commit/git-tag showed it was pointing to .virc files (weird*) so I simply copied my ~/.vimrc into ~/.virc [except, see below].

macOS 10.13.4 with vim 8.0 from brew works just fine off /usr/share/vim/vim80/ftplugin/gitcommit.vim according to :verbose :set tw=?.

CentOS 7.4 with vim 7.4 (git version 1.8.3.1) for some reason though didn't appear to be making use of the textwidth line in its supplied gitcommit.vim so I went for a quick and dirty workaround (to save me from dealing with multiple files) in ~/.vimrc:

nmap <F2> :set textwidth=72<CR>
inoremap <F2> <Esc>:set textwidth=72<CR>a

That seems to work well enough and is easy to remember - I mostly only pull from there anyway and have kind of given up messing around any more with the old versions of git and vim.

Otherwise, I (temporarily) went for Chip Hogg's suggestion after Abe Voelker's answer: autocmd FileType gitcommit setlocal textwidth=72

I don't think it makes much of a difference inside git-commit but it's possibly better to be safe (especially if that line ends up getting copied throughout a vimrc). Filetype is of course set to on, as it is in many example vimrcs.

* However, I was still curious as to why vim's ruler wasn't showing, so I looked at :help ruler which informs +cmdline_info (displayed after :version) needs to be set at compile time. Running :ver in vim outside of git-commit revealed different settings and a different compiled time, suggesting that git was perhaps calling the system copy of vim instead of the user one.

So what I should have done at the beginning to all this was run git config --global core.editor "vim" except I didn't because I had assumed it was a redundant step. Doing this first on every git installation might save a lot of hassle from the start!