1 puan yazan GN⁺ 2024-05-13 | 1 yorum | WhatsApp'ta paylaş
  • Emacs’ta pencere yönetimi, buffer ile pencerenin ayrıldığı esnek bir yapının üzerine biraz kaba varsayılan işlemlerin eklenmiş hâlidir; bu yüzden kullanıcının araçları ve alışkanlıkları birleştirerek kendi iş akışını oluşturması gerekir
  • Yazının odağı display-buffer kuralları ya da sekme tabanlı çalışma alanları değil; tek bir Emacs frame’i içinde fokus taşıma, buffer yerleşimi, bölme/silme ve geçici işleri ele alan manuel işlemlerdir
  • other-window, windmove, winum, ace-window, fare, transpose-frame, window-prefix-map, other-window-prefix, winner-mode; döngüsel geçiş, yön bazlı geçiş, numarayla seçim, ipucuyla seçim, düzen dönüşümü ve geri yükleme görevlerini paylaşır
  • ace-window ve Avy kullanıldığında belirli bir pencere seçildikten sonra komut çalıştırılabilir ya da metin konumuna doğrudan atlanarak pencere değiştirme ihtiyacının kendisi azaltılabilir
  • Emacs’ta pencere yönetimi karmaşık ve sabit bir sistemden çok açık bir probleme yakındır; display-buffer-alist, Popper/Popwin, pencere ağacı işlemleri ve tiling WM entegrasyonu güçlü oldukları kadar ayar maliyeti ve boşluklar da taşır

Emacs’ta pencere yönetimi ne anlama gelir?

  • Emacs’ta pencere (window), frame içindeki bir viewport ya da paneldir; buffer ise bir dosya içeriği olabilen veya olmayabilen kesintisiz bir metin parçasıdır
  • Birçok IDE ve editör, bilişsel yükü azaltmak için pencere ve buffer kavramlarını fiilen birleştirir; Emacs ise daha esnek yerleşimler sağlamak için ikisini ayırır
    • Aynı dosyayı iki kez görüntülemek kolaydır
    • Bir dosyayla doğrudan eşleşmeyen buffer’lar da doğal biçimde ele alınabilir
    • Emacs’in indirect buffers özelliği, buffer’ın tamamının “canlı” bir kopyasına yakındır
  • Bu ayrık yapı yeni kullanıcıya bir maliyet getirir
    • Frame içinde pencereleri istenen konuma yerleştirmek gerekir
    • İstenen buffer’ı istenen pencereye koymak gerekir
    • Başlarda ayrık yapının sağladığı faydalardan önce işlem yükü göze çarpar

Bu yazının kapsamadığı alanlar

  • display-buffer’ı tamamen denetleyen otomatik buffer gösterim kuralları ana konu değildir
  • Sekmeler, çalışma alanları, buffer izolasyonu ve oturum kalıcılığı da temel kapsamın dışındadır
  • Emacs içinde ayrı bir pencere yöneticisi gibi davranan radikal alternatifler de metnin dışında bırakılır
    • Edwina, DWM tarzı master-and-stack otomatik tiling düzenini zorunlu kılar
    • HyControl, pencere düzeni eylemleri için bir kontrol paneli ve eşit grid gösterimi gibi özellikler sunar
  • Asıl odak manuel ve gündelik işlemlerdir
    • Pencere fokusunu değiştirme
    • Buffer’ları pencereler arasında taşıma
    • Pencereleri bölme ve silme
    • Komut çalıştırılırken hedef gösterim penceresini kontrol etme

