- कमांड लाइन में टेक्स्ट को संपादित करना एक बुनियादी सुविधा जैसा लगता है, लेकिन हर प्रोग्राम इनपुट को अलग तरह से संभालता है, इसलिए एक ही key बिल्कुल अलग तरह से काम कर सकती है
- टर्मिनल इनपुट अनुभव मोटे तौर पर चार तरह में बंटता है: बिना इनपुट सिस्टम, GNU readline,
libedit जैसी वैकल्पिक लाइब्रेरी, और अपना खुद का इनपुट सिस्टम
cat, nc, dash जैसे सरल tools में arrow keys दबाने पर ^[[D जैसा टेक्स्ट दिख सकता है, लेकिन टर्मिनल द्वारा दिए गए Ctrl+W, Ctrl+U, Ctrl+C, Ctrl+Z अब भी काम करते हैं
bash, psql, irb, python3 जैसे readline-आधारित tools history, arrow keys, Ctrl+R search, और Ctrl+A/Ctrl+E navigation देते हैं, और rlwrap से ऐसा ही अनुभव जोड़ा जा सकता है
- मौजूदा इनपुट सिस्टम की पहचान कर लेने पर यह जल्दी समझ आता है कि arrow keys या
Ctrl+R अलग क्यों दिख रहे हैं, और ज़रूरत होने पर docs देखना या rlwrap जैसे workaround चुनना आसान हो जाता है
प्रोग्राम के अनुसार बदलता इनपुट अनुभव
- टर्मिनल में टेक्स्ट दर्ज करने और संपादित करने का तरीका हर प्रोग्राम में काफ़ी अलग होता है
- प्रमुख प्रकार मोटे तौर पर इस तरह बंटते हैं
cat, nc, git commit --interactive आदि arrow keys को support नहीं करते, इसलिए ^[[D^[[D^[[C^[[C^ जैसी string दिख सकती है
irb, Linux का python3 आदि readline लाइब्रेरी की मदद से history और arrow keys जैसी बुनियादी editing सुविधाएँ देते हैं
- Mac के
/usr/bin/python3 की तरह कुछ मामलों में arrow keys तो काम करती हैं, लेकिन Ctrl+left या Ctrl+R reverse search support नहीं होता
fish, ipython3, micro, vim आदि अपना खुद का इनपुट सिस्टम इस्तेमाल करते हैं
मोड 1: बिना इनपुट सिस्टम की बुनियादी स्थिति
- अगर कोई प्रोग्राम
fgets() जैसे call से सिर्फ टेक्स्ट लेता है और अलग editing सुविधा नहीं देता, तो arrow keys editing command की जगह escape sequence के रूप में छप सकती हैं
- उदाहरण के लिए
dash में left arrow दबाने पर टर्मिनल में यह दिख सकता है
$ ls l-^[[D^[[D^[[D
- फिर भी टर्मिनल की डिफ़ॉल्ट control सुविधाएँ बनी रहती हैं
- टेक्स्ट इनपुट
- backspace
Ctrl+W: पिछला शब्द हटाना
Ctrl+U: पूरी पंक्ति हटाना
Ctrl+C: process interrupt
Ctrl+Z: process suspend
- ऐसे माहौल में भी
Ctrl+W का इस्तेमाल करके कई बार backspace दबाने की बजाय शब्द के हिसाब से मिटाया जा सकता है
- टर्मिनल कौन से control codes support करता है, यह
stty -a से देखा जा सकता है
मोड 2: readline इस्तेमाल करने वाले tools
- readline टेक्स्ट इनपुट को अधिक सुविधाजनक बनाने वाली GNU लाइब्रेरी है, और कई interactive tools में इस्तेमाल होती है
- अक्सर इस्तेमाल होने वाले readline shortcuts ये हैं
Ctrl+E या End: पंक्ति के अंत में जाना
Ctrl+A या Home: पंक्ति की शुरुआत में जाना
Ctrl+left/right arrow: एक-एक शब्द आगे-पीछे जाना
- ऊपर वाला arrow: पिछले command पर जाना
Ctrl+R: history search
- बुनियादी मोड के
Ctrl+W, Ctrl+U यहाँ भी इस्तेमाल किए जा सकते हैं, लेकिन readline में Ctrl+U पूरी पंक्ति नहीं बल्कि cursor से पंक्ति की शुरुआत तक हटाता है
bash का Ctrl+R history search, readline द्वारा दिया गया feature है
psql, irb, python3 आदि भी readline इस्तेमाल करने वाले प्रोग्रामों के उदाहरण हैं
- readline editing commands की पूरी सूची readline manual में देखी जा सकती है
readline न होने वाले tools में rlwrap लगाना
nc जैसे प्रोग्राम, जो readline support नहीं करते, उन्हें rlwrap nc की तरह चलाने पर readline-enabled प्रोग्राम जैसा इस्तेमाल किया जा सकता है
- rlwrap readline के बिना tools की usability काफ़ी बढ़ा सकता है
- इसमें custom autocomplete भी सेट किया जा सकता है, हालांकि इसका वास्तविक उपयोग यहाँ नहीं किया गया है
कुछ tools readline क्यों नहीं इस्तेमाल करते
- कुछ tools के readline न इस्तेमाल करने के कई कारण हो सकते हैं
cat, nc जैसे बहुत सरल प्रोग्राम अपेक्षाकृत बड़ी dependency जोड़ना नहीं चाहते होंगे
- readline LGPL नहीं बल्कि GPL license के तहत है, इसलिए यह किसी प्रोग्राम के license से मेल नहीं खा सकता
- अगर किसी प्रोग्राम का सिर्फ़ एक छोटा हिस्सा interactive हो और इनपुट
y या n जैसे एकल character तक सीमित हो, तो readline support की प्राथमिकता कम हो सकती है
git में git add -p जैसी interactive सुविधाएँ हैं, लेकिन जब अर्थपूर्ण लंबा इनपुट चाहिए होता है, तब वह आमतौर पर text editor खोलता है
idris2 dependency कम रखने के लिए readline का उपयोग नहीं करता, और बेहतर interactive फीचर्स चाहिए हों तो rlwrap इस्तेमाल करने का सुझाव देता है
कैसे पहचानें कि अभी readline इस्तेमाल हो रहा है या नहीं
- सबसे आसान तरीका है
Ctrl+R दबाकर देखना
- अगर यह prompt दिखे, तो readline इस्तेमाल होने की संभावना काफ़ी अधिक है
(reverse-i-search)`':
- दूसरी लाइब्रेरियाँ भी यही शब्दावली इस्तेमाल कर सकती हैं, इसलिए यह पूरी तरह निर्णायक तरीका नहीं है, लेकिन history search के लिए
reverse-i-search अभिव्यक्ति इस्तेमाल करने वाला कोई दूसरा सिस्टम आम तौर पर ज्ञात नहीं है
readline shortcuts और Emacs
Ctrl+A से पंक्ति की शुरुआत और Ctrl+E से अंत तक जाने वाले shortcuts को Emacs से आया हुआ माना जा सकता है
- Emacs में भी
Ctrl+A और Ctrl+E readline की तरह ही काम करते हैं
- इसके विपरीत
Ctrl+W, Ctrl+U Emacs और टर्मिनल में एक जैसा व्यवहार नहीं करते
- readline project के इतिहास के बारे में Readline project history में और पढ़ा जा सकता है
मोड 3: libedit जैसी वैकल्पिक इनपुट लाइब्रेरियाँ
- Mac का
/usr/bin/python3 कुछ readline सुविधाएँ support करने वाली एक बीच की स्थिति जैसा है
- उदाहरण के लिए
Ctrl+left arrow दबाने पर शब्द के हिसाब से move होने की जगह ;5D छप सकता है
$ python3
>>> importt subprocess;5D
- Mac OS की डिफ़ॉल्ट Python installation में Python का
readline module वास्तव में libedit आधारित है
- अनुमान है कि इसका कारण readline का GPL license होना है
- नीचे दिया command चलाकर यह जाँचा जा सकता है कि वह Python
libedit इस्तेमाल करता है या नहीं
$ python3 -c "import readline; print(readline.__doc__)"
Importing this module enables command line editing using libedit readline.
- Linux या Homebrew से install किया गया Python आम तौर पर readline इस्तेमाल करता है
- Python 3.13 readline dependency हटाकर अपनी लाइब्रेरी इस्तेमाल करने वाला है, इसलिए आगे चलकर “Python readline इस्तेमाल करता है” यह बात हमेशा सही नहीं रहेगी
मोड 4: अपना खुद का इनपुट सिस्टम
- कुछ प्रोग्राम अपना खुद का टेक्स्ट editing सिस्टम इस्तेमाल करते हैं, और कभी-कभी readline से भी ज़्यादा सुविधाएँ देते हैं
- ऐसे सिस्टम इस्तेमाल करने वाले उदाहरण ये हैं
nano, micro, vim, emacs जैसे अधिकांश terminal text editors
fish जैसा shell
zsh का line editor zle
ipython जैसा REPL
atuin जैसा tool
- ऐसे सिस्टम में ये सुविधाएँ मिल सकती हैं
- tool के अनुसार बेहतर autocomplete
- syntax highlighting सहित बेहतर history management
- अधिक keyboard shortcuts
readline से प्रेरित कस्टम इनपुट सिस्टम
- Atuin shell history search tool है, और इसका इनपुट implementation खुद का है, लेकिन तरीका readline से प्रेरित है
- Atuin इस बात का लाभ उठाता है कि उपयोगकर्ता readline key bindings के आदी होते हैं, इसलिए सीधे readline इस्तेमाल किए बिना भी वही key bindings काम करें, ऐसा बनाया गया है
- IPython द्वारा इस्तेमाल किया जाने वाला prompt_toolkit भी कई विकल्प देता है, जिनमें vi-style key bindings शामिल हैं
- prompt_toolkit का default readline-style key bindings support है
- यह उसी तरह है जैसे कई प्रोग्राम नीचे जाने के लिए
j और ऊपर जाने के लिए k जैसी बुनियादी vim key bindings support करते हैं
- उदाहरण के लिए Fastmail के अधिकांश shortcuts का vim से खास संबंध नहीं है, लेकिन वह
j, k support करता है
- readline से प्रेरित कस्टम इनपुट सिस्टम readline के साथ सूक्ष्म स्तर पर compatible न भी हों, फिर भी जो उपयोगकर्ता सिर्फ़ कुछ बुनियादी shortcuts इस्तेमाल करते हैं, उनके लिए यह बड़ी समस्या नहीं हो सकती
- ऐसे कस्टम सिस्टम में अक्सर सिर्फ readline इस्तेमाल करने की तुलना में autocomplete बेहतर हो सकती है
vi mode support करने वाले shells
bash, zsh, fish सभी टेक्स्ट इनपुट के लिए vi mode support करते हैं
- Mastodon पर हुए गैर-वैज्ञानिक सर्वे में 12% लोगों ने कहा कि वे vi mode इस्तेमाल करते हैं
- readline में खुद भी vi mode है, और
bash का vi mode support उसी से काम करता है
- readline इस्तेमाल करने वाले कई दूसरे प्रोग्रामों में भी vi mode हो सकता है
इनपुट स्थिति पहचानने का तरीका
- अगर पता हो कि कौन सा इनपुट सिस्टम इस्तेमाल हो रहा है, तो command line के व्यवहार का अनुमान लगाना आसान हो जाता है
- इनपुट prompt पर मोटे तौर पर इस क्रम में समझा जा सकता है
- अगर arrow keys काम नहीं करतीं, तो संभव है कि कोई इनपुट सिस्टम ही न हो; फिर भी
Ctrl+W, Ctrl+U इस्तेमाल किए जा सकते हैं, और ज़रूरत पड़ने पर rlwrap जोड़ा जा सकता है
- अगर
Ctrl+R पर reverse-i-search दिखता है, तो readline होने की संभावना अधिक है, और परिचित readline shortcuts तथा बुनियादी history फीचर्स उपलब्ध होंगे
- अगर
Ctrl+R कुछ और करता है, तो संभव है कि कोई कस्टम इनपुट लाइब्रेरी हो; वह आम तौर पर readline जैसा व्यवहार कर सकती है, और ज़रूरत हो तो docs देखे जा सकते हैं
- इन बातों के अलावा भी इनपुट से जुड़ी कई जटिलताएँ बची रहती हैं
ssh, tmux से जुड़े मुद्दे
TERM environment variable
- GNOME Terminal, iTerm, xterm आदि अलग-अलग terminals में copy-paste support का अंतर
- Unicode
- और इनपुट से जुड़े कई अन्य मुद्दे
1 टिप्पणियां
Hacker News की राय
Julia के लेख हमेशा अच्छे होते हैं। एक छूटी हुई बात यह है कि shell script के अंदर
sttyका इस्तेमाल करके terminal के कई व्यवहार बदले जा सकते हैं, जिनमें input processing का तरीका भी शामिल हैपहले
shऔरsttyके साथ किया गया मेरा experiment: https://gist.github.com/alganet/63f1dbc97b8fd35f7bb14ec30f79...VT100-compatible terminals (mintty, xterm, Terminal.app, vscode आदि) में ज़्यादातर key combinations और mouse gestures (press/drag/release) तक shell के अंदर capture और interpret किए जा सकते हैं
running demo
bash -c "$(curl -L https://git.io/fjToH)"है; keys दबाकर या mouse हिलाकर देख सकते हैं। बाहर निकलने के लिए Ctrl+W। zsh और ksh भी supported हैं, लेकिन dash जैसे shells जिनमेंread -rn1नहीं है, वे supported नहीं हैंसाथ ही,
vi | cat -vकी तरह किसी interactive program कोcat -vमें pipe करने पर उस program द्वारा इस्तेमाल किए गए VT100 escapes दिख सकते हैं, और vi कैसे काम करता है यह देखकर मैंने बहुत कुछ सीखाstty sanetype करने से वापस ठीक हो सकता है3 terminals खोलें और 1)
man ascii, 2)nc -lvp 9001 | xxd -c1, 3)stty raw -echo; nc -nv 127.0.0.1 9001चलाएँ, फिर terminal 3 में manpage के “Hex” column को क्रम से पूरा reproduce करके देखेंदेखा जा सकता है कि कुछ values कई तरीकों से बनाई जा सकती हैं, और कुछ दूसरी keys multi-byte payloads भेजती हैं
sttyऔर raw mode समझने में मददगार था: https://viewsourcecode.org/snaptoken/kilo/, https://viewsourcecode.org/snaptoken/kilo/02.enteringRawMode...जादू जैसे लगने वाले
sttyparameters और symbols बहुत पहले define किए गए control sequences से आए हैं। ECMA-48 जैसे 1970s के अस्पष्ट standards में ऐसे कठिन terms भी बहुत हैं जो अब लगभग इस्तेमाल नहीं होतेउदाहरण के लिए Select Graphic Rendition(SGR) मोटे तौर पर 1970s के HTML tags जैसा है; foreground color set करने के लिए
ESC[38;2;R;G;BmTextESC[0mजैसा रूप इस्तेमाल होता है।ESC[CSI है,mSGR है,38foreground color है,2RGB color space है, और0style reset हैcommand से पहले parameters आने वाली संरचना थोड़ी उल्टी लगती है। browsers की तरह terminals में भी implementation का दायरा और तरीका अलग-अलग था, और आज भी है। colors का support काफी अच्छा है, लेकिन बाकी features का नहीं। मसलन
SGR<7>को “negative image” mode कहा गया है, पर standard इसे विस्तार से समझाता नहीं; इसलिए कुछ terminals reverse display करते हैं, और दूसरे terminals इसे अलग तरह से handle करते हैं, जिससे आज भी दिक्कतें आती हैं20 साल से भी पहले मैंने readline के ऊपर एक state machine बनाई थी, ताकि इसे सिर्फ एक line wrap होने तक सीमित न रखकर ऊपर-नीचे move किए जा सकने वाले असली multi-line editor की तरह इस्तेमाल किया जा सके
video: https://github.com/colmmacc/jot/raw/master/jot-demo.mp4
इस feature वाले Unix terminal IM client का CVS repository: https://c-hey.redbrick.dcu.ie/src/c-hey_cvs_latest/
lines के बीच ऊपर-नीचे move करते समय cursor को track करके redraw करता है, और terminal size बदलने पर SIGWINCH देखकर फिर से draw करता है। इसे Rust में दोबारा लिखकर एक छोटी library के तौर पर publish करना चाहता हूँ, लेकिन समय नहीं मिला। यह हमेशा हैरान करता रहा कि किसी और ने ऐसा कुछ नहीं किया
autoload -Uz zedके बादzedका इस्तेमाल करके temporary file edit करें और उसेgit commit -Fको pass करें, तो ZLE की सारी capabilities वाला inline editor शुरू किया जा सकता है।C-x C-wसे save करके commit करें औरC-cसे cancel करेंइस basic implementation का फायदा यह है कि
zedनया ZLE widget है, इसलिए keymap पर पूरा control हो सकता है। emacs mode या vi mode तुरंत काम करता है, और और भी customize किया जा सकता हैअगर आप खुद ZLE widget लिखें, तो उसे line editor के अंदर सीधे call किया जा सकता है, इसलिए ऊपर की तरह command wrap करने की जरूरत भी नहीं रहती
https://github.com/zsh-users/zsh/blob/master/Functions/Misc/...
git commitके interactive mode की तरह context switch न करने के फायदे से मैं सहमत हूँ। “inline typewriter” जैसा effect भी बढ़िया हैलेख में छूटी बातों में wide characters, keyboard mode के फर्क की वजह से वही key input अलग-अलग ANSI escape sequences के रूप में दिखने की समस्या, local echo जैसी TTY state की भिन्नताएँ, और TTY state बदलने वाली system calls का operating system के हिसाब से हल्का-हल्का अलग होना शामिल है
terminal emulation support भी हर जगह अलग है। आजकल ज़्यादातर xterm की नकल करते हैं, लेकिन उसके अंदर भी कोई 100% compatibility को लक्ष्य नहीं बनाता
terminal कौन-सी सुविधाएँ देता है, यह पता करने के तरीके पर भी सहमति कम है। कुछ पक्ष ANSI escape sequence भेजकर response का इंतज़ार करते हैं, कुछ
$TERMदेखते हैं, और कुछ terminals खुद को xterm के रूप में expose करते हुए VT feature sequences को ignore करते हैं और दूसरे environment variables set करते हैं। सच कहूँ तो यह user agent string से भी ज़्यादा गड़बड़ हैयह सब POSIX system मानकर है; Windows को भी मिला दें तो मामला दोगुना दिलचस्प हो जाता है
bash में
$EDITORको अपने पसंदीदा editor पर set कर दें, तो Ctrl-X Ctrl-E से current line को$EDITORमें भेज सकते हैं। command edit करने के बाद save करके exit करें तो वह execute हो जाती हैvदबा सकते हैंfcbuilt-in command भी यही काम करता है। Ctrl key sequence के बिना बसfctype कर देंपिछली command को default
$EDITORके बजाय किसी खास editor में भी खोल सकते हैं। उदाहरण के लिएEDITOR=viहो और ठीक पिछली command को ed में edit करना हो, तोfc -e edइस्तेमाल करेंvi mode में command history से जल्दी shell script बनाने का तरीका भी है। अगर चाहिए command history की 15वीं entry है, तो
fc 15के बादw1.sh,%d,wqजैसे steps से काम हो सकता हैEDITOR=nvimऔर copilot.vim को साथ इस्तेमाल करके AI shell autocomplete जैसा इस्तेमाल कर रहा हूँ। काफ़ी अच्छा हैयहाँ देखा था: https://twitter.com/arjie/status/1575201117595926530?s=46&t=...
Linux beginner के नज़रिए से, अगर कोई program
fgets()जैसी चीज़ से सिर्फ text पढ़ता है, तब भी backspace, Ctrl+W, Ctrl+U जैसी सुविधाएँ मुफ्त में कैसे मिल जाती हैं, यह जिज्ञासा वाली बात हैfgets()documentation में लिखा है कि यह newline या EOF आने तक पढ़ता है, तो क्या इसका मतलब है कि default रूप से यह user के newline enter करने तक blocked रहता है, और उससे पहले terminal line buffer को backspace या Ctrl+W/Ctrl+U से edit करने देता है?लेकिन इसकी कोई guarantee नहीं कि program हमेशा पूरी line पढ़ेगा;
countको 2 देकर character-by-character भी पढ़ सकता है। तब backspace होने पर पहले से पढ़े गए characters को “वापस” नहीं किया जा सकता होगा, तो क्याfgets()के internal buffer में कोई जादू है, या ऐसे case में line editing feature टूट जाता है?https://en.cppreference.com/w/c/io/fgets
newline के आधार पर buffering जैसी जो चीज़ दिखती है, वह असल में shell manage करता है, इसलिए developer tab completion या line की शुरुआत में sudo जोड़ने जैसी text buffer manipulation सुविधाएँ डाल सकता है
Enter दबाने से पहले screen पर दिख रहे characters सिर्फ terminal memory में होते हैं, और application की
readsystem call terminal file descriptor पर blocked रहती है। line पूरी होने तक terminal data नहीं लिखताइस दौरान input हो रही line की editing भी आम तौर पर terminal खुद देता है। अक्षरों का screen पर दिखना भी echo नाम की terminal feature है, और backspace, delete, SIGINT के लिए Ctrl+C, EOF के लिए Ctrl+D भी ऐसे ही हैं
line editors और text editors इन features को बंद करके raw mode में रखते हैं। जो कुछ input किया जाता है, वह तुरंत application को भेजा जाता है और application खुद उसे handle करता है। password prompt में characters छिपाने के लिए सिर्फ echo बंद करना भी आम उदाहरण है
पारंपरिक Unix line ending
\nभी असल में terminal feature है। terminal के नज़रिए से\ncursor को सिर्फ एक line नीचे ले जाता है, इसलिए line की शुरुआत में लौटने के लिए\rभी चाहिए। असली line ending\r\nहै, और terminal अदृश्य रूप से\nको\r\nमें बदल देता है। इसे भी disable किया जा सकता हैraw mode में यह इस तरह काम नहीं करता
helpprogram को SunOS पर port करना था। पहली मुश्किल थी Enter/Return का इंतज़ार किए बिना हर keypress पर react करने का तरीकाboss ने जानबूझकर लगभग कोई मदद नहीं की, और 1986 में, जब web नहीं था और O’Reilly की किताबें भी बहुत कम थीं, मुझे लगभग अकेले ही पता लगाने दिया। आज भी उस फैसले के लिए हमेशा आभारी हूँ
dash shell भी libedit के साथ compile किया जाए तो editing mode support करता है। Debian परिवार शायद space की वजह से ऐसा नहीं करता, लेकिन जो लोग bash से शुरू करते हैं उन्हें बाद में कम सीखना पड़े, इसके लिए support करना सही लगता है
POSIX standard भी
set -o viको optional extension के रूप में specify करता है। POSIX compatibility का दावा करने वाला shell अगर यह editing mode implement करता है, तो उसेset -o visupport करना ही होगा“
[set -o] vi: built-in vi editor का उपयोग करके shell command-line editing की अनुमति देता है। vi mode चालू करने पर implementation extension के रूप में दिए गए अन्य command-line editing modes disable करने चाहिए।”https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V...
मैं लगातार सोचता रहा हूँ कि terminal ही वह अकेला कारण है जो Linux को हमेशा के लिए 5% से कम market share में बाँधे रखता है
समस्या सिर्फ text input नहीं है, पूरा experience ही जटिल है। 95% आबादी बस drone उड़ाना चाहती है, लेकिन उनके सामने बिना labels वाला Concorde cockpit रख दिया जाता है
https://qph.cf2.quoracdn.net/main-qimg-2566f4c91b894e4169d77..., https://media.thedroningcompany.com/images/tincy/WQZpC56vqMp...
Ubuntu के पीछे Concorde cockpit है, और मेरे work Ubuntu laptop से वहाँ पहुँचा जा सकता है—इसके लिए मैं बल्कि आभारी हूँ। उस स्तर का control न हो तो मुझे अच्छा नहीं लगेगा
दूसरी ओर, मेरी माँ का laptop भी Ubuntu है और मेरी girlfriend का laptop Manjaro है; दोनों Concorde cockpit में कदम रखे बिना सिर्फ “drone उड़ाना” करती हैं और आराम से इस्तेमाल कर रही हैं। हाँ, मैं Arch इस्तेमाल करता हूँ
terminal developers और system administrators का tool है। बस desktop GNU/Linux users में ज़्यादातर developers और system administrators हैं, इसलिए ऐसा दिखता है; ये आबादी के बस कुछ प्रतिशत हैं
जहाँ उल्टे बहुत सारे अजीब shortcuts जानने पड़ते हैं वह macOS terminal है, जिसमें हर चीज़ को जितना हो सके उतना कम intuitive बनाया गया है
शायद यह unpopular opinion होगा, लेकिन iTerm2 में Natural text editing preset पर बदलकर मैंने इसे traditional macOS editing shortcuts से मिला लिया
terminal app के अंदर आम तौर पर control sequences में remap कर दिया जाता है, इसलिए कई जगहों पर बदलाव करने या readline support की चिंता किए बिना लगभग हर जगह यह सुविधा मिल जाती है
यह perfect नहीं है, इसलिए कभी-कभी manually input करनी पड़ने वाली sequences भी remap हो जाती थीं, लेकिन यह muscle memory से मेल खाता है, इसलिए मैं command editing कहीं ज़्यादा इस्तेमाल करने लगा
https://pliszko.com/blog/post/2021-10-31-natural-text-editin...
मैं नहीं चाहता कि terminal में text editing किसी खास अलग तरह से behave करे
तीन basic readline key bindings जिन्हें लोग जान लें तो जिंदगी बेहतर हो जाएगी: Ctrl+W, Ctrl+O, Ctrl+R
Ctrl+W, जैसा Julia ने लेख में बताया है, आख़िरी word delete करता है
Ctrl+O history से लाई गई line को execute करता है, और फिर अगली history line को फिर से load करता है। history में पहले command पर जाने के बाद Ctrl+O पाँच बार दबाएँ तो पाँच commands क्रम से execute कर सकते हैं
Ctrl+R search string type करते हुए history में उल्टा search करता है। Ctrl+R फिर दबाने पर पिछले result पर जाता है, और Ctrl+S समय के हिसाब से आगे बढ़ता है। Enter या Ctrl+O से execute होता है
forward search feature के लिए वह key combination इस्तेमाल करना हो, तो यह जानना होगा कि यह क्यों काम नहीं कर रहा और XOFF बंद करने की इच्छा भी होनी चाहिए
Windows Terminal में Ctrl+C हमेशा सही तरह से काम करता है। अगर टेक्स्ट selected है तो उसे copy करता है, और selected नहीं है तो चल रहे process को मार देता है
Linux के terminal apps Ctrl+C से copy नहीं करते और Ctrl+Shift+C मांगते हैं। paste के लिए भी Ctrl+V दबाने पर अजीब characters आ जाते हैं, और बाकी सभी apps में Ctrl+V होता है, इसलिए muscle memory के कारण बार-बार फंसता रहता हूं
सोचता हूं कि क्या कोई Linux terminal app है जो Windows Terminal की तरह behave करे और “अनुचित teletype उपयोग” कहकर हाथ पर चपत न लगाए
यह तरीका अलग Xorg buffer का इस्तेमाल करता है, इसलिए Ctrl+C से कुछ copy करने के बाद अगर कोई दूसरा text select भी कर लें, तो Ctrl+V पहला वाला paste करेगा और middle click दूसरा वाला paste करेगा
Windows या smartphone पर कभी-कभी सिर्फ कुछ select करके छोड़ देने और Ctrl+C जैसी चीज दबाना भूल जाने से झुंझलाहट होती है
Linux terminals में Windows Terminal जैसा करने वाला शायद कोई नहीं होगा। वजह यह है कि terminal के अंदर चल रहा program Ctrl+C को खुद handle करना चाह सकता है। text editor ऐसा ही एक उदाहरण है, और terminal को यह भी नहीं पता होता कि अभी कौन-सा program चल रहा है। job control तो shell का काम है
map ctrl+c copy_or_interruptइस्तेमाल कर सकते हैंhttps://sw.kovidgoyal.net/kitty/actions/#action-copy_or_inte...