Emacs, beralih ke jendela sebelumnya

93

Di Emacs, C-x o bawa saya ke jendela berikutnya.

Makro keyboard apa yang membawa saya ke jendela sebelumnya di Emacs?

Roger CS Wernersson
sumber

Jawaban:

88

Itu akan menjadi C-- C-x o

Dengan kata lain, C-x odengan argumen -1. Anda dapat menentukan berapa banyak jendela yang akan dipindahkan dengan memasukkan argumen numerik antara C-udan perintah, seperti di C-u 2 C-x o. ( C--adalah jalan pintas untuk C-u - 1)

JB.
sumber
Dan Anda dapat menggunakan C-x zuntuk mengulangi perintah terakhir untuk beralih jendela dengan cepat.
Ivan Huang
105

Anda mungkin juga ingin mencoba menggunakan gerakan angin yang memungkinkan Anda menavigasi ke jendela pilihan Anda berdasarkan geometri. Saya memiliki yang berikut ini di file .emacs saya untuk mengubah jendela menggunakan tombol panah Cx.

(global-set-key (kbd "C-x <up>") 'windmove-up)
(global-set-key (kbd "C-x <down>") 'windmove-down)
(global-set-key (kbd "C-x <right>") 'windmove-right)
(global-set-key (kbd "C-x <left>") 'windmove-left)
Nate
sumber
11
Perhatikan bahwa pemanggilan (windmove-default-keybindings)mengikat fungsi-fungsi ini ke SHIFT + atas / bawah / kiri / kanan, yang menurut saya lebih nyaman daripada C-xbinding Anda (yang bertentangan dengan binding default yang juga berguna untuk previous-bufferdan next-buffer. Lkahtz: (kbd)fungsi ini memungkinkan Anda menentukan kunci dalam notasi string dalam sintaks yang lebih mudah dibaca yang juga digunakan oleh Emacs saat Anda menggunakan C-h katau C-h cmenjelaskan pengikatan.
phils
4
Saya tidak setuju menggunakan tombol panah. Tapi saya memuji untuk kegunaannya. : sombong:
Bjorn
2
@phils SHIFT + <keys> meddles dengan pilihan shift yang diaktifkan secara default dari Emacs 23 (shift-selection-mode).
legends2k
2
legends2k: Benar; meskipun Anda juga bisa meneruskan argumen ke windmove-default-keybindingsuntuk menentukan pengubah berbeda untuk digunakan bersama dengan tombol panah; agar fungsinya tetap berguna bagi orang yang menggunakan mode pemilihan-shift.
phils
1
@phils Setuju, meta tampaknya menjadi alternatif yang baik; seperti yang terlihat di Emacs Wiki .
legends2k
30

Secara pribadi saya lebih suka menggunakan window-number.el

Untuk memilih jendela yang berbeda, gunakan Ctrl- x, Ctrl-j n

Di mana n adalah nomor jendela, modeline setiap jendela menunjukkan nomor itu, seperti yang ditunjukkan pada tangkapan layar.

Cukup unduh window-number.el , letakkan di jalur pemuatan emacs Anda dan gunakan perintah berikut di.emacs

 (autoload 'window-number-mode "window-number"
   "A global minor mode that enables selection of windows according to
 numbers with the C-x C-j prefix.  Another mode,
 `window-number-meta-mode' enables the use of the M- prefix."
   t)

Ada mode serupa lainnya switch-window.elyang disebut yang memberi Anda angka besar di jendela ... (menekan angka akan mengalihkan jendela dan mengembalikan tampilan.)


(sumber: tapoueh.org )

ocodo
sumber
2
Bagus, tapi saya sarankan untuk tidak mengikat sesuatu C-x C-j, karena itu adalah pengikatan default dired-jumpjika Anda (require 'dired-x). (Lihat M-x customize-group RET dired-keys RETapakah Anda ingin menggantinya.)
phils
1
Setelah memposting ini, saya memutuskan untuk mencobanya switch-window.el, yang digunakan C-x osebagai gantinya, dan ketika hanya ada dua jendela yang aktif, itu hanya memilih jendela lain. Saya pikir itu paling bijaksana C-x ountuk melakukan window-numbertrik, Anda benar dired-jump. Secara pribadi saya melakukan lebih sedikit pengalihan jendela dan menggunakan C-x bdiri saya sendiri, tetapi memiliki peningkatan C-x ocukup menyenangkan.
ocodo
wow tema Emacs yang menakjubkan di screenshot pertama. bagaimana saya mendapatkannya?
semente
@semente di halaman terkait Emacs saya jasonm23.github.com/EmacsFodder/Emacs/2012/06/29/…
ocodo
1
@petrux emacsfodder.github.io/blog/two-new-emacs24-themes Saya rasa ini mungkin salah satu dari dua tema. - btw. Untuk jalur mode keren, coba gist.github.com/jasonm23/8554119
ocodo
13

Jika Anda bekerja dengan banyak jendela emacs (> 3) dan Anda ingin menyimpan beberapa penekanan tombol, tambahkan ini ke file init Anda dan Anda akan lebih baik:

(defun frame-bck()
  (interactive)
  (other-window-or-frame -1)
)
(define-key (current-global-map) (kbd "M-o") 'other-window-or-frame)
(define-key (current-global-map) (kbd "M-O") 'frame-bck)

Sekarang hanya siklus cepat melalui jendela dengan Mo

okti
sumber
1
Inilah solusi yang saya butuhkan. Yang saya inginkan hanyalah agar perintah pengalihan jendela menjadi satu penekanan tombol yang berulang. Terima kasih! Saya memang harus mengubah jendela-atau-bingkai ke jendela lain untuk membuatnya berfungsi, FYI. Saya menggunakan Emacs 24.2.1.
Geoff
Saya pikir ini adalah binding yang sangat bagus (terutama jika Anda memiliki 2+ jendela), terima kasih. Seperti yang dikatakan juga topi yang harus diubah other-windowuntuk membuatnya bekerja.
dolzenko
11

Ada beberapa jawaban yang sangat bagus dan lengkap di sini, tetapi untuk menjawab pertanyaan dengan gaya minimalis:

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

 (define-key global-map (kbd "C-x p") 'prev-window)
bnzmnzhnz
sumber
2
Saya tidak tahu sejak kapan, tapi emacs sekarang sudah ada previous-window.
Arne
@Arne Ini bukan fungsi yang dapat dipanggil M-xsehingga harus melayani tujuan yang berbeda.
Ivan Huang
4

Berdasarkan ide dari @Nate tetapi sedikit dimodifikasi untuk mendukung perputaran mundur antar jendela

;; Windows Cycling
(defun windmove-up-cycle()
  (interactive)
  (condition-case nil (windmove-up)
    (error (condition-case nil (windmove-down)
         (error (condition-case nil (windmove-right) (error (condition-case nil (windmove-left) (error (windmove-up))))))))))

(defun windmove-down-cycle()
  (interactive)
  (condition-case nil (windmove-down)
    (error (condition-case nil (windmove-up)
         (error (condition-case nil (windmove-left) (error (condition-case nil (windmove-right) (error (windmove-down))))))))))

(defun windmove-right-cycle()
  (interactive)
  (condition-case nil (windmove-right)
    (error (condition-case nil (windmove-left)
         (error (condition-case nil (windmove-up) (error (condition-case nil (windmove-down) (error (windmove-right))))))))))

(defun windmove-left-cycle()
  (interactive)
  (condition-case nil (windmove-left)
    (error (condition-case nil (windmove-right)
         (error (condition-case nil (windmove-down) (error (condition-case nil (windmove-up) (error (windmove-left))))))))))

(global-set-key (kbd "C-x <up>") 'windmove-up-cycle)
(global-set-key (kbd "C-x <down>") 'windmove-down-cycle)
(global-set-key (kbd "C-x <right>") 'windmove-right-cycle)
(global-set-key (kbd "C-x <left>") 'windmove-left-cycle)
Troydm
sumber
4

Hanya untuk menambahkan jawaban @Nate, @aspirin dan @ Troydm, saya menemukan ini sebagai tambahan yang sangat membantu jika Anda memutuskan untuk mengikat perintah windmove ke kombinasi tombol apa pun yang Anda pilih:

(setq windmove-wrap-around t)

Dengan konfigurasi default Anda akan mendapatkan kesalahan ketika Anda mencoba untuk pindah ke jendela yang tidak ada yang menjadi agak mengganggu setelah beberapa saat. Namun ketika windmove-wrap-around diatur, maka mencoba untuk keluar dari bagian bawah bingkai misalnya akan memilih jendela paling atas di bingkai. Ini mungkin perilaku yang lebih intuitif untuk Anda.

Hal
sumber
4

M-ndan M-ppaling masuk akal bagi saya, karena mereka analog dengan C-n( baris berikutnya ) dan C-p( baris sebelumnya ):

(define-key global-map (kbd "M-p") 'previous-multiframe-window)
(define-key global-map (kbd "M-n") 'other-window)

(terinspirasi oleh ini dan itu )

tshepang
sumber
Saya telah memberi suara positif dan menggunakan konfigurasi ini. Masalahnya adalah itu M-ndan M-psudah digunakan di terminal (gdb, python, ielm, dll.) Jadi Anda harus beralih kembali ke metode lain untuk keluar dari buffer terminal.
mihai
Untuk apa mereka digunakan di lingkungan tersebut?
tshepang
Itu adalah yang terbaik yang saya lihat untuk saat ini, tidak bertentangan dengan hal-hal lain dan bekerja seperti pesona! Terima kasih!
aurelien
2

Mengacu pada jawaban Nate, saya mengganti arrow keysmenjadi menggunakan tradisional puntuk pergi up, npergi down, fpergi rightdan bpergi left. Saya juga mengganti Ctrldengan Superkunci seperti C-p, C-n, C-f and C-btombol gerakan default. Kombinasi dengan ini Mmemungkinkan Anda melompati karakter dan garis, bukan melalui satu per satu setelah setiap penekanan tombol. Dengan demikian Superkunci dirasa pilihan terbaik untuk menjaganya tetap menjadi kunci yang mudah mengikat. Juga, sekarang Anda tidak perlu melepaskan tangan Anda dari barisan rumah lagi!

(global-set-key (kbd "s-p") `windmove-up)
(global-set-key (kbd "s-n") `windmove-down)
(global-set-key (kbd "s-f") `windmove-right)
(global-set-key (kbd "s-b") `windmove-left)

Semoga membantu!

Indradhanush Gupta
sumber
2
(global-unset-key (kbd "M-j"))
(global-unset-key (kbd "M-k"))
(global-set-key (kbd "M-j") (lambda () (interactive) (other-window 1)))
(global-set-key (kbd "M-k") (lambda () (interactive) (other-window -1)))

altjdan altkakan menggilir buffer visibel Anda. Maju dan mundur, tepatnya.

sjas
sumber
Mk adalah jalan pintas yang berguna. ada alternatif lain?
A_P
1

Sudah ada paket yang memungkinkan Anda berpindah jendela dengan menggunakan M-. periksa situs web ini . Tambahkan ini ke file init Anda:

(require 'windmove)
(windmove-default-keybindings 'meta) ;; or use 'super to use windows key instead alt
aspirin
sumber
0
(global-set-key (kbd "C-x a") 'ace-swap-window)  
(global-set-key (kbd "C-x q") 'ace-select-window)

download ace-window from the melpa repo if you don't know how to do that
put this in your .emacs file if you don't have one create it 

(package-initialize)                                                                                                                                                                     

(require 'package)                                                                                                                                                                       
(add-to-list 'package-archives '("melpa" , "http://melpa.org/packages/"))                                                                                                                

(package-initialize) 

then "m-x list-packages"
pengguna9618991
sumber