Hızlıca pencereler arasında nasıl geçiş yapılır?


90

Pencereler arasında hızlıca nasıl geçiş yapabilirim?

Genellikle birden fazla pencerem açık ve aralarında geçiş yapmam gerekiyor. Şu anda C-x oistediğim kişiye ulaşmak için kullanıyorum . Bunun için daha verimli bir iş akışı var mı?


Yanıtlar:


62

Açıkçası bunun için ace- window'u tercih ediyorum . Görünür pencereler ve çerçeveler arasında geçiş yapabilirsiniz. MELPA'da hızlıca yükleyebilirsiniz. Yapacak tek şey onu bağlamak.

(global-set-key (kbd "C-x o") 'ace-window)

Ya da belki daha kısa bir anahtar akoru kullanın, çünkü pencereleri değiştirmek yaygın bir iştir:

(global-set-key (kbd "M-p") 'ace-window)

Özeti ace-window

Bunun için açılan bir yedek other-window. Sonuncusundan farklı olarak, ace-windowbir pencere seçmek için asla iki veya daha fazla kez aramanız gerekmez : bir aramada istediğiniz bir pencereyi seçersiniz (muhtemelen birden fazla karede).

Pencereleri değiştirmenin yanı sıra ace-windowdaha fazlasını yapabilirsiniz (pencereleri silme veya değiştirme vb.), README'ye bakınız .


2
Bu ilginç. Harflerin daha belirgin olması dışında kabaca aynı şeyi yapan görünüyor ace-windowve kullandım switch-window. komik görünüyor, iki paketimiz de var.
milkypostman

Haklısın. Aralarında sadece küçük farklılıklar var. 2000 paketli bir havuzumuz olduğunda karşılaşmamız gereken bir sorun bu. MELPA'ya switch-windowgönderilinceye kadar farkında ace-windowdeğildim.
abo-abo

1
için teşekkürler ace-window, sanırım diğer paketlerden daha fazla kişiselleştirmeye sahip. Gelecekte, yine de biri yardımcı olabilir, akıllı takas eylemine benzer şekilde işlev görecek bir fonksiyona anahtarlık yapmak, ancak o noktayı daha büyük bir pencereye ve daha küçük seçilen bir pencereye (yenen bir pencereye sahip olmakla) sonuçlanan bir fonksiyona bağlamaktır. penceresini aç). Bu durumda oran, yarı yarıya, dördüncü ya da üçte biri olarak belirlenmelidir.
doktora

4
Lütfen bir açıklama eklemeyi düşünün. Sadece hoşuna gittiğini söylüyorsun ve bağlantı kuruyorsun. Bu aslında sadece bir link cevap yapar.
Drew

4
Ace-window'un faydası nedir? Neden bu sayfada önerilen diğer 14 çözüm üzerinde kullanmalıyım?
Gilles,

103

Bir yol kullanmaktır windmove. Varsayılan tuş bağlarıyla, aktif olanın yanındaki pencereye geçilmesine izin verir.

Emacs'ta yerleşiktir, bu nedenle herhangi bir şey yüklemeye gerek yoktur; sadece init dosyanızda aşağıdaki asgari kurulumla etkinleştirin:

(windmove-default-keybindings)

Ardından (sezgisel olarak kullanılan ok taşımak hangi yönde tanımlar) aşağıdaki tuşları kullanarak komşu pencereleri geçebilirsiniz: S-<left>, S-<right>, S-<up>, S-<down>.


Bunun yerine başka bir değiştirici kullanmayı tercih shiftederseniz, bunu bir argüman olarak sağlayabilirsiniz windmove-default-keybindings. Örneğin:

(windmove-default-keybindings 'meta)

veya

(windmove-default-keybindings 'control)

Emacs Wiki'de daha fazla bilgi .


16
Bu kabul edilen cevap olmalı!
rowman

OMG, neden hiçbir öğretici pencere etrafında hareket etmek için shift + ok tuşlarını bahsetmiyor! O zaman çok daha iyi ctrl + o
Didier A.

Buradaki diğer cevapların bir kısmının yedek windmove yapılandırması içerdiğini söyleyebilirim. Belki de işlevin değiştirici anahtarı örneğin (windmove-default-keybindings 'meta)EmacsWiki'de önerildiği gibi bir argüman olarak kabul ettiğini belirtmek için cevabı güncellemeye değer .
metaturso,

Bu, diğer anahtarlarla (veya pencere yöneticileriyle) çok fazla çatışma yaratır. As-window'u tercih ederim.
azzamsa

Benzer bir şey kullanıyorum (birlikte hareket ediyorum Shift-arrow) , ancak çok fazla bölünmüş büyük bir monitörünüz olduğunda, bu tür bir hareket çabucak hantallaşıyor. Bir şekilde pencereleri / bölmeleri saymak daha ilginç olurdu. Gibi ace-window, ancak daha az tuşa basıldığında ve istediğiniz numarayı hemen bulmak için açık bir algoritma ile.
Hi-Angel

21

Daha other-windowkolay yazılabilir bir tuş sırasına bağlayabilirsiniz .

Örneğin, ben var C-.bağlı other-windowve C-,önceki pencereye gitmek bağlıdır.

(global-set-key (kbd "C-.") #'other-window)
(global-set-key (kbd "C-,") #'prev-window)

(defun prev-window ()
  (interactive)
  (other-window -1))

Bu özellikle birden fazla pencereyi taşımak için kullanışlıdır; Control tuşunu basılı tuttuğunuzda, bir sonraki pencereye geçmek için sadece bir düğmeye basmanız yeterlidir. Bu, hamle başına üç tuşa basmaktan çok daha kolaydır.


2
1 C-x oiçin other-window"en kötü varsayılan emacs kısayol" başlığı için bir kaç katı yarışmacının biri. Benim çözümüm (zck'e benzer other window) daha kolay bir anahtar dizilimine yeniden bağlamaktı (buna bağlı kaldım C-;(ve benim Caps-Lockyer değiştirdiğim Ctrliçin pinkies'e hızlıca dokunmak gerekiyor). Btw, ben belirli özelliklerinden tamamen bağımlı değilim helmve icicles(yani değilim "Anti-paketleri" ya da bir şey); Sadece basit bir çözümün burada en iyi sonucu verdiğini düşünüyorum.
iceman

2
+1 Bu, kabul edilen cevap VE en basit cevap olmalıdır (ne yazık ki, StEx'te henüz böyle bir şey yoktur). Kutunun dışında çalışır, mükemmel ölçekler, ezberlemek kolaydır. İkincisi, özellikle Emacs ormanında önemli buldum. Orada 20+ yıl hayatta kaldıktan sonra bazen kendimi özlediğimde vi çölünde gizlice buluyorum ...
Andreas Spindler

Basit, kullanımı kolay, uygulaması kolay. Bunun için daha fazla oy gerekiyor.
stewSquared

1
Bu da benim yaptığım şey. Kullandığım M-oiçin other-window. Bazı modlar zaten M-obağlayıcı, özellikle diff-mode, ggtag-modeve ibuffer-mode. Her mod haritasında elle ayırmanız gerekir. unbind-keytarafından sağlanan bind-key.elçok yararlıdır.
Yasushi Shoji,

Ben de kullanıyorum ve ek güce ihtiyaç duyduğumda M-obuna M-Obağlı kaldım ace-window.
glucas

13

window-numbering.el!

Belirli pencereyi değiştirmek için ", 1", ", 2", ", 3" kısayol tuşlarını atarım (lütfen kötü mod kullandığımı unutmayın)

ayrıca, mod satırındaki pencere numarasını PINK renginde, altı çizili olarak görüntülerim.

Asla görmezden gelemeyeceğin görsel bir ipucu,

Pencereyi değiştirmenin en hızlı yolu budur .

https://github.com/redguardtoo/emacs.d/blob/master/lisp/init-evil.el ve https://github.com/redguardtoo/emacs.d/blob/master/lisp/init-modeline adresini kontrol edin. .el benim kurulum için.

Sylvain Benner fikrimi uzay haritalarında benimsemiştir, ancak anahtarlıklar farklıdır . Böylece boşluk kullanıyorsanız, kutudan en hızlı çözümü alırsınız.


2
Evet. Bu kavram harika. Paketi kullanımı window-numberile M-<num>hızlı bir şekilde pencere w / b geçmek için. Buna benzer bir kavram
unperson325680

1
Not pencere numbering.el winum lehine kullanımdan kaldırılmıştır olduğunu burada . FWIW benim için pencereyi ayarlayan işe yaramadı bile.
Hi-Angel

Yakında winum'a geçebilirim. Fakat pencere numaralandırması emacs24 / 25 / 26'da hala iyi çalışıyor.
chen bin

10

Herhangi bir ek eklenti kullanmadan C-x o, bu kadar fazla pencereyi atlamak için isteğe bağlı bir önekle kullanmaya devam edebilirsiniz . Örn: C-u 1 C-x osırayla bir sonraki pencereye gidecektir (yani düz ile ne elde edersiniz C-x o), C-u 2 C-x oiki pencereye, C-u 3 C-x oüç pencereye, vb.

other-windowDokümantasyondan bir alıntı (işlevinin çağırdığı işlev C-x o:

COUNT, seçimi yapmadan önce, seçilen pencereden başlayarak atlanacak pencerelerin sayısını belirtir. COUNT pozitifse, COUNT pencereyi ileriye atlayın. COUNT negatifse, -COUNT pencereyi geriye atlayın. Sıfır COUNT, herhangi bir pencereyi atlamadığı için seçilen pencereyi seçin. Etkileşimli bir aramada, COUNT sayısal önek argümanıdır. Sıfırın.


Birden fazla pencereniz olduğunda hangi sırayı izlerler?
stsquad


2
hmm "Sıralama, ağacın yaprak düğümleri olan canlı pencereleri almak, çerçevenin pencere ağacının derinlikli bir ilk hareketine göre belirlenir", hangi pencerenin bir sonraki pencere olduğunu tahmin etmeye çalışan insan beyni için en yararlı açıklama değildir veya kaç tane atlanmalı. Sanırım bu yüzden ace-window kullanıyorum.
stsquad

2
@ stsquad: oh, sana katılıyorum - bu da başımı döndürüyor. Bu cevabı tamlık uğruna buraya koydum.
Dan

8

Bazı insanlar Brief editörünü (Underware adlı bir şirket tarafından üretilen yeterince komik) hatırlayabilir.

Görünür pencereler arasında geçiş yapmak için düzgün bir yol vardı. M-ok, imleci cama doğrudan ok tuşunun yönünde gelecek şekilde hareket ettirir.

Yani, eşlenen winmove-left, winmove-right, winmove-upve winmove-downişlevleri M-left, M-right, M-upve M-downbenim .emacs dosyasında tuşları aşağıdaki gibi -

(global-set-key [M-left] 'windmove-left)          ; move to left window
(global-set-key [M-right] 'windmove-right)        ; move to right window
(global-set-key [M-up] 'windmove-up)              ; move to upper window
(global-set-key [M-down] 'windmove-down)          ; move to lower window

Artık, ne kadar karmaşık bir yapıya sahip olduğumdan bağımsız olarak pencereler arasında kolaylıkla hareket edebiliyorum ... Günümüzde ekranların boyutuyla da oldukça karışık olabiliyor ...


Francesco'nun cevabı @ az ya da çok değil mi?
Dan

Katılıyorum. Benimkini göndermeden önce farketmedim.
kullanıcı2542

2
Bu anahtar kelimeleri almanın çok daha kısa bir yolu (windmove-default-keybindings 'meta)!
Omar

8

Eğer kullanırsanız Icicles sonra C-x oetmenizi sağlar tarafından pencereler seçmek adına (veya bisiklet ile).

  • Hiçbir önek argümanı olmadan, çerçevenin sadece bir penceresi olmadıkça, C-x onormalde olduğu gibi aynıdır .other-windowother-frame

  • Bir önek argümanıyla, pencereler veya çerçeveler arasında ada (veya bisiklete binerek) göre gezinmenizi sağlayan çok komutlu C-x obir komuttur . Pencereler arasında gezinmek için çoklu komut kullanılır icicle-select-window; çerçeveler arasında gezinti kullanır icicle-select-frame.

Hangi navigasyonun kullanılması önek argümanına bağlıdır:

  • Sıfır önek arg (örneğin C-0): Seçilen çerçeve birden fazla pencere varsa, o zaman bu icicle-select-windowpencere ile aynı çerçeve adayları olarak. Aksi takdirde (tek pencere çerçevesi) budur icicle-select-frame.

  • C-u: Seçilen karenin birden fazla penceresi varsa, bu durumda icicle-select-window, tüm görünür karelerin pencereleri aday olarak görünür . Aksi takdirde, bu icicle-select-frame.

  • C-u C-u: icicle-select-window, tüm çerçevelerden pencereleri aday olarak gösterme

Her zaman olduğu gibi içinde Icicles için (a) birleştirebilirsiniz tamamlama , (b) ile, (bu durumda pencere veya çerçeve adları) adayları eşleştirme kümesini daraltmak için metin yazarak, bisiklet (eşleşen aday arasından).


4

Pencereler arasında hızlıca zıplamak için bir anahtar akoru kullanmayı düşünün . Bir değiştirici tuşa ulaşmaktan (ve ellerimde daha az zorlanmak) ulaşmaktan çok daha hızlı buluyorum.

Kullanacağım paket seçimi ise ace-windowbirden fazla pencerede gezinmekten çok daha kolay other-window.

(require 'key-chord)
(key-chord-define-global "xo" 'ace-window)
(key-chord-mode +1)

Açıkçası bunu kullanmak için ihtiyacınız key-chordve ace-windowher ikisi de melpa'da mevcuttur.


2
Bu abo-abo'nun yanıtı az ya da çok değil mi?
Dan

1
@Kor tuşunu kullanmıyorsa, akorda meta veya süper tuşların bulunmadığına dikkat edin. Ace-window veya başka bir şey kullanmanız biraz alakasızsa, önemli olan bu işlem için değiştirici tuşları kullanmayan bir cevap vermekti.
Zavior

1
Bunu gördüm, ama soruyu sordum çünkü ace-windowişi @ abo-abo'nun cevabında olduğu gibi yapıyor. Bu bağlamda, kullanılacak belirli bir anahtarlamanın bir cevaptan çok bir yorum olarak daha anlamlı olacağı bana dikkat çekiyor. Sadece iki sentim.
Dan

@Dan, genel olarak soru pencereleri hızla değiştirmek üzereydi ve bu çözümün henüz ortaya çıktığını sanmıyorum. Bununla ilgili olarak cevabı biraz açıklığa kavuşturdu.
Zavior

@ Zaior önemli bir noktaya yükseltir. Soru, pencerelerin hızlı bir şekilde değiştirilmesiyle ilgilidir - bunun için bağlayıcılık şekli çok önemlidir. Tercih ettiğiniz kütüphaneden bağımsız olarak, key-chordçok erişilebilir tuş kombinasyonlarının bağlanmasına izin verir. Örnek bağlama xo, daha hızlıdır C-x o(bir ile iki arasındaki derinlik). Bu cevap, cevabın fonksiyon seçimi ile ilgili diğer cevaplara ortogonal olduğunu vurgulamak için yeniden cevaplandırılabilir (ve ace-windowtarif edilen şekilde bağlı olabilecek birçok seçimlerden sadece biridir). Bu cevabı farklı tut!
ebpa,

3

Burada bazı iyi cevaplar, ayrıca WinMove hayranıyım, ama C-'ye bağlarım çünkü org-mode başlıkları değiştirmek için M- kullanır.

(define-key global-map (kbd "C-<up>") 'windmove-up)
(define-key global-map (kbd "C-<down>") 'windmove-down)
(define-key global-map (kbd "C-<left>") 'windmove-left)
(define-key global-map (kbd "C-<right>") 'windmove-right)

Gerçekten iyi olduğunda, Hydra ile birleştirirseniz olur . Vikileri üzerindeki örnekleri takip ederek kendi canavarımı yarattım:

(defhydra hydra-windows ()
  "C-arrow = switch, S-arrow = size, M-arrow = move"
  ("C-<left>" windmove-left nil)
  ("C-<right>" windmove-right nil)
  ("C-<up>" windmove-up nil)
  ("C-<down>" windmove-down nil)
  ("S-<left>" hydra-move-splitter-left nil)
  ("S-<right>" hydra-move-splitter-right  nil)
  ("S-<up>" hydra-move-splitter-up nil)
  ("S-<down>" hydra-move-splitter-down nil)
  ("M-<left>" buf-move-left nil)
  ("M-<right>" buf-move-right nil)
  ("M-<up>" buf-move-up nil)
  ("M-<down>" buf-move-down nil)
  ("p" previous-buffer "prev-buf")
  ("n" next-buffer "next-buf")
  ("1" delete-other-windows "1")
  ("d" delete-window "del")
  ("k" kill-buffer "kill")
  ("s" save-buffer "save")
  ("u" (progn (winner-undo) (setq this-command 'winner-undo)) "undo")
  ("r" winner-redo "redo")
  ("b" helm-mini "helm-mini" :exit t)
  ("f" helm-find-files "helm-find" :exit t)
  ("|" (lambda () (interactive) (split-window-right) (windmove-right)))
  ("_" (lambda () (interactive) (split-window-below) (windmove-down)))
  ("q" nil "cancel")
  )

(global-set-key (kbd "M-#") 'hydra-windows/body)

Bu, pencereleri değiştirmemi, bunları yeniden boyutlandırmamı, arabellekleri pencereden pencereye taşımamı, arabellekleri kapatmamı, arabellekleri öldürmeyi ve hatta pencere yapılandırmalarını kazanan moduyla geri almamı sağlar ve ayrıca dümeni birleştirir. Hidradan çıkmak için, sadece ok veya hydra'da bulunmayan başka bir tuşa basın. Hydra örnekleri üzerinde "hydra-move" işlevlerini bulabilirsiniz. Hydra ile ilgili en güzel şey, tüm bu anahtar bağlarını ve "modunu" hatırlamama gerek kalmaması, yani bir kez hidrada bulunduğunuzda her şey tek bir anahtar olarak kullanılabilir. basın.


1
Başlangıçta bahsettiğiniz anahtar sözcükleri almanın daha kısa bir yolu (windmove-default-keybindings 'control).
Omar

1

Eğer kullanırsanız evil-mode, sadece bir sayısal öneki kullanabilirsiniz C-w C-w( evil-window-nextistediğiniz pencereyi seçmek için). Yani: 1 C-w C-wilk pencereyi döngüsel sırayla 3 C-w C-wseçer, üçüncü pencereyi döngüsel sırayla seçer vb.


Bu sadece diğer cevabınızla birleştirilmesi gerektiği gibi görünüyor : aynı şey, sadece kötülüğe özgü bağlamalar ile.
npostavs

1

Ace Jump , hangi pencerede veya çerçevede olduklarından bağımsız olarak işaretçinizi ekrandaki tüm kelimelere yönlendirmenize izin verir, bu yüzden Ace Window veya Pencereyi Değiştir seçeneğinden farklı değildir.

Bir avantaj, pencereleri zıplatırken işaretçinizi bir miktar hassasiyetle yerleştirebilmeniz olabilir.

Hala biraz hantal veya rahatsız edici buluyorum ve windmovedaha fazlasını kullandığımı biliyorum , çünkü çok basit, ama yine de başka bir pencerede veya çerçevede okurken ve orada bir noktaya taşınmak istediğimde hala Ace Jump kullanıyorum.


1

Her zamanki gibi, bunu başarmanın yüzlerce yolu var. Tercih ettiğim yol, NumberedWindows kullanıyor . Sonra Super ve 1-9 tuşlarını kullanarak aşağıdaki tuş takımını ayarladım.

(global-set-key (kbd "s-1") (lambda() (interactive) (window-number-select 1)))

Öğleden sonra kodlayıcıda okuyabileceğiniz son bir yazı ile bu konu hakkında biraz daha ayrıntıya giriyorum .


Bunun chen bin'in cevabından farkı ne ?
Gilles,

Yapılandırma örneği var.
Travis

-1

Geçiş penceresini görsel olarak değiştirme olarak kullanmaya da karar verebilirsiniz.C-x o


1
Anahtarlama penceresinin faydası nedir? Neden bu sayfada önerilen diğer 14 çözüm üzerinde kullanmalıyım?
Gilles,

Nasıl demelisin? Emacs alternatifler, kişiselleştirme ve karar verme özgürlüğü ile ilgili.
csantosb

2
Ne burada ne de orada. Neden birisi bu özel alternatifi seçsin? Neden biri switch-windowdiğerlerinin üzerinde kullanmaya karar verdi ?
Gilles,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.