Với những người dùng Linux, terminal emulator là thứ không thể thiếu. Trong bài viết này mình sẽ ghi lại cách mình build cho mình một terminal nhỏ gọn, tối giản và chỉ thực hiện những gì mình cần.
Simple Terminal gọi tắt là st là một terminal phát triển bởi cộng đồng Suckless.
Cài đặt gói cần thiết
Để build st, trước hết ta phải có các thư viện và các phần mềm cần thiết trong máy. Với Void Linux, mình sẽ dùng lệnh sau để cài:
sudo xbps-install -S git curl base-devel libXft-devel harfbuzz-devel
Tải mã nguồn
Bây giờ chúng ta sẽ clone mã nguồn của st về máy từ git server của Suckless, sau đó tạo thư mục để chứa các patches.
git clone https://git.suckless.org/st
mkdir ./st/patches
cd ./st
Cài đặt patches
Mình đã giải thích về khái niệm patch (bản vá) trong Suckless - Vá phần mềm.
Scroll back
Mặc định st không có chức năng cuộn trang lên xuống lịch sử terminal. Đây là một patches phức tạp, thật ra là tổng hợp của 3 patches:
- scrollback: thêm chức năng cuộn trang với phím tắt Shift+PageUp
- scrollback-reflow: chức năng gói dòng (wrap) khi cửa sổ thay đổi kích thước, dưới đây sẽ là ví dụ trước và sau khi cài
scrollback-reflow
.
- scrollback-mouse: gán chức năng cuộc trang lên con lăn của chuột
Vì cài đặt các patch này dễ gặp mâu thuẫn nên mình sẽ soạn lại file diff bao gồm cả 3 patches cho tiện lợi, do đó chúng ta sẽ tải file diff từ repo của mình.
curl https://gitlab.com/khiemtu27/st/-/raw/master/patches/scrollback.diff -o patches/scrollback.diff
patch -i patches/scrollback.diff
Boxdraw
Khi sử dụng terminal, sẽ có lúc ta gặp phải những hộp được vẽ bằng những ký tự đặt biệt như hình dưới.
Để ý sẽ thấy những đường thẳng không liền mạch mà có những điểm giao nhau khá khó chịu, patch boxdraw
sẽ khắc phục điều này.
curl https://gitlab.com/khiemtu27/st/-/raw/master/patches/boxdraw.diff -o patches/boxdraw.diff
patch -i patches/boxdraw.diff
Ligatures
Ký tự nối (ligatures) là những ký tự đặt biệt được tạo nên từ 2 ký tự chẳng hạn như æ, œ, ≦, ≠... Những ký tự nối này đòi hỏi các khối trong terminal phải biến hóa khác đi một chút để kết hợp với nhau thành một ký tự mới.
Ghi chú
Tất cả nội dung hiển thị trong terminal về bản chất đều là những khối (cell). Những khối này có kích thước y hệt nhau, đó cũng là lí do vì sao terminal không thể hiển thị nhiều kích thước font cùng lúc.
Lưu ý
- Sau khi cài patch này tất cả các ký tự bạn gõ như
!=
,>>
,->
đều sẽ được hiển thị khác đi như hình phía trên.- Khả năng hiển thị ký tự nối còn tùy vào font bạn đang dùng.
- Nếu như đã cài patch này mà các ký tự nối vẫn chưa hiển thị đúng, như ví dụ trên, thì hãy thử cài một trong những fonts tại Nerd Fonts.
- Font trong hình là IosevkaTerm.
curl https://st.suckless.org/patches/ligatures/0.9/st-ligatures-boxdraw-20240105-0.9.diff -o patches/ligatures.diff
patch -i patches/ligatures.diff
Anysize
Mặc định st render kích thước cửa sổ theo đơn vị cột và dòng. Điều này khiến việc thay đổi kích thước cửa sổ cũng chỉ là thay đổi số lượng dòng và cột. Do đó không thể thay đổi chính xác từng pixel như các phần mềm khác.
Khi dùng tiling window manager, sẽ xuất hiện những khoảng trống như hình dưới đây. Kể cả bề ngang lẫn bề dọc đều không thể chạm mép màn hình.
Patch này để khiến st vẽ cửa sổ bằng đơn vị pixel.
curl https://st.suckless.org/patches/anysize/st-expected-anysize-0.9.diff -o patches/expected-anysize.diff
patch -i patches/expected-anysize.diff
Del key
Mặc định st không gán phím Del với chức năng xóa ký tự sau con trỏ như ở mọi nơi khác.
$ curl https://st.suckless.org/patches/delkey/st-delkey-20201112-4ef0cbd.diff -o patches/delkey.diff
$ patch -i patches/delkey.diff
Chỉ in đậm
Màu sắc hiển thị trong terminal thường gồm 16 màu, gồm 8 màu thường và 8 màu sáng như dưới đây:
Ngoài ra để đa dạng hơn trong hiển thị, font chữ trong terminal cũng hỗ trợ các kiểu cách như nghiêng và đậm.
Mặc định st sẽ đánh đồng kiểu dáng đậm cũng sẽ có nhóm màu sáng. Patch này sẽ tách riêng chúng ra. Đậm là đậm mà sáng là sáng, không có đi chung.
$ curl https://st.suckless.org/patches/bold-is-not-bright/st-bold-is-not-bright-20190127-3be4cf1.diff -o patches/bold-is-not-bright.diff
$ patch -i patches/bold-is-not-bright.diff
Màu sắc
Một trong những yếu tố quyết định đẹp xấu của một terminal emulator là bảng 16 màu của chúng. Thật ra là có tới 18 màu, 16 màu như trên với màu nền (background) và màu chữ (foreground), đôi khi còn cả màu con trỏ (cursor).
Mình thường thay đổi màu sắc terminal của mình cho đỡ chán mắt. Nhưng việc phải vào config.h thay đổi từng màu một là rất phiền. Do đó mình sẽ bóc tách bảng màu ra những files riêng, và chỉ cần thay đổi một dòng trong config.h là có thể thay đổi màu sắc.
curl https://gitlab.com/khiemtu28/st/-/raw/master/patches/colors.diff -o patches/colors.diff
patch -i patches/colors.diff
Mình đính kèm sẵn các bảng màu sau:
- Catppuccin (Mocha)
- Dark
- Dracula
- Gruvbox (Hard)
- Kanagawa (Wave)
- Nord (Dark)
- One Dark
- Rosé Pine
- Tokyo Night (Storm)
Để tạo cho mình một bảng màu, bạn truy cập website này:
- Chỉnh sửa màu tùy ý thích
- Vào tab Export, chọn Simple Terminal
- Copy đoạn mã nguồn đó vào một file có đuôi
.c
trong thư mục gốc của st - Xem các file
colors-???.c
mẫu có sẵn để xóa các dòng thừa ở dưới - Chỉnh sửa dòng
#include "colors-???.c"
trong file config.h. - Rebuild st.
Thành quả
Nếu bạn chưa biết cách cài đặt st, hãy tham khảo bài viết Suckless - Cài và chạy thử.
Dưới đây sẽ là ảnh chụp màn hình của tất cả các bảng màu đi kèm để bạn có thể tham khảo.