Emacs, перейти в предыдущее окно


Ответы:


88

Это было бы C-- C-x o

Другими словами, C-x oс аргументом -1. Вы можете указать, сколько окон нужно переместить, вставив числовой аргумент между C-uкомандой и, как в C-u 2 C-x o. ( C--это ярлык для C-u - 1)


И вы можете использовать C-x zдля повторения последней команды для быстрого переключения окон.
Иван Хуанг

105

Вы также можете попробовать использовать windmove, который позволяет перейти к выбранному вами окну на основе геометрии. В моем файле .emacs есть следующее, чтобы менять окна с помощью клавиши со стрелкой Cx.

(global-set-key (kbd "C-x <up>") 'windmove-up)
(global-set-key (kbd "C-x <down>") 'windmove-down)
(global-set-key (kbd "C-x <right>") 'windmove-right)
(global-set-key (kbd "C-x <left>") 'windmove-left)

11
Обратите внимание, что вызов (windmove-default-keybindings)привязывает эти функции к SHIFT + вверх / вниз / влево / вправо, что, на мой взгляд, более удобно, чем ваши C-xпривязки (которые конфликтуют с также полезными привязками по умолчанию для previous-bufferи next-buffer. Lkahtz: (kbd)функция позволяет вам указывать ключи в строковой нотации в более удобочитаемом синтаксисе, который также используется Emacs, когда вы используете C-h kили C-h cдля описания привязки.
phils

4
Я не одобряю использование клавиш со стрелками. Но я все равно проголосовал за помощь. : smug:
Бьорн

2
@phils SHIFT + <keys> вмешивается в выбор сдвига, который включен по умолчанию в Emacs 23 (режим выбора-сдвига).
legends2k

2
legends2k: Верно; хотя вы также можете передать аргумент, чтобы windmove-default-keybindingsуказать другой модификатор, который будет использоваться вместе с клавишами со стрелками; так что эта функция все еще может быть удобна для людей, которые используют режим выбора-сдвига.
phils

1
@phils Согласен, мета кажется хорошей альтернативой; как показано в Emacs Wiki .
legends2k

30

Лично я предпочитаю использовать window-number.el

Чтобы выбрать другое окно, используйте Ctrl- x, Ctrl- j n

Где n - номер окна, модельная строка каждого окна показывает его номер, как показано на снимке экрана.

Просто загрузите window-number.el , поместите его в свой путь загрузки emacs и используйте следующее в своем.emacs

 (autoload 'window-number-mode "window-number"
   "A global minor mode that enables selection of windows according to
 numbers with the C-x C-j prefix.  Another mode,
 `window-number-meta-mode' enables the use of the M- prefix."
   t)

Есть еще один похожий режим, switch-window.elкоторый выдает большие числа в окнах ... (нажатие числа переключает окно и меняет отображение.)


(источник: tapoueh.org )


2
Хорошо, но я бы посоветовал не привязывать что-либо к C-x C-j, так как это привязка по умолчанию для dired-jumpif you (require 'dired-x). (Посмотрим M-x customize-group RET dired-keys RET, хотите ли вы это изменить.)
Филс

1
После публикации я решил switch-window.elпопробовать, C-x oвместо этого он использует , а когда активны только два окна, он просто выбирает другое окно. Я думаю, что разумнее всего C-x oбыло бы повторить window-numberтрюк, вы совершенно правы dired-jump. Лично я меньше переключаюсь между окнами и C-x bсам пользуюсь , но наличие улучшенного C-x oдовольно приятно.
ocodo

вау потрясающая тема Emacs на первом скриншоте. как я могу это получить?
semente

@semente на моей странице, связанной с Emacs jasonm23.github.com/EmacsFodder/Emacs/2012/06/29/…
ocodo

1
@petrux emacsfodder.github.io/blog/two-new-emacs24-themes Я думаю, что это, вероятно, одна из двух тем. - кстати. Для крутого режима попробуйте gist.github.com/jasonm23/8554119
ocodo

13

Если вы много работаете с несколькими окнами emacs (> 3) и хотите сохранить несколько нажатий клавиш, добавьте это в свой файл инициализации, и вам будет лучше:

(defun frame-bck()
  (interactive)
  (other-window-or-frame -1)
)
(define-key (current-global-map) (kbd "M-o") 'other-window-or-frame)
(define-key (current-global-map) (kbd "M-O") 'frame-bck)

Теперь просто быстро переключайтесь между окнами с помощью Mo


1
Это именно то решение, которое мне было нужно. Все, что я хотел, это чтобы команда переключения окон была однократным повторяющимся нажатием клавиши. Спасибо! Мне пришлось изменить другое окно или фрейм на другое окно, чтобы оно заработало, к вашему сведению. Я использую Emacs 24.2.1.
Джефф

Я думаю, что это очень хорошие привязки (особенно когда у вас 2+ окна), спасибо. Как уже было сказано, нужно изменить, чтобы other-windowон работал.
долзенко 08

11

Здесь есть несколько очень хороших и полных ответов, но, чтобы ответить на вопрос в минималистской манере:

 (defun prev-window ()
   (interactive)
   (other-window -1))

 (define-key global-map (kbd "C-x p") 'prev-window)

2
Я не знаю с каких пор, но emacs уже previous-windowвстроен.
Arne

@Arne Это не вызываемая функция, M-xпоэтому она должна служить другой цели.
Иван Хуанг

4

Основано на идее @Nate, но немного изменено для поддержки обратного переключения между окнами

;; Windows Cycling
(defun windmove-up-cycle()
  (interactive)
  (condition-case nil (windmove-up)
    (error (condition-case nil (windmove-down)
         (error (condition-case nil (windmove-right) (error (condition-case nil (windmove-left) (error (windmove-up))))))))))

(defun windmove-down-cycle()
  (interactive)
  (condition-case nil (windmove-down)
    (error (condition-case nil (windmove-up)
         (error (condition-case nil (windmove-left) (error (condition-case nil (windmove-right) (error (windmove-down))))))))))

(defun windmove-right-cycle()
  (interactive)
  (condition-case nil (windmove-right)
    (error (condition-case nil (windmove-left)
         (error (condition-case nil (windmove-up) (error (condition-case nil (windmove-down) (error (windmove-right))))))))))

(defun windmove-left-cycle()
  (interactive)
  (condition-case nil (windmove-left)
    (error (condition-case nil (windmove-right)
         (error (condition-case nil (windmove-down) (error (condition-case nil (windmove-up) (error (windmove-left))))))))))

(global-set-key (kbd "C-x <up>") 'windmove-up-cycle)
(global-set-key (kbd "C-x <down>") 'windmove-down-cycle)
(global-set-key (kbd "C-x <right>") 'windmove-right-cycle)
(global-set-key (kbd "C-x <left>") 'windmove-left-cycle)

4

Просто чтобы добавить к ответам @Nate, @aspirin и @ Troydm, я считаю, что это очень полезное дополнение, если вы решите привязать команды windmove к любой выбранной вами комбинации клавиш:

(setq windmove-wrap-around t)

В конфигурации по умолчанию вы получите сообщение об ошибке, когда попытаетесь перейти к несуществующему окну, которое через некоторое время станет раздражающим. Однако, когда установлен windmove-wrap-around, то при попытке отойти от нижней части кадра, например, вместо этого будет выбрано самое верхнее окно в кадре. Это может быть для вас более интуитивным поведением.


4

M-nи M-pимеет для меня наибольший смысл, поскольку они аналогичны C-n( next-line ) и C-p( previous-line ):

(define-key global-map (kbd "M-p") 'previous-multiframe-window)
(define-key global-map (kbd "M-n") 'other-window)

(вдохновленный на это и что )


Я проголосовал за и использовал эту конфигурацию. Проблема в том, что M-nи M-pуже используются в терминалах (gdb, python, ielm и т. Д.), Поэтому вам придется вернуться к другому методу для выхода из буфера терминала.
mihai

Для чего они используются в этих средах?
tshepang

Это лучшее, что я видел на данный момент, он не идет вразрез с другими вещами и работает как шарм! Спасибо!
Aurelien 07

2

Ссылаясь на ответ Ната, я заменил arrow keysиспользовать традиционный pдля выезда up, nдля выезда down, fдля выезда rightи bдля выезда left. Я также заменил Ctrlс Superключом , как C-p, C-n, C-f and C-bэто клавиши перемещения по умолчанию. Эта комбинация с Mпозволяет вам переходить по символам и строкам вместо того, чтобы переходить по одному после каждого нажатия клавиши. Таким образом, Superключ был лучшим выбором, чтобы упростить привязку клавиш. Кроме того, теперь вам больше не нужно убирать руку с домашнего ряда!

(global-set-key (kbd "s-p") `windmove-up)
(global-set-key (kbd "s-n") `windmove-down)
(global-set-key (kbd "s-f") `windmove-right)
(global-set-key (kbd "s-b") `windmove-left)

Надеюсь, поможет!


2
(global-unset-key (kbd "M-j"))
(global-unset-key (kbd "M-k"))
(global-set-key (kbd "M-j") (lambda () (interactive) (other-window 1)))
(global-set-key (kbd "M-k") (lambda () (interactive) (other-window -1)))

altjи altkбудет циклически перебирать ваши видимые буферы. Точнее, вперед и назад.


Mk - полезный ярлык. любые другие альтернативы?
A_P

1

Уже существует пакет, который позволяет переключать окна с помощью M-. проверьте этот сайт . Добавьте это в свой файл инициализации:

(require 'windmove)
(windmove-default-keybindings 'meta) ;; or use 'super to use windows key instead alt

0
(global-set-key (kbd "C-x a") 'ace-swap-window)  
(global-set-key (kbd "C-x q") 'ace-select-window)

download ace-window from the melpa repo if you don't know how to do that
put this in your .emacs file if you don't have one create it 

(package-initialize)                                                                                                                                                                     

(require 'package)                                                                                                                                                                       
(add-to-list 'package-archives '("melpa" , "http://melpa.org/packages/"))                                                                                                                

(package-initialize) 

then "m-x list-packages"
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.