Turbo Vision 2.0 - 90 के दशक के टेक्स्ट UI का पुनर्निर्माण
(github.com/magiblot)- 90 के दशक के Borland टेक्स्ट UI framework का cross-platform + Unicode के साथ modernize किया गया open source port
- टर्मिनल ऐप बनाते समय terminal compatibility को अलग से संभालने की जरूरत नहीं - Linux, Windows, DOS पर एक ही code से चलता है
- resize किए जा सकने वाले overlapping windows, pull-down menus, dialogs, buttons, scrollbars, input boxes, checkboxes, radio buttons जैसे TUI widgets पहले से built-in हैं, इसलिए इन्हें खुद implement करने की जरूरत नहीं, सीधे इस्तेमाल किया जा सकता है
- UTF-8 Unicode का पूर्ण समर्थन — मौजूदा
char-आधारित API को बनाए रखते हुए भी CJK full-width characters, combining characters, और emoji तक संभाले जा सकते हैं, औरmoveStr()की एक ही लाइन से multibyte scrolling और clipping अपने आप हो जाती है - Microsoft RTL के UTF-8
setlocaleसमर्थन का उपयोग करकेstd::ifstream f("コンピュータ.txt")जैसा code Windows पर भी वैसे ही चलता है - 24-bit true color support — पहले के 16 colors से बढ़ाकर RGB, xterm-256, और terminal default colors तक विस्तार किया गया है, और अगर terminal support न करे तो अपने आप सबसे नज़दीकी रंग में quantize कर देता है
- mouse wheel, middle button, triple click, 32767 rows/columns तक की screen size, window resize events आदि सहित आधुनिक input/output का पूरा समर्थन
- system clipboard integration built-in: Windows/macOS पर तुरंत काम करता है, और SSH remote environment में भी X11 forwarding या OSC 52 escape code के जरिए copy/paste संभव है
- पुराने Borland C++ दौर के Turbo Vision source code को बहुत कम बदलाव के साथ वैसे का वैसा build किया जा सकता है
- CMake build system का समर्थन, vcpkg से
./vcpkg install tvisionकी एक लाइन में installation पूरा, और CMake submodule के रूप मेंadd_subdirectoryजोड़ने पर dependency अपने आप link हो जाती है - C++14 या उससे ऊपर,
libncurseswआवश्यक / MIT license
1 टिप्पणियां
Hacker News टिप्पणियाँ
इस repository को front page पर देखना सच में बहुत अच्छा लगा, और मैं अभी इसी repository के लिए अपना wrapper खुद बना रहा हूँ
.Net के ऊपर macOS पर Turbo Vision चला रहा हूँ, और यह काफ़ी जादुई लगता है
मैं एक higher-level API दे रहा हूँ, काफ़ी पुरानी palette API को wrap या बेहतर कर रहा हूँ, और layout भी जोड़ रहा हूँ
अभी यह सब private repository में ज़ोरों से चल रहा काम है, और आज surface के हिसाब से palette सेट कर रहा हूँ जहाँ controls रखे गए हैं, कल किसी और हिस्से को polish करूँगा—ऐसे ही लगातार सुधार रहा हूँ
layout को साफ़-सुथरा करना, और आज के हिसाब से missing basic controls जोड़ना जैसे काम अभी बाकी हैं
पहले Terminal.Gui भी इस्तेमाल किया था, लेकिन शायद v2 transition की वजह से उसे bugs के बिना संभालना काफ़ी मुश्किल था, और Claude ने भी यह अच्छी तरह दिखा दिया कि अगर असली terminal को ध्यान में रखे बिना TUI library बनाई जाए तो क्या नहीं करना चाहिए
इसलिए मैं सोच ही रहा था कि Turbo Vision का कोई आधुनिक रूप होना चाहिए, तभी यह repository मिली, और इसमें Unicode support देखकर सच में बहुत आभार महसूस हुआ
https://www.remobjects.com/elements/oxygene/
https://www.remobjects.com/elements/
मैं भी एक .NET wrapper बना रहा हूँ, और शायद मेरी प्रगति कम हुई है, लेकिन मैं Windows Forms API को जितना हो सके उतना नज़दीक से mimic करना चाहता हूँ, यहाँ तक कि drag-and-drop TUI designer भी जोड़ना चाहता हूँ
उदाहरण यहाँ है: https://github.com/brianluft/terminalforms/tree/main/src/TerminalFormsDemo
C++ वाली मुश्किल integration का ज़्यादातर हिस्सा मैंने यहाँ संभाला है: https://github.com/brianluft/terminalforms/tree/main/src/tfcore
मैंने simple C functions export किए हैं ताकि उन्हें P/Invoke से बुलाया जा सके, और C# side को मुख्यतः class structure पर फ़ोकस करने दिया
शुरुआत में मैंने ज़ोर दिया था कि C++ में जो कुछ संभव है वह सब C# में भी संभव होना चाहिए, लेकिन वह बहुत जटिल हो गया, और placement new से C++ objects को C# buffers के अंदर रखकर लगभग यह स्थिति आ गई कि C# side से C++ classes inherit की जा रही हों—फिर design ही टूट गया
आख़िर में मैंने एक ज़्यादा सीधा, कम flexible लेकिन बहुत सरल approach अपनाया, और flexibility C# side पर छोड़ दी
आपका P/Invoke system कैसे बना है, यह जानने की जिज्ञासा है
शायद इसी वजह से GEOS के लिए app बनाने या one-man Hurd team में शामिल होने जैसी बेकार कोशिशों से बच गया हूँ
Terminal.Gui इस्तेमाल किया था, लेकिन TV side ज़्यादा आकर्षक लगी, इसलिए wrapper के बारे में सोच रहा था, और अगर यह public हो तो मैं ज़रूर देखना चाहूँगा
मेरा programming career सचमुच 90s में कूड़ेदान से शुरू हुआ था
किसी के फेंके हुए Turbo Vision book मिली थी, और मैं उन नीले रंग की TUI screens पर तुरंत फ़िदा हो गया जिन्हें कोई भी बना सकता था
मूल version Turbo Pascal 6 में था, और C++ port बाद में आया
इसलिए इसे port का आधुनिक port कहना ठीक होगा
Borland के दूसरे frameworks में भी यही पैटर्न था; OWL भी मूल रूप से Turbo Pascal for Windows 1.5 side पर पहले था, और C++ Builder के काफ़ी tools असल में Delphi में लिखे गए थे
Turbo Pascal 5.5 का Object Pascal, और 6 का Turbo Vision—यही मेरे लिए OOP की शुरुआत थे, और मुझे लगता है कि उस रास्ते पर जाना मेरी किस्मत थी
MS-DOS जैसे environment में भी OOP और Turbo Vision के framework फ़ायदे सचमुच अच्छे से सीखे जा सकते थे
जब Borland ने Turbo Pascal, Turbo C++, और TurboVision जारी किए, तो लगा जैसे संभावनाओं का पूरा ब्रह्मांड खुल गया हो
compiler performance भी शानदार थी और manuals कला-कृतियों जैसे थे; काश वे किताबें अभी भी मेरे पास होतीं
यह बस एक सांस्कृतिक ख़ज़ाना है
90s की शुरुआत में मैंने लगभग सिर्फ़ Turbo C++ के साथ आने वाली Borland की किताबों के ढेर को पढ़कर खुद C/C++ सीखा था, और आज यह कल्पना करना भी मुश्किल है कि कोई सिर्फ़ reference books पढ़कर इस तरह सीख सकता है
नए TUI frameworks में हमेशा कुछ न कुछ कमी लगती थी, और अब इसे फिर से इस्तेमाल करके देखूँगा कि वह सिर्फ़ nostalgia था या नहीं
मैं इसे अपने अगले tool में डालने वाला हूँ, और इसे बनाने वालों के लिए ज़ोरदार तालियाँ हैं
GW-BASIC और MS-DOS को छोड़ दें तो Turbo BASIC, Turbo Pascal, Turbo C++ for MS-DOS and Windows 3.x, Turbo Vision, OWL—सब कुछ Borland ही था
VC++ मैंने शायद version 5 के आसपास इस्तेमाल किया, लेकिन MFC हमेशा Borland products की तुलना में बहुत फीका लगा
आज भी C++ Builder की RAD capabilities का सही मुकाबला कम ही चीज़ें कर पाती हैं, और .NET को भी Delphi जैसी low-level coding और AOT story को ठीक करने में काफ़ी समय लगा
मेरा मानना है कि Go, C++, और Rust developers को MS-DOS के लिए Turbo Pascal 7 और आधुनिक Delphi की कुछ-कुछ copies पकड़ाई जानी चाहिए
Turbo Vision 2.0 आज भी काफ़ी practical है, और मैंने एक साल पहले prototyping के काम में इसे सीधे इस्तेमाल किया था
मैंने LLDB debugger के लिए एक Turbo Vision frontend बनाने की कोशिश की थी ताकि वह Borland के Turbo Debugger जैसा काम करे, और ज़्यादातर चीज़ें मनचाहे तरीके से चलीं
यह देखकर हैरानी हुई कि यह 199x में जहाँ रुका था वहीं से जैसे आगे बढ़ गया हो, और 1993 का code भी बिना बड़ी समस्या के compile और run हो गया
एक बेहतर built-in editor का Scintilla-based version भी है, जिसमें syntax highlighting जैसी सुविधाएँ हैं, लेकिन जिस तरह मैं उसे modify करना चाहता था, वह ठीक से नहीं हुआ, इसलिए शायद author से मदद माँगनी पड़ेगी
हालाँकि आज के साझा ज्ञान वाले अर्थ में documentation की कमी है, इसलिए Stack Overflow या AI से पूछना आसान नहीं था; मुझे example code देखकर सीखना पड़ा और Turbo Vision की कुछ किताबें बार-बार पढ़ने वाली पुरानी शैली अपनानी पड़ी
manual layout काफ़ी झंझटभरा है, इसलिए Qt जैसी auto layout सुविधा होती तो अच्छा होता, और splitter भी याद आता है, हालाँकि उसे implement करना मुश्किल नहीं लगता
एक और हैरानी की बात यह थी कि TV असल में काफ़ी छोटा और compact है. 90s में यह बहुत विशाल लगता था
कुल मिलाकर modernization का काम बहुत अच्छे से हुआ है, और मुझे यह बेहद पसंद है
Turbo Vision मूल रूप से बहुत बड़ी मात्रा में high-quality documentation के साथ आता था
उल्टा मुझे लगता है कि ऐसी documentation की कमी आज की चीज़ों में ज़्यादा है
https://archive.org/details/bitsavers_borlandTurrogrammingGuide1992_25707423
इतनी सारी cmake directives देखकर बेवजह अतीत में लौटने का मन करता है
Turbo C या Pascal में तो बस F9 दबाते ही सब चल पड़ता था
दूसरी तरफ़, यह हमारी toolchain की अक्षम्यता भी दिखाता है
आज के ज़माने में तो बस किसी online compiler की ओर इशारा करो और तुरंत चला दो, या download करके एक folder खोलो और run कर दो—इतना काफ़ी होना चाहिए; यह tools नहीं, किसी ritual जैसी प्रक्रिया बन गई है
./configure && make && make install अब भी gold standard होना चाहिए
यह बस Turbo Vision ports/clones में से एक है
C++ side पर यह भी है: https://github.com/kloczek/tvision
FreePascal/Lazarus में शामिल version Pascal में लिखा गया है, और एक Rust version भी है, हालाँकि वह थोड़ा vibe-coded जैसा लगता है: https://github.com/aovestdipaperino/turbo-vision-4-rust
terminal में इसे चलाने पर वह मूल text-mode screen mouse वाली अहम अनुभूति थोड़ी खो जाती है
असली text-mode screen पर यह mouse pointer जैसा नहीं दिखता था, बल्कि mouse से हिलने वाला एक पीला block जैसा लगता था
जानना चाहूँगा कि किसी ने इसे high-resolution Linux text mode में GPM के साथ चलाया है या नहीं
यह ऊपर ढके हुए cell के रंगों को invert करके दिखाता था, और क्योंकि स्क्रीन का ज़्यादातर हिस्सा भरने वाली main window गहरे नीले रंग की होती थी, इसलिए नतीजा अक्सर चमकीले पीले block जैसा दिखता था
हाल की Wookash podcast में Chuck Jazdzewski वाला episode recommend करता हूँ
वह मूल Turbo Vision बनाने वाली team का हिस्सा था, और पूरे ecosystem के बारे में भी काफ़ी बातें करता है
मैं आज भी C++ version से ज़्यादा असल Turbo Vision, यानी Pascal version, चाहता हूँ
C++ version आख़िरकार Pascal version का एक अनुवाद ही ज़्यादा लगता है
उदाहरण के लिए Pascal में
usesएक keyword है, जबकि#defineसे modules include करने का तरीका थोड़ा hack जैसा लगता हैहालाँकि अब शायद यह कोई बहुत बड़ा फ़र्क न हो
text-mode IDE भी Free Vision का इस्तेमाल करता है
https://wiki.lazarus.freepascal.org/images/1/19/Userscreen.png
लेकिन मुख्य फ़र्क यह है कि Free Vision और Turbo Vision, Delphi के
classकी जगह Turbo Pascal 5.5 के दौर वालेobjecttype का इस्तेमाल करते हैंclassमें RTTI की वजह से automatic serialization जैसी चीज़ें implement करना आसान होता है, लेकिनobjectमें वह नहीं होता, इसलिए runtime पर अलग-अलग types पहचानने के लिए object pointer के एक fixed offset पर मौजूद VMT pointer को register करके manual serialization करनी पड़ती हैFree Pascal ने
objectमें private/protected/public, property जैसी कुछ सुविधाजनक extensions जोड़ी हैं, लेकिन Free Vision मूल Turbo Vision API को implement करने के लिए उन extensions का इस्तेमाल नहीं करता