Skip to content
พิมพ์ภาษาไทย: 2 ชั้นที่ต้องผ่าน

พิมพ์ภาษาไทย: 2 ชั้นที่ต้องผ่าน

debug ทีละชั้น: layout คีย์บอร์ด → ฟอนต์ที่วาดตัวไทย
Two-layer debugging of Thai input in kitty

ใช้ทำอะไร (Purpose)

กด Alt+Shift ─► [ชั้น 1: layout มี th] ─► [ชั้น 2: มีฟอนต์วาดตัวไทย] ─► เห็นตัวไทย
                 setxkbmap / localectl          fontconfig / kitty symbol_map
อาการชั้นที่พัง
ยังเป็นตัวอังกฤษ1 layout
กล่อง □ หรือไม่ขึ้นอะไร2 ฟอนต์

ขั้นตอน debug จริง (ตามลำดับที่เกิด)

1. ไม่มีฟอนต์ไทยเลย

fc-list :lang=th family          # ว่าง
sudo pacman -S noto-fonts

ต้นเหตุ: ttf-sarabun ถูกตัดเพราะอยู่ AUR (ถูกตามหลัก) แต่ ไม่ได้ถามว่ามันทำหน้าที่อะไร

2. ติดตั้ง yay + ฟอนต์จาก AUR

pacman -Ss tlwg                  # ไม่มีใน repo ทางการ (เจอแค่ texlive)
cd ~ && git clone https://aur.archlinux.org/yay-bin.git && cd yay-bin && less PKGBUILD
makepkg -si
yay -S ttf-sarabun ttf-tlwg

⚠️ AUR ใครก็อัปโหลดได้ → ตรวจ source= ใน PKGBUILD ทุกครั้ง (typosquatting แบบโดเมนปลอม)

3. ชั้น layout ไม่ทำงาน

setxkbmap -query                 # layout: us (ไม่มี th) → บรรทัดใน i3 config ไม่มีผล
setxkbmap -layout th             # บังคับไทยล้วน เพื่อแยกสมมติฐาน

พิมพ์แล้วได้ “ทดสอบ” (copy ออกมาอ่านได้) แต่ kitty แสดงเป็นกล่อง → ชั้น 2 ก็พังด้วย

แก้ถาวรระดับ Xorg (ไม่ขึ้นกับ i3):

sudo localectl set-x11-keymap us,th pc105 "" grp:alt_shift_toggle

เขียน /etc/X11/xorg.conf.d/00-keyboard.conf = ย้ายจาก config ระดับ interface เป็นค่า global

4. ชั้นฟอนต์ใน kitty

kitty --debug-font-fallback

ผล: Symbol map fonts: NotoSansMono-Regular → kitty ได้ฟอนต์ผิดตัว

สาเหตุจริง: kitty.conf ใน repo มี symbol_map U+0E00-U+0E7F Bai Jamjuree แต่ P15 ไม่มีฟอนต์นี้ → fontconfig ส่ง “ตัวใกล้เคียง” (Noto Sans Mono, ไม่มีตัวไทย) มาเงียบๆ (เหมือน DNS ตอบ record ใกล้เคียงแทน NXDOMAIN)

ทดสอบโดยไม่แก้ไฟล์:

kitty -o 'symbol_map U+0E00-U+0E7F Tlwg Mono' --debug-font-fallback   # TlwgMono ✓

แก้ถาวรแบบไม่กระทบเครื่องอื่น (local.conf):

sed -i '/^symbol_map U+0E00-U+0E7F/d' ~/dotfiles/kitty/.config/kitty/kitty.conf
# เปลี่ยนเป็นบรรทัดสุดท้าย: globinclude local.conf
echo 'symbol_map U+0E00-U+0E7F Tlwg Mono' > ~/.config/kitty/local.conf
echo '**/local.conf' >> ~/dotfiles/.gitignore

ทดสอบว่าใช้ได้ (Verification)

  • setxkbmap -query → layout: us,th + options: grp:alt_shift_toggle
  • kitty --debug-font-fallback (ไม่มี -o) → TlwgMono = มาจาก local.conf จริง
  • Alt+Shift พิมพ์ไทยใน kitty หน้าต่างใหม่ได้

ทำไม Tlwg Mono

ฟอนต์ไทยแบบ monospace → ตัวไทยตรงแนวกับตัวอังกฤษใน terminal และชื่อตรงตัว จับคู่ได้แน่นอน

ปัญหาที่เคยเจอ & สิ่งที่ทายผิด (Troubleshooting)

เหตุการณ์บทเรียน
ทาย ttf-tlwg อยู่ใน repoอยู่ AUR → ค้นด้วย pacman -Ss ก่อน ไม่เดาชื่อ
วิเคราะห์ว่า “บรรทัด Noto Sans Thai ชนะ”ผมอ่าน kitty.conf ของ MSI (ที่มีการแก้ค้างไม่ได้ commit) ไม่ใช่ของ P15
สมมติฐาน “kitty ชอบ monospace”ไม่ได้รับการพิสูจน์ สาเหตุจริงคือฟอนต์ที่ขอไม่มีในเครื่อง
commit ลบไป 1 บรรทัด (ทายว่า 3)ตัวเลข diff เผยว่า MSI มีการแก้ค้าง → ต้อง restore ก่อน pull
glfw error ... Notifyไม่มี notification daemon (แก้ด้วย dunst ในไฟล์ 09)

คำถามชวนคิด

  1. ทำไมการ “บังคับไทยล้วน” (setxkbmap -layout th) จึงแยกสองชั้นออกจากกันได้ในการทดสอบเดียว
  2. fontconfig ส่งฟอนต์ใกล้เคียงแทนการบอกว่าไม่มี — พฤติกรรมแบบนี้มีข้อดีอะไร และอันตรายอย่างไรต่อการ debug
  3. ถ้าลูกทีมใช้ desktop อื่น (ไม่ใช่ i3) แนวทาง localectl ยังใช้ได้ไหม เพราะอะไร