Vim retab пробелы только в начале строк - PullRequest
7 голосов
/ 02 марта 2011

Я использую

:set noet|retab!

Но проблема, с которой я сталкиваюсь, заключается в замене всех экземпляров 4 пробелов на вкладки во всем файле.Мне нужен vim, чтобы заменить только 4 пробела в начале строк.

Если я удалю!в конце retab пробелы нигде не заменяются.

Я пытался использовать пользовательскую функцию, которую кто-то создал:

" Retab spaced file, but only indentation
command! RetabIndents call RetabIndents()

" Retab spaced file, but only indentation
func! RetabIndents()
    let saved_view = winsaveview()
    execute '%s@^\( \{'.&ts.'}\)\+@\=repeat("\t", len(submatch(0))/'.&ts.')@'
    call winrestview(saved_view)
endfunc

, но при запуске я получаю небольшое сообщение об ошибке:

:RetabIndents

Обнаружена ошибка при обработке функции RetabIndents:

строка 2:

E486: шаблон не найден: ^ ({4}) +

Ответы [ 2 ]

9 голосов
/ 02 марта 2011

Поговорив с другими людьми об этом, мне нужно было добавить молчание!Команда перед выполнением.Вот что я сейчас работаю:

autocmd BufWritePre * :RetabIndents
command! RetabIndents call RetabIndents()

func! RetabIndents()
    let saved_view = winsaveview()
    execute '%s@^\(\ \{'.&ts.'\}\)\+@\=repeat("\t", len(submatch(0))/'.&ts.')@e'
    call winrestview(saved_view)
endfunc

Так что теперь эта функция будет автоматически заменять пробелы символами табуляции в начале каждой строки.

0 голосов
/ 28 января 2017

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

Использование BSD sed:

sed -i "" -e ':loop' -e "s/^\([ ]*\)  /\1   /" -e 't loop' somefile.sh

* примечание: (i) символ в квадратных скобках является символом табуляции (ii) символ после / \ 1 также является символом табуляции. Обе вкладки cgharacters вводятся в терминал с помощью комбинации клавиш Ctrl + v + Tab.

Использование GNU sed:

sed -i -e ':loop' -e 's/^\([\t]*\)  /\1\t/' -e 't loop' somefile.sh
...