Як швидко перемикати буфери?


67

У ванільному Emacs я повинен зробити, C-x bа потім вручну ввести ім’я буфера, щоб переключитися. Якщо я забуду назву буфера, мені доведеться натиснути, TABщоб перелічити можливі завершення. Чи можна щось зробити, щоб зробити цей процес швидшим?


10
Це має помітити Wiki Wiki. Але Emacs вже має гігантську вікі. Наприклад, найкращим результатом Google є ця сторінка про перемикання буферів . Питання в стилі CW, на мою думку, особливо недоречні на emacs.SE.
purple_arrows

1
Мені подобається C-x C-<left/right>швидко перемикати буфери. Коли потрібно перейти на «дальший» буфер, я використовую IBuffer.
kuanyui

Я використовую "Cx x" для перемикання буферів (з кермом і кришками, відображеними для управління). Я ніколи не відчував себе комфортно, набираючи "Cx b".
wdkrnls


1
Використовуйте одне з рішень у відповідях і не використовуйте Cx b. 3 клавіші занадто багато для такої частої роботи. Я особисто використовую один ключ, праву клавішу Windows, яку я не використовую інакше.
Том

Відповіді:


49

Існує режим ido, який повинен допомогти.

Редагувати:

помістіть це у свій файл init, щоб активувати режим ido за замовчуванням:

(ido-mode 1)

Тепер C-x bпокаже вам список кандидатів.

Помістіть це у свій файл init, якщо ви бажаєте, щоб елементи відображалися вертикально:

(setq ido-separator "\n")

Надано ергоемаками

Дозвольте також запропонувати цей пост говорити про перехід до попереднього / наступного буфера.


2
Напевно, ми повинні спробувати отримати більшість важливої ​​інформації на цій посаді як відповідь на це питання. Таким чином майбутнім користувачам не доведеться переслідувати посилання на можливі померлі сайти.
nixeagle

@nixeagle Я вніс декілька змін, сподіваюся, найважливіша інформація присутня.
Nsukami _

Я підтримав ваше як зараз, але я зачекаю кілька днів, перш ніж прийму, якщо інші прийдуть з різними або кращими відповідями. Дякую!
nixeagle

@nixeagle це нічого!
Nsukami _

1
@nixeagle Ви знайшли кращу відповідь?
Користувач Emacs

42

Я нещодавно почав використовувати C-x <left>і C-x <right>. Це обидва стандартні вкладки Emacs - нічого налаштовувати. Зліва повертає вас до попереднього буфера (спочатку такий же, як C-x b RET), але робити це знову повертає вас до 3-го останнього відвідуваного буфера. Якщо ви пересуваєтеся між 3 або 4 буферами багато, то мені це набагато простіше, ніж намагатися запам'ятати імена буфера.

Також я щойно виявив C-x C-<left>і C-x C-<right>прив’язаний до одних і тих же функцій, так що ви можете просто утримувати клавішу управління і чергувати х і стрілки, щоб прогортати буфери. Дуже приємно!


4
Я погоджуюсь з тобою! Я новачок у emacs, і не хочу перевантажуватись додатковими пакунками та ще більшою кількістю конфігурацій. Це рішення працює для мене! : D
ankush981

Cx C- <ліворуч> та Cx C- <right> на виграш! У мене був попередній / наступний буфер, прив'язаний до CS- <left> / <right>. Але мені якось легше набрати текст Cx C-left, ніж використовувати два мета-клавіші. CS незручно натискати.
Дідьє А.

Приємно! Я дізнався ці прив’язки тиждень тому, подумав, як вони приголомшливі, а потім забув, що вони є. Не вдалося їх знайти в мережі протягом тижня, до цих пір. Дякую!
Кирило Юнусов

40

Ви можете використовувати Helm .

У моїй установці, я переключився C-x bна M-l. Це, пов'язане з helm-buffers-list, робить процес досить швидким, принаймні для мене.


Це в основному найкраща відповідь зараз. Звичайно, ви можете використовувати idoабо iswitchbчи icicles, такі речі , як це, але вони в основному застаріли, Helm. Так, ace-jump-bufferкруто, але це не так швидко, як Хелм, адже перш ніж знати, яку клавішу натиснути, ти повинен знайти буфер у списку. Helm дозволяє звузити список за допомогою декількох натискань клавіш, які ви вже знаєте (наприклад, назва буфера). Я використовую C-TABдля перемикання буферів, завантаження останніх файлів, закладок тощо. Нічого не швидше.
blujay

4
+1 для helm. Але я вважаю за краще використовувати helm-mini, який також показує Recentfв helm-buffers-list.
юний

