Automatically wrap long Git commit messages in Vim
Asked Answered
S

7

92

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.

Specialist answered 13/6, 2012 at 20:59 Comment(5)
The question you link to suggests setting the 'textwidth' option in your .vimrc. Does that not meet your needs?Morelli
Perhaps https://mcmap.net/q/242253/-auto-wrap-long-lines-in-vim is what you're looking forIllyrian
@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.Specialist
@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).Specialist
Vim unintentionally taught me about proper commit message formatting practices via its syntax highlighting. Linking this here: Git Commit Messages: 50/72 Formatting.Remorseful
F
111

Add this to your .vimrc:

au FileType gitcommit setlocal tw=72
Fishbein answered 13/6, 2012 at 21:5 Comment(7)
That setting should already exist in .../vim73/ftplugin/gitcommit.vim unless you've set your own textwidth.Googins
This only works if formatoption t is set. Use :set fo? to check an :set fo+=t to correct.Vestryman
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. @Vestryman 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.Gymnastics
I had to say filetype plugin on in my .vimrcBellay
This did not work for me.Buttock
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?Natale
@JoePrevite Did not work for me as well. I'm on macOS Vim 9.0. I had to manually wrap it using gqq, from jamessan's answer at "Wrap long lines in Vim?"Remorseful
R
29

Add this to your .vimrc:

filetype indent plugin on

From here.

Rude answered 23/6, 2012 at 8:45 Comment(4)
This is the only thing that works for me, Vim 7.3 on os x 10.9Paxton
Only thing that worked for my on Vim 7.4, OSX SierraTrichinopoly
This worked for me immediately on VI improved 8.2 on opensuse tumbleweedWily
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.Easley
P
26

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

Pickup answered 23/6, 2012 at 10:44 Comment(2)
Git/vim appear to do the syntax highlighting without any plugin for me.Teacart
I have this installed but it doesn't wrap in 72 characters the commit messageWooden
H
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
Hindgut answered 12/2, 2018 at 19:49 Comment(1)
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.Easley
H
4

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

See Vim Tips Wiki: Automatic formatting of paragraphs

Hellraiser answered 13/9, 2019 at 16:37 Comment(2)
this is an immensely useful tip! Thank you!Bailsman
The top two answers did not work for me but this did. gqq is shorter and is for just the current line.Remorseful
M
2

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

Musette answered 18/1, 2014 at 9:9 Comment(0)
M
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!

Machuca answered 7/6, 2018 at 20:29 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.