Mình bỏ Windows sau một đợt update khá ngu vào khoảng cuối tháng 9, đầu tháng 10. Windows Explorer bắt đầu giật, còn bật máy thì hên xui ăn màn hình đen. Mở laptop lên để làm việc, xong việc đầu tiên trong ngày lại là ngồi chờ cái máy cho phép mình làm việc.

Đúng đợt đó mình xem được video KDE Plasma 6.6 made me quit Hyprland của Zei. Ông ấy chạy Fedora KDE trên con MacBook Air 2015. Tên video là chuyện ông ấy bỏ Hyprland, còn mình từ Windows đi ra thì làm gì có quãng đời Hyprland nào để bỏ. Nhưng nhìn cái desktop gọn, không màu mè, mình thấy hợp mắt nên kéo bản Fedora KDE Plasma Desktop về cài luôn lên chiếc ThinkPad T14s Gen 2 Intel (hiện đang ở Fedora 44, KDE Plasma 6.7.5, chạy Wayland).

Chọn thẳng bản cài KDE từ đầu cho khỏe. Cài bản mặc định dùng GNOME rồi mới đè KDE lên sau chỉ tổ rác máy.

Desktop Fedora KDE trên chiếc ThinkPad với nền DarkestHour và panel gọn ở cạnh dưới
Desktop Fedora KDE trên chiếc ThinkPad với nền DarkestHour và panel gọn ở cạnh dưới

Nhìn ảnh thì thấy mỗi cái hình nền với thanh taskbar. Nhưng cài xong hệ điều hành mới chỉ là có chỗ đăng nhập. Cái quyết định mình ở lại được hay hai hôm sau cài lại Windows nằm ở mấy thứ lặt vặt chạm vào mỗi ngày: font chữ, chỗ để cửa sổ, cái touchpad, gõ tiếng Việt, mở khóa máy, rồi đám đồ nghề viết code.

Mắt nhìn cả ngày thì đừng để mỗi app một phách

Màn 14 inch mà để nền trắng sáng trưng suốt tám tiếng thì mắt chịu không nổi. Mình đổi sang tông tối (Calm Charcoal), dùng luôn tấm hình nền DarkestHour có sẵn của Fedora.

Cái khó chịu hơn trên Linux là chuyện mỗi ứng dụng một kiểu giao diện. App của KDE dùng Qt, nhiều app khác lại dùng GTK; để mặc định thì mở hai cửa sổ cạnh nhau nhìn như hàng xóm cãi nhau. Đồng bộ màu của GTK 3, GTK 4 và terminal Konsole về chung một tông tối giúp mở app nào lên cũng thấy yên bình.

Phông chữ cũng thế. Mình dùng Ubuntu Nerd Font cho giao diện và JetBrainsMono Nerd Font Mono cho terminal. Phải có chữ Nerd Font vì mấy đồ chơi trong terminal như Yazi hay Neovim dùng ký tự đặc biệt để vẽ icon thư mục với nhánh Git; dùng font thường là chỗ đó biến thành một hàng ô vuông nhìn rất phèn. Tất nhiên khai báo tên font trong cài đặt xong thì vẫn phải tải bộ font thật về cài vào máy, chứ chữ không tự mọc ra từ file config được.

Cấu hình font KDE với Ubuntu Nerd Font cho giao diện và JetBrainsMono Nerd Font Mono cho phần monospace
Cấu hình font KDE với Ubuntu Nerd Font cho giao diện và JetBrainsMono Nerd Font Mono cho phần monospace

Màn 14 inch và cái touchpad

Làm việc trên màn laptop 14 inch có một cảnh rất quen: mở code bên trái, kéo cái terminal sang bên phải, ngồi căn mép hai cửa sổ cho khít nhau xong xuôi thì sực nhớ phải mở trình duyệt đọc tài liệu. Thế là đè trình duyệt lên trên, lúc quay lại gõ lệnh thì bấm nhầm sang cửa sổ khác, rồi ngồi Alt+Tab năm vòng chỉ để tìm cái terminal vừa chạy dở. Còn nếu nhảy hẳn sang mấy bộ tiling window manager tự động hoàn toàn thì lại gặp cảnh ngược lại: vừa bật hộp thoại cài đặt bé tí lên nó cũng đè ra chia đôi màn hình, ép chữ co lại bằng con kiến.

