→ buildbench

עזבתי את Ghostty כי הוא לא מדבר עברית

חצי שנה ישבתי על Ghostty. מהיר, יפה, קונפיג של שורתיים — בדיוק מה שרציתי. עד שהיום cat של קובץ עברי חזר אליי הפוך, אות-אות, משמאל לימין, כאילו הטרמינל החליט שעברית היא בעצם אנגלית קצת מוזרה.

זו לא בדיוק החלטה של Ghostty — זה פשוט פיצ’ר שלא קיים שם. הטרמינל מצייר גליפים בסדר שבו הם מגיעים בזיכרון (logical order) ולא מפעיל את אלגוריתם ה-Unicode Bidirectional. בשפה שמסומנת RTL זה בדיוק הזוי כמו שזה נשמע: שלום הופך ל-םולש.

מה ש-Ghostty לא יכול לעשות לי

חיפשתי הגדרה. אין. בדקתי את ה-issues — #1442 פתוח, “minimal RTL support for single lines”, מתויג accepted. יש discussion עם פורק עובד שמשלב FriBidi ל-BiDi ו-HarfBuzz extended ל-shaping של ערבית. אבל ב-main אין כלום, וה-PRs שיתקבלו צריכים benchmarks, Unicode APIs במקום זיהוי תווים מותאם, ו-zero overhead ל-LTR. בקיצור — לא בקרוב.

עבודה על מוצר שכל הממשק שלו בעברית, ואני רואה את הטקסט הפוך בכל לוג, בכל grep, בכל psql — לא נסבל.

WezTerm פשוט עובד

-- ~/.wezterm.lua
return {
  bidi_enabled = true,
  bidi_direction = 'AutoLeftToRight',
}

זהו. שתי שורות. קובץ עברית.txt קורא את עצמו נכון, מספרים בתוך משפט עברי נשארים LTR, פיסוק במקום הנכון. ה-BiDi של WezTerm לא מושלם (יש edge cases במצבים מעורבים מורכבים), אבל הוא קיים, והוא מספיק טוב ליום-יום.

הגילוי הקטן על פונטים

חשבתי שסיימתי. הפעלתי wezterm ls-fonts --text "שלום" כדי לוודא איזה פונט נטען, וגיליתי שהעברית עברה ל-Courier New. למה? כי JetBrains Mono לא מכיל גליפים עבריים, ו-WezTerm נופל ל-fallback של מערכת.

התקנתי Noto Sans Hebrew — קריא, יפה — אבל הוא proportional. לא monospace. בטרמינל זה אומר שהאותיות העבריות לא יושבות על אותו רוחב תא כמו האנגליות, וכל יישור עמודה (ls -la, top, טבלאות) נשבר ברגע שיש בו עברית.

מצאתי את Miriam Mono CLM — פונט עברי mono אמיתי, חופשי, יושב נקי על הגריד. השורות מתיישרות. סוף סוף.

הבונוסים ש-Ghostty לא נתן

WezTerm קונפיג ב-Lua, לא ב-INI. זה אומר שאני יכול לכתוב לוגיקה — לדוגמה, שם הטאב מתעדכן אוטומטית מ-basename של ה-CWD, אז במקום zsh, zsh, zsh אני רואה את שמות הפרויקטים. כמה שורות:

wezterm.on('format-tab-title', function(tab)
  local cwd = tab.active_pane.current_working_dir
  local name = cwd and cwd.file_path:match '([^/]+)/?$'
             or tab.active_pane.title
  return ' ' .. (tab.tab_index + 1) .. ': ' .. name .. ' '
end)

יש מערכת פלאגינים native (clone של git repo דרך wezterm.plugin.require). הוספתי bar.wezterm כסטטוס בר עם CWD/hostname/clock. יש quick-select מובנה — ⌘⇧Space מסמן כל URL/path על המסך באותיות, אני מקיש ופותח. workspaces כמו tmux sessions, ללא tmux.

מה איבדתי

זמן הפעלה. Ghostty נפתח מיידית; WezTerm לוקח חצי שנייה מורגשת. גם הקונפיג מורכב יותר — Lua פותח אפשרויות אבל גם מזמין שעות של tinkering שלא תכננתי.

שווה את זה? לעבודה יומיומית על מוצר עברי, בלי ספק. הפעם הראשונה שראיתי psql מציג שורה מעורבת עברית/אנגלית נכון הרגישה כמו שמיכה חמה.

ה-bug ש-Ghostty יסגור יום אחד הוא bug יפה. עד אז — ביי.