On Fri, Oct 27, 2006 at 04:46:02PM +0100, A. S. Budden wrote:
> Dear all,
>
> I've recently started using the CleverTab function below, modified from
> the bottom of the comments page on tip 102. This is brilliant from my
> point of view:
>
> - tab produces tabs at the start of the line for indenting*;
> - tab shows the longest unique option in the omnicomplete list
> when using omnicompletion;
> - tab cycles through the list of completions if the popup menu is
> visible but omnicompletion isn't used;
> - otherwise, it returns a tab.
>
> What I'd like to do is change the last one of those so that it puts in
> enough spaces to reach the next tabstop so that good formatting is
> maintained regardless of the tabstop setting on a users editor.
>
> However, I can't figure out how to achieve this.
>
> The 'expandtab' option is no use as it will change the tabs at the start
> of the line (used for indentation) to spaces, which will result in a
> really badly formatted piece of source code (as it is edited by several
> people who all like different tab stops)*. Similarly, replacing "\<Tab>"
> in the last return line with " " is no use as it will always insert
> four spaces, even if we're halfway through a tab stop (it's also not
> very flexible for different tabstop settings).
>
> Can anyone offer any suggestions for this?
[snip]
The 'expandtab' option does not affect existing tabs in the file
(unless you :retab) so it should be safe to have your function reset/set
it depending on whether you are at the start of the line or not. I have
not tested this.
For another approach, pretty much what you suggested, look at the
VarTab() function in foo.vim, my file of example vim functions:
http://www.vim.org/script.php?script_id=72
This function returns a calculated number of spaces, and it should be
pretty easy to use the same idea for your function. (It just takes a
little :while loop.)
HTH --Benji Fisher