1 पॉइंट द्वारा GN⁺ 2024-05-13 | 1 टिप्पणियां | WhatsApp पर शेयर करें
  • Emacs का विंडो मैनेजमेंट एक ऐसे लचीले ढांचे पर बना है जहाँ buffer और window अलग-अलग हैं, लेकिन उसके ऊपर कुछ हद तक भद्दे बेसिक controls चढ़े हुए हैं, इसलिए यूज़र को tools और आदतों को मिलाकर अपना workflow बनाना पड़ता है
  • इस लेख का फोकस display-buffer rules या 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 इसका मुख्य विषय नहीं हैं
  • tabs, workspaces, buffer isolation, और session persistence भी मुख्य दायरे से बाहर हैं
  • Emacs के भीतर अलग window manager की तरह काम करने वाले radical alternatives को भी इस लेख से बाहर रखा गया है
    • Edwina DWM-style master-and-stack automatic tiling layout लागू करता है
    • HyControl window layout action control panel और equal grid display जैसी सुविधाएँ देता है
  • असली फोकस manual और रोज़मर्रा की operations पर है
    • window focus switching
    • windows के बीच buffer movement
    • window split और delete
    • command execution के दौरान target display window का control

बुनियादी movement: other-window और “अगली window”

  • other-window Emacs tutorial में सिखाया जाने वाला बुनियादी window switching command है, और इसकी default key C-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-window window 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/down commands दिशा के आधार 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) के करीब है और windmove spatial 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-map Emacs की default key C-x w से जुड़ा window management commands का set है
  • split-root-window-right और split-root-window-below frame की 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-window current window को नए tab या नए frame में ले जाते हैं
    • उनकी default keys C-x w ^ t और C-x w ^ f को लंबा माना गया है
    • इन्हें ace-window dispatch actions या mouse bindings से बदला जा सकता है

other-window-prefix: अगले command की display location बदलना

  • other-window-prefix built-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-register current window configuration को register में सेव करने वाला built-in command है, और इसकी default key C-x r w है
  • jump-to-register सेव की गई configuration restore करता है, और इसकी default key C-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-mru example दिया गया है
    • दूसरी window को mouse, ace-window, winum या किसी भी तरीके से चुन लेने के बाद आगे तेज़ी से आगे-पीछे जाया जा सकता है
  • 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-prefix other-window-prefix के अधिक direct version की तरह काम करता है
    • अगले command द्वारा दिखाए जाने वाले buffer की target window को ace-window से सीधे चुना जाता है
    • ज़रूरत पड़ने पर ace-window action से तुरंत नई window बनाकर वहीं display किया जा सकता है
    • प्रस्तावित key binding C-x 4 o है

क्या विंडो बदलना वाकई ज़रूरी है

  • विंडो बदलने के उद्देश्य मोटे तौर पर दो हिस्सों में बंटते हैं
    • 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-windows setting देखनी चाहिए
  • pop-global-mark पिछले स्थान पर लौटने का तरीका है, और ज़रूरत हो तो इसके साथ विंडो switching भी हो सकती है
    • डिफ़ॉल्ट रूप से यह मौजूदा विंडो में buffer बदलता है, इसलिए pop-to-buffer इस्तेमाल कराने वाला advice मौजूद है
  • दूसरे मामले में “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-mode frame के भीतर सभी विंडो के scroll behavior को जोड़ देता है
    • जब कई विंडो views को sync करके देखना हो, तब यह उपयोगी है
  • with-other-window macro, 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 करती हैं
  • एक रणनीति यह भी है कि विंडो को सिर्फ 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 देता है
  • Popwin और Popper इस अवलोकन से शुरू होते हैं कि सभी buffers एक जैसे नहीं होते
    • ये मुख्य work buffer और अस्थायी popup buffer में फ़र्क करते हैं
    • documentation, shell, task status, compile results, search results, messages आदि को छोटे सहायक विंडो में खोलते हैं ताकि उन्हें आसानी से बंद या cycle किया जा सके
    • Popper का फ़ोकस तय किए गए popup buffers को एक key से ऊपर-नीचे लाने पर है
    • Popwin अधिक पुराना और व्यापक implementation है, लेकिन इसमें अपनी display-buffer settings भी साथ बंधी होती हैं
    • अगर सिर्फ 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-tree tree खुद लौटाता है
    • frame-root-window root लौटाता है
    • 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 टिप्पणियां

 
GN⁺ 2024-05-13
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 8 binding से इसी तरह 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))))

    • golden-ratio भी इस काम के लिए इस्तेमाल किया जा सकता है
  • अच्छी पड़ताल थी। अभी mobile पर हूँ इसलिए तुरंत try नहीं कर सकता, लेकिन ace-window, ace-window-display-mode, frames-only-mode जल्दी आज़माना चाहता हूँ
    सच कहूँ तो करीब 40 साल Emacs इस्तेमाल करने के बावजूद, मैं अधिकतर next-window, नीचे या side में नई window बनाना, और remote server पर काम करते समय tmux पर निर्भर रहना—बस इतना ही करता आया हूँ

    • मेरे साथ भी कुछ ऐसा ही है। 30 साल तक 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-mode note में जोड़ूँ तो, windmove-default-keybindings set करके Ctrl-<arrow keys> से windows के बीच move किया जा सकता है
    (windmove-default-keybindings 'control)
    इसे मैंने अपनी config में भी रखा है, और एक minimal starter kit में भी शामिल किया है; यह सच में game changer है
    https://codeberg.org/ashton314/emacs-bedrock

    • अपनी .emacs check की तो पाया कि मैं बिल्कुल यही इस्तेमाल कर रहा था। 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 हटाने के लिए मुझे manually delete-window call नहीं करना पड़ा और वह हमेशा अपने आप गायब हो गई

    • अगर web browser Vivaldi जैसा हो, जो कई pages एक साथ देखने देता है, तो वह असल में windows को ऐसे split कर सकता है
    • frame को कई windows में split न होने देने का कोई खास problem solve करना मकसद था क्या, यह जानना चाहूँगा
      मैं 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

    • सभी window configuration changes को redo या undo करने के लिए winner mode देखने लायक है
      https://www.emacswiki.org/emacs/WinnerMode
    • ideally तो यह undo होना चाहिए, ऐसा लगता है
      अजीब जरूर होगा, लेकिन C-u C-x 1 हो तो consistency दिखती है
  • अगर author यह देख रहे हों, तो कहना चाहूँगा कि Acme editor का हल्का-सा mention देखकर अच्छा लगा

  • जब hledger-balance-sheet call करूँ, तो यह existing .hledger.journal को replace न करे, बल्कि right side में 30% width में खुले
    left side में .hledger.journal वैसे ही खुला रहे और selected state में बना रहे