Mình chọn cách ở giữa, chia sẵn ba virtual desktop cố định:

WorkspaceĐể làm gì
CodeEditor và terminal lúc làm việc
WebTrình duyệt, tài liệu, chỗ tra cứu
ToolsMấy công cụ phụ và cửa sổ cấu hình
Ba virtual desktop được đặt tên Code, Web và Tools trong KDE
Ba virtual desktop được đặt tên Code, Web và Tools trong KDE

Trong mỗi workspace, KWin có sẵn trò chia ô ở Meta+T (phím Meta chính là cái phím có logo Windows — đổi hệ điều hành rồi mà cái logo ấy vẫn phải đi làm đều). Mình kẻ sẵn ba cột 25%–50%–25%. Lúc nào cần xếp gọn thì kéo cửa sổ vào ô hoặc bấm Meta với phím mũi tên; lúc nào cần để cửa sổ nổi bình thường thì cứ mở tự nhiên. Meta+W xem toàn cảnh, Meta+G nhìn dạng lưới. Đỡ hẳn khoản ngồi căn chỉnh mép cửa sổ bằng tay.

Rồi tới cái touchpad. Gõ code trên bàn phím laptop sợ nhất là đang viết dở ở dòng 80, cườm tay hơi tì xuống bàn di một cái là con trỏ âm thầm nhảy tọt lên dòng 12, gõ tiếp mấy chữ mới phát hiện mình vừa phá nát cái hàm ở trên. Cộng thêm chuyện mới cài máy xong cuộn hai ngón bị ngược chiều quen tay, muốn chọn gì cũng phải ấn cạch một cái xuống mặt bàn di. Thế nên việc đầu tiên trong phần chuột là bật khóa touchpad trong lúc đang gõ phím, chỉnh lại cuộn hai ngón tự nhiên (natural scrolling), chạm nhẹ để click (tap-to-click), và hạ gia tốc con trỏ xuống 0,1. Mấy thứ này chẳng bao giờ lên ảnh khoe desktop được, nhưng lệch một cái là ngứa ngáy cả ngày.

Touchpad bật cuộn hai ngón tự nhiên, chạm để click và chống chạm nhầm khi đang gõ
Touchpad bật cuộn hai ngón tự nhiên, chạm để click và chống chạm nhầm khi đang gõ

Pin, ngưỡng sạc và cái lệnh eyecare lúc nửa đêm

Mang máy ra quán ngồi bằng pin mà màn hình với đèn bàn phím cứ sáng trưng thì tụt nhanh lắm. Mình để profile dùng pin tự hạ độ sáng xuống 45%, tắt đèn bàn phím, nghỉ 3 phút thì tắt màn, 10 phút thì sleep. Còn khi ngồi bàn cắm sạc suốt ngày, pin được khóa ngưỡng phần cứng chỉ sạc trong khoảng 75%–80% để đỡ chai.

Cấu hình nguồn khi dùng pin trên KDE
Cấu hình nguồn khi dùng pin trên KDE

Có điều ngồi làm việc đến tầm 11 giờ đêm mới thấy cái dở của profile nguồn: nó chỉ biết máy đang cắm sạc hay rút sạc, chứ đâu biết đèn phòng đã tắt. Đang nhìn editor nền tối quen mắt, chuyển tab sang trang tài liệu nền trắng một phát là ánh sáng phả thẳng vào mặt chói lòa. Muốn dịu xuống lại phải mò vào System Settings kéo thanh độ sáng, rồi tìm sang mục khác bật Night Light cho màn hình ngả vàng; sáng hôm sau mở máy lên thấy màn hình tối om vàng khè lại phải vào từng chỗ kéo trả về như cũ. Làm thủ công kiểu đó đến tối thứ ba là lười.

