10 điểm bởi GN⁺ 13 ngày trước | 1 bình luận | Chia sẻ qua WhatsApp
  • Bản port mã nguồn mở hiện đại hóa framework text UI của Borland từ thập niên 90 với khả năng đa nền tảng + Unicode
  • Khi tạo ứng dụng terminal, không cần tự xử lý tính tương thích của terminal - chạy bằng cùng một mã trên Linux, Windows và DOS
  • Các widget TUI như cửa sổ chồng lấp có thể đổi kích thước, menu thả xuống, hộp thoại, nút bấm, thanh cuộn, ô nhập liệu, checkbox, radio button đã được tích hợp sẵn, nên có thể dùng ngay mà không cần tự triển khai
  • Hỗ trợ đầy đủ UTF-8 Unicode — vẫn giữ API cũ dựa trên char nhưng vẫn xử lý được ký tự CJK toàn chiều rộng, ký tự kết hợp và cả emoji; chỉ với một dòng moveStr() là tự động xử lý cuộn và cắt chuỗi đa byte
  • Tận dụng hỗ trợ UTF-8 setlocale của Microsoft RTL để các đoạn mã như std::ifstream f("コンピュータ.txt") vẫn chạy nguyên vẹn trên Windows
  • Hỗ trợ true color 24-bit — mở rộng từ 16 màu cũ sang RGB, xterm-256 và màu mặc định của terminal; nếu terminal không hỗ trợ thì sẽ tự động lượng tử hóa về màu gần nhất
  • Hỗ trợ đầy đủ nhập/xuất hiện đại như bánh xe chuột, nút giữa, triple click, kích thước màn hình lên tới 32767 hàng/cột, sự kiện đổi kích thước cửa sổ, v.v.
  • Tích hợp sẵn kết nối với clipboard hệ thống: Windows/macOS dùng ngay được, còn trong môi trường SSH từ xa cũng có thể sao chép/dán qua X11 forwarding hoặc mã escape OSC 52
  • Có thể build lại mã nguồn Turbo Vision thời Borland C++ cũ với chỉnh sửa tối thiểu
  • Hỗ trợ hệ thống build CMake, chỉ cần ./vcpkg install tvision là cài xong qua vcpkg, và nếu thêm add_subdirectory dưới dạng submodule CMake thì dependency sẽ được liên kết tự động
  • Cần C++14 trở lên, libncursesw / giấy phép MIT

