Bagaimana cara beralih antar windows dengan cepat?

91

Bagaimana cara beralih antar windows dengan cepat?

Saya sering memiliki beberapa jendela terbuka dan perlu beralih di antara mereka. Saat ini, saya menggunakan C-x ountuk mendapatkan yang saya inginkan. Apakah ada alur kerja yang lebih efisien yang tersedia untuk ini?

Sibi
sumber

Jawaban:

62

Saya jelas lebih suka jendela as untuk ini. Anda dapat beralih antara jendela dan bingkai yang terlihat. Ada dalam MELPA, Anda dapat menginstalnya dengan cepat. Satu-satunya yang tersisa untuk dilakukan adalah mengikatnya:

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

Atau mungkin menggunakan kunci nada yang lebih pendek, karena beralih windows adalah tugas yang umum:

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

Ringkasan dari ace-window

Ini pengganti pengganti untuk other-window. Berbeda dengan yang terakhir, Anda tidak perlu menelepon ace-windowdua kali atau lebih untuk memilih jendela: Anda memilih jendela yang Anda inginkan dalam satu panggilan (mungkin di beberapa frame).

Selain beralih windows, ace-windowdapat melakukan lebih banyak (menghapus atau menukar windows, dll), lihat README .

abo-abo
sumber
2
Ini menarik. Saya menggunakan ace-windowdan kemudian melihat switch-windowyang tampaknya melakukan hal yang kira-kira sama, kecuali bahwa huruf-hurufnya lebih jelas. sepertinya lucu kami memiliki kedua paket.
milkypostman
Kamu benar. Hanya ada sedikit perbedaan di antara mereka. Ini adalah masalah yang harus kita hadapi ketika kita memiliki repositori dengan 2000 paket. Saya tidak menyadarinya switch-windowsampai saya mengajukan ace-windowke MELPA.
abo-abo
1
terima kasih untuk ace-window, itu memiliki lebih banyak kustomisasi daripada paket lain saya kira. Masih ada yang bisa membantu di masa depan adalah kunci yang mengikat fungsi yang akan mirip dengan tindakan pertukaran pintar tetapi memakan jendela yang menghasilkan jendela yang lebih besar pada titik dan lebih kecil dalam ukuran jendela yang dipilih (dimakan jendela atas). Rasio harus ditentukan dalam hal ini sebagai setengah, seperempat, atau sepertiga mungkin.
gelar doktor
4
Silakan pertimbangkan untuk menambahkan deskripsi. Anda hanya mengatakan bahwa Anda menyukainya, dan Anda terhubung dengannya. Itu membuat ini pada dasarnya jawaban tautan saja.
Drew
4
Apa manfaat ace-window? Mengapa saya harus menggunakannya di atas 14 solusi lain yang diusulkan pada halaman ini?
Gilles
103

Salah satu caranya adalah menggunakan windmove. Dengan ikatan kunci default, ini memungkinkan beralih ke jendela di sebelah yang aktif saat ini.

Itu dibangun di Emacs, jadi tidak perlu menginstal apa pun; cukup aktifkan dengan pengaturan minimal berikut di file init Anda:

(windmove-default-keybindings)

Anda kemudian dapat beralih ke tetangga jendela menggunakan tombol berikut (di mana panah digunakan secara intuitif mendefinisikan arah di mana Anda bergerak): S-<left>, S-<right>, S-<up>, S-<down>.


Jika Anda lebih suka menggunakan pengubah lain shift, Anda bisa memberikannya sebagai argumen windmove-default-keybindings. Sebagai contoh:

