کارهای پیشین
چند پروژه پیشتر بخشهایی از این مسئله را هدف گرفتهاند. پیش از ساختن هر چیزی، کد هر کدام را خواندیم، نه فقط README آن را، و آنچه واقعاً انجام میدهد را بر نُه لایهٔ خودمان نگاشتیم.
پوشش لایهها
هر سطر یک پروژه است و هر ستون یکی از نُه لایهٔ ما. در طول سطر ببینید هر پروژه چه چیزی را پوشش میدهد، و در طول ستون ببینید چه کسی به یک لایه پرداخته است.
| ۱رمزگذاری | ۲ورودی | ۳پهنا | ۴شکلدهی | ۵دوجهتی | ۶مکاننما و کپی | ۷قلمها | ۸مالتیپلکسر | ۹برنامهها و TUI | |
|---|---|---|---|---|---|---|---|---|---|
| RtlTerminal | ◐نیمه | ◐نیمه | ◐نیمه | ●کامل | ◐نیمه | ●کامل | ◐نیمه | ·غایب | ◐نیمه |
| termenal-web | ·غایب | ◐نیمه | ◐نیمه | ●کامل | ◐نیمه | ●کامل | ◐نیمه | ·غایب | ◐نیمه |
| termux-app-arabic | ·غایب | ·غایب | ◐نیمه | ●کامل | ◐نیمه | ◐نیمه | ·غایب | ·غایب | ·غایب |
| Tarminal | ?در مخزن نیست | ?در مخزن نیست | ?در مخزن نیست | ?در مخزن نیست | ·غایب | ?در مخزن نیست | ◐نیمه | ·غایب | ?در مخزن نیست |
| Terminal-ar | ·غایب | ·غایب | ·غایب | ◐نیمه | ◐نیمه | ◐نیمه | ◐نیمه | ·غایب | ◐نیمه |
| ar-terminal | ·غایب | ◐نیمه | ·غایب | ◐نیمه | ◐نیمه | ◐نیمه | ◐نیمه | ·غایب | ◐نیمه |
| estaterm | ·غایب | ◐نیمه | ·غایب | ◐نیمه | ◐نیمه | ·غایب | ·غایب | ·غایب | ◐نیمه |
| bidiscope | ·غایب | ·غایب | ·غایب | ◐نیمه | ◐نیمه | ◐نیمه | ·غایب | ·غایب | ◐نیمه |
| fa-console | ●کامل | ◐نیمه | ·غایب | ◐نیمه | ◐نیمه | ◐نیمه | ◐نیمه | ·غایب | ·غایب |
| rtl-terminal | ·غایب | ·غایب | ·غایب | ·غایب | ◐نیمه | ·غایب | ·غایب | ·غایب | ◐نیمه |
پروژهها
RtlTerminal
شبیهساز ترمینال · ویندوز (WPF + ConPTY)
- شکلدهی
- WPF، واژهبهواژه
- دوجهتی
- حدسی و دستساز
جدیترین کار پیشین: بافر منطقی، کپی منطقی و نگاشت کلیک به جای منطقی. اما دوجهتیاش UAX #9 نیست و واژهها را در خانهها فشرده میکند.
خواندن یادداشتها ←termenal-web
ترمینال مرورگر (نمونهٔ اولیه) · مرورگر + Node PTY
- شکلدهی
- HarfBuzz، برای هر تکهٔ یکجهته
- دوجهتی
- سطوح UAX #9؛ جهت پاراگراف با اکثریت
بهترین طرح مرجع: نگاشت منطقی↔دیداری برای هر سطر و کپی منطقی. هستهٔ WASM و رندر WebGPU که ادعا میکند در کد نیست.
خواندن یادداشتها ←termux-app-arabic
شبیهساز ترمینال (انشعاب) · اندروید
- شکلدهی
- HarfBuzz سیستم، با کل سطر
- دوجهتی
- UAX #9 برای هر سطر، پایهٔ LTR
اثبات مفهومی در حدود ۳۰۰ خط، فقط در لایهٔ رندر. لمس و انتخاب به متن منطقی برنمیگردند، آزمونی ندارد و همیشه روشن است.
خواندن یادداشتها ←Tarminal
شبیهساز ترمینال (پوستهٔ SwiftTerm) · macOS
- شکلدهی
- کدی در مخزن ندارد
- دوجهتی
- ندارد
پوستهای بدون هیچ کد عربی، دوجهتی یا پهنای خودش. آنچه باید مطالعه شود خود SwiftTerm است.
خواندن یادداشتها ←Terminal-ar
لایهٔ رویی روی xterm.js (Electron) · ویندوز / لینوکس
- شکلدهی
- Chromium، برای هر بخش
- دوجهتی
- حدسی، برای هر بخش
قابل استفاده نیست (ادعای MIT بدون فایل مجوز). مکاننمای آینهشده با متن نمیخواند و آزمونی ندارد.
خواندن یادداشتها ←ar-terminal
لایهٔ رویی VS Code + بازنویسی PTY · VS Code
- شکلدهی
- Chromium / فرمهای نمایشی
- دوجهتی
- Blink سطربهسطر / bidi-js پخته در متن
قابل استفاده نیست (بدون مجوز). مسیر اصلی کپی را منطقی نگه میدارد اما مکاننما و انتخاب ناهمخواناند؛ مسیر دوم همان ترفند ترتیب دیداری است.
خواندن یادداشتها ←estaterm
پراکسی PTY · لینوکس
- شکلدهی
- FriBidi ← فرمهای نمایشی
- دوجهتی
- UAX #9 (FriBidi)، تکهتکه
نمونهٔ کلاسیک ترفند ترتیب دیداری که در صفحهٔ جایگزین کنار میکشد. فقط ترتیب فراخوانی FriBidi آن ارزش برداشتن دارد.
خواندن یادداشتها ←bidiscope
کتابخانه + لایهٔ رویی xterm.js · جاوااسکریپت / مرورگر
- شکلدهی
- جدول دستساز ← فرمهای نمایشی
- دوجهتی
- UAX #9 ناقص (بدون BD13)
ایدهٔ درست (لایهٔ رویی بافر را منطقی نگه میدارد)، اجرای نادرست. ادعای ۹۹٫۹۱٪ انطباقش اثبات نشده است.
خواندن یادداشتها ←fa-console
پوشش stdout پایتون · کنسول ویندوز
- شکلدهی
- arabic-reshaper ← فرمهای نمایشی
- دوجهتی
- python-bidi یا وارونهسازی کل سطر
برای لایهٔ ۱ ارزشمند است (راهاندازی UTF-8، یکسانسازی ي/ك به ی/ک). بخش نمایشش ترفند ترتیب دیداری است و ANSI را خراب میکند.
خواندن یادداشتها ←rtl-terminal
افزونهٔ Claude Code (فقط پرامپت) · Claude Code
- شکلدهی
- ندارد
- دوجهتی
- از مدل میخواهد نویسهٔ کنترلی بگذارد
فقط چند فایل Markdown: بدون هوک، بدون تشخیص، بدون هیچ اجبار. ارزش برداشتن: جداسازی مسیرها با LRI…PDI و مجموعهآزمونش.
خواندن یادداشتها ←آنچه این پروژهها به ما میگویند
- ۱
بازنویسی متن همیشه هزینه دارد
هر ابزاری که فرمهای نمایشی یا ترتیب دیداری را در ترمینال نوشت، کپی، جستوجو یا دنبالههای کنترلی را شکست و از برنامههای تمامصفحه دست کشید. رندرکنندههایی که بافر را منطقی نگه داشتند، کپی را درست انجام دادند.
- ۲
مسئلهٔ پهنا حل نشده است
هیچ پروژهای متن شکلدادهشدهٔ فارسی را با شبکهٔ خانهها هماهنگ نمیکند؛ گلیفها فشرده، بریده یا سرریز میشوند. این پرسش اصلی پژوهش است.
- ۳
مالتیپلکسرها: صفر از ده
همهٔ پیادهسازیهای سمت ترمینال هر سطر فیزیکی را یک پاراگراف دوجهتی میگیرند؛ پس در قاببندی tmux یا Zellij، تکههای راستبهچپ از مرز قابها رد میشوند. کسی به آن نپرداخته است.
- ۴
کسی بر سر مالکیت دوجهتی توافق نمیکند
همه دوجهتی را بیقیدوشرط یا حدسی اعمال میکنند، حتی درون برنامههای تمامصفحه. هیچکدام از حالتهای صریح پیشنویس BiDi in Terminal Emulators استفاده نمیکند.
- ۵
ورودی نادیده گرفته شده است
هیچ پروژهای ترکیب IME، ورود نیمفاصله یا حرکت منطقی مکاننما هنگام تایپ را مدیریت نمیکند.
- ۶
READMEها اغراق میکنند
پنج پروژه بیش از آنچه کدشان دارد ادعا میکنند و دو پروژه بدون فایل مجوز ادعای MIT دارند. کارنامهٔ ما اندازه میگیرد و ادعا را تکرار نمیکند، حتی ادعای خودمان را.
ارزش برداشتن
| از | چه چیزی | لایه |
|---|---|---|
| termenal-web | جایگشت colToVisual / visualToCol برای هر سطر؛ شکلدهی هر تکهٔ یکجهته با جهت صریح | ۵ · ۶ |
| RtlTerminal | انتخاب متن با جای منطقی و نگاشت کلیک به جای منطقی، همراه با آزمون؛ پهنای صفر برای اعراب و نیمفاصله | ۳ · ۶ |
| termux-app-arabic | شکلدهی کل تکه با زمینهٔ کامل سطر؛ کشیدن مکاننما بهصورت لایهٔ جدا؛ پایهٔ LTR تا جابهجایی محلی بماند | ۴ · ۵ |
| fa-console | راهاندازی UTF-8؛ یکسانسازی ي/ك به ی/ک و رقمها؛ قاعدهٔ «دادههای برنامه منطقی میمانند» | ۱ |
| estaterm | ترتیب فراخوانی FriBidi (نه مسیر خروجیاش) | ۵ |
| rtl-terminal | جداسازی مسیرها و کد با LRI…PDI؛ مجموعهآزمون پیش و پس | ۵ · آزمون |
پایهها و پیشینه
Section titled “پایهها و پیشینه”- مسئلهٔ #553 در Neovim، «پشتیبانی از زبانهای دوجهتی»: از سال ۲۰۱۴ باز است و ۴۷ نظر دارد. این مسئله بیش از یک دهه قدمت دارد.
- BiDi in Terminal Emulators (اگمونت کوبلینگر، ۲۰۱۹): پیشنویس استانداردی برای اینکه دوجهتی کار ترمینال است یا برنامه. VTE آن را پیاده کرده؛ هیچیک از این ده پروژه از آن استفاده نمیکند.
- موتورها: HarfBuzz برای شکلدهی؛ FriBidi و ICU برای UAX #9. هر پروژهای که شکلدهی را درست انجام داد، آن را به موتوری از همین دست سپرد.