1 bình luận

 
Ý kiến trên Hacker News
  • Thật vui khi thấy kho lưu trữ này lên trang nhất, và hiện giờ tôi đang tự làm một wrapper cho chính kho này
    Tôi đang chạy Turbo Vision trên macOS qua .Net, và nó mang lại cảm giác khá kỳ diệu
    Tôi đang bổ sung API cấp cao hơn, đồng thời bao lại hoặc cải thiện palette API vốn khá lỗi thời, và cũng thêm cả layout
    Hiện vẫn đang làm rất tích cực trong một kho riêng tư; hôm nay thì chỉnh palette dựa trên surface nơi control được đặt, ngày mai lại tinh chỉnh phần khác, kiểu như vậy
    Vẫn còn việc phải làm như dọn dẹp layout, thêm các control cơ bản còn thiếu theo tiêu chuẩn ngày nay
    Trước đây tôi cũng đã dùng Terminal.Gui, nhưng có lẽ vì đang chuyển sang v2 nên khá khó dùng mà không dính bug, và Claude cũng cho thấy rất rõ không nên làm gì khi tạo thư viện TUI mà không tính đến terminal thực tế
    Vì thế tôi đã nghĩ sẽ thật tuyệt nếu có một Turbo Vision hiện đại, rồi tình cờ phát hiện kho này, và thấy nó còn hỗ trợ cả Unicode nên thực sự rất biết ơn

    • Oxygene là một phần của bộ sản phẩm Elements của RemObjects, nên ngoài Oxygene thuộc họ Pascal còn có thể trộn với nhiều ngôn ngữ phổ biến khác và mang sang Windows, macOS, Linux, Android v.v.
      https://www.remobjects.com/elements/oxygene/
      https://www.remobjects.com/elements/
    • Tôi cũng từng làm việc với bản port tvision này, và mỗi lần đụng vào framework TUI mới lại thấy cuối cùng Turbo Vision vẫn tốt hơn
      Tôi cũng đang làm một .NET wrapper, có lẽ tiến độ kém hơn, nhưng muốn mô phỏng API Windows Forms giống nhất có thể và thậm chí thêm cả TUI designer kéo-thả
      Ví dụ ở đây: https://github.com/brianluft/terminalforms/tree/main/src/TerminalFormsDemo
      Phần lớn công việc tích hợp C++ rắc rối được xử lý ở đây: https://github.com/brianluft/terminalforms/tree/main/src/tfcore
      Tôi export các hàm C đơn giản để có thể gọi bằng P/Invoke, còn phía C# thì chủ yếu tập trung vào tổ chức lớp
      Ban đầu tôi cố ép rằng mọi thứ làm được trong C++ cũng phải làm được trong C#, nhưng nó trở nên quá phức tạp; thậm chí tôi còn dùng placement new để nhét đối tượng C++ vào buffer C#, gần như đạt tới mức kế thừa lớp C++ từ phía C#, rồi thiết kế sụp đổ
      Cuối cùng tôi chuyển sang cách tiếp cận trực diện hơn, ít linh hoạt hơn nhưng đơn giản hơn rất nhiều, và để sự linh hoạt ở phía C#
      Tôi tò mò hệ thống P/Invoke của bạn được tổ chức như thế nào
    • Mỗi khi nghịch thư viện TV này là cảm giác hoài niệm được gãi đúng chỗ nên rất vui
      Nhờ vậy mà có lẽ tôi không còn thử mấy chuyện viển vông như viết app cho GEOS hay tham gia đội Hurd một người nữa
    • Tôi cũng muốn thử làm điều tương tự
      Tôi có dùng Terminal.Gui, nhưng phía TV cuốn hút hơn nên từng nghĩ tới chuyện làm wrapper, và nếu được công khai thì tôi thật sự rất muốn xem
  • Sự nghiệp lập trình của tôi đúng nghĩa là bắt đầu từ thùng rác vào thập niên 90
    Tôi nhặt được một cuốn sách Turbo Vision mà ai đó vứt đi, và lập tức mê mẩn cái TUI ánh xanh mà ai cũng có thể tạo ra

  • Bản gốc nằm trong Turbo Pascal 6, còn bản port C++ ra đời sau
    Vậy nên có thể xem đây là một bản port hiện đại của một bản port
    Borland cũng từng như vậy với các framework khác; OWL ban đầu cũng đến từ phía Turbo Pascal for Windows 1.5 trước, và khá nhiều công cụ của C++ Builder thật ra được viết bằng Delphi
    Object Pascal của Turbo Pascal 5.5, rồi Turbo Vision của bản 6 là nơi tôi nhập môn OOP, và tôi cảm thấy mình đã may mắn khi đi theo con đường đó
    Ngay cả trong môi trường như MS-DOS, tôi vẫn có thể học rất rõ các lợi ích của OOP và kiểu framework mà Turbo Vision mang lại

    • Điều thú vị là Free Vision từng là kết quả của việc ai đó dịch thủ công bản C++ từng được phát hành vào public domain, rồi chuyển ngược lại sang Object/Free Pascal
    • OWL thực sự đi trước thời đại
  • Khi Borland tung ra Turbo Pascal, Turbo C++, TurboVision, tôi cảm thấy cả một vũ trụ khả năng bỗng mở ra
    Hiệu năng compiler cũng tuyệt vời, còn các cuốn manual thì như tác phẩm nghệ thuật; ước gì tôi vẫn còn giữ những cuốn đó
    Đây đúng là một báu vật văn hóa

    • Những manual đó thực sự phi thường
      Đầu thập niên 90, tôi gần như tự học C/C++ chỉ bằng cách đọc Turbo C++ và cả chồng sách Borland đi kèm, còn bây giờ thì thật khó tưởng tượng cảnh chỉ đọc tài liệu tham khảo mà học như thế
    • Turbo Vision từ lâu đã là một kiểu tiêu chuẩn vàng đối với tôi
      Các framework TUI mới lúc nào cũng cho cảm giác thiếu thiếu gì đó, và giờ tôi định dùng lại cái này để xem đó có chỉ là hoài niệm hay không
      Tôi sẽ đưa nó vào công cụ tiếp theo của mình, và muốn gửi lời tán dương lớn tới những người đã làm ra nó
    • Đã có một thời tôi all-in với Borland
      Trừ GW-BASIC và MS-DOS, còn lại từ Turbo BASIC, Turbo Pascal, Turbo C++ cho MS-DOS và Windows 3.x, đến Turbo Vision, OWL, tất cả đều là Borland
      Tôi chỉ dùng VC++ vào khoảng bản 5, và MFC lúc nào cũng thấy quá nhạt nhòa so với sản phẩm của Borland
      Ngay cả bây giờ, cũng hiếm thứ nào thực sự bắt kịp năng lực RAD của C++ Builder, và .NET cũng mất khá lâu mới giải quyết được câu chuyện viết mức thấp và AOT kiểu Delphi
      Tôi nghĩ nên phát cho các lập trình viên Go, C++, Rust mỗi người vài bản Turbo Pascal 7 cho MS-DOS cùng Delphi hiện đại
  • Turbo Vision 2.0 đến giờ vẫn khá thực dụng, nên một năm trước tôi đã trực tiếp dùng nó cho một công việc nguyên mẫu
    Tôi đã thử làm một frontend Turbo Vision cho debugger LLDB để nó hoạt động giống Turbo Debugger của Borland, và phần lớn mọi thứ diễn ra đúng như mong muốn
    Thật đáng ngạc nhiên khi nó như tiếp nối đúng chỗ đã dừng lại từ những năm 199x, và tôi còn có thể compile rồi chạy mã từ năm 1993 mà không gặp vấn đề lớn
    Trình editor bên trong cũng có một phiên bản tốt hơn dựa trên Scintilla, với các tính năng như syntax highlighting, nhưng phần tôi định sửa thì không suôn sẻ lắm nên có lẽ phải nhờ tác giả giúp
    Tuy vậy, theo nghĩa tri thức chung hiện đại thì tài liệu vẫn còn thiếu, nên khó mà hỏi Stack Overflow hay AI; tôi buộc phải quay về cách cũ là học bằng ví dụ mã nguồn và đọc đi đọc lại vài cuốn sách Turbo Vision
    Layout thủ công khá phiền, nên sẽ hay nếu có auto layout kiểu Qt, và tôi cũng hơi nhớ splitter, dù việc tự triển khai có vẻ không khó
    Một điều nữa khiến tôi ngạc nhiên là TV thực ra khá nhỏ gọn và compact. Hồi thập niên 90 nó từng cho cảm giác rất đồ sộ
    Nhìn chung, công cuộc hiện đại hóa được làm rất tốt và tôi cực kỳ thích nó

  • Chỉ cần nhìn thấy cả đống chỉ thị cmake là tôi đã muốn quay lại quá khứ
    Với Turbo C hay Pascal, chỉ cần nhấn F9 là chạy ngay
    Mặt khác, tôi cũng thấy điều này cho thấy sự bất lực của toolchain của chúng ta
    Ở thời đại này, lẽ ra chỉ cần trỏ vào một compiler online để chạy ngay, hoặc tải về rồi mở một thư mục và chạy là xong, nhưng nó đã thành nghi thức hơn là công cụ

    • Trên Unix hiện đại, việc compile phần mềm từng là một vấn đề đã được giải quyết
      ./configure && make && make install mới đúng là gold standard và vẫn nên như vậy
  • Đây chỉ là một trong các bản port/bản clone của Turbo Vision
    Phía C++ còn có cái này: https://github.com/kloczek/tvision
    Bản đi kèm FreePascal/Lazarus được viết bằng Pascal, và cũng có một bản Rust, dù trông hơi vibe-coded: https://github.com/aovestdipaperino/turbo-vision-4-rust

  • Chạy nó trong terminal thì có phần mất đi cảm giác cốt lõi mà chuột của màn hình chế độ văn bản mang lại
    Trên màn hình text mode thật, nó không hiện như con trỏ chuột mà giống một khối vàng di chuyển bằng chuột hơn
    Tôi tò mò không biết có ai từng chạy nó trên text mode Linux độ phân giải cao với GPM chưa

    • Về bản chất nó không hẳn là màu vàng
      Nó hoạt động bằng cách đảo màu của ô bị đè lên, và vì cửa sổ chính tối xanh lam thường phủ phần lớn màn hình nên kết quả thường trông như một khối vàng sáng
  • Tôi khuyên nghe tập gần đây của Wookash podcast nói về Chuck Jazdzewski
    Ông là một thành viên của đội ngũ gốc tạo ra Turbo Vision, và cũng có nhiều câu chuyện về toàn bộ hệ sinh thái đó

  • Tôi vẫn muốn Turbo Vision thật sự, tức bản Pascal, hơn là bản C++
    Bản C++ cuối cùng vẫn cho cảm giác gần như là phía được chuyển từ bản Pascal sang
    Ví dụ trong Pascal, uses là từ khóa, còn kiểu include module bằng #define thì thế nào cũng thấy như một trò hack
    Dĩ nhiên bây giờ có thể khác biệt đó không còn lớn nữa

    • Free Vision đi kèm Free Pascal về cơ bản đảm nhiệm vai trò đó
      IDE text mode cũng dùng Free Vision
      https://wiki.lazarus.freepascal.org/images/1/19/Userscreen.png
      Tuy nhiên, điểm khác biệt cốt lõi là Free Vision và Turbo Vision dùng kiểu object từ thời Turbo Pascal 5.5 chứ không phải class của Delphi
      class nhờ có RTTI nên dễ hiện thực những thứ như tuần tự hóa tự động, còn object thì không có; vì vậy nếu muốn phân biệt các kiểu khác nhau lúc runtime thì phải làm tuần tự hóa thủ công, chẳng hạn đăng ký VMT pointer nằm ở offset cố định của object pointer
      Free Pascal có bổ sung cho object một số tiện ích như private/protected/public, property, nhưng Free Vision không dùng các phần mở rộng đó vì phải triển khai API Turbo Vision gốc