ВозможностиЦеныДокументацияБлог
Получить mote
← Блог
Дизайн·5 августа 2026 г.·4 мин чтения

Редактирование таблиц с сохранением исходного ручного форматирования

Случалось ли вам исправить всего одно слово в таблице, а затем увидеть в git diff всю таблицу целиком? В Markdown чаще всего сбивается именно форматирование таблиц.

m
mote
Экран с прямоугольным выделением ячеек таблицы в режиме Live. Только выделенные ячейки заполняются синим цветом, а текст за пределами таблицы в выделение не попадает.
Экран с прямоугольным выделением ячеек таблицы в режиме Live. Только выделенные ячейки заполняются синим цветом, а текст за пределами таблицы в выделение не попадает.

В таблицах Markdown остаются следы ручной правки. Вертикальные черты аккуратно выстраивают, ширину ячеек подгоняют пробелами, а иногда выравнивание даже намеренно нарушают. Сам этот вид и есть исходный текст файла.

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

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

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

Исходный текст показывается только в редактируемой ячейке

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

Перейти в другую ячейку можно с помощью Tab или клавиш со стрелками. Если нажать Enter в последней строке, появится новая строка.

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

Если выделение, начатое за пределами таблицы, доходит до неё, таблица выделяется целиком. Половина таблицы не окажется выделенной каким-то неестественным образом.

Строки и столбцы тоже можно перемещать целиком. Если навести указатель на таблицу, слева от строк и над столбцами появятся маркеры. Достаточно перетащить их в нужное место.

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

Экран с введённым словом "표" в палитре команд — команды создания таблицы и добавления строки снизу показаны вместе с соответствующими сочетаниями клавиш, а в документе на заднем плане видна таблица, отображаемая в виде сетки
Экран с введённым словом "표" в палитре команд — команды создания таблицы и добавления строки снизу показаны вместе с соответствующими сочетаниями клавиш, а в документе на заднем плане видна таблица, отображаемая в виде сетки

Из-за одной вертикальной черты таблица развалилась

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

Но для человека, который пишет таблицу Markdown вручную, вертикальная черта — это знак, разделяющий ячейки. При вводе новой строки даже разделители превращались в обычные символы, и таблица разваливалась.

Поэтому мы изменили поведение так, чтобы учитывать место ввода.

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

Такие проблемы трудно обнаружить, просто изучая код. Поэтому мы создали тест, который щёлкает таблицу в настоящем окне и перетаскивает маркеры. Он проверяет, правильно ли отображается таблица, перемещаются ли строки и столбцы в нужном направлении и не завершается ли приложение аварийно в процессе.

После сохранения результат виден ещё отчётливее. Если изменить только одно слово в одной ячейке, в git diff появится лишь одна строка с этой ячейкой.

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

Строка состояния и git diff после изменения слова в одной ячейке таблицы в режиме Live и сохранения. В строке состояния показано +8 −6 B, а в diff появились только одна строка с исправленной ячейкой и одно предложение.
Строка состояния и git diff после изменения слова в одной ячейке таблицы в режиме Live и сохранения. В строке состояния показано +8 −6 B, а в diff появились только одна строка с исправленной ячейкой и одно предложение.

Были и функции, которые мы добавили, а затем убрали

Некоторое время ширину столбцов можно было регулировать мышью. Теперь этой функции нет.

В Markdown нет синтаксиса для сохранения ширины столбцов. Чтобы запомнить ширину, пришлось бы создавать рядом с документом отдельный файл. Тогда содержимое этой папки оставалось бы полноценным только при наличии mote. При переносе через git, открытии на другом устройстве или использовании другого редактора эта информация терялась бы.

Границы таблицы мы вынесли в настройки приложения. Можно выбрать, показывать ли полную сетку или рисовать линию только под заголовком. Та же настройка применяется к отображению на экране и при экспорте в PDF и HTML.

Критерий прост. Значения, которые невозможно записать в Markdown, либо помещаются в настройки приложения, либо вообще не превращаются в функцию.

Поэтому мы убрали возможность регулировать ширину столбцов. Теперь она определяется автоматически в соответствии с содержимым. А документ до конца остаётся одним файлом .md.

Редактор, который красиво переписывает таблицу, и редактор, который сохраняет написанную мной таблицу в точности такой, какой она была.

mote выбрал второй вариант.

← РанееПочему символы Markdown показываются только в слове под курсоромПозже →Чтобы приложение выглядело одинаково при любом способе установки, мы решили поставлять GTK вместе с ним
Следите за новостями через RSS.
Оставьте только текст
Русский
© 2026 mote