Emacs विंडो मैनेजमेंट का विश्वकोश
(karthinks.com)- Emacs का विंडो मैनेजमेंट एक ऐसे लचीले ढांचे पर बना है जहाँ buffer और window अलग-अलग हैं, लेकिन उसके ऊपर कुछ हद तक भद्दे बेसिक controls चढ़े हुए हैं, इसलिए यूज़र को tools और आदतों को मिलाकर अपना workflow बनाना पड़ता है
- इस लेख का फोकस
display-bufferrules या tab-आधारित workspaces पर नहीं, बल्कि एक Emacs frame के भीतर focus movement, buffer placement, split·delete, और temporary work को संभालने वाली manual operations पर है other-window,windmove,winum,ace-window, mouse,transpose-frame,window-prefix-map,other-window-prefix,winner-modeक्रमशः circular movement, directional movement, number selection, hint selection, layout transformation, और recovery की जिम्मेदारी बाँटते हैंace-windowऔर Avy का उपयोग करके किसी खास window को चुनने के बाद command चलाया जा सकता है, या सीधे text position पर jump किया जा सकता है, जिससे window switching खुद कम की जा सकती है- Emacs window management किसी जटिल fixed system से अधिक एक open problem के करीब है;
display-buffer-alist, Popper·Popwin, window tree manipulation, और tiling WM integration शक्तिशाली तो हैं, लेकिन उनकी configuration cost और gaps भी बड़े हैं
Emacs में window management का मतलब
- Emacs में window frame के भीतर का viewport या panel है, और buffer लगातार text का एक हिस्सा है, जो file की सामग्री हो भी सकता है और नहीं भी
- कई IDE और editors window और buffer की अवधारणाओं को लगभग मिला देते हैं ताकि cognitive load कम हो, लेकिन Emacs इन्हें अलग रखता है, जिससे ज्यादा flexible layout संभव होता है
- एक ही file को दो बार देखना आसान हो जाता है
- ऐसे buffers भी स्वाभाविक रूप से संभाले जा सकते हैं जिनका file से सीधा संबंध नहीं होता
- Emacs के indirect buffers पूरे buffer की एक “live” copy के अधिक करीब हैं
- यह अलगाव वाला ढांचा नए यूज़र्स के लिए कीमत भी लाता है
- frame के भीतर windows को मनचाही जगह पर रखना पड़ता है
- मनचाहे buffer को मनचाही window में डालना पड़ता है
- शुरुआत में इस separation structure के फायदे से पहले उसका operational burden दिखता है
इस लेख में क्या शामिल नहीं है
display-bufferको पूरी तरह नियंत्रित करने वाले automatic buffer display rules इसका मुख्य विषय नहीं हैंdisplay-bufferAPI मेंwindow-parameters, slots, dedicated windows जैसी details की समझ चाहिए- संबंधित सामग्री के लिए Mickey Peterson का लेख, Protesilaos Stavrou का वीडियो, और Emacs Lisp manual देखे जा सकते हैं
- tabs, workspaces, buffer isolation, और session persistence भी मुख्य दायरे से बाहर हैं
- संबंधित tools में tab-bar, tabspaces, eyebrowse, tab-bookmark, desktop.el, persp-mode.el, perspective, project-tab-groups, beframe, activities.el शामिल हैं
- Emacs के भीतर अलग window manager की तरह काम करने वाले radical alternatives को भी इस लेख से बाहर रखा गया है
- असली फोकस manual और रोज़मर्रा की operations पर है
- window focus switching
- windows के बीच buffer movement
- window split और delete
- command execution के दौरान target display window का control
बुनियादी movement: other-window और “अगली window”
other-windowEmacs tutorial में सिखाया जाने वाला बुनियादी window switching command है, और इसकी default keyC-x oहै- selection order आम तौर पर frame के भीतर clockwise घूमती है
- जब windows कम हों, तो यह simple और काफी उपयोगी है
- windows बढ़ने पर मनचाही जगह तक पहुँचने के लिए इसे कई बार चलाना पड़ता है
- इसे practical तरीके से adjust भी किया जा सकता है
- इसे
M-oजैसी ज्यादा आसान key पर bind किया जा सकता है - numeric argument देकर कई steps आगे बढ़ा जा सकता है या उलटी दिशा में जाया जा सकता है
repeat-modeचालू हो तोC-x o o o...याM-o o o...जैसी repeated input संभव होती है
- इसे
no-other-windowwindow parameter सेट करने परother-windowकुछ खास windows को skip करता है- यही वजह है कि
dired-sidebarयाdirvish-sideजैसे file-manager type side windows,other-windowके targets से बाहर रहते हैं
- यही वजह है कि
- “अगली window” की अवधारणा
scroll-other-windowजैसे commands का भी default target होती है, जो दूसरी window पर काम करते हैं
दिशा-आधारित movement: windmove
windmoveदिशा के आधार पर window focus बदलने वाली एक built-in library है- यह Vim यूज़र्स की अपेक्षा वाले left·right·up·down movement के करीब है
evil-modeयूज़र भी अंदरूनी तौर पर Windmove ही इस्तेमाल करते हैं
windmove-left,windmove-right,windmove-up,windmove-downकोWASD,HJKL, arrow keys आदि से bind करके इस्तेमाल किया जा सकता हैwindmove-swap-states-left/right/up/downcommands दिशा के आधार on windows के buffers को swap करते हैं- इस समय focus भी buffer के साथ move करता है
windmove-delete-*family से किसी खास दिशा की window delete की जा सकती है, लेकिन लेख आगे नीचे दूसरे तरीकों पर ज्यादा बात करता है- tiling WM environment में Emacs के अंदर की windows और OS windows के बीच एक ही keys से movement को integrate किया जा सकता है
- Emacs+i3wm integration का एक उदाहरण i3 integration में है
- qtile के लिए configuration example emacs-wm.el में देखा जा सकता है
Emacs windows को OS windows के हवाले करना
- frames-only-mode सभी buffers को Emacs windows की बजाय नए frames में खोलता है, ताकि उन्हें OS window manager संभाले
- इस तरीके से Emacs buffers को OS windows के समान स्तर पर संभाला जा सकता है, जिससे दोनों को एक ही keys से manage करना संभव हो जाता है
- Avy,
winum,ace-window,scroll-other-windowजैसे tools सिर्फ windows ही नहीं, पूरे frames पर भी लागू हो सकते हैं - कुछ Emacs commands यह मानकर चलते हैं कि वे frames को मनमाने ढंग से split कर सकते हैं, इसलिए exceptional situations आ सकती हैं
- खासकर org-mode commands में ऐसा रुझान दिखता है
- Wayland compositor में
frames-only-modeइस्तेमाल करने का अनुभव नहीं है
नंबर और hints से तुरंत चयन
- winum mode line में window numbers दिखाता है और नंबर के आधार पर window चुनने देता है
- अगर
other-windowलगभग O(n) के करीब है औरwindmovespatial layout पर निर्भर करता है, तोwinumनंबर पता होने पर लगभग O(1) access देता है - negative prefix argument के साथ selection command चलाने पर उस window को delete कर देता है
- minibuffer सक्रिय होने पर उसे हमेशा 0 नंबर मिलता है
- यह Emacs frames के पार भी काम करता है
- अगर
- default key
C-x w <n>लंबी लग सकती है, इसलिएM-0सेM-9तक को window selection के लिए इस्तेमाल करने वाला configuration example भी है - ace-window को keyboard-based Emacs window control के एक शक्तिशाली tool के रूप में लिया गया है
- यह हर window पर hint दिखाता है, और उस key को दबाकर window चुनी जाती है
ace-window-display-modeचालू करने परwinumकी तरह hints को mode line में लगातार दिखाया जा सकता है?दबाने पर dispatch menu खुलता है
ace-windowकी असली ताकत सिर्फ selection में नहीं, बल्कि window चुनने के बाद action चलाने में है- window delete करना
- window move और swap करना
- window split करना
- किसी specific buffer को दिखाना
- चुनी हुई window छोड़े बिना दूसरी windows पर काम लागू करना
माउस और layout transformation
- Emacs में mouse window selection, resizing, context menu, और drag-and-drop के लिए स्वाभाविक रूप से फिट बैठता है
context-menu-modeऔर menu bar discoverability बढ़ाते हैं
- अगर हाथ पहले से keyboard से हट चुके हों, तो mouse से Emacs चलाना सबसे कम friction वाला रास्ता हो सकता है
- mouse gestures से भी कुछ काम किए जा सकते हैं
- frame को vertical या horizontal split करना
- window delete करना
- window के भीतर buffers को cycle करना
- दाईं या बाईं तरफ windows swap करना
- एक window में आखिरी दो buffers के बीच toggle करना
mouse-autoselect-windowसेट करने पर focus-follows-mouse behavior चालू किया जा सकता है- transpose-frame frame की window layout को rotate या flip करने वाले commands देता है
rotate-frame,flip-frame,flop-frameको अक्सर उपयोगी commands माना जाता हैtranspose-frameखुद मुख्य diagonal के आधार पर transpose करता है, इसलिए व्यवहारिक उपयोगिता कम मानी गई है
window-prefix-map और window tree
window-prefix-mapEmacs की default keyC-x wसे जुड़ा window management commands का set हैsplit-root-window-rightऔरsplit-root-window-belowframe की root window को split करते हैं- ये क्रमशः
C-x w 3औरC-x w 2पर bound हैं - सामान्य split commands जहाँ current window को और बाँटते हैं, वहीं ये अलग workspace बनाने में उपयोगी हैं
- ये क्रमशः
- Emacs की windows tree structure में व्यवस्थित होती हैं
- असली windows leaf nodes होती हैं
- split करने पर leaf दो windows वाले parent node में बदल जाता है
- यह i3 या bspwm जैसे manual tiling window managers की layout जैसा है
tab-window-detachऔरtear-off-windowcurrent window को नए tab या नए frame में ले जाते हैं- उनकी default keys
C-x w ^ tऔरC-x w ^ fको लंबा माना गया है - इन्हें
ace-windowdispatch actions या mouse bindings से बदला जा सकता है
- उनकी default keys
other-window-prefix: अगले command की display location बदलना
other-window-prefixbuilt-in command है जोC-x 4 4से bound है, और अगले command द्वारा दिखाए जाने वाले buffer को next window में दिखाता है- यह command file खोलना, buffer switch करना, bookmark jump जैसे buffer-display commands को target window selection से अलग करता है
- इससे
find-file-other-window,find-file-other-tab,find-file-other-frameजैसे command families को हर बार याद रखने की ज़रूरत कम हो जाती है find-file,find-file-read-only,switch-to-bufferजैसे basic commands के आगे prefix लगाकर सिर्फ display location बदली जा सकती है
- इससे
- Forge example में issue list पर
RETदबाने से current window overwrite हो जाने की समस्या कोother-window-prefixसे टाला जा सकता है - Magit, Org mode, Notmuch, Elfeed, EWW जैसे packages में “दूसरी window में खोलना” अलग-अलग तरह से काम करे, तब भी यह एकसमान behavior देता है
- इससे जुड़े prefixes भी हैं
same-window-prefixअगले command के buffer को current window में force करता हैother-frame-prefixउसे नए frame में खोलता हैother-tab-prefixउसे नए tab में खोलता है
window configuration सेव करना और वापस लाना
window-configuration-to-registercurrent window configuration को register में सेव करने वाला built-in command है, और इसकी default keyC-x r wहैjump-to-registerसेव की गई configuration restore करता है, और इसकी default keyC-x r jहै- Elisp level पर
current-window-configurationके result को variable में सेव करकेset-window-configurationसे लागू किया जा सकता हैprin1,persist,multisessionजैसे तरीकों से disk पर सेव करने पर sessions के बीच restore feature की नींव रखी जा सकती है- लेकिन हर window की cursor position तक restore हो जाना आम तौर पर हमेशा वांछित behavior नहीं होता
- पुराने configurations को अपने-आप stack करने वाले “oops” options भी हैं
winner-mode: tab का उपयोग न करने परwinner-undo,winner-redoसे window configuration changes को undo या redo किया जा सकता हैtab-bar-history-mode: हर tab के लिए अलग history stack देता हैundelete-frame-modeऔरtab-undo: गलती से बंद किए गए frame या tab को recover करते हैं
- Emacs के buffer को गलत जगह दिखा देने के बाद हर बार
winner-undoसे स्थिति सँभालना एक अस्थायी उपाय के करीब है- मूल समस्या यह है कि buffer display rules आपकी इच्छा के अनुसार सेट नहीं हैं
अक्सर आने-जाने वाली दो windows के लिए optimize करना
- वास्तविक काम में, स्क्रीन पर कई windows होने पर भी ज़्यादातर आना-जाना दो windows के बीच ही होता है
- Code & REPL
- Code & Grep
- Prose & Notes
- Listing & Item
- बाकी windows दस्तावेज़, debug जानकारी, logs, command output, table of contents, file explorer, preview जैसी reference panes हो सकती हैं, जिन्हें अक्सर देखा जाता है लेकिन शायद ही switch किया जाता है
get-mru-windowका उपयोग करके सबसे हाल में इस्तेमाल की गई window पर जाने वालाother-window-mruexample दिया गया है- दूसरी window को mouse,
ace-window,winumया किसी भी तरीके से चुन लेने के बाद आगे तेज़ी से आगे-पीछे जाया जा सकता है
- दूसरी window को mouse,
other-windowको खुद बेहतर बनाने के तरीके भी हैं- अगर सिर्फ एक window हो तो अपने-आप split कर देना
- switchy-window की तरह recent usage order में cycle करना
other-window-alternatingकी तरह, लगातार call न होने पर हर बार direction उलट देना ताकि दो windows के बीच आना-जाना स्वाभाविक लगे
ace-window को command execution आधारित रूप में बढ़ाना
ace-windowमेंaw-selectके ज़रिए किसी specific window को चुनने वाला selection step अलग से इस्तेमाल किया जा सकता हैaw-selectसे लौटाई गई window पर मनचाहा काम करके “window selection → action execution → original window बनाए रखना” पैटर्न बनाया जा सकता है- example commands इस प्रकार हैं
ace-tear-off-window:ace-windowसे चुनी गई window को नए frame में अलग कर देता हैace-tab-window-detach: चुनी गई window को नए tab में ले जाता है
ace-window-one-commandचुनी हुई window में किसी भी arbitrary single command को चलाने देता है- पहले
ace-windowसे window चुनी जाती है - फिर key sequence पढ़कर उससे जुड़ा command चलाया जाता है
- original selected window बदले बिना दूसरी window पर काम लागू किया जा सकता है
- पहले
ace-window-prefixother-window-prefixके अधिक direct version की तरह काम करता है- अगले command द्वारा दिखाए जाने वाले buffer की target window को
ace-windowसे सीधे चुना जाता है - ज़रूरत पड़ने पर
ace-windowaction से तुरंत नई window बनाकर वहीं display किया जा सकता है - प्रस्तावित key binding
C-x 4 oहै
- अगले command द्वारा दिखाए जाने वाले buffer की target window को
क्या विंडो बदलना वाकई ज़रूरी है
- विंडो बदलने के उद्देश्य मोटे तौर पर दो हिस्सों में बंटते हैं
- Switch and stay: गंतव्य विंडो में ही आगे संपादन या काम जारी रखना
- Switch and return: थोड़ी देर के लिए scroll, search, copy, delete जैसे काम करके मूल स्थान पर लौट आना
- पहले मामले में Avy विंडो switching और cursor movement को एक में जोड़ सकता है
avy-goto-char-timerस्क्रीन पर दिख रही कई Emacs विंडो और frames को एक jump candidate pool की तरह संभालता है- किसी खास string या character position पर jump करते समय विंडो भी अपने-आप बदल जाती है
- अगर Avy विंडो और frame के पार नहीं जा रहा है, तो
avy-all-windowssetting देखनी चाहिए
pop-global-markपिछले स्थान पर लौटने का तरीका है, और ज़रूरत हो तो इसके साथ विंडो switching भी हो सकती है- डिफ़ॉल्ट रूप से यह मौजूदा विंडो में buffer बदलता है, इसलिए
pop-to-bufferइस्तेमाल कराने वाला advice मौजूद है
- डिफ़ॉल्ट रूप से यह मौजूदा विंडो में buffer बदलता है, इसलिए
- दूसरे मामले में “switch → action → return” flow को command में लपेटकर automate किया जा सकता है
ace-window-one-commandइसका एक सामान्य तरीका है- खास actions के लिए dedicated command या macro बनाया जा सकता है
दूसरी विंडो में scroll, search, buffer switching
scroll-other-windowऔरscroll-other-window-downमौजूदा विंडो छोड़े बिना दूसरी विंडो को scroll करते हैं- डिफ़ॉल्ट target, मौजूदा विंडो से clockwise दिशा में “अगली विंडो” होती है
- अगर तीन या उससे ज़्यादा विंडो हों, तो अपेक्षित reference विंडो के बजाय कोई दूसरी विंडो scroll हो सकती है
other-window-scroll-defaultसेट करके scroll target चुनने के नियम बदले जा सकते हैंget-lru-windowइस्तेमाल करने पर सबसे कम हाल में उपयोग की गई विंडो scroll होती हैget-mru-windowइस्तेमाल करने पर हाल में उपयोग की गई विंडो को target बनाया जा सकता है
other-window-scroll-bufferसेट करने पर किसी खास buffer को दिखाने वाली विंडो को scroll target बनाया जा सकता है- इसे मुख्यतः package authors के लिए उपयोगी option माना जाता है
isearch-other-windowका उदाहरण scroll target विंडो में search शुरू करता है और search खत्म होने पर मूल विंडो में वापस लौट आता है- shell और Man buffer को साथ इस्तेमाल करने वाला उदाहरण भी है
next-buffer,previous-buffer,switch-to-bufferको भी prefix argument औरother-window-for-scrollingके साथ जोड़कर दूसरी विंडो में चलाने के लिए बढ़ाया जा सकता हैrepeat-modeके लिए keymap बना लें, तोn,p,bसे दूसरी विंडो के buffers को लगातार cycle या select किया जा सकता है
master-mode, scroll-all-mode, with-other-window
master-modeमौजूदा buffer को “master” और दूसरे buffer को “slave” बनाकर, अपनी मौजूदा position छोड़े बिना slave buffer को actions भेजने देता है- डिफ़ॉल्ट रूप से इसे ऊपर बताए गए
other-window-scroll-defaultतरीके की तुलना में कम पारदर्शी विकल्प माना जाता है master-saysके ज़रिए slave buffer मेंrecenterजैसे arbitrary action चलाने वाली keys बनाई जा सकती हैं
- डिफ़ॉल्ट रूप से इसे ऊपर बताए गए
scroll-all-modeframe के भीतर सभी विंडो के scroll behavior को जोड़ देता है- जब कई विंडो views को sync करके देखना हो, तब यह उपयोगी है
with-other-windowmacro,other-window-for-scrollingद्वारा चुनी गई विंडो में body code चलाने वाला Elisp helper है- इससे
isearch-other-window,isearch-other-window-backwardsजैसे commands आसानी से बनाए जा सकते हैं - यह interactive
ace-window-one-commandके Elisp समकक्ष की तरह काम करता है
- इससे
विंडो की संख्या कम करने की रणनीति
- आधुनिक editor UI आमतौर पर एक main विंडो, ऊपर tab bar, बाईं ओर directory या table of contents sidebar, वैकल्पिक दायाँ panel, और नीचे terminal पर सिमटता है
- Emacs में भी ऐसा layout बनाया जा सकता है, लेकिन स्क्रीन को एक ही buffer पर केंद्रित रखकर buffer switching से विंडो switching की जगह लेना भी संभव है
- अगर अधिकतम दो विंडो तक ही ढील दी जाए, तो ज़्यादातर सादगी बनाए रखते हुए दूसरी विंडो को live reference material की तरह इस्तेमाल किया जा सकता है
- Emacs की default settings
scroll-other-windowजैसे commands के ज़रिए इस pattern को काफ़ी अच्छी तरह support करती हैं
- Emacs की default settings
- एक रणनीति यह भी है कि विंडो को सिर्फ text container मानकर नज़रअंदाज़ कर दिया जाए
- Avy से सीधे स्क्रीन पर किसी text position पर jump करें
mark-ring,global-mark-ringसे पिछली positions को trace करें- dogears और अधिक बारीक trace-back UI दे सकता है
- manual position pinning के लिए
point-to-registerऔरjump-to-registerइस्तेमाल किए जा सकते हैं, और अधिक स्थायी रिकॉर्ड के लिएbookmark-setऔरbookmark-jumpउपयोगी हैं
auto display rules और popup management
display-buffer-alistवह variable है जो तय करता है कि जब Elisp code किसी buffer को दिखाना चाहे, तो buffer और rules का मिलान करके उसे कैसे दिखाया जाए- सिद्धांत रूप में, अगर रोज़ देखने वाले हर buffer type के लिए size, position, role, और focus rules बना दिए जाएँ, तो विंडो management का बड़ा हिस्सा सुलझ सकता है
- समस्या है setup cost
- buffer और mode predicate
- विंडो type और slot
- display-buffer action functions
- window parameters
- “मेरे विंडो layout को मत छेड़ो” जैसी सरल मंशा को आसानी से व्यक्त करना कठिन है
- सहायक tools भी मौजूद हैं
- Shackle
display-buffer-alistकी जटिलता को ढककर एक सरल Elisp interface देता है - Doom Emacs,
set-popup-rule!जैसे convenience commands देता है
- Shackle
- Popwin और Popper इस अवलोकन से शुरू होते हैं कि सभी buffers एक जैसे नहीं होते
- ये मुख्य work buffer और अस्थायी popup buffer में फ़र्क करते हैं
- documentation, shell, task status, compile results, search results, messages आदि को छोटे सहायक विंडो में खोलते हैं ताकि उन्हें आसानी से बंद या cycle किया जा सके
- Popper का फ़ोकस तय किए गए popup buffers को एक key से ऊपर-नीचे लाने पर है
- Popwin अधिक पुराना और व्यापक implementation है, लेकिन इसमें अपनी
display-buffersettings भी साथ बंधी होती हैं - अगर सिर्फ shell को जल्दी खोलना-बंद करना हो, तो shell-pop या vterm-toggle काफ़ी हो सकते हैं
गायब हिस्सा: विंडो tree manipulation
- Emacs, frame के भीतर विंडो को एक tree के रूप में दर्शाता है, लेकिन ज़्यादातर user commands tree structure नहीं बल्कि केवल spatial position देखकर काम करती हैं
- इस mismatch की वजह से split या delete करते समय अपेक्षा से अलग behavior मिल सकता है, या बनने वाली split structures पर सीमाएँ लग सकती हैं
- अगर
window-treeजैसा कोई काल्पनिक package हो, तो internal node स्तर पर manipulation संभव हो सकता है- frame के केवल एक हिस्से को split, transpose, या mirror करना
- कई विंडो को partial configuration के रूप में चुनना
- चुने गए हिस्से को tab या frame में भेजना
- partial configuration को duplicate या save करना
- किसी खास tree branch को
display-bufferपरिवार के commands से सुरक्षित रखना
- कुछ मौजूदा Elisp तत्व पहले से हैं
window-treetree खुद लौटाता हैframe-root-windowroot लौटाता हैwindow-parent,window-child,window-*-siblingउपलब्ध हैंwalk-window-tree,walk-windowsसे traversal किया जा सकता है
- कमियाँ भी साफ़ हैं
- सामान्य split/delete के अलावा tree को बदलने वाली कोई बुनियादी function नहीं है
- internal window को select करने की कोई अवधारणा नहीं है, इसलिए UI में उसका simulation करना पड़ता है
छूटा हुआ हिस्सा: tiling WM इंटीग्रेशन
- Emacs का विंडो ट्री मॉडल i3 या bspwm जैसे मैनुअल tiling window manager से बहुत मिलता-जुलता है
- अगर आप i3, bspwm, या tmux के अंदर Emacs इस्तेमाल करते हैं, तो आप एक ही keybinding से Emacs के अंदर और बाहर की विंडो के बीच स्वाभाविक रूप से आना-जाना चाहेंगे
- मौजूदा उदाहरणों में Pavel Korytov का i3-integration और qtile के लिए emacs-wm.el शामिल हैं
- एक अधिक साफ-सुथरे integration interface के लिए निम्न तत्वों की ज़रूरत है
- window manager को सक्रिय window class की पहचान करनी चाहिए, और विंडो मूवमेंट व manipulation को प्रोग्रामेटिक तरीके से उपलब्ध कराना चाहिए
- संचार का तरीका shell कमांड, socket, server-आधारित IPC, Linux का D-Bus आदि हो सकता है
- Emacs पक्ष में window manager-शैली manipulation की नकल करने वाला, संचार के तरीके से स्वतंत्र interface चाहिए
- OS विंडो स्विच करते समय यह जांचना चाहिए कि सक्रिय विंडो Emacs है या नहीं, और ज़रूरत पड़ने पर Emacs आंतरिक frame के भीतर manipulation संभाले
निष्कर्ष
- Emacs विंडो मैनेजमेंट
other-windowसे लेकरace-window, Avy, Popper, औरdisplay-buffer-alistतक कई स्तरों पर विकल्प देता है - हर तरीका इस्तेमाल करने की ज़रूरत नहीं है; क्योंकि एक ही समस्या सुलझाने के कई वैकल्पिक साधन हैं, आप एक चुनकर बाकी को नज़रअंदाज़ कर सकते हैं
- डिफ़ॉल्ट built-in टूल लंबे समय तक बने रहने की संभावना रखते हैं, लेकिन third-party package की स्थिति विकास, उपेक्षा, या अनाथ हो जाने के अनुसार बदल सकती है
- Emacs का विंडो मैनेजमेंट किसी जटिल स्थिर व्यवस्था से ज़्यादा, सामग्री और रेसिपी देने वाली एक खुली संरचना के क़रीब है
- कम सेटिंग्स के साथ भी बुनियादी काम चल सकता है, और थोड़े संयोजन व Elisp समायोजन से कहीं अधिक अनुकूलित workflow बनाया जा सकता है
1 टिप्पणियां
Hacker News की रायें
लेख अच्छा है और explanations व guidelines भी शानदार हैं। कभी-कभी बराबर split windows काफी नहीं होतीं, इसलिए
init.elमें नीचे वाला function डालकर उसेC-x 7से bind किया है, ताकि current window और paired window को vertically 70%/30% size में adjust कर सकूँhorizontal direction को भी
C-x 8binding से इसी तरह handle करता हूँ(defun partial-size-window ()"Set the two split windows to 70% and 30% vertically."(interactive)(let ((size (- (truncate (* .70 (frame-height))) (window-height))))(if (> size 0)(enlarge-window size))))(defun partial-size-window-h ()"Set the two split windows to 70% and 30% horizontally."(interactive)(let ((size (- (truncate (* .70 (frame-width))) (window-width))))(if (> size 0)(enlarge-window-horizontally size))))अच्छी पड़ताल थी। अभी mobile पर हूँ इसलिए तुरंत try नहीं कर सकता, लेकिन ace-window,
ace-window-display-mode,frames-only-modeजल्दी आज़माना चाहता हूँसच कहूँ तो करीब 40 साल Emacs इस्तेमाल करने के बावजूद, मैं अधिकतर
next-window, नीचे या side में नई window बनाना, और remote server पर काम करते समयtmuxपर निर्भर रहना—बस इतना ही करता आया हूँC-x 1/2/3,C-x oही लगभग सब कुछ रहाफिर भी सच में यह काफी powerful है और मेरे use case के लिए पर्याप्त है, इसलिए लगता है कि कई tiling window managers भी बस इतने ही हों तो अच्छा हो
C-x oथोड़ा झंझट वाला है, इसलिए नीचे वाली setting कर रखी है, लेकिन ये extra packages मुझे सच में जरूरी नहीं लगते(global-set-key (kbd "M-o") #'other-window)फिर भी इतना गहरा reference article होना अच्छा है, और Karthik के लेख हमेशा educational और interesting होते हैं
Karthink के
windmove-modenote में जोड़ूँ तो,windmove-default-keybindingsset करकेCtrl-<arrow keys>से windows के बीच move किया जा सकता है(windmove-default-keybindings 'control)इसे मैंने अपनी config में भी रखा है, और एक minimal starter kit में भी शामिल किया है; यह सच में game changer है
https://codeberg.org/ashton314/emacs-bedrock
.emacscheck की तो पाया कि मैं बिल्कुल यही इस्तेमाल कर रहा था।C-x Oकी तुलना में एक key कम दबानी पड़ती है और यह ज्यादा flexible है, इसलिए मुझे पसंद हैमैंने Emacs को frame को कई windows में split न करने के लिए configure किया है। यह कुछ वैसा है जैसे web browser अपने browser window को कई viewports में नहीं बाँटता
मेरा Emacs दूसरा frame भी नहीं बनाता। पुराना तरीका काम करना बंद होने के बाद इसे implement करने का तरीका साल-दर-साल बदलता रहा
मौजूदा तरीके में, जैसे जब Emacs
*Completions*buffer दिखाता है, कुछ cases में frame split हो जाता है, लेकिन जहां तक याद है, दूसरी window हटाने के लिए मुझे manuallydelete-windowcall नहीं करना पड़ा और वह हमेशा अपने आप गायब हो गईमैं multi-window frames काफी इस्तेमाल करता हूँ। latest macOS और latest Emacs पर कभी-कभी multi-window frame keyboard या trackpad पर respond नहीं करता और अटका हुआ लगता है, और कई बार
Ctrl-Gदबाने पर भी काम नहीं बनतालेकिन
C-x 5 2से नया frame बनाना काम करता था, और अटके हुए frame पर लौटकरC-x 5 0से उस frame को close कर पाता थालेख बहुत गहरा है, और author ने अच्छे diagrams बनाने में समय लगाया—यह बात मुझे सच में पसंद आई
अच्छा लेख है, और इसके साथ इस्तेमाल करने के लिए एक शानदार package share करना चाहता हूँ। मेरे लिए zygospore अनिवार्य tool रहा है
“zygospore
C-x 1(delete-other-window) को फिर सेC-x 1दबाकर reverse करने देता है”https://github.com/LouisKottmann/zygospore.el
https://www.emacswiki.org/emacs/WinnerMode
undoहोना चाहिए, ऐसा लगता हैअजीब जरूर होगा, लेकिन
C-u C-x 1हो तो consistency दिखती हैअगर author यह देख रहे हों, तो कहना चाहूँगा कि Acme editor का हल्का-सा mention देखकर अच्छा लगा
जब
hledger-balance-sheetcall करूँ, तो यह existing.hledger.journalको replace न करे, बल्कि right side में 30% width में खुलेleft side में
.hledger.journalवैसे ही खुला रहे और selected state में बना रहे