Monaspace
(monaspace.githubnext.com)- Monaspace là một hệ thống phông chữ mới nhằm đưa biểu đạt typography phong phú hơn vào màn hình mã nguồn trong khi vẫn giữ lưới monospace
- Tính năng cốt lõi Texture Healing điều chỉnh sự mất cân bằng khoảng trống giữa các cặp ký tự liền kề bằng glyph thay thế, giúp giảm chênh lệch mật độ trong văn bản monospace
- Cách làm này áp dụng contextual alternates của OpenType cho phông chữ dùng cho code; có thể dùng trong hầu hết trình soạn thảo mà không cần plugin riêng, và cũng có cấu hình cho Visual Studio Code
- Monaspace có các trục độ đậm 200~800, độ nghiêng 0~-11°, độ rộng 100~125, và có thể bật/tắt code ligature theo từng style set cho từng ngôn ngữ
- GitHub Next đã phát triển phông chữ này cùng Lettermatic từ năm 2022, với mục tiêu mở rộng hiển thị code thành một phương tiện biểu đạt rộng hơn mà công cụ phát triển có thể tận dụng
Hệ thống phông chữ mở rộng màn hình code monospace
- Monaspace là một “superfamily” phông chữ dành cho code, tập trung vào việc cải tiến cách hiển thị code trên màn hình
- Từ thời kỳ đầu của teletype, code đã được hiển thị bằng phông chữ monospace; Monaspace muốn giữ lưới đó trong khi chứa được nhiều ý nghĩa hơn
- Các trình soạn thảo hiện nay thường truyền tải thông tin vượt ra ngoài tô sáng cú pháp bằng màu sắc thông qua các yếu tố giao diện như hover, gạch chân và trang trí đồ họa
- Monaspace cung cấp ở cấp độ phông chữ một bảng biểu đạt phong phú hơn mà code và công cụ phát triển có thể tận dụng
Gợi ý Copilot và typography
- Các gợi ý code như Copilot có thể có một giọng nói typography riêng thông qua Monaspace
- Ghost text có thể khiến việc phân tích cú pháp và đánh giá code được đề xuất trở nên khó khăn
- Nếu chính cách thể hiện của phông chữ cho thấy phần nào là code được đề xuất, các đoạn code được đề xuất cũng sẽ dễ phân biệt hơn về sau
Giới hạn của phông chữ monospace mà Texture Healing nhắm tới
- Phông chữ monospace đặt mọi ký tự vào một ô có cùng chiều rộng, khiến mật độ văn bản không đồng đều
- Các ký tự hẹp như
l,icần serif được phóng đại để lấp đầy ô, nhưng vẫn còn nhiều khoảng trống hơn mức cần thiết - Các ký tự rộng như
m,wbị nén trong ô, làm méo hình dạng, nét mảnh đi và khoảng trống bên trong cũng bị hạn chế - Những ràng buộc này là vấn đề cấu trúc của phông chữ monospace kéo dài từ thời teletype những năm 1960
Cách Texture Healing hoạt động
- Texture Healing tìm các cặp ký tự liền kề trong đó một ký tự thiếu không gian và ký tự kia thừa không gian, rồi thay thế glyph
- Ký tự hẹp được đổi thành glyph thay thế nhường một phần khoảng trống cho ký tự bên cạnh, còn ký tự rộng được đổi thành glyph thay thế mở rộng tới mép ô
- Tính năng này được triển khai bằng contextual alternates của OpenType
- contextual alternates thường được dùng trong chữ Ả Rập hoặc phông chữ viết tay, nơi hình dạng glyph thay đổi tùy theo ký tự xung quanh
- Monaspace áp dụng kỹ thuật này cho phông chữ monospace dùng cho code
- Văn bản kết quả vẫn tuân theo lưới monospace
- Có thể xem cách bật Texture Healing trong Visual Studio Code tại tài liệu Monaspace
Trục phông chữ và kiểu dáng
- Trục độ đậm của Monaspace được cung cấp từ 200 đến 800
- 200: Extra Light
- 300: Light
- 400: Regular
- 500: Medium
- 600: Semibold
- 700: Bold
- 800: ExtraBold
- Trục độ nghiêng được cung cấp từ 0 đến -11°
- 0: Normal
- -5.5°: Điểm giữa nơi một số ký tự chuyển từ dạng oblique sang dạng italic
- -11°: Italic
- Trục độ rộng được cung cấp từ 100 đến 125
- 100: Normal
- 112.5: Semiwide
- 125: Wide
- Monaspace bao gồm các tên họ phông như Neon, Argon, Xenon, Radon, Krypton
Code ligature và thiết lập OpenType
- Monaspace bao gồm code ligature cho nhiều ngôn ngữ lập trình khác nhau
- Ligature được tổ chức thành các style set, nên người dùng có thể chỉ bật hoặc tắt những set mình muốn
- Mỗi style set được thiết kế đại khái dựa trên nhu cầu của một ngôn ngữ cụ thể
ss01: Bao gồm ligature cho các chuỗi ký tự thường thấy trong JavaScriptss05: Cung cấp ligature cho toán tử F#
- Các tính năng OpenType bổ sung cũng được cung cấp
calt: Kích hoạt Texture Healingliga: Tùy chỉnh khoảng cách cho các ký tự lặp như///,||, và được thiết kế để không kích hoạt bên trong các chuỗi dài hơn như////
- Trong Visual Studio Code, kích hoạt bằng cách chỉ định các tính năng và style set mong muốn trong
editor.fontLigaturescủasettings.json
Sản xuất và phân phối
- Monaspace được tạo ra với mục tiêu cải thiện hiển thị code cho mọi nhà phát triển
- GitHub Next bắt đầu công việc này vào năm 2022 và phát triển phông chữ cùng Lettermatic
- Danh sách người đóng góp, tài liệu và tệp phông chữ có thể xem tại Monaspace repo
- Có thể tải xuống từ kho GitHub
1 bình luận
Ý kiến trên Hacker News
Tính năng Texture Healing sử dụng các tính năng OpenType rất khéo léo, làm cho những tổ hợp phông chữ monospace có vấn đề trở nên dễ nhìn hơn nhiều mà không hề phá vỡ lưới
Nếu theo cách đơn giản thì sẽ tạo ligature cho các cặp chữ khó như
mi,lm, nhưng ở đây có vẻ như nó chọn glyph thay thế để lấp đầy khác nhau bên trong chiều rộng cố định tùy theo các chữ xung quanhThực tế thì khó dùng. Độ rộng ký tự thay đổi tùy theo ký tự theo sau, nên văn bản bị giật khi đang nhập. Khi đọc thì đẹp, nhưng khi viết thì rất tệ
Riley Cran, người đã nghĩ ra kỹ thuật này như một phần của dự án, cùng toàn bộ đội ngũ https://lettermatic.com thật đáng nể
Ví dụ trong
time_limitở ví dụ mặc định, chữmthứ hai cóiở cả hai bên nên có thêm không gian để “phình ra”, vì vậy trông rõ ràng rộng hơn chữmđầu tiên. Tôi không chắc đây có phải điều tốt hay khôngTexture healing này cũng đã phá vỡ lưới ô ký tự hoàn hảo, nên ở một khía cạnh nào đó, nó có cảm giác mang nhược điểm của cả hai bên
Tôi cũng nhìn các ligature hào nhoáng theo cách tương tự ở một mức độ nào đó. Có thể dùng ký tự thật trong mã nguồn, và Unicode được hỗ trợ rộng rãi. Raku làm như vậy, nhưng để thật sự tỏa sáng thì cần dàn chữ tốt hơn, bao gồm cả phông chữ có độ rộng biến thiên
Ban đầu tôi chỉ nghĩ “lại thêm một họ phông monospace nữa, trông cũng đẹp”, nhưng sau khi thấy texture healing thì rất muốn thử dùng
Tôi rất thích ý tưởng dùng các kiểu phông khác nhau cho từng mục đích. Tuy nhiên vì tôi chủ yếu dùng terminal nên không biết terminal nào hỗ trợ việc này, và có lẽ trình soạn thảo văn bản dòng lệnh cũng phải hỗ trợ. Dù vậy tôi vẫn thấy đây là một ý tưởng tuyệt vời
ESC[<10-19>mlà escape sequence để chọn phông 0~9Còn thực tế có chạy hay không lại là chuyện khác. Tôi dùng Alacritty nhưng không tìm thấy thông tin hỗ trợ, và tự thử cũng không có kết quả
Tôi tò mò mọi người nhìn ví dụ Mix & Match như thế nào
Radon, kiểu giống chữ viết tay, thực chất trông như italic nên phối khá hợp với các phông khác. Nhưng các kiểu còn lại có metric quá giống nhau, khiến các ví dụ như “chuỗi tài liệu có thẩm quyền” hay “giọng Copilot” khá khó phân biệt
Từ lâu tôi đã tìm một lựa chọn thay thế mở cho Operator Mono, và nhờ Mix & Match, cuối cùng tôi thấy đây có thể là lựa chọn đó
Chắc sẽ có người không thích, nhưng cá nhân tôi muốn thử dùng
Các biến thể khác không đủ khác biệt để truyền tải thông tin
Có khá nhiều ligature, nhưng với tôi vẫn chưa đủ. Giờ đây
!=và<=đã là cơ bản, và tôi cứ nhận ra Fira Code làm tốt đến mức nào khi căn chiều cao của*trong*ptr, đặt:ở giữa trongX:Y, hoặc nângxtrong0xFFTôi suýt thích hình dáng của biến thể Krypton, nhưng nét ngang của chữ thường
tthấp hơn quá nhiều so với chiều cao của các chữ như chữ thườngc. Vì vậy hiện tại có lẽ tôi vẫn sẽ tiếp tục dùng Fira Code, và sẽ quay lại xem sau khoảng một năm kể từ khi có phản hồi người dùng thì đã thay đổi những gì*trong/**bị lệch ở ví dụ trên trang được liên kết trông khá gượngĐặc biệt dễ thấy trong các ví dụ như
// What if tentative ideas looked handwritten?và/** * What if docstrings looked authoritative? */Ý tưởng thì hay, nhưng tôi thắc mắc tại sao lại không thấy nhiều phông chữ hẹp như PragmataPro hơn
Tôi đã dùng nó gần 10 năm rồi và rất muốn có thêm lựa chọn trong mảng này, nhưng có vẻ không ai muốn làm hẹp đến mức đó. Berkeley Graphics đã úp mở về một phiên bản hẹp của Berkeley Mono gần 1 năm nay, nhưng vẫn chưa có gì xảy ra
Ở Monaspace này cũng có thanh trượt độ rộng, nhưng cảm giác điểm bắt đầu đã là “rộng hơn PragmataPro”, còn điểm cuối thì đi tới mức “rộng một cách lố bịch”. Tôi thắc mắc tại sao họ không làm cho nó có thể giảm xuống cả phía phiên bản hẹp
Iosevka mặc định khá gần, nhưng khoảng cách dòng lớn hơn nhiều. May là có thể tùy chỉnh gần như giống hệt bằng cách đặt
leading = 1110trong cấu hình. Tôi tìm ra giá trị này bằng thử-saiKhi tìm phông chữ hẹp nhất, tôi nhận ra Quinze là câu trả lời. Nó hẹp hơn Iosevka hay M+ khoảng 20%. Tôi không tìm được tài liệu so sánh trực tiếp với PragmataPro, nhưng nếu Iosevka là một cách diễn giải miễn phí của PragmataPro thì Quinze chắc cũng hẹp hơn
Thực tế Quinze hẹp đến mức khi tôi ép dùng nó cho toàn bộ văn bản monospace trong trình duyệt, khả năng đọc không tốt lên mà còn tệ đi. Vì ở cùng một chiều cao, nó trông nhỏ hơn nhiều so với phông “bình thường”. Trong môi trường lập trình thì tôi tăng cỡ chữ lên, và điều đó hợp với bề ngang hẹp
Nhược điểm là Quinze rất tối giản. Gần như chỉ có ASCII, không có ligature và cũng không tùy chỉnh được. Cá nhân tôi không thấy những điểm đó phiền
Dù vậy nó có thể hẹp đúng như bạn muốn
https://mplusfonts.github.io/
Tôi đang dùng “Bell MT” thay cho Times trong trình duyệt, và cũng dùng làm phông biến độ rộng trong Org mode của emacs; nó tốt, nhưng nếu có phiên bản to hơn và hẹp hơn thì hay
Ngoài ra một phông monospace hẹp tốt nữa là “The Sans Mono Condensed”, nổi tiếng nhờ những cuốn sách O’Reilly thời kỳ đầu. Về sau O’Reilly đã đổi sang phông monospace khác. Nhược điểm là nó chỉ có bộ ký tự phương Tây, nhưng tôi từng rất thích nó
Ký hiệu Radon trên trang đang là Rd khiến tôi thấy khó chịu. Nếu là Radon thì phải là Rn
Radium là
Ra, Radon làRn, và tôi đã phải kiểm tra lại xem có nguyên tố nào khác bắt đầu bằngRvà có chữdtrong tên khôngRhVì mono flag chưa được đặt, nên tôi đã phải thử bằng GTK2 gvim để tải phông chữ
Kết quả của
% ttfmono MonaspaceArgon-Regular.otflàmonospaced flag = 0, và hiện0 = variable-width, otherwise = monospacedĐáng tiếc là có vẻ vì flag này nên ligature không được bật
Dù vậy trong vim chạy trên
stđã được patch, tôi đã thấy được ligature và texture healing, và thật sự rất thích. Khi gõ, dòng chỉ dịch chuyển cực kỳ tinh tế, và khi con trỏ đi qua, chẳng hạn vì chữmđược nới rộng, cũng không để lại dư ảnh. Nó được thiết kế rất tốt cho codeNếu được yêu cầu một tính năng, tôi muốn có thể chọn một số biến thể, chẳng hạn thêm dấu gạch chéo ngược vào số 0 dạng góc cạnh, hoặc giữ lại
!trong ligature!=. Ý tôi có thể xem ở đây: https://github.com/be5invis/Iosevka/blob/main/doc/stylistic-...https://st.suckless.org/patches/ligatures/
Tôi đang dùng bản phát hành hôm nay, nên có thể nó đã được sửa gần đây
Phải bật rõ checkbox “Show all fonts” thì mới thấy cả những phông “không phải monospace”
Trên các hệ thống hiện đại, có lẽ phông chữ cho code giờ đã có thể vượt ra ngoài phông monospace
Tôi đã đề xuất nhiều lần ở đây rồi, nhưng tôi dùng Input Sans, một phông lập trình tỷ lệ
https://input.djr.com
Nhìn phông này có vẻ có thể khiến việc tìm lỗi gõ sai khó hơn
Khi dùng Vim qua SSH thì cứ tiếp tục dùng monospace cũng được, nhưng dù nhờ Neovim mà đã có nhiều frontend hơn, dường như gần như không có cái nào hỗ trợ phông tỷ lệ. Những cái có hỗ trợ thì lại chậm đến mức dùng rất khổ
>=thành≥không? Tôi thử xem bản preview web trên điện thoại, nhưng có thể đó là giới hạn của Android FirefoxTham khảo, ligature là kiểu này: https://fonts.google.com/knowledge/glossary/ligature
Tôi luôn thấy khó hiểu vì sao số 0 có dấu chấm trong các phông chữ kiểu này lại trở thành gần như một chuẩn. Tôi lúc nào cũng nhầm nó với số 8, nên thích số 0 có gạch chéo hơn nhiều
Nếu có biến thể như vậy thì tôi rất muốn dùng thử phông chữ này
Nhà thiết kế phông chữ cũng có thể nhấn mạnh phần lồi của số 0 có dấu chấm và phần lõm của
8để phân biệt trực quan, nhưng tôi không biết phông chữ này có làm vậy khôngTexture healing là một ý tưởng thật sự thông minh và đẹp
Tôi cũng muốn thử áp dụng nó cho chữ viết tay tiếng Trung, vốn thường được dùng ở dạng chữ rộng cố định. Những chữ phổ biến nhưng rất dày đặc, đặc biệt là các chữ phồn thể như
邊鐵餐廳臺藥機麵顧露樓幫讓, sẽ được lợi rất nhiều nếu có thể nhận thêm không gian và trải rộng ra