Bagaimana siklus antara dua jendela ketika saya memiliki lebih dari dua terbuka?

8

Skenario: Saya memiliki beberapa (lebih dari 2) jendela yang terbuka. Saya aktif bekerja dengan mereka berdua. Bagaimana cara terbaik saya melompat dari satu jendela ke jendela lain, dan kembali, dengan satu perintah?

Saya menggunakan ace-window; itu bagus tapi saya tidak ingin menekan nomor jendela setiap waktu. Saya tahu tentang next-window/ prev-window, tetapi ini adalah dua perintah yang berbeda.

Apa yang saya cari adalah sesuatu yang mengingat apa windows sebelumnya ketika saya memilih jendela lain, dan kembali ke sana. Dipanggil berulang kali, itu akan beralih di antara dua jendela terakhir, Alt- Tab-style.

Di mana saya melihat?

9000
sumber
Saya menggunakan fnplus salah satu tombol panah untuk menuju ke segala arah, termasuk masuk dan keluar dari minibuffer (jika aktif) - lihat perpustakaan bawaan windmove.
hukum
@lawlist: Saya tahu tentang windmove. Apa yang saya cari adalah cara untuk tidak memikirkan arah yang diperlukan, terutama jika windows memiliki beberapa jendela lain di antara mereka.
9000

Jawaban:

6

Salah satu cara untuk menulis perintah Anda sendiri adalah dengan menggunakan get-mru-windowfungsi bawaan.

Sebagai contoh:

(defun my-flip-window ()
  (interactive)
  (let ((win  (get-mru-window nil nil t)))
    (when win (select-window win))))

Ini mencari jendela yang paling baru digunakan dalam bingkai saat ini yang bukan jendela yang saat ini dipilih.

Berikut adalah variasi yang berfungsi lintas bingkai yang terlihat:

(defun my-flip-window ()
  (interactive)
  (let ((win  (get-mru-window 'visible nil t)))
    (when win
      (select-frame-set-input-focus (window-frame win))
      (select-window win))))

Seperti disebutkan dalam komentar, inilah variasi yang berfungsi ketika hanya ada satu jendela (beralih ke buffer terbaru):

(defun flip-window ()
  (interactive)
  (let ((win  (get-mru-window 'visible t t)))
    (if win
        (progn
          (select-frame-set-input-focus (window-frame win))
          (select-window win))
      (mode-line-other-buffer))))
glukas
sumber
1
Berhasil! Yang ini jauh lebih baik daripada yang saya kumpulkan. Nice ditemukan get-mru-window.
Dan
1
Saya akhirnya menambahkan ini ke konfigurasi saya dengan variasi tambahan: ketika hanya ada satu frame / jendela (get-mru-window mengembalikan nil), lalu panggil mode-line-other-buffer. Dengan begitu saya punya satu tombol yang bolak-balik di antara dua buffer dalam konfigurasi jendela apa pun.
glucas
Bagus. Saya suka variasi terakhir @glucas. Terima kasih. Inilah cara saya menulisnya dan berfungsi. Apakah itu cara terbaik untuk melakukannya? (defun my-switch-to-before-window () (interaktif) (let ((win (get-mru-window nil nil t)))) (jika win (pilih-window win) (mode-line-other-buffer) ))))
prosoitos
6

Jika Anda sudah menggunakan ace-window, maka Anda dapat menggunakan perintah aw-flip-windowuntuk bolak-balik di antara dua jendela. Secara default ini terikat npada jendela ace aw-dispatch-alist.

Itu berarti Anda dapat memanggil jendela ace dan menekan nbukannya nomor jendela untuk membalik kembali ke jendela sebelumnya. Anda juga dapat mengikat aw-flip-windowbeberapa kunci lainnya.

Perhatikan bahwa ini hanya akan membalik kembali ke jendela yang sebelumnya dipilih oleh jendela-ace. Jika Anda sering berganti windows dengan perintah lain, Anda mungkin menginginkan solusi yang lebih umum.

glukas
sumber
4

Ini adalah perintah sederhana, teruji ringan, yang akan mengalihkan Anda ke jendela yang terakhir dikunjungi:

(defvar recent-window nil
  "The most recently visited window.")

(defun switch-to-recent-window ()
  "Switch to the most recently visited window, as stored in
`recent-window'."
  (interactive)
  (let ((current (car (window-list))))
    (if recent-window
        (select-window recent-window)
      (message (concat "No recent window selected, "
                       "so I'm setting this window "
                       "as the most recent.")))
    (setq recent-window current)))
Dan
sumber
Terima kasih! Berhasil. Apakah Anda keberatan jika saya membuat paket darinya, dengan atribusi?
9000
Sama-sama. Tentu, jangan ragu untuk menggunakannya dalam sebuah paket, tetapi perlu diketahui bahwa kode di (belum) sangat cerdas. Jika Anda beralih ke jendela lain dengan perintah seperti next-windowatau other-window, perubahan tidak akan diambil dalam recent-windowvariabel. Tidak ada kaitan yang jelas untuk digunakan, jadi memperbaiki bagian ini mungkin melibatkan pendefinisian saran untuk sejumlah fungsi lainnya.
Dan
1
Saya pikir Anda bisa menggunakan buffer-list-update-hook, yang dipanggil saat jendela aktif berubah (setelah select-window). Pengait itu disebut dalam kasus lain tetapi dapat digunakan untuk melacak jendela terakhir.
glukas