107

In Vim, if I'm typing a comment in a code file, and I hit Enter, it automatically makes the newline a comment, too.

For instance, in a Ruby file:

# I manually typed the pound at the start of this line and hit enter.
# This line formatted itself this way automatically.

Generally, this is what I want, but not always. How can I temporarily turn off this auto-commenting behavior?

Nathan Long
  • 27,435

9 Answers9

134

I think you're looking for

:set formatoptions-=cro

From :help fo-table:

You can use the 'formatoptions' option  to influence how Vim formats text.
'formatoptions' is a string that can contain any of the letters below.  The
default setting is "tcq".  You can separate the option letters with commas for
readability.

letter  meaning when present in 'formatoptions'

t       Auto-wrap text using textwidth
c       Auto-wrap comments using textwidth, inserting the current comment
        leader automatically.
r       Automatically insert the current comment leader after hitting
        <Enter> in Insert mode.
o       Automatically insert the current comment leader after hitting 'o' or
        'O' in Normal mode.
...
Tim
  • 1,752
17

Temporarily setting the 'paste' option may do what you want, but it also disables a lot of other Vim features:

Use :set paste to turn it on and :set nopaste to turn it off. Alternatively, you can use :set paste! to toggle it.

See also:

:help 'paste'
:help 'pastetoggle'

(Those commands are typed with the single-quotes.)

Heptite
  • 20,411
13

An alternative is to just hit ctrl-w after you pressed enter. This deletes the previous word (e.g. # or //) when in insert mode. In fact, ctrl-w is a pretty universal shortcut in most applications.

6

To permanently disable this behavior, add autocmd FileType * set formatoptions-=cro in your .vimrc/init.vim.

5

I enter non-formatted plain new lines with <CR>.

When I want to continue typing the next line in the commented block I just use the O key as usual.

Try this:

nnoremap <silent> <cr> :set paste<cr>o<esc>:set nopaste<cr>
user4157482
  • 171
  • 1
  • 5
2

This answer applies to Debian and some of its derivatives.

On a Debian distribution Vim defaults are unreasonable. They are located in /usr/share/vim/vim80/defaults.vim and applied after(!) /etc/vim/vimrc is run. The only way to tell Vim not to use its defaults is to ensure ~/.vimrc exists even if it is blank. Vim on startup tries to read from .vimrc, but if the file is not found it applies the defaults which brings a lot of undesirable behavior e.g. mouse integration, copy-paste quirks, comment auto-wrap, etc.

On Debian you can fix ALL that by simply running touch ~/.vimrc

1

I have ended up with this:

nnoremap <Leader>o o<Esc>^Da
nnoremap <Leader>O O<Esc>^Da

It appends a new line, deletes everything already inserted there, and leaves the cursor in insert mode in the indented column, without messing with the format options.

1

This just makes it one line command which when you run this, it will disable continuation of comment permanently

echo 'au FileType * set fo-=c fo-=r fo-=o' >> ~/.vimrc
grepit
  • 253
1

If you just want to temporary disable this feature, I think the easiest way is to make a key map. <C-u> can delete content of current line to the beginning, keep indent space, so I created a key map in my .vimrc:

inoremap <silent><expr> <C-CR> "\<CR>\<C-u>" 

This map is for insert mode, you can create a normal mode key map if you want, like below:

nnoremap <silent><expr> <C-CR> "o\<C-u>"