Bagaimana cara mengganti buffer dengan cepat?


68

Di vanilla Emacs, saya harus melakukan C-x bdan kemudian secara manual mengetikkan nama buffer untuk beralih. Jika saya lupa nama buffer, saya harus menekan TABke daftar kemungkinan penyelesaian. Adakah yang bisa saya lakukan untuk mempercepat proses ini?


10
Ini harus ditandai sebagai Wiki Komunitas. Tapi Emacs sudah memiliki wiki raksasa. Misalnya, hasil teratas Google saya adalah halaman ini di Switching Buffer . Pertanyaan gaya CW terasa, bagi saya, khususnya tidak pada emacs.SE.
purple_arrows

1
Saya suka menggunakan C-x C-<left/right>untuk mengganti buffer dengan cepat. Ketika perlu beralih ke buffer "lebih jauh", saya menggunakan IBuffer.
kuanyui

Saya menggunakan 'Cx x' untuk mengganti buffer (dengan helm dan dengan topi yang dipetakan untuk mengontrol). Saya tidak pernah merasa nyaman mengetik 'Cx b'.
wdkrnls


1
Gunakan salah satu solusi dalam jawaban dan jangan gunakan Cx b. 3 tombol terlalu banyak untuk operasi yang sering. Saya pribadi menggunakan satu tombol, tombol jendela kanan yang tidak saya gunakan sebaliknya.
Tom

Jawaban:


50

Ada mode ido yang seharusnya membantu.

SUNTING:

letakkan ini di file init Anda, untuk mengaktifkan mode ido secara default:

(ido-mode 1)

Sekarang, C-x bakan menunjukkan daftar kandidat.

Letakkan ini di file init Anda, jika Anda lebih suka item ditampilkan secara vertikal:

(setq ido-separator "\n")

Atas perkenan ergoemacs

Izinkan saya juga menyarankan posting ini berbicara tentang beralih ke buffer sebelumnya / selanjutnya.


2
Kami mungkin harus mencoba untuk mendapatkan sebagian besar informasi penting di pos itu sebagai jawaban atas pertanyaan ini. Dengan begitu pengguna di masa depan tidak perlu mengejar tautan ke situs yang mungkin mati.
nixeagle

@nixeagle Saya membuat beberapa pengeditan, saya harap informasi yang paling penting ada.
Nsukami _

Saya memutakhirkan milik Anda karena sudah selesai sekarang, tetapi saya akan menunggu beberapa hari sebelum saya menerimanya seandainya orang lain datang dengan jawaban yang berbeda dan atau lebih baik. Terima kasih!
nixeagle

@nixeagle bukan apa-apa!
Nsukami _

1
@nixeagle sudahkah Anda menemukan jawaban yang lebih baik?
Pengguna Emacs

44

Saya baru saja mulai menggunakan C-x <left>dan C-x <right>. Keduanya adalah binding standar Emacs — tidak ada yang perlu dikonfigurasi. Kiri membawa Anda kembali ke buffer sebelumnya (awalnya sama dengan C-x b RET) tetapi melakukannya lagi akan membawa Anda ke buffer ke-3 yang terakhir dikunjungi. Jika Anda sering bolak-balik antara 3 atau 4 buffer banyak maka saya merasa jauh lebih mudah daripada mencoba mengingat nama buffer.

Saya juga baru saja menemukan C-x C-<left>dan C-x C-<right>terikat ke fungsi yang sama sehingga Anda bisa tahan tombol kontrol dan bergantian antara x dan panah untuk membalik buffer. Cukup bagus!


4
Saya setuju denganmu! Saya pendatang baru di emacs, dan tidak ingin kelebihan beban dengan paket tambahan dan konfigurasi yang lebih banyak. Solusi ini bekerja untuk saya! : D
ankush981

Cx C- <left> dan Cx C- <right> untuk kemenangan! Saya dulu memiliki buffer prev / next terikat ke CS- <left> / <right>. Tapi entah bagaimana saya menemukan mengetik Cx C-kiri lebih mudah daripada menggunakan dua kunci meta. CS canggung untuk menekan.
Didier A.

Bagus! Saya mempelajari ikatan-ikatan ini seminggu yang lalu, berpikir betapa hebatnya mereka, dan kemudian melupakan apa itu. Tidak dapat menemukannya di internet selama seminggu, sampai sekarang. Terima kasih!
Kirill Yunussov

