Пишу, по большей части, про историю, свою жизнь и немного про программирование.

Как преобразовать пробелы в табуляции в вашей программе

По code guidelines PHPbb в коде нужно использовать табуляции, вместо пробелов. К сожалению, я об этом поздновато узнал, теперь надо всё, что я написал привести к правильному виду.

Оказывается, в Linux есть специальная утилита для этого — unexpand (находится в пакете coreutils). Кстати, есть и противоположная по действию утилита — expand.

19 комментариев
hshhhhh.name 2010

find -name ’*.php’ -exec sed -i ’s/ /\t/;’ ’{}’;

Евгений Степанищев (bolknote.ru) 2010

Комментарий для hshhhhh.name:

Как заменить только те пробелы, которые в начале строки?

astur (astur.net.ru) 2010

Комментарий для hshhhhh.name:

Хорошее направление мысли, но такая строчка исправит все пробелы, а не только форматирующие. Можно, конечно сделать что-то типа `’s/^ /\t/’`, но тогда надо будет прогонять несколько раз (тем больше, чем глубже форматирование отступами). Всё-таки, coreutils — это не просто по приколу.

Евгений Степанищев (bolknote.ru) 2010

Комментарий для hshhhhh.name:

Естественно, должны заменяться по количеству пробелов, 16 пробелов — две табуляции, 8 — одна.

Илья Бирман 2010

Я думал это любой текстовый редактор умеет делать. Text → Entab (или Detab) в ББЭдите, например.

Евгений Степанищев (bolknote.ru) 2010

Комментарий для Илья Бирман:

Понятия не имею. А зачем мне текстовый редактор, если всё можно сделать одной строкой?

Viperet (viperet.info) 2010

Такая функция есть в каждом первом текстовом редакторе для программистов, ну и perl-программисты за 5 минут напишут соответствующий скрипт в одну строчку или оформят в форме какого нибудь верблюда, по желанию...
Кстати, приятно — expand и unexpand есть в MacOS, ничего ставить не надо

hshhhhh.name 2010

Комментарий для astur.net.ru:

Хорошее направление мысли, но такая строчка исправит все пробелы, а не только форматирующие.

find -name ’*.php’ -exec sed -i ’s/^( ){24}/\t\t\t/;s/^( ){16}/\t\t/;s/^( ){8}/\t/;’ ’{}’;

hshhhhh.name 2010

Комментарий для Евгения Степанищева:

16 пробелов — две табуляции, 8 — одна.

дикость какая. всю жизнь считал что табуляция = 4 пробела.

hshhhhh.name 2010

Комментарий для viperet.info:

perl-программисты за 5 минут напишут соответствующий скрипт в одну строчку или оформят в форме какого нибудь верблюда

а другие, другие программисты справятся?

Евгений Степанищев (bolknote.ru) 2010

Комментарий для hshhhhh.name:

find -name ’*.php’ -exec sed -i ’s/^( ){24}/\t\t\t/;s/^( ){16}/\t\t/;s/^( ){8}/\t/;’ ’{}’;

Ну вот оно надо так извращаться? Если можно одной командой сделать. Тем более, что тут всего лишь третья вложенность.

дикость какая. всю жизнь считал что табуляция = 4 пробела.

Табуляция обычно равна 4 или 8 пробелам. Например, в DOS это 8 символов.

Евгений Степанищев (bolknote.ru) 2010

Комментарий для viperet.info:

Такая функция есть в каждом первом текстовом редакторе для программистов

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

ну и perl-программисты за 5 минут напишут соответствующий скрипт в одну строчку или оформят в форме какого нибудь верблюда, по желанию

Да есть уже такая утилита, вот на: unexpand, зачем писать ещё что-то?

hshhhhh.name 2010

Комментарий для Евгения Степанищева:

Ну вот оно надо так извращаться?

По-моему весело. Можно еще и регу модную написать а не тупо копипасту :). Ну и я не мастер bash’a, там наверняка есть более хитрые решения.

На повершелле так же легко можно сделать?

Евгений Степанищев (bolknote.ru) 2010

Комментарий для hshhhhh.name:

На повершелле так же легко можно сделать?

Ну, можно сделать замену пробелов в начале строки для любого уровня, например, так:

cat file | %{ If ($_ -match ’^(?: {4})+’) { $_ -replace $matches[0], («`t» * ($matches[0].length / 4)) } Else {$_} }

jankkhvej (jankkhvej.blogspot.com) 2010

В чём вы работаете, в каком редакторе? Вы вручную там отступы делали пробелами? Или специально делали всё пробелами?

Евгений Степанищев (bolknote.ru) 2010

Комментарий для jankkhvej.blogspot.com:

В чём вы работаете, в каком редакторе?

В данном проекте я пользовался FARом

Вы вручную там отступы делали пробелами? Или специально делали всё пробелами?

У меня стоит настройка «преобразовывать табуляции в пробелы».

jankkhvej (jankkhvej.blogspot.com) 2010

Комментарий для Евгения Степанищева:

У меня стоит настройка «преобразовывать табуляции в пробелы».

Но зачем?!

Евгений Степанищев (bolknote.ru) 2010

Комментарий для jankkhvej.blogspot.com:

Я, в последнее время, пишу чаще всего на Python, а там используются 4 пробела в качестве отступа: http://www.python.org/dev/peps/pep-0008/

Но есть люди, которые не соблюдают style guide, лучше автоматически исправлять исходники.

jankkhvej (jankkhvej.blogspot.com) 2010

Комментарий для Евгения Степанищева:

Удивлён предпочтением к пробелам в Python. Рад, что там всё-таки не отказались от \t.