Temel geçiş: other-window ve “sonraki pencere”

  • other-window, Emacs öğreticisinde öğrenilen temel pencere değiştirme komutudur; varsayılan tuşu C-x o’dur
  • Seçim sırası genellikle frame içinde saat yönünde döner
    • Pencere sayısı az olduğunda basit ve yeterince kullanışlıdır
    • Pencere sayısı arttıkça istenen konuma ulaşmak için komutu birkaç kez çağırmak gerekir
  • Pratik ayarlama yöntemleri de vardır
    • M-o gibi basması daha kolay bir tuşa bağlanabilir
    • Sayısal argümanla birkaç pencere atlanabilir ya da ters yönde gidilebilir
    • repeat-mode açıldığında C-x o o o... veya M-o o o... gibi tekrarlı giriş yapılabilir
  • no-other-window pencere parametresi ayarlandığında other-window belirli pencereleri atlar
    • dired-sidebar veya dirvish-side gibi dosya yöneticisi tarzı yan pencerelerin other-window hedeflerinden çıkarılmasının nedeni budur
  • “Sonraki pencere” kavramı, scroll-other-window gibi başka bir pencere üzerinde işlem yapan komutların varsayılan hedefidir

Yön tabanlı geçiş: windmove

  • windmove, pencere fokusunu yöne göre taşıyan yerleşik bir kütüphanedir
    • Vim kullanıcılarının beklediği sol/sağ/yukarı/aşağı hareketine yakındır
    • evil-mode kullanıcıları da içeride Windmove kullanır
  • windmove-left, windmove-right, windmove-up, windmove-down; WASD, HJKL, yön tuşları vb. tuşlara bağlanarak kullanılabilir
  • windmove-swap-states-left/right/up/down komutları, yöne göre pencerelerin buffer’larını takas eder
    • Bu sırada fokus buffer ile birlikte hareket eder
  • windmove-delete-* ailesiyle belirli bir yöndeki pencereyi silmek de mümkündür; ancak metin aşağıda diğer yöntemleri daha fazla ele alır
  • Tiling WM ortamlarında, aynı tuşlarla Emacs içi pencereler ile OS pencereleri arasında geçiş yapacak şekilde entegrasyon sağlanabilir
    • Emacs+i3wm entegrasyonu örneği olarak i3 integration bulunur
    • qtile için ayar örneği emacs-wm.el dosyasında görülebilir

Emacs pencerelerini OS pencerelerine bırakmak

  • frames-only-mode, tüm buffer’ları Emacs penceresi yerine yeni frame’de açarak OS pencere yöneticisinin yönetmesine bırakır
  • Bu yaklaşım Emacs buffer’larını OS pencereleriyle aynı düzeyde ele almayı sağlar; böylece ikisi de aynı tuşlarla yönetilebilir
  • Avy, winum, ace-window, scroll-other-window gibi araçlar yalnızca pencerelere değil, tüm frame’lere de uygulanabilir
  • Bazı Emacs komutları frame’i serbestçe bölebileceğini varsaydığından istisnai durumlar ortaya çıkabilir
    • Özellikle org-mode komutlarında böyle bir eğilim vardır
  • Wayland compositor üzerinde frames-only-mode kullanma deneyimim yok

Numara ve ipuçlarıyla anında seçim yapmak

  • winum, mode line’da pencere numaralarını gösterir ve pencereleri numarayla seçmeyi sağlar
    • other-window O(n)’ye yakın çalışıyor ve windmove mekânsal yerleşime dayanıyorsa, winum numarayı bildiğinizde O(1) erişime yakındır
    • Seçim komutunu negatif prefix argümanıyla çağırırsanız ilgili pencereyi siler
    • Minibuffer etkinleştiğinde her zaman 0 numarasını alır
    • Emacs frame’leri arasında çalışır
  • Varsayılan C-x w <n> tuşu uzun gelebileceğinden, pencere seçimi için M-0’dan M-9’a kadar kullanmayı gösteren bir yapılandırma örneği vardır
  • ace-window, klavye tabanlı Emacs pencere denetimi için güçlü bir araç olarak ele alınır
    • Her pencerenin üzerinde ipuçları gösterir ve ilgili tuşa basarak seçim yapılır
    • ace-window-display-mode açılırsa, winum gibi ipuçlarını mode line’da sürekli gösterebilir
    • ? tuşuna basınca dispatch menüsü açılır
  • ace-window’ın güçlü yanı, basit seçimden çok pencereyi seçtikten sonra bir aksiyon çalıştırmaktır
    • Pencere silme
    • Pencere taşıma ve takas etme
    • Pencere bölme
    • Belirli bir buffer’ı gösterme
    • Seçili pencereden ayrılmadan başka bir pencereye işlem uygulama