Thế là mình viết một lệnh nhỏ tên eyecare:

eyecare on
eyecare status
eyecare off

Gõ eyecare on là nó gọi thẳng PowerDevil của KDE với Night Light của KWin để kéo độ sáng xuống 30% và đổi màu màn hình về 3200 K (muốn số khác thì truyền --brightness 35 --temperature 4000).

Chỗ ăn tiền nằm ở lúc tắt. Trước khi hạ sáng lần đầu, script tự ghi lại độ sáng và nhiệt độ màu đang dùng lúc đó. Đến khi gõ eyecare off, nó trả về đúng con số cũ của mình (ví dụ 45% và 6500 K), khỏi sợ cảnh tắt chế độ ban đêm xong màn hình bắn thẳng lên 100% trắng lóa giữa phòng tối.

Chuyện gõ tiếng Việt trên Wayland

Desktop đẹp mấy mà gõ một câu tiếng Việt còn rớt dấu thì cũng vứt.

Đang nhắn dở câu trả lời cho đồng nghiệp mà gõ duong cứ trơ ra duong, mở cài đặt lên thấy chữ Telex đã nằm chình ình ở đó rồi nhưng quay ra trình duyệt gõ vẫn thuần tiếng Anh — cảm giác lúc đó rất dễ nổi quạu. Trên Linux chạy Wayland hay dính cảnh này vì cài gói, chọn engine và nối bộ gõ vào phiên làm việc của KWin là ba bước rời nhau. Đã thế, nếu cứ copy mấy bài hướng dẫn cũ thời X11 rồi nhét GTK_IM_MODULE với QT_IM_MODULE vào biến môi trường, lên Wayland đôi khi lại tự bóp chân mình.

Mình dùng IBus Typing Booster với bộ tb:vi:telex đi cặp cùng English (US), bấm Ctrl+Space để đổi:

sudo dnf install ibus ibus-typing-booster ibus-gtk3 ibus-gtk4
IBus Preferences với phím chuyển Control+Space
IBus Preferences với phím chuyển Control+Space

Phần nối vào hệ thống thì để KWin cầm trực tiếp IBus Wayland, còn file biến môi trường chỉ giữ đúng một dòng XMODIFIERS=@im=ibus. Xong đăng xuất Plasma vào lại một lần là gõ êm.

Bỏ vân tay, giữ mở khóa khuôn mặt bằng Howdy

Quen kiểu mở nắp máy là vào thẳng màn hình bên Windows rồi, giờ mỗi lần bật máy lại gõ mật khẩu dài ngoằng thì hơi oải. Con ThinkPad này có cả cảm biến vân tay lẫn camera hồng ngoại (IR).

Vân tay thì mình thử qua đám fprintd rồi dẹp luôn. Dùng lằng nhằng, bỏ cho nhẹ đầu.

Mình chuyển sang dùng camera hồng ngoại với Howdy để quét mặt lúc mở khóa màn hình. Dùng thì tiện thật, nhưng lúc cài trên Fedora 44 cũng phải vòng vèo một chặp vì gói đóng sẵn trên COPR bị kẹt dependency, phải kéo source về tự cài vào /opt/howdy và tự build dlib 20.0.1. Làm món này có ba chỗ lệch một ly là đi một dặm:

  1. GUI một nơi, lúc đăng nhập một nẻo: Giao diện cấu hình của Howdy và phần xác thực PAM lúc mở khóa máy phải trỏ vào cùng một môi trường Python. Nếu quên sửa phần GUI cho khớp với CLI, bạn mở cửa sổ test thấy nhận mặt ầm ầm, nhưng ra màn hình khóa thì hệ thống gọi sang Python khác thiếu thư viện, đứng im luôn.
  2. Đừng tin số thứ tự /dev/video0: Máy có hai camera (thường và hồng ngoại). Hôm nay hồng ngoại là video0, mai khởi động lại nhân Linux đổi sang video2 là tịt. Phải trỏ vào đường dẫn cố định trong /dev/v4l/by-path/.
  3. Test ngoài terminal trước khi gắn vào PAM: Cài xong, quét mẫu mặt, chạy nhận diện thử hai vòng ngon lành rồi mới bật PAM cho kde và plasmalogin. Gắn PAM trước khi test xong là cách nhanh nhất để tự nhốt mình ngoài cửa.

