2012-06-29 3 views
1

У меня нет проблем, мне просто интересно.Как заменить на расширенную вкладку в vim

Вот часть моего .vimrc.

set tabstop=4 
set shiftwidth=4 
set expandtab 

Я хочу заменить в тексте все notab с <-here is a tab

поэтому команда должна быть:

:%s/notab/^I<-here is a tab/ 

которым дают мне реальную вкладку, поэтому для того, чтобы заменить его на 4 места в необходимо позвонить по телефону :retab

Аналогичные результаты за один раз (сразу добавить 4 пробела):

:%s/notab/ <-here is a tab/

Но это не удобно, это первая версия включает реальную вкладку в тексте, которым тот требуется retabed и вторая версия зависит от количества пространства, определенного для одной вкладки.

Есть ли общий способ сделать это?

+1

Что вы хотите сделать? Заменить 'notab' таблицей или заменить ее на 4 пробела? – romainl

ответ

4

Я думаю, что это должен делать именно то, что вы хотите:

:%s/notab/\=repeat(" ", &tabstop)/ge 
+0

Это работает только в том случае, если «notab» находится в положении, где (col-1)% & tabstop == 0. – ZyX

+0

@ZyX Как-то я никогда не совершал мое редактирование, которое так много говорило. Ммм. Это была очень напряженная рабочая неделя ... Еще раз спасибо – sehe

1

@ ответ sehe работает хорошо, если notab помещается в начале строки (если (кол-1)% & табуляцией == 0, но с переменной & tabstop это гарантируется, только когда col == 1). Если вы не в порядке ни с %s/notab/\t/ge | retab (т. Е. Ваш вариант соединяется в одну строку с использованием символа) (возможно, потому что уже есть вкладки, которые нельзя отбрасывать, я не вижу других причин), ни с ответом @ sehe, который у вас есть для использования гораздо более сложного кода:

function ToExpTab(pat) 
    for lnr in range(1, line('$')) 
     let line='' 
     let chunks=split(getline(lnr), a:pat, 1) 
     if len(chunks)<=1 
      continue 
     endif 
     for chunk in chunks[:-2] 
      let line.=chunk 
      let line.=repeat(' ', &tabstop-(strdisplaywidth(line))%&tabstop) 
     endfor 
     let line.=chunks[-1] 
     call setline(lnr, line) 
    endfor 
endfunction 
call ToExpTab('notab') 
Смежные вопросы