41

Anda bisa menggunakan Helm .

Dalam pengaturan saya, saya telah beralih C-x buntuk M-l. Ini bersekutu dengan helm-buffers-list, membuat prosesnya cukup cepat, setidaknya untuk saya.


Ini pada dasarnya jawaban terbaik sekarang. Tentu, Anda masih dapat menggunakan idoatau iswitchbatau icicles, hal-hal seperti itu, tetapi mereka pada dasarnya usang oleh Helm. Ya, ace-jump-bufferitu keren, tetapi tidak secepat Helm, karena sebelum Anda tahu kunci apa yang harus ditekan, Anda harus menemukan buffer dalam daftar. Helm memungkinkan Anda mempersempit daftar dengan beberapa penekanan tombol yang sudah Anda ketahui (seperti nama buffer). Saya gunakan C-TABuntuk mengganti buffer, memuat file terbaru, bookmark, dll. Tidak ada yang lebih cepat.
blujay

4
+1 untuk helm. Tapi saya lebih suka menggunakan helm-mini, yang juga menunjukkan Recentfkepada Anda helm-buffers-list.
joon

1
Ada juga ivy dengan ivy-switch-buffer.
Oleksii Filonenko

Saya menemukan ivy jauh lebih cepat daripada helm, jadi saya merekomendasikannya di atas helm.
Didier A.

10

Hanya untuk menambahkan tweak yang saya gunakan dengan Ido yang telah disebutkan :

