Почему на консоли с 80 колонками имеется 11 таблиц?

Вы могли бы предположить, что, поскольку каждая вкладка по умолчанию перемещает 8 столбцов, консоль на 80 столбцов будет иметь ровно 10 табулок. Это может быть опровергнуто:

$ printf "1\t2\t3\t4\t5\t6\t7\t8\t9\t0\ta" 

Можно было бы ожидать, что вывод будет в 2 строках, потому что есть 10 табулок, забирая комнату из всех 80 столбцов плюс один символ, который должен быть перенесен на следующую строку. Но команда создает единственную выходную строку в xterm, gnome-terminal и rxvt.

  • Как Terminal.app обнаруживает изменение параметров терминала?
  • Удаление escape-символов из экранного экрана GNU Screen.% N
  • Пытаясь установить Astromenace на мой linux mint 14 cinnamon pc
  • Повторение вывода в файл при одновременном просмотре его в консоли
  • Альтернативы cd / ls для навигации по командной строке?
  • Какова команда вырезать часть из видео и сохранить ее с помощью ffmpeg?
  • Случилось так, что последняя вкладка-стоп магически занимает на один символ меньше места.

    Между тем, expand (1) утверждает, что пространство табуляции равно 8, таким образом

     $ printf "1\t2\t3\t4\t5\t6\t7\t8\t9\t0\ta" | expand 

    Волшебным образом создаст 2 строки на консоли с 80 колонками.

    Это похоже на какой-то стандарт. Но я просто не могу найти источник по поиску.

    Протестировано только в Linux, но я боюсь, что это разделяет все unix.

  • Как автоматически загружать byobu при запуске терминала?
  • Как прокручивать вверх в окне терминала, в то время как новый ввод генерируется без отбрасывания назад (внизу)
  • Новая вкладка gnome-terminal в одном и том же пути
  • Альтернативы cd / ls для навигации по командной строке?
  • Какова команда вырезать часть из видео и сохранить ее с помощью ffmpeg?
  • Закрыть соединение SSH
  • One Solution collect form web for “Почему на консоли с 80 колонками имеется 11 таблиц?”

    На консоли с 80 колонками имеется всего 9 таблиц.

    Давайте сначала рассмотрим комментарий. На самом деле вы не протестировали какие-либо консоли. Это все эмуляторы эмуляторов терминала GUI. К счастью, фактические консоли (по крайней мере, в Linux и FreeBSD) также демонстрируют такое поведение.

    Но это не то поведение, которое вы утверждаете. Он не демонстрирует 11 tabstops. Это демонстрирует 9.

    Чтобы правильно понимать tabstops, вам нужно выбросить «Они всегда расширяются до N пробелов». идея. Если у вас есть доступ к механической пишущей машинке с вкладками, перейдите и посмотрите, как она работает (при этом вкладки устанавливаются выступающими штифтами на каретке). Табстопы в терминалах в мирах Unix и Linux работают таким образом .

    (Можно настроить линейную дисциплину, чтобы ввести мягкие вкладки, заменяя символы табуляции в выходном потоке символами пробела, прежде чем они когда-либо достигнут терминала. Мы обсуждаем жесткие вкладки, выполняемые самим терминалом, а не линейной дисциплиной, хотя С жесткими вкладками на терминал отправляется символ TAB с костяной добротой. С мягкими вкладками, наоборот, поведение, которое вы описываете, не происходит в первую очередь. Попробуйте установить stty tab3 и посмотрите.)

    Как инициализировано, терминал не имеет никаких настроек табуляции . На ранней стадии, getty или команда reset или что-то похожее (это зависит от системы) выводит серию символов пробела и escape-последовательностей, которые устанавливают tabstops в определенных столбцах. Иногда столбцы и даже escape-последовательности жестко привязаны. Однако чаще всего команда ищет информацию в базе данных termcap / terminfo. Функция terminfo, предоставляющая escape-последовательность для очистки всех вкладок, – tbc ; hts дает escape-последовательность для установки вкладки в текущем столбце; И it способность указывает количество столбцов между вкладками по умолчанию. Для termcap эквивалентными возможностями являются: ct и st .

    Команда получает размер терминала (из ядра, через системный вызов или из другой части записи terminfo / termcap), просматривает количество столбцов и многократно выводит it пробелы, за которыми следует последовательность st для количества столбцов, таких как Он может, наконец, вывести возврат каретки, чтобы вернуться в столбец # 0. Именно так вы устанавливаете множество табустановок на многих механических пишущих машинах: пробел многократно до следующего таблоста, нажмите рычаг «set tabstop», чтобы вытолкнуть булавку, повторите до правого края, нажмите на каретку влево ,

    Для терминала с шириной в 80 колонок, с которой it задан как 8, как обычно, команда выполняет это девять раз, устанавливая вкладки в столбцах 8, 16, 24, 32, 40, 48, 56, 64 и 72.

    В столбце 0 нет tabstop (запрет ошибки программы). Это ваша первая ошибка подсчета. В столбце 80 также нет табустопа, вторая ошибка подсчета. «Почему», спросите вы, «это?». Во-первых, это потому, что в столбце 80 невозможно установить tabstop. Курсор переместится от столбца 0 в столбец 79 на терминале с 80 столбцами.

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

    Символ TAB на терминалах Unix и Linux фактически работает одинаково . В ответ на это терминал испускает пробелы, пока не будет достигнут следующий набор tabstop или самый правый столбец . И вот что здесь происходит. Когда курсор находится в столбце 79, вы можете записать столько символов TAB сколько хотите, и ничего не произойдет. За пределами самой правой колонки нет вкладок.

    Система termcap / terminfo позволяет настраивать жесткие вкладки как необязательные. Но программы, которые вы протестировали, предоставляют эмулятор термина «xterm». (Управляющие последовательности, которые он понимает, это те, которые указаны в записи / записи xterm в базе данных termcap / terminfo.) Так же, в настоящее время, эмулятор терминала на виртуальной консоли FreeBSD. Эмулятор терминала в виртуальной консоли Linux фактически представляет собой немного другой тип терминала, обозначенный как linux . (Это имело место и для виртуальной консоли FreeBSD, которая имела тип cons25 . FreeBSD сменил эмулятор ядра ядра на xterm-совместимый в версии 9.0, как часть проекта, чтобы получить поддержку UTF-8 на виртуальных консолях .) Все эти xterm-alike и эмулятор терминала ядра Linux имеют полностью настраиваемый жесткий механизм вкладок.

    (Для тех, кто любит читать источник: посмотрите на функции TabNext() и TabToNextStop() в tabs.c в исходном коде xterm .)

    Вы можете попробовать это для себя. Выполните следующие команды:

     tbc=$(tput tbc) hts=$(tput hts) printf '%s\r%s\r\n' "${tbc}" "a${hts}aaa${hts}aaaaaaa${hts}aaaaaaaaaaaaa${hts}aaaaaaaaaaaaaaaaaa${hts}" 

    Затем запустите команду еще раз. Было установлено ровно пять табуляторов. Подсчитайте ${hts} в команде или посмотрите на строку символов. Помимо пятого, характер TAB приводит к тому, что метафорическая тележка для пишущей машинки переходит во все остальное время до правого края.

    Следующий (печатный, не TAB ) символ приводит к возврату автоматической каретки в левое поле и перевод строки в следующую строку. Терминология termcap / terminfo, тип терминала xterm имеет автоматические поля . Теоретически Unix и Linux могут работать с терминалами, которые не имеют автоматических полей. Ваша команда printf застряла бы в столбце 79, неважно, сколько еще вы выведете, пока не напишете возврат каретки. На практике такое устройство в последнее время удручало бы умы большинства людей.

    Давайте будем гением компьютера.