Bản thân đội làm Howdy cũng nói thẳng: nhận diện khuôn mặt kiểu này làm cho tiện thôi, vẫn có thể bị qua mặt. Nên mình vẫn giữ mật khẩu để dự phòng, còn chạy sudo trong terminal thì cứ gõ phím như thường. Với cả nhớ gạt mở cái nắp che camera của ThinkPad ra. Đóng nắp nhựa đen sì mà ngồi nhìn màn hình chờ mở khóa thì có chỉnh thông số trời cũng chịu.

Chỗ làm việc: mang Vim theo và gom AI agent vào Zed

Đồ nghề trong terminal như Neovim (LazyVim) với Yazi thì mình vẫn giữ thói quen cũ: gd nhảy tới định nghĩa, Space e mở cây thư mục. Còn trình sửa code có giao diện chính trên Fedora thì mình chuyển sang Zed — nhẹ, bật sẵn Vim mode trên nền phím tắt VS Code, chỉnh cỡ chữ đọc code (15–16 pt) tách riêng khỏi chữ hệ thống.

Zed bật Vim mode và danh sách các ACP agent
Zed bật Vim mode và danh sách các ACP agent

Lý do lớn nữa để chọn Zed là đợt này mình dùng cùng lúc mấy con AI coding agent: Codex, Grok Build, Antigravity và OpenCode v2. Mở bốn cái cửa sổ riêng thì dở, mà cài bốn bản fork của VS Code thì rác máy.

Zed có chuẩn ACP (Agent Client Protocol): phần khung chat và sửa code nằm gọn trong Zed, còn từng agent chạy ngầm như một process riêng bên dưới.

AgentLệnh nối vào Zed
CodexQua Node adapter codex-acp (2.2.2) trỏ vào binary Codex
Grok Buildgrok agent stdio
AntigravityRuntime riêng agy_acp_server.par --uid=
OpenCode v2opencode acp

Đoạn này có một cú lừa nhẹ với Antigravity: cài bản CLI agy thông thường vào PATH xong gọi trong Zed sẽ không chạy, vì bản CLI đó không mở cổng ACP. Phải kéo đúng cục runtime ACP riêng (bản 1.4.3 đi kèm localharness_external) thì hai bên mới nói chuyện được với nhau. Còn adapter codex-acp của Codex thì cất vào một thư mục cố định trong máy, đừng để trong cache tạm của Zed kẻo hôm nào dọn cache lại mất công cài lại.

Gom được bốn ông vào chung một chỗ giúp lúc làm việc đỡ phải nhảy cửa sổ. Tất nhiên chuyện đăng nhập, quota với tiền token thì vẫn mạnh ai nấy thu — vụ hóa đơn đó mình đã tính kỹ ở bài AI trong QA chạy ngon rồi, hóa đơn token ai trả? rồi.

Xong phần dọn nhà

Bắt đầu từ một đợt Windows update dở hơi, đi ngang qua một video YouTube, rồi ngồi gọt lại từng chút cho hợp tay hợp mắt. Linux vẫn có những lúc bắt mình tự xắn tay áo lên xử lý — như đoạn ngồi build dlib cho Howdy hay mò xem tại sao có CLI rồi mà ACP vẫn chưa chạy. Bằng chứng nằm ngay dọc bài này chứ đâu.

Nhưng qua hết mấy khúc đó rồi thì mở chiếc ThinkPad lên chỉ còn đúng một việc: ngồi vào làm. Không phải chờ Explorer tỉnh ngủ, cũng không phải nhìn màn hình đen đoán xem hôm nay máy vui hay buồn.

Nguồn tham khảo