Таблицы в Emacs

Ниже приводится описание пакета table.el Такааки Ота.


Введение

Этот пакет предоставляет возможности по созданию и редактированию таблиц. С этим пакетом становится возможным редактирование таблиц внутри текстового документа прямо в Emacs, подобно тому, как это делается в современных текстовых процессорах WYSIWIG. Таблица представляет собой прямоугольную текстовую область, состоящую из рамки вокруг и содержимого внутри. Содержимое как правило разделено на множество прямоугольных ячеек. См. например, таблицы ниже по тексту в данном документе. Как только таблица распознана, операция редактирования ячейки таблицы ограничена определенной прямоугольной областью ячейки. Это означает, что печатание и удаление символов внутри ячейки не влияет на текст снаружи, а приводит к изменению форматирования только содержимого ячейки. Ячейка будет автоматически расширена по горизонтали или вертикали, если это необходимо для того, чтобы вместить добавленный текст. Пакет не использует ни главных, ни второстепенных режимов, так как необходимый текст локализован внутри буфера.


Функции

Если вы только хотите попробовать поработать с этим пакетом, загрузите его при помощи M-x load-file RET. Укажите имя файла “table.el”. Затем переключитесь на новый тестовый буфер и выполните команду M-x table-insert RET. Она попросит вас ввести количество столбцов и строк таблицы, а также ширину и высоту ячеек. Задайте какие-нибудь небольшие значения для каждого из параметров. Поиграйте немного с получившейся таблицей. Обратите внимание на появившийся пункт “Table” в меню “Tools”, а также на меню “Table”, появляющееся когда курсор находится внутри таблицы.

