Как переключиться на другой буфер из терминального буфера

Я использую emacs в течение нескольких недель, и до сих пор это было здорово - исходить из vim было проще, чем я ожидал (на самом деле - сочетания клавиш emacs кажутся более ... естественными).

Я добавил несколько настроек, например, перемещение между буферами с помощью M-Left/Right/Up/Down, потому что C-x o было немного слишком медленно, когда у меня было одновременно открыто четыре файла.

Все идет нормально :-)

Однако меня беспокоит одна вещь:

  1. Я открываю несколько сплитов с помощью C-x 3 и C-x 2
  2. Я открываю терминал в одном из них с помощью M-x term ENT
  3. Как переключиться на другой разделение с помощью клавиатуры?

Обычные ярлыки явно не работают - терминал перехватывает каждую команду emacs, и мне нужно щелкнуть другой буфер, чтобы активировать его.


person lukaszkorecki    schedule 31.01.2010    source источник
comment
Приняв голосование, спасенный грешник особенно приветствуется в Церкви Emacs.   -  person High Performance Mark    schedule 01.02.2010
comment
Вам следует подумать об использовании iswitch-buffer для изменения буферов, а не использовать несколько окон. Это намного продуктивнее.   -  person Noufal Ibrahim    schedule 01.02.2010
comment
@Noufal - под окнами вы подразумеваете актуальные окна приложений? Терминология Emacs иногда сбивает с толку :-)   -  person lukaszkorecki    schedule 01.02.2010
comment
Окна Emacs - это то, что вы получаете, когда делаете C-x 2 и т. Д. Окна приложений верхнего уровня называются в emacs фреймами.   -  person Noufal Ibrahim    schedule 01.02.2010
comment
@NoufalIbrahim, почему не оба? очень часто для эффективной работы мне нужно видеть два файла или фрагмента кода одновременно, два окна для этого очень хороши. А затем icomplete-mode для переключения буферов (который заменил iswitch-buffer в 24.4: emacswiki.org/emacs/IswitchBuffers)   -  person Aaron Wallentine    schedule 10.03.2018
comment
@lukaszkorecki, не могли бы вы добавить свои настройки для использования M-[left|right|up|down]?   -  person Ramy    schedule 07.01.2020
comment
@ramy Я задал этот вопрос почти 10 лет назад :-) Сейчас я использую пакет ace-window для быстрого перехода между видимыми буферами.   -  person lukaszkorecki    schedule 08.01.2020


Ответы (5)


В режиме термина любая обычная C-x whatever привязка клавиш становится C-c whatever.

person Josh Matthews    schedule 31.01.2010
comment
Это должно получить больше голосов - бывают случаи, когда требуется разница между m-x term и m-x shell - например, с помощью команды watch, чтобы следить за изменением данных (если нет лучшего способа emacs для этого). - person Danny Staple; 03.09.2012
comment
Совершенно верно, моя текущая проблема заключается в том, что я привязал переключение окна к C-f / b / n / p, но когда я в срок, я не могу переключиться! - person Chironex; 05.08.2013
comment
Кто-нибудь знает, почему это так? Почему бы просто не использовать C-x, как обычно (команда stty -a не показывает привязку для C-x). - person tjb; 09.09.2017
comment
Приносим извинения за голос против. Я неправильно прочитал ответ и подумал, что он неправильный. К сожалению, я понял это слишком поздно, и теперь голос против заблокирован. - person protoboolean; 23.03.2019

Я не уверен, что понимаю ваш вопрос. Если вы запустите Mx terminal, большинство ключевых событий отправляется на базовый терминал, поэтому стандартная привязка Cx o и ваша M-Left недоступны в терминале.

Попробуйте использовать M-x shell, чтобы получить оболочку в одном из окон, и установленные вами привязки навигации должны по-прежнему работать.

person Trey Jackson    schedule 31.01.2010
comment
Спасибо - это решило мою проблему. Я не знал, что есть разница между M-x shell и M-x term. - person lukaszkorecki; 01.02.2010

В терморежиме введите C-c b RET, чтобы переключиться на другой буфер.

Это делает то, что обычно делает C-x b RET.

person offby1    schedule 31.01.2010

Это должно помочь заставить C-x b работать. Возможно, вам придется добавить привязки для любых пользовательских команд перемещения.

(add-hook 'term-mode-hook
   (lambda ()
     ;; C-x is the prefix command, rather than C-c
     (term-set-escape-char ?\C-x)
     (define-key term-raw-map "\M-y" 'yank-pop)
     (define-key term-raw-map "\M-w" 'kill-ring-save)))

Кстати, между режимом оболочки и режимом термина есть большая разница. Первый лучше интегрируется с emacs (например, команда cd). Последний является полной эмуляцией терминала и может обрабатывать программы curses. У них обоих есть свое место.

person harpo    schedule 27.02.2010

Для более общего ответа, касающегося окон emacs, вы можете посмотреть windmove, который начал поставляться с Emacs около Emacs 22, я считаю:

;;; Commentary:
;;
;; This package defines a set of routines, windmove-{left,up,right,
;; down}, for selection of windows in a frame geometrically.  For
;; example, `windmove-right' selects the window immediately to the
;; right of the currently-selected one.  This functionality is similar
;; to the window-selection controls of the BRIEF editor of yore.
;;
;; One subtle point is what happens when the window to the right has
;; been split vertically; for example, consider a call to
;; `windmove-right' in this setup:
;;
;;                    -------------
;;                    |      | A  |
;;                    |      |    |
;;                    |      |-----
;;                    | *    |    |    (* is point in the currently
;;                    |      | B  |     selected window)
;;                    |      |    |
;;                    -------------
;;
;; There are (at least) three reasonable things to do:
;; (1) Always move to the window to the right of the top edge of the
;;     selected window; in this case, this policy selects A.
;; (2) Always move to the window to the right of the bottom edge of
;;     the selected window; in this case, this policy selects B.
;; (3) Move to the window to the right of point in the selected
;;     window.  This may select either A or B, depending on the
;;     position of point; in the illustrated example, it would select
;;     B.
;;
;; Similar issues arise for all the movement functions.  Windmove
;; resolves this problem by allowing the user to specify behavior
;; through a prefix argument.  The cases are thus:
;; * if no argument is given to the movement functions, or the
;;   argument given is zero, movement is relative to point;
;; * if a positive argument is given, movement is relative to the top
;;   or left edge of the selected window, depending on whether the
;;   movement is to be horizontal or vertical;
;; * if a negative argument is given, movement is relative to the
;;   bottom or right edge of the selected window, depending on whether
;;   the movement is to be horizontal or vertical.
person Joe Casadonte    schedule 01.02.2010