Как да превключите към различен буфер от терминален буфер

Използвам 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 и т.н. Прозорците на приложението от най-високо ниво се наричат ​​Frames в emacs speak.   -  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)


В term-mode всяко обикновено 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

Не съм сигурен, че разбирам въпроса ви. Ако стартирате M-x терминал, повечето от ключовите събития се изпращат към основния терминал, така че стандартното C-x o обвързване и вашето M-Left не са налични в терминала.

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

person Trey Jackson    schedule 31.01.2010
comment
Благодаря - това реши проблема ми. Не знаех, че има разлика между M-x shell и M-x term. - person lukaszkorecki; 01.02.2010

В режим term, въведете 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)))

Между другото, има голяма разлика между shell-mode и term-mode. Първият се интегрира по-добре с 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