[vox-tech] vim leaves # comments at beginning of line when indenting

Peter Jay Salzman vox-tech@lists.lugod.org
Sat, 22 May 2004 12:57:10 -0700


On Sat 22 May 04, 12:02 PM, Bryan Richter <btrichter@ucdavis.edu> said:
> Issac Trotts wrote:
> > As an example, suppose I've written some Python code with a comment
> > 
> > # Assorted verbiage here
> > 
> > and then decide to indent it.  I position my cursor on the line and
> > press the magic vim key sequence >>.  Nothing happens.  I go to other
> > lines not beginning with '#' and do the same thing.  They get indented.
> > I assume Bram Moolenar didn't do this as a practical joke, so it's a
> > mystery to me...  Can someone tell me the rationale, and how to make it
> > do what I want anyway?
> > 
> 
> Well, that doesn't happen to me, even when editing Python code. I have
> all the default syntax files that come with vim on Debian Unstable, and
> I haven't coded in Python yet so I just found some random script that is
> part of some package and tried it on that. I can imagine that some odd
> combination of tabstops, shiftwidths, etc. would lead to some weirdness.
> Personally, I use 
> 
>     set nocompatible
>     set tabstop=4
>     set shiftwidth=4
>     set expandtab
> 
> in my ~/.vimrc 
> 
> -Bryan


This is a subject I don't know much about because it's awfully
confusing, but I'll tell you what I (think I) know.

There are 3 indentation modes in Vim:

   1. cindent
   2. smartindent
   3. autoindent

The thing that makes it so confusing is that they're not mutually
exclusive.  You'd think they would be.  However, you can have all three
or any combination of two set.

In order to set any one of these indentation modes, you use the ex "set"
command.  To unset any of them, you'd use the ex "set" command but with
the "no" qualifier, like this:

   :set cindent        % Set cindent indentation mode.
   :set nosmartindent  % Unset the smart indentation mode.

First of all, unset all the modes:

   :set nocindent
   :set smartindent
   :set autoindent

And type this:

This is not a Python comment
This is not a Python comment
# This is a Python comment
# This is a Python comment
This is not a Python comment

Highlight the whole thing and use >> to indent it.  You'll see this:

   This is not a Python comment
   This is not a Python comment
   # This is a Python comment
   # This is a Python comment
   This is not a Python comment

Which is exactly what you want.  However, you don't get any of the
groovy automatic indentation that Vim is capable of.

Now type u to undo the indentation and type:

   :set cindent

And try the same thing.  You'll see:

   This is not a Python comment
   This is not a Python comment
# This is a Python comment
# This is a Python comment
   This is not a Python comment


Which isn't what you want.  The reason for this is that the cindent
indentation mode is for, well, C programs.  :-)   Preprocessor
statements don't have to be in column 0 but at some point they used to
(see -Wtraditional of the gcc man pages).

OK.  Undo the indenting, turn off cindent and turn on smartindent.

   u
   :set nocindent
   :set smartindent

Try our experiment again.  This is what you'll get:

   This is not a Python comment
   This is not a Python comment
# This is a Python comment
# This is a Python comment
   This is not a Python comment

Again, not what you want.  Undo the indenting, turn off smartindent and
turn on autoindent:

   u
   :set nosmartindent
   :set autoindent

And try again:

   This is not a Python comment
   This is not a Python comment
   # This is a Python comment
   # This is a Python comment
   This is not a Python comment

This is what you want.

This is pretty much all I know.  All three modes can be turned on at the
same time, and I have ZERO idea how they interact with each other.  One
of these days, I'm going to have to roll up my sleeves and really read
about this more.

Anyway, you may want to do something like:

   au BufNewFile,BufRead *.py set nocindent
   au BufNewFile,BufRead *.py set nosmartindent
   au BufNewFile,BufRead *.py set autoindent

But cindent may do something for Python programming that autoindent
doesn't.  You'll want to play around with this a bit.

There are ways to fine tune all this stuff.  The vim help pages (which I
don't consider as good as most people say they are, but I'll admit they
are complete) will have details about fine tuning these modes.  In
particular, you'll want to look at cinoptions, indentexpr, cinkeys,
cinwords and other things.

Whew!  Hope this helped!    :-)

Pete

-- 
GPG Instructions: http://www.dirac.org/linux/gpg
GPG Fingerprint: B9F1 6CF3 47C4 7CD8 D33E 70A9 A3B9 1945 67EA 951D

Good, Fast, Cheap.  Pick any two (you can't have all three)
   --- RFC 1925: The Twelve Networking Truths (The 7th truth)