Sunday, July 1, 2012

Re: Treat spaces as tabs only at the start of the line

On Saturday, June 30, 2012 5:34:35 PM UTC-5, Gerardo Marset wrote:
> I have sofftabstop (and shiftwidth) set to 4, and expandtab enabled. Thus, when deleting groups of spaces, vim treats them as tabs and deletes them 4 at a time. I want vim to do that only if from the start of the line and up to the cursor's position there's only spaces and nothing else.
> Currently I'm doing the following:
>
> inoremap <silent> <BS> <C-R>=fbs()<CR>
>
> function fbs()
> if getline('.') =~ '^ \{' . (col('.') - 1) . '}'
> return "\<BS>"
> endif
> return "\<Left>\<Del>"
> endfunction
>
> It works, but it breaks the repeat (dot) command, and I don't want that :). I think it's because of the <Left>. Any help (either modifying the previous code so that it doesn't break the dot command or coming up with a new one that doesn't) is appreciated.

You might try determining how many characters got deleted (getline in combination with your cursor position command may help here) and insert enough characters after the BS to make up for the difference. The thing interrupting your undo sequence (and therefore messing up your repeat command, '.') is the <Left> key, so you just need to avoid doing that. Dropping out of insert mode (even temporarily with <C-O>) will do the same thing unfortunately, and using setline() or setpos() is possible but will not be reflected in the repeat sequence without a lot of effort and additional mappings.

--
You received this message from the "vim_use" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

No comments: