st - Simple Terminal

20242805 #tech #suckless #linux

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:

Cuộn trang bằng phím tắt

Mặc định nội dung sẽ mất hết khi thu nhỏ Nội dung terminal trả lại trạng thái ban đầu

Đã có thể cuộn trang bằng 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.

Vẽ hộp mặc định

Để ý 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.

Vẽ hộp đã được vá

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.

Vẽ ký tự nối mặc định Vẽ kỹ tự nối sau khi vá

Lưu ý

  1. 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.
  2. Khả năng hiển thị ký tự nối còn tùy vào font bạn đang dùng.
  3. 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.
  4. 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.

Thay đổi kích thước mặt định

Patch này để khiến st vẽ cửa sổ bằng đơn vị pixel.

Cửa sổ ra tới tận viền sau khi vá

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:

Bảng 16 màu trong terminal

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đậ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:

  1. Catppuccin (Mocha)
  2. Dark
  3. Dracula
  4. Gruvbox (Hard)
  5. Kanagawa (Wave)
  6. Nord (Dark)
  7. One Dark
  8. Rosé Pine
  9. Tokyo Night (Storm)

Để tạo cho mình một bảng màu, bạn truy cập website này:

  1. Chỉnh sửa màu tùy ý thích
  2. Vào tab Export, chọn Simple Terminal
  3. Copy đoạn mã nguồn đó vào một file có đuôi .c trong thư mục gốc của st
  4. Xem các file colors-???.c mẫu có sẵn để xóa các dòng thừa ở dưới
  5. Chỉnh sửa dòng #include "colors-???.c" trong file config.h.
  6. 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.

Catppucin Dark Dracula Gruvbox Kanagawa Nord One Dark Rose Pine Tokyo Night


Bài viết liên quan