1
Є і плющ з ivy-switch-buffer.
Олексій Філоненко,

Я знаходжу плющ набагато швидше, ніж штурвал, тому рекомендую його над кермом.
Дідьє А.

10

Просто для додання налаштувань, які я використовую з уже згаданим Ido :

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

Я також використовую ace-windowдля перемикання між буферами, а також ace-jump-modeдля переходу між видимими вікнами. Походить з деяким звиканням, але варто спробувати.

Я поєднав це з key-chord-modeі вдарив soдля швидкого стрибка:

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

Всі вищезазначені пакети доступні через менеджера пакунків від Melpa.


Я редагував свій відповідь , щоб замінити use-packageз , requireщоб уникнути плутанини. У наведеному прикладі немає конкретної потреби у встановленні додаткового пакету для реалізації цього рішення.
Каушал Моді

1
Я б запропонував не використовувати комбінації букв, які часто зустрічаються англійською мовою (припускаючи, що ви вводите в основному англійською мовою в emacs) як акорди клавіш. На мою думку, "так" дуже легко викликати ненавмисне, коли ви дуже швидко набираєте речі типу "так", "деякі", "особисті" тощо.
Каушал Моді

10

Як говорить @kuanyui в коментарі, next-buffer& previous-bufferви дуже швидкі, якщо у вас є лише кілька буферів для переходу між цими . (Я використовую більше декількох функцій і для більшої кількості функцій вибору буфера icicle-buffer.)

Однак, за замовчуванням, next-bufferі previous-bufferзнаходяться на ключі приставки,C-x .

Це означає, що вони не повторюються : не можна просто вдарити C-x <right> <right> <right>.... Натомість ви повинні або прив’язати ці команди до різних повторюваних клавіш, або використовувати C-x <right> C-x <right> C-x <right>..., що не дуже швидко.

Для повторюваних версій цих команд завантажте бібліотеку misc-cmds.elта перезавантажте ванільну, неповторювану версії до визначених там повторюваних версій:

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

(Аналогічно, в тій самій бібліотеці ви знайдете версію, undoяка повторюється, навіть коли ви маєте префіксний ключ:. undo-repeat)


До речі, ви можете зробити будь-яку команду, що повторюється (навіть на префіксному ключі), використовуючи функцію repeat-command(від misc-cmds.el). Це все, що було потрібно для визначення повторюваної версії 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
... або просто прив’язати наступний / попередній буфер до C-,та, C-.щоб отримати повторюваність, і поки ви все одно на ньому, встановіть C-x.і C-x,до, other-windowі (lambda()(interactive)(other-window -1)). На велосипеді вікна, ймовірно, потребують повторюваності менше, і ви підете за хвилину, без зайвих пакетів.
Андреас Шпіндлер

2
@AndreasSpindler: Звичайно, ви можете поставити будь-яку команду на повторюваний ключ і таким чином зробити його повторюваним. Це не сенс. Клавіші, що повторюються, мало, а незв'язані - все рідше. Йдеться про те, як зробити команду, що повторюється, коли вона знаходиться на ключі префікса .
Дрю

1
Я не зрозумів вашу публікацію, але більш-менш посилався на тему цієї теми "Як швидко перемикати буфери?". З цією метою я знайшов вашу пораду щодо використання next-bufferта previous-bufferнайкращого рішення незалежно від будь-якого конкретного прив’язки ключа. Тому мій коментар.
Андреас Шпіндлер

@AndreasSpindler: зрозумів; Дякую.
Дрю

Це чудово, мені багато разів потрібні повторювані команди, навіть коли у них є префіксні ключі. Це означає, що я знайшов значення попереднього / наступного буфера до Cx C ліворуч та Cx C-праворуч, що дозволяє вам старий C, і просто повторіть натискання x ліворуч та x праворуч. Що не так вже й погано як за замовчуванням.
Дідьє А.

9

Я здивований, iswitchbпоки ніхто не згадав . Це може бути не настільки потужним ido, але задовго до того, ido-modeяк народився, iswitchb-modeвже було стандартом для emacs, і воно досі корисне. Щоб спробувати це просто поставте

(iswitchb-mode 1)

в ваш .emacs або активувати з допомогою M-x iswitchb-mode.


4
iswitchbзастаріло на Emacs 24.4. Вся його функціональність доступна вже idoзараз.
Тайлер

4
@Tyler Мені подобається вигляд iswitchb за замовчуванням, тому що він більш барвистий, красивіший. Можливо, ido може бути налаштований так, щоб виглядати так само, але немає сенсу (принаймні для мене), поки iswitchb доступний.
Том

7

