суббота, 28 января 2017 г.

Замена пробелов табами и наоборот

Следуя PSR, мой редактор настроен на работу с отступами в 4 пробела, эта настройка применяется при открытии/сохранении файла, заменяя все лишние табы на пробелы.
Однако бывает так что некоторые файлы проекта обязаны иметь в качестве отступов табы. Так как мне лень ковыряться в настройках редактора и вводить какие-нибудь исключения-шмисключения, я сделал себе такой воркфлоу:
  • открываю нужный файл в редакторе
  • редактирую
  • сохраняю
  • командой unexpand заменяю пробелы на табы обратно.
Собственно, сегодня речь пойдет о командах unexpand и expand.

Начну с unexpand, так как ей приходится пользоваться чаще.
Итак, unexpand заменит в файле пробелы на табуляции. Синтаксис прост:
> unexpand spaced_file.js

Здесь надо отметить три момента:
  • Результат выполнения будет выведен в stdout. 
  • На табуляцию будут заменены последовательности в 8 пробелов. То есть последовательности меньше чем из 8 пробелов - не заменятся на таб, а больше 8 пробелов - заменятся на число табов, кратное восьми
  • Замена будет произведена в началах строк (что в общем случае и требуется)
Следующий пример:
> unexpand spaced_file.js > tabbed_file.js

Здесь мы по-прежнему заменяем 8 пробелов на таб, но результат уже записываем в другой файл (tabbed_file.js). Кстати, использование одного и того же файла в качестве входного и выходного приводит к тому что файл становится пустым, поэтому лишний раз не экспериментируйте.

Добавляем опцию с длиной последовательности пробелов:
> unexpand spaced_file.js -t 4 > tabbed_file.js

Здесь мы заменяем на таб последовательности из 4 символов.
Флаг t также может поддерживать список из длительностей пробельных последовательностей, например:
> unexpand spaced_file.js -t 2,4 > tabbed_file.js

Но закономерности такой замены вам предстоит выяснить самим)
Наконец, чтобы заменить вообще любые пробельные символы в тексте, а не только те, что в начале строк, - используйте флаг a
> unexpand spaced_file.js -a > tabbed_file.js

Перейдем к expand, команда работает ровно наоборот - заменяет табы на пробельные последовательности определенной длины. Примеры:
# Заменяем ЛЮБЫЕ табы на последовательности из 8 пробелов, поведение по умолчанию
> expand tabbed_file.js > spaced_file.js
# Заменяем ЛЮБЫЕ табы на последовательности из 4 пробелов
> expand tabbed_file.js -t 4 > spaced_file.js
# Заменяем табы в начале строк на последовательности из 2 пробелов
> expand tabbed_file.js -i -t 2 > spaced_file.js
# Вывод в тот же файл также сделает его ПУСТЫМ, повнимательнее


Хелп по командам можно получить по флагу --help

Комментариев нет:

Отправить комментарий