Простое решение проблемы смешанного форматирования

В программировании использование табуляции для создания отступов и форматирования исходного кода является темой для непрекращающихся дискуссий. Некоторые программисты полагают, что использование 8 пробелов для представления одного символа табуляции слишком много, мотивируя это тем, что просмотр кода с большим уровнем вложенности (и, как следствие, с большими отступами) затруднён. Программисты, предпочитающие использовать табуляцию, отвечают тем, что код с большим уровнем вложенности неудачен сам по себе.

Есть много аргументов как за использование табуляции, так и против. Тем не менее, при использовании табуляции возникают проблемы, если у человека, редактирующего впоследствии код, редактор сконфигурирован расширять табуляцию другим количеством пробелов. В результате в некоторых строках для отступах будет использоваться табуляция, в некоторых — пробелы или смесь из пробелов и табуляции. При просмотре в другом редакторе такой код может выглядеть просто ужасно.

К счастью, в Linux проблема решается очень просто (причем как для замены табуляции пробелами, так и наоборот).

Рассмотрим два случая. В обоих случаях будем полагать, что нам нужно произвести глобальную замену во всех файлах с расширением PHP.

Случай 1. Замена табуляций на пробелы.

Расширение табуляции до четырёх пробелов:

[-]
View Code Bash
find . -name "*.php" -type f -print0 | xargs -0 -I {} sh -c 'expand -t 4 "{}" | cat > "{}"'

Расширение табуляции до восьми пробелов:

[-]
View Code Bash
find . -name "*.php" -type f -print0 | xargs -0 -I {} sh -c 'expand -t 8 "{}" | cat > "{}"'

Расширение табуляции до восьми пробелов, не затрагивая символы табуляции, находящиеся после пробелов:

[-]
View Code Bash
find . -name "*.php" -type f -print0 | xargs -0 -I {} sh -c 'expand -t 8 -i "{}" | cat > "{}"'

Случай 2. Замена пробелов на табуляцию.

Установка размера табуляции в 8 пробелов

[-]
View Code Bash
find . -name "*.php" -type f -print0 | xargs -0 -I {} sh -c 'unexpand -t 8 "{}" | cat > "{}"'

Установка размера табуляции в 4 пробела

[-]
View Code Bash
find . -name "*.php" -type f -print0 | xargs -0 -I {} sh -c 'unexpand -t 4 "{}" | cat > "{}"'

Установка размера табуляции в 4 пробела с заменой только начальных пробелов

[-]
View Code Bash
find . -name "*.php" -type f -print0 | xargs -0 -I {} sh -c 'unexpand -t 4 --first-only "{}" | cat > "{}"'

Кстати, очень интересно замечание Линуса Торвальдса:

Tabs are 8 characters, and thus indentations are also 8 characters. There are heretic movements that try to make indentations 4 (or even 2!) characters deep, and that is akin to trying to define the value of PI to be 3.
Добавить в закладки

Связанные записи

14
Май
2008

Комментарии к статье «Простой способ глобальной замены табуляции на пробелы или наоборот» (4)  »

  1. Vladimir says:

    К табуляции не относится, но всё равно красивая магия с командной строкой: “глобальное” редактирование файлов: убираем строку define ('EM_TOPADMIN', false); из всех файлов wp-config.php:

    [-]
    View Code Bash
    find /home -maxdepth 3 -name "wp-config.php" -type f -print | xargs -I {} sh -c "cat '{}' | sed \"s/define ('EM_TOPADMIN', false);//\" | cat > '{}'"

    Что примечательно, так работать не будет:

    [-]
    View Code Bash
    find /home -maxdepth 3 -name "wp-config.php" -type f -print | xargs -I {} sh -c "cat '{}' | sed \"s/define ('EM_TOPADMIN', false);//\" > '{}'"
  2. Mike says:

    Эти комманды не работают! В них expand и cat одновременно читают и пишут в один файл.

  3. Vladimir says:

    Mike, Вы не поверите, но они работают. Точнее, работает только первый вариант. Вспомните, как работает pipeline в bash: стандартный вывод первой команды подается на стандартный ввод для второй через pipe; при этом соединение осуществляется до перенаправления ввода-вывода. Грубо говоря, работать это будет следующим образом:

    [-]
    View Code Bash
    DATA=`cat myfile`
    echo -e "$DATA" > myfile
  4. Mike says:

    Тогда я не понимаю, почему следующая команда оставила в моем проекте половину пустых файлов.

    find . -name “*.java” -type f -print0 | xargs -0 -I {} sh -c ‘expand -t 4 “{}” | cat > “{}”‘

    При сохранении во временный файл все заработало

    find . -name “*.java” -type f -print0 | xargs -0 -I {} sh -c ‘expand -t 4 “{}” > /tmp/f && cat /tmp/f > “{}”‘

Подписаться на RSS-ленту комментариев к статье «Простой способ глобальной замены табуляции на пробелы или наоборот» Trackback URL: http://blog.sjinks.org.ua/linux/144-easy-way-to-replace-spaces-with-tabs-or-opposite/trackback/

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

Вы можете использовать данные тэги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Оставляя комментарий, Вы выражаете своё согласие с Правилами комментирования.

Подписаться, не комментируя