Fare ve yerleşim dönüşümü

  • Emacs’te fare; pencere seçimi, boyutlandırma, bağlam menüleri ve sürükle-bırak için doğal biçimde uygundur
    • context-menu-mode ve menü çubuğu keşfedilebilirliği artırır
  • Eliniz zaten klavyeden ayrılmışsa Emacs’i fareyle kullanmak en düşük dirençli yol olabilir
  • Fare jestleriyle yapılabilecek işler de vardır
    • Frame’i dikey/yatay bölme
    • Pencere silme
    • Pencere içindeki buffer’lar arasında dolaşma
    • Pencereleri sağa/sola takas etme
    • Tek bir pencerede son iki buffer arasında geçiş yapma
  • mouse-autoselect-window ayarlanırsa focus-follows-mouse davranışı açılabilir
  • transpose-frame, frame’in pencere yerleşimini döndürmeye veya ters çevirmeye yarayan komutlar sağlar
    • rotate-frame, flip-frame, flop-frame sık kullanılabilecek komutlar olarak sayılır
    • transpose-frame’in kendisi ana köşegene göre transpozisyon yaptığı için pratik kullanımının düşük olduğu değerlendirilir

window-prefix-map ve pencere ağacı

  • window-prefix-map, Emacs’in varsayılan C-x w tuşuna bağlı pencere yönetimi komutları kümesidir
  • split-root-window-right ve split-root-window-below, frame’in kök penceresini böler
    • Sırasıyla C-x w 3 ve C-x w 2 tuşlarına bağlıdır
    • Normal bölme komutları geçerli pencereyi daha da parçalarken, bunlar ayrı bir çalışma alanı oluştururken kullanışlıdır
  • Emacs pencereleri ağaç yapısı halinde yerleştirilir
    • Gerçek pencereler leaf düğümlerdir
    • Bölme işlemi bir leaf’i iki pencerenin ebeveyn düğümüne dönüştürür
    • i3 veya bspwm gibi manuel tiling pencere yöneticilerinin yerleşimine benzer
  • tab-window-detach ve tear-off-window, geçerli pencereyi yeni bir sekmeye veya yeni bir frame’e taşır
    • Varsayılan tuşların sırasıyla C-x w ^ t ve C-x w ^ f olduğu ve uzun sayıldığı belirtilir
    • ace-window dispatch aksiyonlarıyla veya fare bağlarıyla ikame edilebilir

other-window-prefix: Bir sonraki komutun gösterim yerini değiştirmek

  • other-window-prefix, C-x 4 4’e bağlı yerleşik bir komuttur ve bir sonraki komutun göstereceği buffer’ı sonraki pencerede gösterir
  • Bu komut, dosya açma, buffer değiştirme, yer imine atlama gibi buffer gösteren komutlarla hedef pencere seçimini birbirinden ayırır
    • find-file-other-window, find-file-other-tab, find-file-other-frame gibi komut ailelerini her seferinde ezberleme ihtiyacını azaltır
    • find-file, find-file-read-only, switch-to-buffer gibi temel komutların önüne prefix koyarak yalnızca gösterim yerini değiştirebilirsiniz
  • Forge örneğinde, issue listesindeyken RET’e basıldığında geçerli pencerenin üzerine yazılması sorunu other-window-prefix ile önlenebilir
  • Magit, Org mode, Notmuch, Elfeed, EWW gibi paketlerde “başka pencerede açma” yöntemleri farklı olduğunda da tek tip bir davranış sağlar
  • İlgili prefix’ler de vardır
    • same-window-prefix, bir sonraki komutun buffer’ını geçerli pencerede göstermeyi zorlar
    • other-frame-prefix, yeni frame’de açtırır
    • other-tab-prefix, yeni sekmede açtırır