Если вы хотите использовать пакет постоянно, поместите файл table.el в каталог локальных библиотек (site library directory) и добавьте следующую строку в ваш файл .emacs:

  (require 'table)

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

  (add-hook 'text-mode-hook 'table-recognize)

Ниже следует таблица функций с кратким описанием каждой из них. Все таблицы, разумеется, созданы при помощи этого пакета. Не все команды привязаны к клавишам. Многие из них должны вызываться через M-x (execute-extended-command).

Функции, доступные пользователю

  • table-insert — Вставить таблицу из указанного количества столбцов и рядов, с ячейками указанной ширины и высоты.
  • table-insert-row — Вставить ряд(ы) ячеек перед текущей строкой с той же самой структурой строки.
  • table-insert-column — Вставит колонки ячеек перед текущей колонкой с той же самой структурой, что и текущая.
  • table-delete-row — Удалить ряд(ы) ячеек. Ряд должен состоять из ячеек одной высоты.
  • table-delete-column — Удалить колонку (колонки). Колонка должна состоять из ячеек одной и той же высоты.
  • table-recognize — Распознать все таблицы в текущем
  • table-unrecognize — буфере и активизировать/ девктивизировать из.
  • table-recognize-region — Распознать все ячейки в регионе
  • table-unrecognize-region — и активизировать/деактивизировать их.
  • table-recognize-table — Распознать все ячейки в одиночной
  • table-unrecognize-table — таблице и автивизировать/ дактивизировать их.
  • table-recognize-cell — Распознать ячейку. Найти ячейку,
  • table-unrecognize-cell — содержащую курсор и автивизировать /деактивизировать ее.
  • table-forward-cell — Переместить курсор на N ячеек вперед в таблице.
  • table-backward-cell — Переместить курсор на N ячеек назад в таблице.
  • table-span-cell — Расширить текущую ячейку в указанном направлении и объединить ее со следующей. Направление может быть: влево, вправо, вверх или вниз.
  • table-split-cell-vertically — Разбить текущую ячейку по вертикали с создать по ячейке над и под текущим местоположением.
  • =table-split-cell-horizontally=Разбить текущую ячейку по горизонтали и создать по ячейке слева и справа от текущего местоположения.
  • table-split-cell — Разбить текущую ячейку по вертикали или горизонтали. Это всего лишь “обертка” для двух предыдущих команд.
  • table-heighten-cell — Увеличить высоту текущей ячейки.
  • table-shorten-cell — Уменьшить высоту текущей ячейки.
  • table-widen-cell — Увеличить ширину текущей ячейки.
  • table-narrow-cell — Уменьшить ширину текущей ячейки.
  • table-fixed-width-mode — Переключить режим фиксированной ширины. В этом режиме колонки никогда не меняют своей ширины, в то время как в обычном режиме ячейка автоматически раздвигается чтобы предотвратить перенос слова на другую строку. Режим фиксированной ширины использует инвертированный шрифт и подчеркивание для индикации.
  • table-query-dimension — Вычислить и показать текущие размеры ячейки, таблицы, количество строк и колонок таблицы.
  • table-generate-source — Генерировать исходный код текущей таблицы на заданном языке и вставить его в заданный буфер.
  • table-insert-sequence — Пройти по каждой ячейке вперед по таблице и вставить заданную строку в каждую ячейку.
  • table-capture — Преобразовать простой текст из выделенной области в таблицу.
  • table-release — Преобразовать таблицу в простой текст путем удаления рамки таблицы.
  • table-justify — Выровнять содержимое ячеек.

Примечание

Вы можете обнаружить, что некоторые общие команды для работы с таблицами не реализованы, например копирование и вставка строк и столбцов. Однако эти функции легко реализуются через стандартные команды Emacs’а. Со строками легко работать через команды выделения, а столбцы можно копировать с помощью прямоугольного выделения. В конце концов, таблица остается частью текста в буфере.

Функция table-generate-html, появившаяся в ранних релизах, теперь не должна использоваться. Вместо нее используется table-generate-source. Теперь HTML трактуется как один из языков для описания логической структуры таблиц.


Клавиатура

Команды, доступные в ячейке таблицы

  • TAB — Переместить курсор в начало следующей ячейки.
  • C-> — Расширить текущую ячейку.
  • C-< — Сузить текущую ячейку.
  • C-} — Увеличить высоту текущей ячейки.
  • C-{ — Уменьшить высоту тукущей1 ячейки.
  • C-- — Разбить текущую ячейку вертикатьно.
  • C-| — Разбить текущую ячейку горизонтально.
  • C-* — Объединить ячейки.
  • C-+ — Insert row(s)/column(s).
  • C-! — Переключиться между обчным режимом и режимим с фиксированной шириной.
  • C-# — Показать размеры ячейки и таблицы.
  • C-^ — Генерировать исходный код на выбранном языке из текущей таблицы.
  • C-: — Выровнять содержимое ячейки (ячеек).

Вы можете использовать сочетания C-key, так и
C-c C-c key.


Меню

После загрузки пакета в меню “Tools” появится соответствующее подменю, “Table”, в котором собраны. Команды, приведенные в этом подменю, ограничены командами создания и инициализации таблиц, создания строк и колонок, а также распознавания таблиц. Как только таблица создана и курсор перемещен в одну из ячеек, в главном меню появляется еще один пункт “Table”. Команды этого меню предоставляют полный контроль над манипуляциями с таблицей: навигация по ячейкам, вставка, разбивка, слияние, расширение, сужение ячеек, строк и колонок. В дополнение к двум предыдущим меню по нажатию правой кнопки мыши внутри ячейки доступно контекстное меню. Преимущество контекстного меню состоит в том, что оно совмещает выбор места (ячейки, местоположения внутри ячейки) с выбором операции над выбранным объектом.


Определение таблиц и ячеек

В этом пакете нет никакого магического искусственного интеллекта. Определение таблицы и ячейки в таблице было сознательно ограничено для достижения приемлемого быстродействия в интерактивных операциях в реализации на Emacs Lisp. Допустимая таблица представляет собой прямоугольную область текста, состоящую из правильных ячеек. Допустимая ячейка — это прямоугольная область текста, все четыре края которой состоят из допустимых символов рамки. Ячейки не могут быть вложенными и не могут перекрывать друг друга. Допустимым символом для вертикальной границы является либо вертикальная черта “|” (table-cell-vertical-char), либо символ пересечения “+” (table-cell-intersection-char). Ячейка должна содержать по меньшей мере один пробел. Нет никаких ограничений на содержимое ячейки таюлицы, однако настоятельно не рекомендуется использовать внутри ячейки символы рамок ячеек. Как правило нзначительное число таких символов вполне допустимо. Тем не менее, вполне возможно, что они могут образовать ложную ячейку (или ее часть), что может повлиять на правильное распознование таблицы. Если такое случится, программа будет введена в заблуждение и может ошибиться в определении размера ячейки.

Ниже следуют примеры допустимых таблиц.

+--+----+---+     +-+     +--+-----+
|  |    |   |     | |     |  |     |
+--+----+---+     +-+     |  +--+--+
|  |    |   |             |  |  |  |
+--+----+---+             +--+--+  |
                          |     |  |
                          +-----+--+

Следующие пять примеров демонстрируют неправильные таблицы.
(Слева направо: 1. вложенные ячейки; 2. перекрывающиеся и
непрямоугольные ячейки; 3. непрямоугольная таблица; 4.
нулевая ширина или высота ячеек; 5. нулевая размерность
ячейки)

+-----+    +-----+       +--+    +-++--+    ++
|     |    |     |       |  |    | ||  |    ++
| +-+ |    |     |       |  |    | ||  |
| | | |    +--+  |    +--+--+    +-++--+
| +-+ |    |  |  |    |  |  |    +-++--+
|     |    |  |  |    |  |  |    | ||  |
+-----+    +--+--+    +--+--+    +-++--+

Несмотря на то, что программа может распознать некоторые из подобных таблиц, результат нескольких последовательных операций редактирования внутри таких ячеек может быть непредсказуем и наиболее вероятно, что структура таблицы будет разрушена.

Настоятельно рекомендуется оставлять как минимум по одной пустой строке перед и после таблицы. Чтобы таблица могла мирно сосуществовать с окружающим текстом, нужно, чтобы она была отделена от него. Это, например, необходимо для левой таблицы в нижеследующем примере, чтобы она могла расширяться или сужаться по горизонтали.

                         +-----+-----+-----+
 +-----+-----+           |     |     |     |
 |     |     |           +-----+-----+-----+
 +-----+-----+           |     |     |     |
                         +-----+-----+-----+


Форматирование содержимого ячеек

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

+-------------------------------------------------+
|Каждый из элементов списка начинается с пробела, |
|формируя собственный абзац. Ограничения на       |
|форматирование внутри ячеек:                     |
|                                                 |
| 1. Только один пробел между словами.            |
| 2. Не более двух пробелов между предложениями.  |
| 3. Абзац должен начинаться с пробела или идти за|
|пустой строкой.                                  |
|                                                 |
|Этот абзац отделен от пункта 3 пустой строкой.   |
+-------------------------------------------------+

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

Вот пример использования режима фиксированной ширины. Предположим, у нас есть такая таблица:

+-----+
|     |
+-----+

В обычном режиме, если вы напечатаете слово “antidisestablishmentarianism”, это вызовет расширение ячейки до нужных размеров:

+----------------------------+
|antidisestablishmentarianism|
+----------------------------+

В режиме фиксированной ширины то же самое действие приведет к следующему результату. Места переносов будут обозначены символом продолжения (по умолчанию “\”). Символ продолжения трактуется специальным образом, так что рекомендуется выбирать такой символ, который не должен появляться где-быто ни было еще в таблице. Изменить символ продолжения можно через настройку переменой table-word-continuation-char. Символ продолжения трактуется особым образом только в режиме фиксированной ширины и не имеет никакого особого значения в обычном режиме.

+-----+
|anti\|
|dise\|
|stab\|
|lish\|
|ment\|
|aria\|
|nism |
+-----+


Выравнивание в ячейках

По умолчанию содержимое ячеек выравнивается влево, вертикальное выравнивание отсутствует. Абзац может быть выровнен независимо от других, но только по горизонтали. Пользователь может задать вертикальное или горизонтальное выравнивание ячеек независимо. Значение для горизонтального вырвнивания должно быть “left”, “center” или “right”. Значение для вертикального выравнивания — “top”, “middle”, “bottom” или “none”. Информация о выравнивании сохраняется, пока вы работаете в Emacs’е. Даже копироание таблиц сохраняет ее. Однако, как только файл, содержащий таблицу, сохранен, а буфер уничтожен, вся эта информация теряется. При распозновании таблиц программа пытается также определить выравнивание ячеек на основании размещения текста внутри каждой ячейки. Нет никаких гарантий, что выравнивание всегда будет правильно распознано, однако как правило оно работает вполне надежно. Алгоритм распознавания реализован в функции table--detect-cell-alignment. Если вы знаете лучший алгоритм или у вас есть идея получше — предложения приветствуются.