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 o
istediğim kişiye ulaşmak için kullanıyorum . Bunun için daha verimli bir iş akışı var mı?
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 o
istediğim kişiye ulaşmak için kullanıyorum . Bunun için daha verimli bir iş akışı var mı?
Yanıtlar:
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)
ace-window
Bunun için açılan bir yedek other-window
. Sonuncusundan farklı olarak, ace-window
bir 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-window
daha fazlasını yapabilirsiniz (pencereleri silme veya değiştirme vb.), README'ye bakınız .
ace-window
ve kullandım switch-window
. komik görünüyor, iki paketimiz de var.
switch-window
gönderilinceye kadar farkında ace-window
değildim.
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.
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 .
(windmove-default-keybindings 'meta)
EmacsWiki'de önerildiği gibi bir argüman olarak kabul ettiğini belirtmek için cevabı güncellemeye değer .
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.
Daha other-window
kolay yazılabilir bir tuş sırasına bağlayabilirsiniz .
Örneğin, ben var C-.
bağlı other-window
ve 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.
C-x o
iç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-Lock
yer değiştirdiğim Ctrl
için pinkies'e hızlıca dokunmak gerekiyor). Btw, ben belirli özelliklerinden tamamen bağımlı değilim helm
ve 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.
M-o
için other-window
. Bazı modlar zaten M-o
bağlayıcı, özellikle diff-mode
, ggtag-mode
ve ibuffer-mode
. Her mod haritasında elle ayırmanız gerekir. unbind-key
tarafından sağlanan bind-key.el
çok yararlıdır.
M-o
buna M-O
bağlı kaldım ace-window
.
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.
window-number
ile M-<num>
hızlı bir şekilde pencere w / b geçmek için. Buna benzer bir kavram
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 o
sırayla bir sonraki pencereye gidecektir (yani düz ile ne elde edersiniz C-x o
), C-u 2 C-x o
iki pencereye, C-u 3 C-x o
üç pencereye, vb.
other-window
Dokü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.
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-up
ve winmove-down
işlevleri M-left
, M-right
, M-up
ve M-down
benim .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 ...
(windmove-default-keybindings 'meta)
!
Eğer kullanırsanız Icicles sonra C-x o
etmenizi 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 o
normalde olduğu gibi aynıdır .other-window
other-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 o
bir 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-window
pencere 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).
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-window
birden 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-chord
ve ace-window
her ikisi de melpa'da mevcuttur.
ace-window
iş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.
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-window
tarif edilen şekilde bağlı olabilecek birçok seçimlerden sadece biridir). Bu cevabı farklı tut!
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.
(windmove-default-keybindings 'control)
.
Eğer kullanırsanız evil-mode
, sadece bir sayısal öneki kullanabilirsiniz C-w C-w
( evil-window-next
istediğiniz pencereyi seçmek için). Yani: 1 C-w C-w
ilk pencereyi döngüsel sırayla 3 C-w C-w
seçer, üçüncü pencereyi döngüsel sırayla seçer vb.
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 windmove
daha 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.
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 .
Geçiş penceresini görsel olarak değiştirme olarak kullanmaya da karar verebilirsiniz.C-x o
switch-window
diğerlerinin üzerinde kullanmaya karar verdi ?