Pencere yapılandırmasını kaydetme ve geri alma

  • window-configuration-to-register, geçerli pencere yapılandırmasını register’a kaydeden varsayılan komuttur; varsayılan tuşu C-x r w’dir
  • jump-to-register, kayıtlı yapılandırmayı geri yükler; varsayılan tuşu C-x r j’dir
  • Elisp düzeyinde current-window-configuration sonucunu bir değişkende saklayıp set-window-configuration ile uygulayabilirsiniz
    • prin1, persist, multisession gibi yöntemlerle diske kaydedilirse oturumlar arası geri yükleme işlevinin tohumu olur
    • Ancak her pencerenin imleç konumunun da geri yüklenmesi genellikle istenmeyen bir davranış olabilir
  • Geçmiş yapılandırmaları otomatik olarak biriktiren “oops” seçenekleri de vardır
    • winner-mode: Sekme kullanmıyorsanız winner-undo, winner-redo ile pencere yapılandırması değişikliklerini geri alır veya yeniden uygular
    • tab-bar-history-mode: Her sekme için ayrı bir geçmiş yığını sağlar
    • undelete-frame-mode ve tab-undo: Yanlışlıkla kapatılan frame veya sekmeleri kurtarır
  • winner-undo’yu, Emacs bir buffer’ı alakasız bir yerde açtıktan sonra her seferinde toparlamak için kullanmak geçici çözüme yakındır
    • Temel sorun, buffer gösterim kurallarının istenen şekilde yakalanmamış olmasıdır

Sık gidip gelinen iki pencereye göre optimize etmek

  • Gerçek çalışmada ekranda birden fazla pencere olsa da çoğunlukla iki pencere arasında sık gidip gelinir
    • Code & REPL
    • Code & Grep
    • Prose & Notes
    • Listing & Item
  • Diğer pencereler; dokümanlar, debug bilgisi, loglar, komut çıktısı, içindekiler, dosya gezgini, önizleme gibi sık bakılan ama neredeyse hiç geçiş yapılmayan referans alanları olabilir
  • get-mru-window kullanarak en son kullanılan pencereye geçiş yapan other-window-mru örneği vardır
    • İkinci pencereyi fare, ace-window, winum vb. herhangi bir yöntemle seçseniz de sonrasında hızlıca gidip gelebilirsiniz
  • other-window’ın kendisini iyileştirme yöntemleri de vardır
    • Yalnızca bir pencere varsa otomatik olarak bölmesini sağlamak
    • switchy-window gibi son kullanım sırasına göre dolaşmak
    • other-window-alternating gibi, ardışık çağrı olmadığında her seferinde yönü ters çevirerek iki pencere arasında gidip gelmeyi doğal hale getirmek

ace-window’u komut çalıştırma temelli genişletmek

  • ace-window, aw-select aracılığıyla belirli bir pencereyi seçme aşamasını ayrı olarak kullanabilir
  • aw-select’in döndürdüğü pencere üzerinde istediğiniz işlemi gerçekleştirirseniz “pencere seç → işlem çalıştır → özgün pencereyi koru” kalıbını oluşturabilirsiniz
  • Örnek komutlar şunlardır
    • ace-tear-off-window: ace-window ile seçilen pencereyi yeni bir frame olarak ayırır
    • ace-tab-window-detach: Seçilen pencereyi yeni bir sekmeye taşır
  • ace-window-one-command, seçilen pencerede rastgele tek bir komut çalıştırmayı sağlar
    • Önce ace-window ile pencere seçilir
    • Tuş dizisi okunup ilgili komut çalıştırılır
    • Özgün seçili pencereyi değiştirmeden başka bir pencereye işlem uygulanabilir
  • ace-window-prefix, other-window-prefix’in daha doğrudan bir sürümü gibi davranır
    • Bir sonraki komutun göstereceği buffer için hedef pencereyi ace-window ile doğrudan seçer
    • Gerekirse ace-window aksiyonuyla anında yeni pencere oluşturup orada gösterebilir
    • Önerilen tuş bağı C-x 4 o’dur

