Revision as of 07:08, December 21, 2012

Auto-comment allows easy insertion of additional lines of comments. For example, in a C++ file, if you insert a blank line after a comment line beginning with //, Vim may automatically insert // at the start of the new line. This tip explains how auto commenting can be disabled.

Contents

Disabling in general

This sets up an auto command that fires after any filetype-specific plugin; the command removes the three flags from the 'formatoptions' option that control the automatic insertion of comments. With this in your vimrc, a comment character will not be automatically inserted in the next line under any situation.

Use this command to check your format options:

:set formatoptions?

C++ single-line comments

Many C++ and C programs use //-style single line comments, like this:

// This is a comment.

When file type detection is enabled (for example, with filetype plugin indent on in your vimrc; see here), the file $VIMRUNTIME/ftplugin/c.vim is sourced when you edit a C or C++ file. The c.vim script sets the 'comments' option for the local buffer (that is, for the C or C++ file).

One result is that when the cursor is in the // This is a comment. line, pressing Enter will automatically insert the comment string (//) at the beginning of the next line. It is possible to disable this action, while leaving other auto-commenting features unchanged. To do this, create the file ~/.vim/after/ftplugin/c.vim (Unix) or $HOME/vimfiles/after/ftplugin/c.vim (Windows), creating the directories if needed. The file contains these lines:

setlocal comments-=://
setlocal comments+=f://

When you edit a C or C++ file, the first c.vim (in $VIMRUNTIME/ftplugin) will be sourced, then the second c.vim (in after/ftplugin) will be sourced. The second file modifies the 'comments' option by removing (-=) the :// component, then adding (+=) the f:// component. The f causes the // to be used for a comment only on the first line, that is, Vim will not try to insert // on following lines.

Creating the second c.vim is the recommended procedure, but an alternative would be to create an auto command by placing the following line in your vimrc:

au FileType c,cpp setlocal comments-=:// comments+=f://

This auto command will be executed after the c or cpp file types are set. The command performs the same modification to the 'comments' option as before, but uses the shortcut of placing the two operations in a single command.

Overriding format options set by filetype plugin

If you have enabled file type plugins, you may notice that your format options still contain c, o, or r, depending on the filetype. One way to override these settings is by creating a file in your after directory.

For example, the command :filetype plugin sets formatoptions=lncrq for Perl files by default. You can modify that setting by creating a file named perl.vim with contents:

setlocal formatoptions-=c formatoptions-=r formatoptions-=o

The perl.vim file should be in this directory (which you may need to create): ~/.vim/after/ftplugin on Unix-based systems; or $HOME/vimfiles/after/ftplugin on Windows systems.

You don't say what you're trying to accomplish, but it looks like youre attempting to remove all automatic indentation, keep automatic insertion of /*...*/ comments in C and C++ code, and remove automatic insertion of //... comments in C and C++ code.

First, Vim does not automatically indent anything unless you tell it to, with a "filetype indent on" or a "filetype indent plugin on" in your .vimrc. Remove the "indent" keyword and you should not get any automatic indenting. Although it may be a good idea to keep your "set noai..." line to make sure you default to no indents, unless you disable the automatic indent setup per filetype, the filetype indent plugins will override these every time you load a file.

Your FileType autocmd should work fine, assuming you have automatic filetype detection turned on, and should also render the following setlocal and set commands unnecessary. You say it has no effect. What do you try (step by step) to see that it has no effect? What do you see? What do you expect to see?