Многие разработчики, переходящие с Linux на Windows, сталкиваются с одной и той же болью: отсутствием адекватного нативного мультиплексора терминалов. Да, есть WSL, есть вкладки в Windows Terminal, но это не заменяет классический опыт. Настоящий tmux — это когда ты можешь отцепиться (detach) от сессии, закрыть терминал, а потом вернуться и продолжить работу ровно с того же места.

Я решил, что хватит это терпеть, и реализовал tmux-win — нативный порт tmux для Windows, написанный на C с использованием Win32 API без тяжелых слоев совместимости вроде Cygwin или MSYS2.

Почему не WSL или готовые порты?

WSL — это полноценная виртуальная машина. У неё своя файловая система, свой сетевой стек и заметный оверхед. Существующие порты часто либо заброшены, либо тянут за собой окружение POSIX. Мне же хотелось инструмент, который:

  1. Запускается мгновенно и весит копейки.

  2. Работает напрямую с powershell.exe и cmd.exe.

  3. Не требует ничего, кроме самой Windows.

Технический стек и архитектура

Проект построен на трех «китах»:

  1. ConPTY (Windows Pseudo Console): Технология от Microsoft (появилась в Win10 1809), которая наконец-то позволила Windows работать с консольными приложениями через псевдотерминалы, аналогично UNIX PTY.

  2. Клиент-серверная модель: Как и в оригинале, сервер управляет состоянием окон и панелей, а клиент отвечает за ввод-вывод и отрисовку.

  3. Named Pipes (Именованные каналы): Используются для IPC (межпроцессного взаимодействия) между клиентом и сервером. Это нативно, быстро и безопасно.

Роль ИИ: Разработка на C без знания C

Интересный нюанс: этот проект стал для меня экспериментом по работе с современными ИИ-инструментами. Я буду честен — я практически не знаю языка C, и у меня нет времени на его глубокое изучение. Но мне был очень нужен нативный tmux для Windows, и я решил проверить, сможет ли связка из разработчика и нейросети выдать качественный системный продукт.

Значительная часть низкоуровневой работы была выполнена при поддержке Claude Code:

  • Маппинг структур Win32 API: Рутинная работа, которую ИИ делает превосходно.

  • Написание бойлерплейта: Именованные каналы (Named Pipes), обработка системных вызовов и управление памятью.

  • Трансляция логики: Я объяснял высокоуровневую логику работы сессий, а Claude переводил это на язык указателей и структур.

Использование ИИ позволило мне сосредоточиться на архитектуре и логике управления панелями, делегировав «сишную» рутину нейросети. Однако финальная отладка взаимодействия с ConPTY всё равно требовала ручного контроля и сотен итераций — у псевдоконсолей Windows есть свои специфичные «капризы», о которых модели пока знают мало.

В итоге получился проект, который я бы никогда не написал в одиночку из-за языкового барьера, но который теперь реально работает.

Что уже работает

На текущий момент реализован базовый функционал для комфортной работы:

  • Панели (Panes): Разделение экрана вертикально (Ctrl-b %) и горизонтально (Ctrl-b ").

  • Окна (Windows): Создание новых вкладок (Ctrl-b c) и переключение между ними (0-9, n, p).

  • Persistent Sessions: Стандартный Detach (Ctrl-b d) и Attach. Сессия живет, пока запущен сервер.

  • Управление: Переключение между панелями и их закрытие (Ctrl-b x).

Архитектура модулей

Для тех, кто захочет покопаться в коде, структура выглядит так:

  • win32_conpty.c — вся магия работы с псевдоконсолью.

  • win32_pipe.c — реализация обмена данными через пайпы.

  • win32_proc.c — управление процессами и жизненным циклом сессий.

Как попробовать?

Проект открытый (Open Source), и я буду рад фидбеку, баг-репортам и звездам на GitHub.

Репозиторий: https://github.com/D-Shey/tmux_for_win

Сборка: Вам понадобятся Visual Studio 2022 и CMake:

Bash

git clone https://github.com/D-Shey/tmux\_for\_win.git
cd tmux_for_win
cmake -B build
cmake --build build --config Release

Что дальше?

В планах — поддержка .tmux.conf для кастомизации, расширение списка горячих клавиш и улучшение обработки спецсимволов.

Если вам не хватало нативного tmux в Windows так же, как и мне — залетайте в репозиторий, пробуйте и делитесь впечатлениями!