Pencereyi mutlaka değiştirmek gerekir mi

  • Pencere değiştirmenin amacı genel olarak ikiye ayrılır
    • Switch and stay: hedef pencerede düzenlemeye veya çalışmaya devam etmek
    • Switch and return: kısa süreliğine kaydırma, arama, kopyalama, silme gibi işler yapıp özgün konuma dönmek
  • İlk durumda Avy, pencere değiştirmeyi ve imleç hareketini tek bir işlemde birleştirebilir
    • avy-goto-char-timer, ekranda görünen birden çok Emacs penceresini ve frame’i tek bir atlama adayı havuzu gibi ele alır
    • Belirli bir dizgeye veya karakter konumuna atlarken pencere de otomatik olarak değişir
    • Avy pencereler ve frame’ler arasında geçmiyorsa avy-all-windows ayarını kontrol etmek gerekir
  • pop-global-mark, önceki konuma dönmenin bir yoludur; gerekirse pencere değişimi de beraberinde gerçekleşebilir
    • Varsayılan olarak mevcut pencerede buffer değiştirdiği için, pop-to-buffer kullanmasını sağlayan bir advice vardır
  • İkinci durumda “değiştir → eylem yap → geri dön” akışı bir komutla sarılıp otomatikleştirilebilir
    • ace-window-one-command bunun genel amaçlı bir yoludur
    • Belirli eylemler özel komutlar veya makrolar olarak yapılabilir

Başka pencerede kaydırma, arama ve buffer değiştirme

  • scroll-other-window ve scroll-other-window-down, mevcut pencereden ayrılmadan başka bir pencereyi kaydırır
    • Varsayılan hedef, mevcut pencereden saat yönündeki “sonraki pencere”dir
    • Üç veya daha fazla pencere varsa beklenen referans penceresi yerine başka bir pencere kaydırılabilir
  • other-window-scroll-default ayarlanarak kaydırma hedefini seçme kuralı değiştirilebilir
    • get-lru-window kullanılırsa en uzun süredir kullanılmayan pencere kaydırılır
    • get-mru-window kullanılırsa son kullanılan pencere hedef alınabilir
  • other-window-scroll-buffer ayarlanırsa belirli bir buffer’ın gösterildiği pencere kaydırma hedefi olarak belirtilebilir
    • Bu çoğunlukla paket yazarları için yararlı bir seçenek olarak ele alınır
  • isearch-other-window örneği, kaydırma hedefi olan pencerede aramayı başlatıp arama bittikten sonra özgün pencereye dönme biçimindedir
    • Shell ve Man buffer’ını birlikte kullanan bir örnek vardır
  • next-buffer, previous-buffer, switch-to-buffer da prefix argümanı ile other-window-for-scrolling birleştirilerek başka pencerede çalışacak şekilde genişletilebilir
    • repeat-mode için bir keymap yapılırsa n, p, b ile başka penceredeki buffer’lar art arda döndürülebilir veya seçilebilir

master-mode, scroll-all-mode, with-other-window

  • master-mode, mevcut buffer’ı “master”, başka bir buffer’ı “slave” olarak belirleyip mevcut konumdan ayrılmadan slave buffer’a eylem gönderebilir
    • Varsayılan olarak yukarıdaki other-window-scroll-default yöntemine göre daha az şeffaf bir alternatif olarak değerlendirilir
    • master-says üzerinden slave buffer’da recenter gibi isteğe bağlı eylemleri çalıştıran tuşlar yapılabilir
  • scroll-all-mode, frame içindeki tüm pencerelerin kaydırma davranışını birbirine bağlar
    • Birden çok pencere görünümünü senkronize ederek görmek istendiğinde yararlıdır
  • with-other-window makrosu, other-window-for-scrolling tarafından seçilen pencerede gövde kodunu çalıştıran bir Elisp yardımcı aracıdır
    • isearch-other-window, isearch-other-window-backwards gibi komutlar kolayca yapılabilir
    • Etkileşimli ace-window-one-commandin Elisp karşılığı gibi kullanılır

