Как быстро переключать буферы?


68

В ванильном Emacs, я должен сделать, C-x bа затем вручную введите имя буфера для переключения. Если я забуду название буфера, я должен нажать TABна список возможных завершений. Что я могу сделать, чтобы ускорить этот процесс?


10
Это должно быть отмечено сообществом Wiki. Но в Emacs уже есть гигантская вики. Например, мой лучший результат Google - это страница о переключении буферов . Вопросы в стиле CW, на мой взгляд, особенно неуместны в emacs.SE.
purple_arrows

1
Мне нравится использовать C-x C-<left/right>для быстрого переключения буферов. При необходимости переключения на «более дальний» буфер я использую IBuffer.
Куануи

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


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

Ответы:


50

Есть режим ido, который должен помочь.

РЕДАКТИРОВАТЬ:

поместите это в файл инициализации, чтобы активировать режим ido по умолчанию:

(ido-mode 1)

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

Поместите это в файл инициализации, если вы предпочитаете, чтобы элементы отображались вертикально:

(setq ido-separator "\n")

Предоставлено ergoemacs

Позвольте мне также предложить этот пост, говорящий о переключении на предыдущий / следующий буфер.


2
Вероятно, мы должны попытаться получить большую часть важной информации в этом посте в ответ на этот вопрос. Таким образом, будущие пользователи не будут преследовать ссылки на возможно мертвые сайты.
nixeagle

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

Я проголосовал за вашу, поскольку она завершена сейчас, но я подожду несколько дней, прежде чем согласиться, если другие придут с другими или более лучшими ответами. Спасибо!
nixeagle

@ nixeagle это ничего!
Nsukami _

1
@nixeagle ты нашел лучший ответ?
Emacs User

44

Я недавно начал использовать C-x <left>и C-x <right>. Это обе стандартные привязки Emacs - ничего настраивать. Слева вы вернетесь к предыдущему буферу (изначально так же, как C-x b RET), но при повторном выполнении вы вернетесь к третьему последнему посещенному буферу. Если вы часто переключаетесь между 3 или 4 буферами, я нахожу это намного проще, чем пытаться запомнить имена буферов.

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


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

Cx C- <слева> и Cx C- <справа> за победу! Раньше у меня был предыдущий / следующий буфер, привязанный к CS- <left> / <right>. Но почему-то я нахожу, что печатать Cx C-left еще проще, чем использовать два мета-ключа. CS неловко нажимать.
Дидье А.

Приятно! Я выучил эти привязки неделю назад, подумал, какие они классные, а потом забыл, что они собой представляют. Не мог найти их в сети в течение недели, до сих пор. Спасибо!
Кирилл Юнусов

41

Вы могли бы использовать шлем .

В моей настройке я переключился C-x bна M-l. Это связано с тем helm-buffers-list, что делает процесс довольно быстрым, по крайней мере, для меня.


Это в основном лучший ответ сейчас. Конечно, вы все еще можете использовать idoили iswitchbили icicles, и тому подобное, но они в основном устарели от Хелма. Да, ace-jump-bufferэто круто, но это не так быстро, как у Хелма, потому что прежде чем вы знаете, какую клавишу нажимать, вы должны найти буфер в списке. Helm позволяет сузить список несколькими нажатиями клавиш, которые вы уже знаете (например, имя буфера). Я использую C-TABдля переключения буферов, загрузки последних файлов, закладок и т. Д. Нет ничего быстрее.
Блюджей

4
+1 за helm. Но я предпочитаю использовать helm-mini, который также показывает Recentfв helm-buffers-list.
Joon

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(from 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-left и Cx C-right, который позволяет вам старый C, и просто повторяю нажатие x-left и x-right. Что не так уж плохо по умолчанию.
Дидье А.

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 доступен.
Том

8

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


6

Другие обсуждали пакеты, которые полезны для облегчения жизни в отношении переключения буфера / окна / фрейма. (Лично я использую helmэто феноменально.) Я хочу обсудить более простые изменения, которые могут сделать процесс Emacs более приятным.

Для меня решение моих проблем с буфером / фреймом (потому что я думаю, что C-x oэто худшее) не было пакетом; это было просто

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

Я также подумал, что поделюсь несколькими мыслями о привязках клавиш, которые новички могут найти полезными. (Извините, если это не то место.) У меня нет конкретных предложений, а есть «философия», которая позволяет мне поддерживать эффективный набор комбинаций клавиш для себя.

  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)

Буфер НЕ Окно (Кадр)! Не путайте их!
Куануи

2
И окно не рама. Независимо от того, windmove.elнаходится на странице EmacsWiki «Переключение буферов», плюс bs.elработает на буферах, а не окнах.
Джо

Я уточнил, что делает Windmove.
Джо

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

Вообще говоря, есть 2 способа переключения буферов, и большинство решений попадают в один из них.

  1. Использование мини буфера

Это то, что C-x bделает по умолчанию. Ido дает вам хорошее автозаполнение, так что вам не нужно так много вкладывать TAB TAB TAB. Такие проекты, как helm, projectile и т. Д., Облегчают эту задачу, давая вам возможность работать с файлами в проекте и т. Д., И вместе с ido они могут быть весьма полезны.

  1. Весь буфер со всеми элементами в списке.

Это полезно, когда у вас так много буферов, и вы хотите получить список их всех. Вы можете перейти вверх и вниз по буферу и нажать клавишу ввода, чтобы перейти к определенному файлу. Ибуффер довольно хорош для этого.

Я использую оба, и вот как вы можете настроить его.

 (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. Привязать режим Dired к 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 -карт .el или даже просто o во второй раз, так как он также отслеживает историю переключений.


0

Если вы хотите просто продолжать чистить свои буферы, добавьте это в ваш файл инициализации:

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

Вам нужен пакет привязки клавиш , и вы можете изменить привязку клавиш по своему желанию, но я нашел эти сочетания клавиш наиболее удобными. Перед добавлением этого фрагмента вам необходимо указать bind-key,

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

0

Это не очень элегантное решение (поскольку оно использует макросы вместо функций), и оно не объясняет, как быстро перейти к любому буферу, а только как перейти к буферам, которые использовались недавно. Но это работает очень хорошо для меня:

У меня есть серия макросов, которые используются ido-switch-bufferдля перехода к предыдущему буферу, буферу до этого, буферу до этого и т. Д. И я связал эти макросы с привязками клавиш, которые я считаю удобными.

Чтобы перейти к последнему буферу:

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

Чтобы перейти к предпоследнему буферу:

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

Чтобы перейти к предпоследнему буферу:

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

И т. Д. (Вы можете объявить столько, ?\C-nсколько захотите, чтобы вернуться к истории посещенных буферов, сколько захотите).

Существует встроенная функция для перехода к предыдущему буферу, но преимущество использования макросов в ido-switch-bufferтом, что вы можете настроить переменную ido-ignore-buffersдля удаления специальных буферов, таких как *Messages*или *scratch*любой другой нежелательный буфер, из списка. Таким образом, единственные буферы, к которым вы переходите, - это те, к которым вы действительно заинтересованы.


-1

На моей виртуальной машине Cx ALT-RIGHT / LEFT слишком медленный. Я должен ждать Cx, чтобы зарегистрироваться в строке состояния, прежде чем я смогу сделать что-нибудь еще. плюс его слишком много ключей. Поэтому я сопоставил C-TAB и CM-TAB с буфером next и prev, так как это то, что я делаю в большинстве программ 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.