tags:

views:

83

answers:

3

I've noticed that git seems to use different vim settings any time I'm writing a commit message. I have the git+svn install off Macports, and I've checked the $MYVIMRC variable: it's set to the correct file. Still, every time I go to commit a message I have a restriction on 80 characters per line, case sensitive search, and none of the plugins I've installed.

It's probably something silly. Would appreciate a pointer as to what it is.

EDIT: Actually I just checked: my plugins work. It's only the column width of 80 chars that miraculously comes alive when I type out commit messages.

+3  A: 

:verbose set textwidth? formatoptions? will tell you the values of these option and what script last set them. Text is only hard-wrapped while typing if 'textwidth' is non-zero and 'formatoptions' contains the t setting. It's likely that the gitcommit filetype plugin (ftplugin/gitcommit.vim) is changing one or both of these options because you have filetype plugins enabled (:filetype shows plugin:ON).

jamessan
+1  A: 

Partial answer, maybe helpful...

According to ps aux, git starts vim with this command:

vim .git/COMMIT_EDITMSG

This triggers the syntax mode gitcommit, which on my Ubuntu system lives in

/usr/share/vim/vimcurrent/syntax/gitcommit.vim

and is loaded from

/usr/share/vim/vimcurrent/filetype.vim
Thomas
There's not just syntax - there's an ftplugin!
Jefromi
+4  A: 

That's not a bug, it's a feature!

Vim knows about a lot of filetypes - including git commits (and interactive rebases, and config...). There are syntax definitions and ftplugins (filetype-activated plugins) for each of these. One of the settings in the commit ftplugin is textwidth=72. This is done so that the output of git log will look good in a standard-width terminal. If you really want to change it, you could go edit the plugin, but I'd really recommend keeping it.

The plugin should be in <vim-directory>/vimXX/ftplugin/gitcommit.vim. The XX is the version number, e.g. 72 for version 7.2, and the leading component is generally something like /usr/share/vim.

P.S. The plugin also defines a command DiffGitCached, which will open the diff to be committed in a preview window. Handy!

Jefromi
This is both the quickest and most complete answer. Thanks! And okay, you talked me into not touching it :).
mitjak
@mitjak: Oh dear, jamessan's was actually before mine, but thanks!
Jefromi
But.. the timestamp.. Strange.
mitjak
@mitjak: Hm, mine shows his four minutes before mine - I did answer then edit a couple times though.
Jefromi
If you want to override the setting, then you should do so in `~/.vim/after/ftplugin/gitcommit.vim`, not by editing the system file. See http://vimdoc.sourceforge.net/htmldoc/options.html#after-directory
jamessan
@jamessan: True. Fortunately in this case you don't have to worry about figuring out what value to restore the option to, as the ftplugin only modifies it if it's set to zero. (I hadn't read the plugin carefully enough to notice that the first time, and thought there'd be no way to restore.)
Jefromi
@Jefromi: What would need to be restored?
jamessan
@jamessan: It's not a boolean. Suppose you set it to 100, and the plugin sets it to 72. How would would the after ftplugin know what to set it back to? (But like I said, not a problem in this case.)
Jefromi
@jamessan Strange: http://funkyimg.com/u2/405/385/Screen_shot_2010-08-11_at_12_18_13_PM.png
mitjak
The ftplugin doesn't have to set it back to anything. Since it's properly using `setlocal` instead of `set` and `'textwidth'` is a buffer-local option, the change only affects the current buffer. There's also the convention of setting up an "undo" string that will be evaluated when undoing changing filetype. Plus, the whole point of the after directory is to override particular settings that are being made in the system runtime files.
jamessan
@jamessan: I know that's the point of it. It's just awkward to have to maintain two copies of a setting, one in your vimrc and one as an override. The point here is that you want to override it to the *same* thing as it was previously set to by your vimrc. (But again, it's moot in this case, because the only thing it could've been was 0.)
Jefromi
Ah, I explicitly don't set `textwidth` in my vimrc because of this behavior. Doing so precludes, e.g., the mail ftplugin from setting `textwidth` to 72 since it would defer to the setting from the vimrc. Instead, I put filetype/project-specific `textwidth` settings in the relevant after/ftplugin or project autocmd.
jamessan
@jamessan: Yeah, that's a good approach. I doubt there are a ton of people who do explicitly set it in their vimrc, but I'm just obsessive about covering all of the cases.
Jefromi