Pencere sayısını azaltma stratejisi

  • Modern editör arayüzleri genellikle tek bir ana pencere, üstte tab bar, solda dizin veya içindekiler yan paneli, isteğe bağlı sağ panel ve altta terminal düzenine yakınsar
  • Emacs’ta da böyle bir düzen yapılabilir; ancak ekranı tek bir buffer’a odaklayıp pencere değiştirmeyi buffer değiştirmeyle ikame etmek de mümkündür
  • Yalnızca iki pencereye kadar gevşetilirse, basitliğin büyük kısmı korunurken ikinci pencere canlı referans materyali olarak kullanılabilir
    • Emacs varsayılan ayarları, scroll-other-window gibi komutlarla bu kalıbı oldukça iyi destekler
  • Pencereleri yalnızca metin kapsayıcıları olarak görüp yok sayma stratejisi de vardır
    • Avy ile ekrandaki metin konumuna doğrudan atlanır
    • mark-ring, global-mark-ring ile önceki konumların izi geri sürülür
    • dogears daha ayrıntılı bir geri izleme arayüzü sağlayabilir
  • Elle konum sabitlemek için point-to-register ve jump-to-register kullanılabilir; daha kalıcı kayıtlar için bookmark-set ve bookmark-jump kullanılabilir

Otomatik gösterim kuralları ve popup yönetimi

  • display-buffer-alist, Elisp kodu bir buffer’ı göstermeye çalıştığında buffer ile kuralları eşleştirip gösterim biçimini belirleyen değişkendir
  • Teoride, her gün görülen her buffer türü için boyut, konum, rol ve odak kuralları yapılırsa pencere yönetiminin önemli bir kısmı çözülür
  • Sorun ayar maliyetidir
    • Buffer ve mod predicate’leri
    • Pencere türü ve slot
    • display-buffer action fonksiyonu
    • Pencere parametreleri
    • “Pencere düzenime dokunma” gibi basit bir niyeti kolayca ifade etmek zordur
  • Yardımcı araçlar da vardır
    • Shackle, display-buffer-alist karmaşıklığını örter ve basit bir Elisp arayüzü sunar
    • Doom Emacs, set-popup-rule! gibi kolaylık komutları sağlar
  • Popwin ve Popper, tüm buffer’ların aynı olmadığı gözleminden yola çıkar
    • Ana çalışma buffer’ları ile geçici popup buffer’larını ayırır
    • Belgeler, shell, iş durumu, derleme sonuçları, arama sonuçları, mesajlar vb. küçük yardımcı pencerelerde açılıp kolayca kapatılabilir veya aralarında dolaşılabilir hale getirilir
    • Popper, belirlenmiş popup buffer’larını tek tuşla yukarı kaldırıp indirmeye odaklanır
    • Popwin daha eski ve kapsamlı bir uygulamadır, ancak kendi display-buffer ayarlarını da birlikte paketler
    • Yalnızca shell’i hızlıca açıp kapatmak istiyorsanız shell-pop veya vterm-toggle yeterli olabilir

Eksik parça: pencere ağacı işlemleri

  • Emacs, frame içindeki pencereleri ağaç olarak temsil eder; ancak çoğu kullanıcı komutu ağaç yapısına değil yalnızca uzamsal konuma bakarak çalışır
  • Bu uyumsuzluk nedeniyle bölme/silme sırasında beklenenden farklı davranışlar ortaya çıkabilir veya oluşturulabilecek bölme yapıları kısıtlanabilir
  • window-tree gibi varsayımsal bir paket olsaydı iç düğüm düzeyinde işlemler mümkün olabilirdi
    • Frame’in yalnızca bir bölümünü bölme, transpoze etme, aynalama
    • Birden çok pencereyi kısmi yapı olarak seçme
    • Seçilen bölümü tab’a veya frame’e aktarma
    • Kısmi yapıyı çoğaltma veya kaydetme
    • Belirli bir ağaç branch’ini display-buffer ailesi komutlardan koruma
  • Halihazırda var olan Elisp öğeleri de vardır
    • window-tree, ağacın kendisini döndürür
    • frame-root-window, kökü döndürür
    • window-parent, window-child, window-*-sibling vardır
    • walk-window-tree, walk-windows ile dolaşılabilir
  • Eksik noktalar da açıktır
    • Genel split/delete dışında ağacı dönüştüren temel fonksiyon yoktur
    • İç pencereyi seçme kavramı olmadığından bunun arayüzde simüle edilmesi gerekir