Використовуйте helm-buffer-list або helm-mini для візуального вибору буфера введення та нечіткого зіставлення. Це може робити багато речей поза буферами комутації. Ви можете побачити демонстрацію за посиланням.


6

Інші обговорили пакунки, які корисні для полегшення життя щодо перемикання буфера / вікна / кадру. (Я особисто використовую те, helmщо є феноменальним.) Я хочу обговорити більш прості зміни, які можуть зробити більш приємним досвід роботи Emacs.

Для мене рішення мій буфер / фрейм (тому що я вважаю C-x oнайгіршим) не був пакетом; це було просто:

  • відображення C-;на other-window(їзда на велосипеді через вікна)
  • відображення C-'до other-frame(проїзд по кадрах). Я фактично почав використовувати кадри набагато більше після додавання цього ярлика).
  • відображення інших простих прив'язок клавіш на одній клавіші до простих, спеціальних функцій для управління буферами у видимому кадрі. Приклади включають: перекидання буфера до іншого вікна (у налаштуваннях з 2 вікнами), перемикання між поточним буфером та останнім буфером у заданому вікні, поховання іншого буфера (цей відмінно підходить для заміни helpспливаючого вікна (під час читання підручних сторінок, підручників тощо) з будь-яким вікном, яке було видно раніше

