Subject: bug#8196: 23.1; Feature request with code: "C-x TAB" to understand tab-stop-list

From: Drew Adams <[email-masked]>
Date: Fri, 12 Jul 2013 12:11:31 -0700 (PDT)

> > I think it would be better if "C-x TAB" (bound to indent-rigidly)
> > advanced the indentation to the next tab stop (as in tab-stop-list) by
> > default, instead of by 1. Similarly, if negative prefix argument were
> > given (with "C-u -") it would change the indentation to the previous
> > tab stop.

Sorry, that does not make sense to me.

What is the "next" or "previous" tab stop?  Relative to what/where?

`indent-rigidly' is for indenting the lines in the region, all of which
might all be currently indented to different columns.  Do you pick the
indentation of one of those lines to measure the "next" or "previous" tab
stop from?  If so, which one?  Or do you measure from point (in which case
it matters which end of the region point is.

Even if you abandon the notion of a next/previous tab stop, because there
is no good answer to "Next/previous to what?", you still have a problem
if you intend to indent to ANY particular tab stop.  You cannot indent lines
RIGIDLY to any particular tab stop, unless they all happen to be indented to
the same column to begin with.  Otherwise, "to" any column has no sense.

Indenting rigidly is about indenting a particular amount, not indenting to
some column.

What you can do is indent the region rigidly a certain number of tab stops
(either direction).  For that, see below.

> > Only when the prefix argument is actual number, positive or
> > negative integer, it would move the indentation to the left or right
> > by the given count.
> 
> Any opinions on this? If you want to use the code in my first message
> just go on. The copyright assignment paperwork is done.

I am definitely against such a change, regardless of what you might actually
mean by the next/previous tab stop.

Such a change would not be great for interactive use, and it would certainly
be bad for Lisp use.  Existing code depends on the current behavior.

If you want a command that indents rigidly a certain number of tab stops (and
not TO a particular tab stop), that is easy enough to define.  Here is one
such definition.  The prefix arg specifies the number of tab stops to indent,
and a negative number means count backwards from the end of `tab-stop-list':

(defun indent-rigidly-to-tab-stop (start end nth)
  "Indent the region rigidly according to the NTH tab stop.
`tab-stop-list' defines the available tab stops.  NTH is the numeric
prefix arg.  One means indent rigidly the amount given by the first
tab stop.  If NTH is negative then indent negatively (outdent)."
  (interactive "r\np")
  (unless (zerop nth)
    (let ((tabstop  (nth (mod (1- (abs nth)) (length tab-stop-list))
                         tab-stop-list)))
      (indent-rigidly start end (if (natnump nth) tabstop (- tabstop))))))