Eksik parça: döşemeli WM entegrasyonu

  • Emacs’in pencere ağacı modeli, i3 veya bspwm gibi manuel döşemeli pencere yöneticilerine çok benzer
  • i3, bspwm ya da tmux içinde Emacs kullanıyorsanız, aynı tuş atamalarıyla Emacs içindeki ve dışındaki pencereler arasında doğal biçimde gidip gelmek istersiniz
  • Mevcut örnekler arasında Pavel Korytov’un i3-integration çalışması ve qtile için emacs-wm.el bulunur
  • Daha temiz bir entegrasyon arayüzü için şu unsurlar gerekir
    • Pencere yöneticisi etkin pencere sınıfını tanımlayabilmeli ve pencere taşıma/manipülasyon işlemlerini programatik olarak sunmalı
    • İletişim yöntemi shell komutları, soket, sunucu tabanlı IPC veya Linux’taki D-Bus olabilir
    • Emacs tarafında, pencere yöneticisi tarzı işlemleri taklit eden, iletişim yönteminden bağımsız bir arayüze ihtiyaç vardır
    • OS pencereleri arasında geçiş yaparken etkin pencerenin Emacs olup olmadığı kontrol edilir; gerekirse Emacs işlemi kendi iç frame’inde ele alır

Sonuç

  • Emacs pencere yönetimi, other-windowdan ace-window, Avy, Popper ve display-buffer-aliste kadar farklı katmanlarda seçenekler sunar
  • Tüm yöntemleri kullanmak gerekmez; aynı sorunu çözen çok sayıda alternatif olduğu için birini seçip kalanları yok sayabilirsiniz
  • Yerleşik temel araçların uzun süre korunma olasılığı yüksektir, ancak üçüncü taraf paketlerin durumu geliştirme, terk edilme veya sahipsiz kalma durumlarına göre değişebilir
  • Emacs’in pencere yönetimi, karmaşık ve sabit bir sistemden çok, malzemeler ve tarifler sunan açık bir yapıya benzer
  • Az ayarla bile temel bir kullanım mümkündür; biraz kombinasyon ve Elisp ayarıyla çok daha özelleştirilmiş bir çalışma akışı oluşturabilirsiniz