(require 'ido)
(require 'ido-hacks)
(require 'flx-ido)
(require 'ido-vertical-mode)

(ido-mode 1)
(flx-ido-mode 1)
(ido-hacks-mode 1)
(ido-everywhere 1)
(ido-vertical-mode 1)

(setq ido-enable-flex-matching t
      ido-use-filename-at-point 'guess
      ido-vertical-define-keys 'C-n-C-p-up-down-left-right))

Saya juga menggunakan ace-windowuntuk beralih di antara buffer bersama dengan ace-jump-modeuntuk melompat di antara jendela yang terlihat. Datang dengan beberapa membiasakan diri tetapi pantas untuk dicoba.

Saya telah mengombinasikannya dengan key-chord-modedan menekan sountuk lompatan cepat:

(key-chord-define-global "so" 'ace-window)

Semua paket yang disebutkan di atas tersedia melalui manajer paket dari Melpa.


Saya telah mengedit jawaban Anda untuk menggantikan use-packagedengan requireuntuk mencegah kebingungan. Dalam contoh yang diberikan, tidak ada kebutuhan khusus bagi pengguna untuk menginstal paket tambahan untuk mengimplementasikan solusi itu.
Kaushal Modi

1
Saya sarankan untuk tidak menggunakan kombinasi huruf yang sering terjadi dalam bahasa Inggris (dengan asumsi Anda mengetik terutama dalam bahasa Inggris di emacs) sebagai kunci-kunci. Menurut pendapat saya "begitu" sangat mudah untuk memicu secara tidak sengaja ketika Anda mengetik hal-hal seperti "begitu", "beberapa", "pribadi", dll sangat cepat.
Kaushal Modi

10

Seperti @kuanyui katakan dalam komentar, next-buffer& previous-buffersangat cepat, jika Anda hanya memiliki beberapa buffer untuk di antaranya. (Untuk lebih dari beberapa, dan untuk lebih banyak fitur pemilihan buffer, saya menggunakan icicle-buffer.)

Namun, secara default, next-bufferdan previous-bufferberada pada kunci awalanC-x ,.

Itu berarti bahwa mereka tidak dapat diulang : Anda tidak bisa hanya memukul C-x <right> <right> <right>.... Sebagai gantinya Anda harus mengikat perintah-perintah ini ke tombol yang berbeda dan dapat diulang, atau Anda harus menggunakannya C-x <right> C-x <right> C-x <right>..., yang tidak terlalu cepat.

Untuk versi berulang dari perintah-perintah ini, muat pustaka misc-cmds.eldan remap vanilla, versi yang tidak dapat diulang ke yang berulang yang didefinisikan di sana:

(global-set-key [remap previous-buffer] 'previous-buffer-repeat)
(global-set-key [remap next-buffer]     'next-buffer-repeat)

(Demikian pula, di perpustakaan yang sama Anda akan menemukan versi undoyang dapat diulang bahkan ketika pada kunci awalan:. undo-repeat)


BTW, Anda dapat membuat cukup banyak setiap perintah berulang (bahkan pada kunci awalan), dengan menggunakan fungsi repeat-command(dari misc-cmds.el). Ini semua yang diperlukan untuk mendefinisikan versi berulang next-buffer:

(defun previous-buffer-repeat ()
  "Switch to the previous buffer in the selected window.
You can repeat this by hitting the last key again..."
  (interactive)
  (require 'repeat nil t) ; Library `repeat.el' is in Emacs 22.1 and later
  (repeat-command 'next-buffer))

3
... atau cukup ikat buffer berikutnya / sebelumnya ke C-,dan C-.untuk mendapatkan pengulangan, dan selagi Anda menggunakannya, atur C-x.dan C-x,ke other-windowdan (lambda()(interactive)(other-window -1)). Bersepeda windows mungkin membutuhkan pengulangan yang lebih sedikit, dan Anda pergi dalam satu menit, tanpa paket tambahan.
Andreas Spindler

2
@AndreasSpindler: Tentu saja Anda dapat menempatkan perintah apa pun pada kunci berulang dan dengan demikian membuatnya berulang. Itu bukan intinya. Kunci yang dapat diulang sangat sedikit, dan yang tidak terikat semakin langka. Ini adalah tentang bagaimana membuat perintah diulang ketika itu pada kunci awalan .
Drew

1
Saya tidak memahami pos Anda, tetapi merujuk lebih atau kurang ke topik utas ini "Bagaimana cara mengganti buffer dengan cepat?". Untuk tujuan ini, saya menemukan tip Anda untuk digunakan next-bufferdan previous-buffersolusi terbaik, terlepas dari pengikatan kunci tertentu. Karena itu komentar saya.
Andreas Spindler

@AndreasSpindler: Mengerti; Terima kasih.
Drew

Ini bagus, saya berkali-kali perlu perintah berulang bahkan ketika mereka memiliki kunci awalan. Yang mengatakan, saya menemukan default buffer prev / next ke Cx C-kiri dan Cx C-kanan yang memungkinkan Anda untuk C lama, dan hanya ulangi menekan x-kiri dan x-kanan. Yang tidak terlalu buruk sebagai standar.
Didier A.

9

Saya terkejut iswitchbbelum ada yang disebutkan . Ini mungkin tidak sekuat ido, tetapi jauh sebelum ido-modelahir iswitchb-modesudah standar untuk emacs, dan masih berguna saat ini. Untuk mencobanya cukup masukkan

(iswitchb-mode 1)

ke dalam .emacs Anda atau aktifkan via M-x iswitchb-mode.


4
iswitchbsudah usang pada Emacs 24.4. Semua fungsinya tersedia melalui idosekarang.
Tyler

4
@ Tyler Saya suka tampilan default iswitchb lebih baik, karena lebih berwarna, lebih cantik. Mungkin ido dapat dikonfigurasi agar terlihat sama, tetapi tidak ada gunanya (setidaknya untuk saya) sementara iswitchb tersedia.
Tom


6

Yang lain telah membahas paket yang berguna untuk membuat hidup lebih mudah sehubungan dengan penyangga / jendela / frame switching. (Saya pribadi menggunakan helmyang fenomenal.) Saya ingin membahas perubahan sederhana yang dapat membuat pengalaman Emacs lebih menyenangkan.

Bagi saya, solusi untuk masalah buffer / frame saya (karena saya pikir C-x oyang terburuk) bukanlah paket; itu hanya:

  • pemetaan C-;ke other-window(bersepeda melalui windows)
  • pemetaan C-'ke other-frame(bersepeda melalui bingkai). Saya sebenarnya mulai menggunakan bingkai lebih banyak setelah menambahkan pintasan ini).
  • memetakan ikatan tombol-keystroke mudah lainnya ke fungsi-fungsi kustom yang sederhana untuk memanipulasi buffer dalam bingkai yang terlihat. Contohnya termasuk: melempar buffer ke jendela lain (dalam pengaturan 2-jendela), beralih antara buffer saat ini dan buffer terakhir di jendela yang diberikan, mengubur buffer lain (yang ini bagus untuk mengganti helpjendela yang muncul (ketika membaca halaman manual, apropos, dll) dengan jendela apa pun yang sebelumnya terlihat).

Saya juga berpikir saya akan berbagi beberapa pemikiran tentang ikatan kunci yang mungkin bermanfaat bagi pemula. (Maaf jika ini adalah tempat yang salah.) Saya tidak punya saran khusus tetapi, lebih tepatnya, "filosofi" yang memungkinkan saya mempertahankan serangkaian ikatan kunci yang efektif untuk diri saya sendiri.

  1. Perintah yang jarang digunakan tidak layak untuk mengikat kunci dengan mudah.

    • Unduh keyfreq.eldan lihat apa yang benar-benar Anda gunakan. Saya menggunakan metode survival-of-the-fittest untuk memutuskan perintah mana yang diberikan real estat paling berharga di keyboard saya.
    • Jangan takut untuk menyingkirkan keybindings Emacs default, beberapa di antaranya hanya tidak masuk akal. C-\adalah cara pintas yang besar (untuk alasan yang dibahas di # 2) ... dan itu akan menjadi kejahatan untuk meninggalkan dipetakan ke perintah default: change-input-method. (Mungkin sebagian dari Anda banyak menggunakannya, saya tentu saja tidak.)
  2. Faktor-faktor berikut menentukan kemudahan dan kecepatan pintasan keyboard (dimulai dengan yang paling penting):

    • Terus menekan tombol pengubah (apa pun itu, Ctrl, Meta, dll). Sebagai contoh, itu jauh lebih cepat bagi saya untuk memukul C-c C-l C-pdaripada memukul C-x o. Saya pribadi merasa sangat tidak nyaman harus mengangkat Ctrlkunci di antara sapuan kunci berurutan dari urutan kunci yang diberikan; jauh lebih mudah hanya dengan terus menumbuk tombol pengubah (dalam hal ini, Ctrl). (Contoh khusus ini mungkin dipengaruhi oleh fakta bahwa saya telah memetakan ulang Ctrlkunci saya dan Caps-Lockkunci saya .)
    • Pergantian teman Anda . Jauh lebih cepat bagi saya untuk memukul C-c C-l C-pdaripada memukul C-p C-' C-;. (Cobalah dan itu harus jelas.) Secara umum, itu jauh lebih mudah untuk menggunakan urutan keystroke yang menggunakan bolak-balik tangan (atau, setidaknya, bolak-balik jari di tangan yang sama).
    • Tingkat keberangkatan dari posisi tangan standar. Ini tidak berlaku untuk penggemar berburu dan mematuk di luar sana. Tetapi bagi kita semua, pintasan keyboard yang paling sering digunakan harus memungkinkan kita untuk kembali ke posisi mengetik standar dengan cepat dan mudah.

Hanya beberapa pemikiran yang saya pikir mungkin bisa membantu pemula. Saya dapat menambahkan lagi nanti.


3

Saya menggunakan windmove.eldan bs.eluntuk mengganti buffer dengan cepat. Kedua mode disertakan dengan Emacs.

  • windmove.el- beralih ke jendela (buffer yang saat ini ditampilkan) dalam arah yang ditentukan, mis. kiri, kanan, atas, bawah.

  • bs.el- Saya menggunakan bs-cycle-nextdan bs-cycle-previousuntuk beralih ke buffer berikutnya yang saat ini tidak ditampilkan di jendela.

Anda dapat men-setup windmove dengan (windmove-default-keybindings)yang akan mengikat perintah yang sesuai untuk Shift-Left Arrow, Shift-Right Arrow, dll

Untuk pengaturan bs.el, sesuatu seperti ini akan berfungsi:

 (global-set-key [(f9)]   'bs-cycle-previous)
 (global-set-key [(f10)]  'bs-cycle-next)

Buffer BUKAN Jendela (Bingkai)! Jangan mengacaukan mereka!
kuanyui

2
Dan sebuah jendela bukanlah bingkai. Apapun itu, windmove.elada di bawah halaman EmacsWiki "Switching Buffer", ditambah bs.elberoperasi pada buffer, bukan jendela.
Joe

Saya mengklarifikasi apa yang dilakukan windmove.
Joe

3

Cara tercepat untuk mengganti buffer yang saya ketahui adalah dengan ace-jump-buffer. Satu stroke kunci membuka menu buffer dan kemudian pilih huruf di sebelah buffer yang Anda inginkan ace-jump-line-mode. Ini berfungsi paling baik untuk 26 atau lebih buffer terbaru. Untuk beralih ke buffer lebih jauh dalam riwayat penggunaan Anda, ido-switch-bufferselalu merupakan pilihan yang baik.


3

Saya lebih suka navigasi tab bergaya browser. Saya telah mengikat Ctrl + Tab dan Ctrl + Shift + Tab untuk masing-masing buffer berikutnya dan sebelumnya:

(global-set-key [C-tab] 'next-buffer)
(global-set-key [C-S-tab] 'previous-buffer)

2

Secara luas, ada 2 cara untuk beralih buffer dan sebagian besar solusi akan jatuh ke salah satunya.

  1. Menggunakan buffer mini

Inilah yang C-x bdilakukan secara default. Ido memberi Anda penyelesaian otomatis yang bagus sehingga Anda tidak perlu terlalu banyak TAB TAB. Proyek-proyek seperti helm, proyektil dll membuatnya lebih mudah dengan memberi Anda kemampuan untuk bekerja dengan file dalam proyek dll, dan bersama dengan ido, mereka bisa sangat berguna.

  1. Seluruh buffer dengan semua item terdaftar.

Ini berguna ketika Anda memiliki begitu banyak buffer dan Anda ingin daftar semuanya. Anda dapat naik dan turun buffer, dan tekan enter untuk mengunjungi file tertentu. Ibuffer cukup bagus untuk itu.

Saya menggunakan keduanya dan ini adalah bagaimana Anda dapat mengaturnya.

 (global-set-key (kbd "C-x C-b") 'ido-switch-buffer)
 (global-set-key (kbd "C-x b") 'ibuffer)`

Untuk Helm kedua juga merupakan opsi yang bagus
Tom

2

Selain ido, saya memiliki pengaturan berikut.

  1. Dalam kasus mode jahat, gunakan binding kunci berikut untuk mengganti buffer

    (define-key evil-normal-state-map (kbd "C-j") 'next-buffer)
    (define-key evil-normal-state-map (kbd "C-k") 'previous-buffer)
    (define-key evil-normal-state-map (kbd "C-S-h") 'evil-window-left)
    (define-key evil-normal-state-map (kbd "C-S-j") 'evil-window-down)
    (define-key evil-normal-state-map (kbd "C-S-k") 'evil-window-up)
    (define-key evil-normal-state-map (kbd "C-S-l") 'evil-window-right)
    
  2. Tetapkan nama buffer sebagai judul jendela. Ini akan membantu Anda saat bernavigasi dengan keybindings di atas

    (setq frame-title-format "%b")
    
  3. Jika Anda menggunakan mode jahat, Anda dapat mencoba evil-leader. Bind sering menggunakan kunci untuk pemimpin. misalnya Anda dapat mengikat C-x buntuk <leader>-b.

    (global-evil-leader-mode)
    (evil-leader/set-leader ",")
    (evil-leader/set-key
     "b" 'switch-to-buffer)
    
  4. Bind mode dired to C-<f8>. Sekarang ketika Anda ingin membuka file dalam direktori, tekan C-<f8>, arahkan ke nama file & tekan aalih-alih RET. Jadi buffer yang dired akan segera dibunuh.

    (global-set-key (kbd "C-<f8>")
            (lambda ()
              (interactive)
              (dired default-directory)))
    (put 'dired-find-alternate-file 'disabled nil)
    
  5. Gunakan recentfmode untuk menavigasi file terbaru.C-x C-r

  6. Satu poin penting terakhir adalah - gunakan keyboard mekanis ergonomis. Jadi Anda dapat menekan tombol 'ctrl' dengan mudah dan cepat dengan pergelangan tangan alih-alih menyakiti kelingking.

Semoga ini bisa membantu seseorang.


1

Seperti yang dapat Anda lihat dari jawaban lain, ada banyak cara untuk merampingkan tugas khusus ini. Saya pribadi menggunakan Lusty Emacs sebagai perangkat switching buffer saya karena menangani penyelesaian fuzzy dengan cukup baik. Ini meminimalkan jumlah tombol-stroke yang diperlukan untuk memilih buffer baru, misalnya saya hanya perlu mengetikkan oxr untuk beralih ke ox-express.el , atau bahkan hanya putaran kedua kalinya karena melacak sejarah switch juga.


0

Jika Anda ingin terus menyikat buffer, tambahkan ini ke file init Anda:

(bind-key* "M-l" 'next-buffer)
(bind-key* "M-k" 'previous-buffer)

Anda memang membutuhkan paket kunci-kunci dan Anda dapat mengubah kunci-kunci sesuai keinginan Anda, tetapi saya menemukan ikatan kunci ini menjadi yang paling nyaman. Sebelum menambahkan potongan ini, Anda harus meminta bind-key dengan,

(require 'bind-key)

0

Saya menggunakan C-Tab dan CS-Tab seperti aplikasi umum.

(defun change-buffer-until-normal (change-fn)
  (let (current (buffer-name))
    (funcall change-fn)
    (while (and (string-prefix-p "*" (buffer-name))
        (not (eq current (buffer-name))))
      (funcall change-fn))))

(defun my-next-buffer ()
  (interactive)
  (change-buffer-until-normal 'next-buffer))

(defun my-prev-buffer ()
  (interactive)
  (change-buffer-until-normal 'previous-buffer))

(global-set-key [C-tab] 'my-next-buffer)
(global-set-key [C-S-iso-lefttab] 'my-prev-buffer)

0

Ini bukan solusi yang sangat elegan (karena menggunakan makro alih-alih fungsi) dan tidak menjawab cara melompat ke buffer apa pun dengan cepat, tetapi hanya cara melompat ke buffer yang digunakan baru-baru ini. Tapi itu bekerja dengan sangat baik untuk saya:

Saya memiliki serangkaian makro yang digunakan ido-switch-bufferuntuk melompat ke buffer sebelumnya, buffer sebelum itu, buffer sebelum itu, dll. Dan saya mengikat makro itu ke binding kunci yang menurut saya nyaman.

Untuk melompat ke buffer terakhir:

(fset 'my-goto-previous-buffer
      [?\C-x ?b return])

Untuk melompat ke buffer kedua dari belakang:

(fset 'my-goto-previous-buffer
      [?\C-x ?b ?\C-n return])

Untuk melompat ke buffer antepenultimate:

(fset 'my-goto-previous-buffer
      [?\C-x ?b ?\C-n ?\C-n return])

Dll (Anda dapat beriklan sebanyak yang ?\C-nAnda inginkan sejauh sejarah buffer yang dikunjungi seperti yang Anda inginkan).

Ada fungsi bawaan untuk melompat ke buffer sebelumnya, tetapi keuntungan menggunakan makro ido-switch-bufferadalah Anda dapat menyesuaikan variabel ido-ignore-buffersuntuk menghapus buffer khusus seperti *Messages*atau *scratch*dan buffer lain yang tidak diinginkan dari daftar. Dengan begitu, satu-satunya penyangga tempat Anda melompat adalah yang benar-benar Anda minati.


-1

Di VM saya, Cx ALT-RIGHT / LEFT terlalu lambat. Saya harus menunggu Cx untuk mendaftar di bilah status sebelum saya dapat melakukan hal lain. ditambah terlalu banyak kunci. Jadi saya memetakan C-TAB dan CM-TAB ke buffer selanjutnya dan seperti itulah yang saya lakukan di sebagian besar program windows. Mudah dilakukan dari dalam emacs: M-xmembawa Anda ke bilah status. Kemudian ketik global-set-keyyang akan meminta Anda untuk urutan kunci yang ingin Anda ikat ( C-TAB) dan kemudian untuk perintah yang ingin Anda ikat ke ( next-buffer). Itu dia!


1
Selamat datang. Jawaban lain tampaknya sudah mencakup pemetaan perintah ini ke tombol lain.
Andrew Swann

Tidak persis - semua orang berbicara tentang cara mengubah file konfigurasi .emacs Anda. Saya telah menjelaskan cara melakukannya dari dalam sesi emacs
SN
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.