Lore: Xây dựng trình xem lệnh terminal pager tối ưu cho lập trình viên
Tác giả đã chia sẻ về hành trình phát triển "lore", một công cụ terminal pager được viết bằng ngôn ngữ Go, nhằm thay thế các trình lệnh truyền thống như `less`. Dự án này dựa trên thư viện thành phần "viewport" tái sử dụng, giải quyết các thách thức về hiển thị Unicode, mã màu ANSI và tích hợp sâu vào các ứng dụng TUI như `kl` hay `wander`.

Lore: Xây dựng trình xem lệnh terminal pager tối ưu cho lập trình viên
Trong môi trường làm việc của các nhà phát triển phần mềm, terminal không chỉ là nơi thực thi các câu lệnh mà còn là không gian để đọc và điều hướng lượng lớn văn bản từ logs, tệp cấu hình hay mã nguồn. Mặc dù các công cụ lâu đời như less hay more vẫn rất phổ biến, nhưng tác giả của bài viết này đã quyết định tự xây dựng một giải pháp mới mang tên lore, cùng với một thư viện thành phần cốt lõi gọi là viewport, nhằm mang lại trải nghiệm tốt hơn khi làm việc với các ứng dụng Terminal User Interface (TUI).
Bối cảnh của dự án này xuất phát từ nhu cầu thực tế khi tác giả phát triển các công cụ TUI phức tạp như kl (để xem logs Kubernetes) và wander (dành cho Nomad). Các ứng dụng này yêu cầu khả năng xử lý và hiển thị các khối văn bản lớn một cách mượt mà.
Khởi động ứng dụng kl cho Kubernetes logs
Thách thức trong việc hiển thị văn bản trên Terminal
Terminal hoạt động dựa trên lưới (grid) các ô ký tự với font chữ đơn cách (monospace). Để văn bản trở nên trực quan hơn, các lập trình viên thường sử dụng ANSI escape codes để định dạng màu sắc và kiểu dáng. Tuy nhiên, việc xử lý các mã này trong một trình phân trang (pager) tùy chỉnh đòi hỏi logic xử lý phức tạp để đảm bảo văn bản hiển thị đúng mà không làm hỏng định dạng.
Thông thường, khi nội dung văn bản dài vượt quá chiều cao của màn hình terminal, các chương trình sẽ sử dụng biến môi trường PAGER để gọi một công cụ hỗ trợ việc cuộn và tìm kiếm. Hầu hết hệ thống đều mặc định sử dụng less, một công cụ mạnh mẽ nhưng đôi khi có giao diện và phím tắt không trực quan với mọi người.
Thành phần Viewport: Trái tim của các ứng dụng TUI
Thay vì viết lại logic hiển thị cho từng dự án, tác giả đã tách biệt chức năng này thành một thư viện viewport viết bằng ngôn ngữ Go, tương thích với framework Bubble Tea. Thành phần này đóng vai trò như một hộp chứa văn bản có thể thay đổi kích thước, cuộn ngang/dọc, hỗ trợ tìm kiếm và xử lý Unicode.
Minh họa thành phần viewport có chú thích
ViewPort được thiết kế để xử lý linh hoạt các kiểu dữ liệu khác nhau:
- Hỗ trợ Unicode và Grapheme Clusters: Không phải tất cả các ký tự đều chiếm một ô trong terminal. Ví dụ, emoji ✨ có thể chiếm 2 ô chiều rộng. Thư viện phải tính toán chính xác chiều rộng (cell width) của từng ký tự để tránh việc văn bản bị lệch dòng hoặc hiển thị vỡ hình.
- Xử lý ANSI: Giữ nguyên các định dạng màu sắc khi văn bản được cắt ngắn hay cuộn.
- Tìm kiếm và lọc: Cho phép tìm kiếm theo chuỗi chính xác, biểu thức chính quy (regex) và phân biệt hoa/thường. Các kết quả tìm kiếm có thể được lọc để chỉ hiển thị các dòng khớp hoặc bao gồm cả ngữ cảnh xung quanh.
Lore: Trình pager dành cho đời sống hàng ngày
Dựa trên nền tảng của viewport, tác giả đã phát triển lore - một terminal pager hoàn chỉnh dùng riêng cho mình. Lore cung cấp một tập hợp các tính năng được tối ưu hóa cho nhu cầu thực tế:
- Tìm kiếm nhanh: Các phím tắt riêng biệt cho tìm kiếm chính xác (/), regex (r) và không phân biệt hoa thường (i).
- Điều hướng linh hoạt: Hỗ trợ cuộn, phóng to (zoom) vào một dòng log cụ thể, và định dạng JSON (prettify) để dễ đọc hơn.
- Tương tác: Cho phép chọn một item (dòng) cụ thể để thực hiện hành động tiếp theo, một tính năng thường thấy trong các TUI hiện đại nhưng ít có ở các pager truyền thống.
Tính năng tìm kiếm văn bản trong terminal
Lore hiện tại có thể không hỗ trợ đầy đủ tất cả các tùy biến phức tạp của less, nhưng nó mang lại trải nghiệm trực quan và phù hợp hơn với thói quen sử dụng của tác giả. Bạn có thể cài đặt lore và đặt nó làm pager mặc định bằng câu lệnh export PAGER=lore trong tệp cấu hình shell (như ~/.zshrc).
Kết luận
Việc tự xây dựng các công cụ nhỏ như lore hay thư viện viewport không chỉ giúp giải quyết các vấn đề cụ thể mà còn cung cấp cái nhìn sâu sắc về cách hoạt động ngầm của hệ thống terminal, từ byte dữ liệu thô đến cách hiển thị trên màn hình. Đây là một ví dụ điển hình cho thấy tinh thần của các lập trình viên: luôn tìm cách tối ưu hóa và tùy chỉnh công cụ làm việc để đạt hiệu suất cao nhất.