1 yorum

 
GN⁺ 2024-05-13
Hacker News yorumları
  • Yazı güzel, açıklamalar ve yönergeler de harika. Eşit bölünmüş pencereler bazen yetmediği için aşağıdaki fonksiyonu init.el içine koyup C-x 7 tuşuna bağlayarak mevcut pencereyi ve eşleşen pencereyi dikeyde %70/%30 boyutlarına ayarlıyorum
    Yatay yön için de aynı şeyi C-x 8 bağlamasıyla yapıyorum

    (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 da bu amaçla kullanılabilir
  • Güzel bir incelemeydi. Şu an mobildeyim, o yüzden hemen deneyemiyorum ama ace-window, ace-window-display-mode ve frames-only-mode'u yakında denemek istiyorum
    Dürüst olmak gerekirse Emacs'i yaklaşık 40 yıldır kullanmama rağmen çoğunlukla next-window, alta ya da yana yeni pencere açma ve uzak sunucularda çalışırken tmux kullanma düzeyinde kaldım

    • Bende de benzer. 30 yıldır neredeyse sadece C-x 1/2/3 ve C-x o kullandım
      Ama bunlar aslında epey güçlü ve benim kullanımım için yeterli; hatta çeşitli tiling pencere yöneticilerinin de tam bu kadarını yapmasını isterdim
    • Bende de benzer. C-x o biraz zahmetli geldiği için aşağıdaki ayarı yaptım ama bu ek paketlerin gerçekten gerekli olduğunu hissetmiyorum
      (global-set-key (kbd "M-o") #'other-window)
      Yine de böyle derinlikli bir başvuru yazısının olması güzel; Karthik'in yazıları her zaman öğretici ve ilgi çekici oluyor
  • Karthink'in windmove-mode notuna ek olarak, windmove-default-keybindings ayarlayarak pencereler arasında Ctrl-<yön tuşu> ile geçiş yapabilirsiniz
    (windmove-default-keybindings 'control)
    Bunu kendi yapılandırmama da ekledim, minimalist başlangıç kitime de koydum; gerçekten oyun değiştirici
    https://codeberg.org/ashton314/emacs-bedrock

    • .emacs dosyama baktım, ben de birebir aynı şeyi kullanıyormuşum. C-x O'ya göre bir tuşa daha az basılıyor ve daha esnek olduğu için tercih ediyorum
  • Emacs'in bir frame'i birden çok pencereye bölmesini engelleyecek şekilde ayarladım. Bu, web tarayıcısının tarayıcı penceresini birden fazla viewport'a bölmemesine benziyor
    Benim Emacs'im ikinci bir frame de oluşturmuyor. Eski yöntemler artık çalışmaz hale geldikçe bunun nasıl yapılacağı yıllar içinde değişti
    Şu anki yöntemde örneğin Emacs *Completions* buffer'ını göstermek istediğinde olduğu gibi bazı durumlarda frame bölünüyor, ama hatırladığım kadarıyla ikinci pencereyi kaldırmak için elle delete-window çağırmam gerekmiyordu; hep kendiliğinden kayboluyordu

    • Web tarayıcıları da aslında bunu yapabilir; örneğin Vivaldi aynı anda birden fazla sayfayı gösterebiliyor
    • Frame'in birden çok pencereye bölünmesini engellemenizin belirli bir sorunu çözmek için olup olmadığını merak ettim
      Ben çok pencereli frame'leri oldukça sık kullanıyorum. Güncel macOS ve güncel Emacs'te bazen çok pencereli bir frame klavye ya da trackpad'e yanıt vermiyormuş gibi donuyor ve birkaç kez Ctrl-G basmak da işe yaramıyor
      Ama C-x 5 2 ile yeni bir frame oluşturmak çalışıyor, ardından donmuş frame'e geri dönüp C-x 5 0 ile o frame'i kapatabiliyordum
  • Yazı çok derinlikli ve yazarın iyi şemalar çizmek için zaman harcamış olmasını gerçekten takdir ettim

  • Güzel bir yazı; birlikte kullanmak için harika bir paketi de paylaşmak istiyorum. Benim için zygospore vazgeçilmez olmuştu
    “zygospore, C-x 1 (delete-other-window) işlemini tekrar C-x 1 basarak geri almanızı sağlar”
    https://github.com/LouisKottmann/zygospore.el

    • Tüm pencere düzeni değişikliklerini yeniden uygulamak ya da geri almak için winner mode'a bakmaya değer
      https://www.emacswiki.org/emacs/WinnerMode
    • İdeal olarak bunun undo olması gerekmez miydi?
      Garip olurdu belki ama C-u C-x 1 tutarlı görünüyor
  • Yazar bunu görürse, Acme editor'a yapılan küçük göndermeyi görmekten memnun olduğumu iletmek isterim

  • hledger-balance-sheet çağrıldığında mevcut .hledger.journal dosyasının yerine geçmesini değil, sağda %30 genişlikte açılmasını istiyorum
    Solda .hledger.journal açık ve seçili olarak kalmalı