(windmove-default-keybindings 'meta)

atau

(windmove-default-keybindings 'control)

Info lebih lanjut di Emacs Wiki .

ffevotte
sumber
16
Ini harus menjadi jawaban yang diterima!
rowman
OMG, mengapa tidak ada tutorial yang menyebutkan tombol shift + panah untuk bergerak di sekitar jendela! Jauh lebih baik daripada ctrl + o
Didier A.
Saya akan mengatakan beberapa jawaban lain di sini mengandung konfigurasi windmove redundan. Mungkin ada baiknya memperbarui jawaban untuk menyebutkan bahwa fungsi menerima kunci pengubah sebagai argumen misalnya (windmove-default-keybindings 'meta)seperti yang disarankan pada EmacsWiki.
metaturso
Ini menciptakan banyak konflik dengan pengikatan kunci lainnya (atau dengan pengelola jendela). Saya lebih suka jendela ace.
azzamsa
Saya menggunakan sesuatu yang sama (saya bergerak dengan Shift-arrow) , tetapi ketika Anda memiliki monitor besar dengan banyak split, gerakan seperti itu dengan cepat menjadi berat. Akan lebih menarik untuk entah bagaimana menghitung windows / splits. Suka ace-window, tetapi dengan penekanan tombol lebih sedikit, dan algoritma yang jelas untuk segera mencari tahu nomor yang Anda inginkan.
Hi-Angel
21

Anda dapat mengikat other-windowke urutan tombol yang lebih mudah diketik.

Misalnya, saya C-.terikat other-window, dan C-,terikat untuk pergi ke jendela sebelumnya.

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

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

Ini sangat berguna untuk memindahkan banyak jendela; setelah Anda menahan Kontrol, Anda hanya perlu menekan satu tombol untuk pindah ke jendela berikutnya. Ini jauh lebih mudah daripada tiga kali penekanan tombol per gerakan.

kawan
sumber
2
+1 C-x ountuk other-windowadalah salah satu dari beberapa pesaing kuat untuk judul "pintasan standar emacs terburuk". Solusi saya (mirip dengan Zck) adalah untuk rebind other windowke urutan kunci (cara) yang lebih mudah - saya memilikinya terikat C-;(dan saya Caps-Lockbertukar dengan Ctrlsehingga yang diperlukan hanyalah ketukan cepat dari kelingking). Btw, saya benar-benar bergantung pada fitur tertentu helmdan icicles(yaitu, saya bukan "anti-paket" atau apa pun); Saya hanya berpikir bahwa solusi sederhana berfungsi paling baik di sini.
iceman
2
+1 Ini harus menjadi jawaban yang diterima DAN jawaban yang paling sederhana juga (sayangnya, belum ada yang namanya di StEx). Bekerja di luar kotak, sisik dengan sempurna, mudah dihafal. Yang terakhir saya temukan sangat penting di hutan Emacs. Setelah bertahan di sana 20+ tahun, kadang-kadang saya mendambakan bersembunyi di padang pasir vi ...
Andreas Spindler
Sederhana, mudah digunakan, mudah diterapkan. Ini membutuhkan lebih banyak suara.
stewSquared
1
Ini juga yang saya lakukan. Saya gunakan M-ountuk other-window. Beberapa mode sudah M-omengikat, terutama diff-mode, ggtag-mode, dan ibuffer-mode. Anda harus melepaskannya secara manual di setiap mode peta. unbind-keydisediakan oleh bind-key.elsangat berguna.
Yasushi Shoji
Saya menggunakan M-ojuga, dan M-Oterikat ace-windowketika saya membutuhkan kekuatan tambahan.
glucas
13

window-numbering.el!

Saya menetapkan hotkey ", 1", ", 2", ", 3" untuk mengganti jendela tertentu (harap dicatat saya menggunakan mode jahat)

selain itu, saya menampilkan nomor jendela di baris mode dalam warna PINK, bergaris bawah.

Ini adalah petunjuk visual yang tidak dapat Anda abaikan,

Itu cara tercepat untuk beralih jendela.

periksa https://github.com/redguardtoo/emacs.d/blob/master/lisp/init-evil.el dan https://github.com/redguardtoo/emacs.d/blob/master/lisp/init-modeline .el untuk pengaturan saya.

Sylvain Benner mengadopsi ide saya di ruang angkasa tetapi ikatan kunci berbeda . Jadi, jika Anda menggunakan spacemacs, Anda mendapatkan solusi tercepat di luar kotak.

chen bin
sumber
2
Ya. Konsep ini hebat. Saya menggunakan paket window-numberdengan M-<num>untuk dengan cepat beralih b / w windows. Konsep yang mirip dengan yang satu ini
unperson325680
1
Perhatikan bahwa window-numbering.el sudah usang karena winum , yang ada di sini . FWIW angka jendela untukku bahkan tidak berhasil.
Hi-Angel
Saya mungkin akan beralih ke winum segera. Tapi penomoran jendela masih berfungsi dengan baik pada emacs24 / 25/26.
chen bin
10

Tanpa menggunakan tambahan apa pun, Anda dapat terus menggunakan C-x oawalan opsional untuk melewati banyak jendela itu. Misalnya: C-u 1 C-x oakan pergi ke jendela berikutnya dalam urutan (yaitu, apa yang akan Anda dapatkan dengan polos C-x o), C-u 2 C-x oberjalan dua jendela, C-u 3 C-x oberjalan tiga jendela, dan seterusnya.

Kutipan dari other-windowdocstring (fungsi yang dipanggil oleh C-x o:

COUNT menentukan jumlah jendela yang akan dilewati, dimulai dengan jendela yang dipilih, sebelum membuat pilihan. Jika COUNT positif, lewati COUNT jendela ke depan. Jika COUNT negatif, lewati -COUNT jendela mundur. COUNT nol berarti jangan melewati jendela apa pun, jadi pilih jendela yang dipilih. Dalam panggilan interaktif, COUNT adalah argumen awalan numerik. Kembalikan nihil.

Dan
sumber
Ketika Anda memiliki banyak jendela, urutan apa yang diikuti?
stsquad
Perintahnya adalah pemesanan jendela siklik .
Dan
2
hmm "Urutan ditentukan oleh traversal kedalaman-pertama dari pohon bingkai jendela, mengambil jendela langsung yang merupakan simpul daun pohon" bukan deskripsi yang paling membantu bagi otak manusia yang mencoba menebak jendela mana yang berikutnya atau berapa banyak untuk dilewati. Saya kira inilah sebabnya saya menggunakan ace-window.
stsquad
2
@stsquad: oh, saya setuju dengan Anda - itu membuat kepala saya berputar juga. Saya menempatkan jawaban ini di sini demi kelengkapan.
Dan
8

Beberapa orang mungkin ingat editor Brief (cukup lucu diproduksi oleh perusahaan bernama Underware).

Itu memiliki cara yang rapi untuk beralih di antara jendela yang terlihat. M-panah akan memindahkan kursor ke jendela secara langsung sejalan dengan arah tombol panah.

Jadi, saya memetakan winmove-left, winmove-right, winmove-updan winmove-downfungsi untuk M-left, M-right, M-updan M-downkunci sebagai berikut dalam file Emacs saya -

(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

Sekarang saya dapat bergerak dengan mudah di antara windows, terlepas dari seberapa berantakan saya memiliki konfigurasi ... Dan itu bisa sangat berantakan dengan ukuran tampilan saat ini ...

pengguna2542
sumber
Bukankah ini lebih atau kurang dari jawaban @ Francesco?
Dan
Saya setuju. Saya tidak memperhatikan sebelum saya memposting milik saya.
user2542
2
Cara yang jauh lebih pendek untuk mendapatkan keybindings itu adalah (windmove-default-keybindings 'meta)!
Omar
8

Jika Anda menggunakan Icicles maka C-x oAnda dapat memilih windows berdasarkan nama (atau dengan bersepeda).

  • Tanpa arg awalan, C-x osama seperti biasa other-window, kecuali jika bingkai hanya memiliki satu jendela, dalam hal ini other-frame.

  • Dengan awalan arg, C-x oadalah multi-perintah yang memungkinkan Anda menavigasi antara jendela atau bingkai dengan nama (atau dengan bersepeda). Menavigasi antar windows menggunakan multi-perintah icicle-select-window; menavigasi di antara penggunaan frame icicle-select-frame.

Navigasi mana yang digunakan tergantung pada awalan arg:

  • Zero prefix arg (eg C-0): Jika bingkai yang dipilih memiliki banyak jendela, maka ini adalah icicle-select-window, dengan jendela dalam bingkai yang sama dengan kandidat. Kalau tidak (bingkai satu jendela), ini icicle-select-frame.

  • C-u: Jika bingkai yang dipilih memiliki beberapa jendela, maka ini adalah icicle-select-window, dengan jendela dari semua bingkai yang terlihat sebagai kandidat. Kalau tidak, ini icicle-select-frame.

  • C-u C-u: icicle-select-window, dengan jendela dari semua bingkai sebagai kandidat (termasuk bingkai yang ditandai atau disembunyikan).

Seperti biasa di Icicles , Anda dapat menggabungkan (a) penyelesaian , mengetik teks untuk mempersempit kumpulan kandidat yang cocok (dalam jendela atau nama bingkai, dalam hal ini), dengan (b) bersepeda (di antara kandidat yang cocok).

Drew
sumber
4

Pertimbangkan untuk menggunakan kunci-kunci untuk melompat cepat di antara jendela. Saya merasa jauh lebih cepat daripada meraih kunci pengubah (dan juga mengurangi ketegangan di tangan saya).

Paket pilihan saya untuk digunakan adalah ace-window, yang memungkinkan Anda menavigasi beberapa jendela lebih mudah daripada sekadar other-window.

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

Jelas untuk menggunakan ini yang Anda butuhkan key-chorddan ace-window, keduanya tersedia dalam melpa.

Zavior
sumber
2
Bukankah ini lebih atau kurang dari jawaban @ abo-abo?
Dan
1
@Dan itu tidak menggunakan kunci-kunci, perhatikan kurangnya meta atau kunci super dalam kunci. Jika Anda menggunakan ace-window / sesuatu yang lain agak tidak relevan, intinya adalah untuk memberikan jawaban yang tidak menggunakan kunci pengubah untuk operasi yang biasa digunakan.
Zavior
1
Saya melihat itu, tetapi saya mengajukan pertanyaan karena ace-windowmelakukan pekerjaan seperti pada jawaban @ abo-abo. Itu mengejutkan saya bahwa, dalam konteks ini, ikatan kunci spesifik untuk digunakan akan lebih masuk akal sebagai komentar daripada jawaban. Hanya dua sen saya.
Dan
@ Dan, secara keseluruhan pertanyaannya adalah tentang dengan cepat mengganti jendela, dan saya tidak berpikir solusi ini telah muncul. Jelaskan sedikit jawabannya dalam hal itu.
Zavior
@Zavior memunculkan poin penting. Pertanyaannya adalah tentang mengganti jendela dengan cepat - yang mana bentuk pengikatannya sangat penting. Terlepas dari pustaka yang Anda inginkan, Anda dapat key-chordmengikat kombinasi tombol yang sangat mudah diakses. Pengikatan contoh xolebih cepat dari C-x o(kedalaman satu lawan dua). Jawaban ini dapat disusun ulang untuk menekankan bahwa jawabannya ortogonal dengan jawaban lain tentang pemilihan fungsi (dan ace-windowhanya salah satu dari banyak pilihan yang dapat diikat dengan cara yang dijelaskan). Simpan jawaban ini sebagai berbeda!
ebpa
3

Beberapa jawaban yang bagus di sini, saya juga penggemar WinMove, tapi saya ikat ke C- karena org-mode menggunakan M- untuk memanipulasi heading

(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)

Di mana itu menjadi sangat baik adalah jika Anda menggabungkannya dengan Hydra . Mengikuti contoh di wiki mereka, saya membuat monster saya sendiri:

(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)

Ini memungkinkan saya mengubah jendela, mengubah ukurannya, memindahkan buffer dari jendela ke jendela, buffer siklus, membunuh buffer dan bahkan membatalkan konfigurasi jendela melalui mode pemenang, dan juga mengintegrasikan helm. Untuk keluar dari hydra, cukup tekan panah atau tombol lain yang tidak ada di hydra. Anda dapat menemukan fungsi "hydra-move" pada contoh hydra Hal yang hebat tentang hydra adalah saya tidak harus mengingat semua keybindings dan "modeful" -nya, jadi begitu Anda berada di hydra semuanya tersedia sebagai satu kunci tekan.

Philip Daniels
sumber
1
Cara yang lebih pendek untuk mendapatkan ikatan kunci yang Anda sebutkan di awal adalah (windmove-default-keybindings 'control).
Omar
1

Jika Anda menggunakan evil-mode, Anda bisa menggunakan awalan angka dengan C-w C-w( evil-window-next) untuk memilih jendela yang Anda inginkan. Jadi: 1 C-w C-wambil jendela pertama dalam urutan siklik, 3 C-w C-wpilih jendela ketiga dalam urutan siklik, dan sebagainya.

Dan
sumber
Sepertinya ini harus dikombinasikan dengan jawaban Anda yang lain : itu adalah hal yang sama, hanya dengan binding spesifik-jahat.
npostavs
1

Ace Jump memungkinkan Anda menavigasi penunjuk ke semua kata di layar, terlepas dari apa jendela atau bingkai mereka, sehingga tidak begitu berbeda dari menggunakan Ace Window atau Switch Window.

Sebuah keuntungan bisa jadi ketika melompat windows Anda juga dapat menempatkan pointer Anda dengan presisi.

Saya masih merasa sedikit rumit atau mengganggu, dan menemukan saya menggunakan windmovelebih banyak, karena sangat sederhana, tetapi masih menggunakan Ace Jump ketika saya membaca di jendela atau bingkai lain dan ingin pindah ke tempat di sana.

Mallory-Erik
sumber
1

Seperti biasa ada seratus cara berbeda untuk mencapai ini. Cara pilihan saya adalah menggunakan NumberedWindows . Saya kemudian mengatur keybind berikut menggunakan Super dan tombol 1-9.

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

Saya masuk ke sedikit lebih detail pada subjek yang tepat ini dengan posting saya baru-baru ini yang dapat Anda baca di Afternoon Coder .

Travis
sumber
Apa bedanya dengan jawaban chen bin ?
Gilles
Memiliki contoh konfigurasi.
Travis
-1

Anda juga dapat memutuskan untuk menggunakan switch-window sebagai pengganti visualC-x o

csantosb
sumber
1
Apa manfaat dari switch-window? Mengapa saya harus menggunakannya di atas 14 solusi lain yang diusulkan pada halaman ini?
Gilles
Bagaimana mengatakannya? Emacs adalah semua tentang alternatif, penyesuaian dan kebebasan untuk memutuskan.
csantosb
2
Itu tidak penting. Mengapa seseorang memilih alternatif khusus ini? Mengapa seseorang memutuskan untuk menggunakan switch-windowyang lainnya?
Gilles