Я також думав, що поділюсь декількома думками щодо прив'язки ключів, які новачкам можуть бути корисними. (Вибачте, якщо це неправильне місце.) У мене немає конкретних пропозицій, а, швидше, "філософія", яка дозволяє мені підтримувати для себе ефективний набір клавішних зв'язків.

  1. Нечасто використовувані команди не заслуговують на легке прив'язування клавіш.

    • Завантажте keyfreq.elта подивіться, що ви справді багато використовуєте. Я використовую метод виживання найдосконалішого, щоб визначити, яким командам присуджується найцінніша нерухомість на моїй клавіатурі.
    • Не бійтеся позбутися стандартних клавіш Emacs, деякі з яких просто абсурдні. C-\це відмінний ярлик (з причин , викладених у # 2) ... і це було б злочином залишити його зіставляється з його командою по замовчуванням: change-input-method. (Можливо, хтось із вас це багато використовує, я, звичайно, не.)
  2. Наступні фактори визначають простоту та швидкість комбінації клавіш (починаючи з найважливішого):

    • Тривале натискання на клавішу - модифікатор (якою б вона не, Ctrl, Metaі т.д.). Наприклад, мені набагато швидше вдарити, C-c C-l C-pніж вдарити C-x o. Мені особисто дуже незручно піднімати Ctrlклавішу між послідовними натисканнями клавіш у заданій послідовності клавіш; набагато простіше просто продовжувати натискання кнопки модифікатора (у цьому випадку Ctrl). (На цей конкретний приклад може вплинути той факт, що я перевстановив свій Ctrlключ і свій Caps-Lockключ.)
    • Чергування у вашого друга . Мені набагато швидше вдарити, C-c C-l C-pніж вдарити C-p C-' C-;. (Спробуйте, і це повинно бути очевидно.) Взагалі кажучи, набагато простіше використовувати послідовності натискань клавіш, які використовують чергування рук (або, принаймні, чергування пальців на одній руці).
    • Ступінь відходу від стандартного положення руки. Це не стосується любителів полювання та клювання там. Але для решти нас наші найпоширеніші комбінації клавіш повинні дозволяти нам швидко та легко повертатися до стандартного положення на дотику.

Всього кілька думок, які я вважав, можуть бути корисними для новачків. Я можу додати ще трохи пізніше.


3

Я використовую windmove.elта bs.elшвидко перемикаю буфери. Обидва режими включені в Emacs.

  • windmove.el- переходить у вікно (буфер, який наразі відображається) у визначеному напрямку, наприклад ліворуч, праворуч, вгору, вниз.

  • bs.el- Я використовую bs-cycle-nextта bs-cycle-previousперемикаюся на наступний буфер, який наразі не відображається у вікні.

Ви можете встановити windmove з (windmove-default-keybindings)якої буде пов'язувати відповідні команди Shift-Left Arrow, Shift-Right Arrowі т.д.

Для налаштування працює bs.elщось подібне:

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

Буфер НЕ вікно (рама)! Не бентежте їх!
kuanyui

2
І вікно не є рамкою. Незалежно від того, що windmove.elзнаходиться на сторінці EmacsWiki "Перемикання буферів", плюс bs.elпрацює на буферах, а не на вікнах.
Джо

Я уточнив, що робить вітряк.
Джо

3

Найшвидший спосіб переключення буферів, про які я знаю, - це ace-jump-buffer. Одним натисканням клавіші відкриється меню буфера, а потім виберіть букву поруч із буфером, який ви хочете ace-jump-line-mode. Це найкраще працює для 26 або більше останніх буферів. Для переходу на буфери далі в історії використання ido-switch-bufferзавжди хороший вибір.


3

Я віддаю перевагу навігаційній вкладці в стилі браузера. Я прив’язав Ctrl + Tab і Ctrl + Shift + Tab до наступних та попередніх буферів відповідно:

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

2

Широко кажучи, є два способи перемикання буферів, і більшість рішень потрапляють в один із них.

  1. Використання міні-буфера

Це те, що C-x bробиться за замовчуванням. Ido дає вам гарне автоматичне завершення, так що вам не потрібно так багато TAB TAB TAB. Такі проекти, як кермо, снаряд тощо, полегшують роботу, надаючи здібності працювати з файлами в проекті тощо, і поряд з ido, вони можуть бути дуже корисними.

  1. Цілий буфер з усіма переліченими елементами.

Це корисно, коли у вас так багато буферів, і ви хочете, щоб перелік усіх був. Ви можете піднімати буфер вгору та вниз і натиснути клавішу Enter, щоб відвідати певний файл. Ibuffer досить добре для цього.

Я використовую і те, і інше, як ви можете це налаштувати.

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

Для другого Хелма також приємний варіант
Том

2

Крім ido, у мене є наступне налаштування.

  1. У разі злого режиму використовуйте наступні прив’язки клавіш для перемикання буферів

    (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. Встановіть назву буфера як заголовок вікна. Це допоможе вам під час навігації за наведеними вище клавішами

    (setq frame-title-format "%b")
    
  3. Якщо ви використовуєте злий режим, можете спробувати evil-leader. Прив’яжіть часто використовувані клавіші до лідера. наприклад , можна пов'язати C-x bз <leader>-b.

    (global-evil-leader-mode)
    (evil-leader/set-leader ",")
    (evil-leader/set-key
     "b" 'switch-to-buffer)
    
  4. Прив’язати переведений режим до C-<f8>. Тепер, коли ви хочете відкрити файл у каталозі, натисніть C-<f8>, перейдіть до назви файла та натисніть aзамість RET. Таким чином, вилучений буфер буде вбитий негайно.

    (global-set-key (kbd "C-<f8>")
            (lambda ()
              (interactive)
              (dired default-directory)))
    (put 'dired-find-alternate-file 'disabled nil)
    
  5. Використовуйте recentfрежим для навігації по останніх файлах.C-x C-r

  6. Останнім важливим моментом є використання ергономічної механічної клавіатури. Таким чином, ви можете легко та швидко натиснути клавішу "ctrl" зап'ястям, замість того, щоб пошкодити рожевий колір.

Сподіваюся, це може комусь допомогти.


1

Як видно з інших відповідей, існує багато способів впорядкування цього конкретного завдання. Я особисто використовую Lusty Emacs як мій апарат для перемикання буфера, оскільки він досить добре обробляє нечітке завершення. Це мінімізує кількість натискань клавіш, необхідних для вибору нового буфера, наприклад, мені потрібен лише тип oxr для переходу на ox-Discover.el , або навіть лише другий раз, оскільки він також відстежує історію комутаторів.


0

Якщо ви хочете просто продовжувати чистити ваші буфери, додайте це до свого файлу init:

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

Вам потрібен пакет прив’язки-ключів, і ви можете змінити прив'язки клавіш на ваше бажання, але я вважав ці вкладки найзручнішими. Перш ніж додати цей фрагмент, вам потрібно буде вимагати прив’язаний ключ,

(require 'bind-key)

0

Я використовую C-Tab та CS-Tab, як загальні програми.

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

-1

У моєму VM Cx ALT-RIGHT / LEFT занадто повільний. Мені доводиться чекати, коли Cx зареєструється в рядку стану, перш ніж я можу зробити щось інше. плюс занадто багато клавіш. Тож я зіставив C-TAB і CM-TAB на наступний і попередній буфер, так як це я роблю в більшості програм Windows. Це легко зробити зсередини emacs: M-xперенесе вас до рядка стану. Потім введіть, global-set-keyякий підкаже вам послідовність ключа, яку ви хочете прив’язати ( C-TAB), а потім для команди, яку ви хочете прив’язати до ( next-buffer). Це воно!


1
Ласкаво просимо. Інші відповіді, схоже, вже охоплюють відображення цих команд на інші клавіші.
Ендрю Сванн

Не зовсім так - всі говорять про те, як змінити конфігураційний файл .emacs. Я розповів, як це зробити з сеансу emacs
SN
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.