창 사이를 빠르게 전환하는 방법?


90

창 사이를 빠르게 전환하려면 어떻게합니까?

나는 종종 여러 개의 창이 열려 있고 그들 사이를 전환해야합니다. 지금, 나는 C-x o내가 원하는 것을 얻는데 사용 합니다. 더 효율적인 워크 플로가 있습니까?


답변:


62

나는 분명히 이것을 위해 에이스 윈도우 를 선호 합니다. 보이는 창과 프레임 사이를 전환 할 수 있습니다. MELPA에 있으며 빠르게 설치할 수 있습니다. 남은 것은 바인딩하는 것입니다.

(global-set-key (kbd "C-x o") 'ace-window)

또는 창 전환은 일반적인 작업이므로 더 짧은 키 코드를 사용할 수도 있습니다.

(global-set-key (kbd "M-p") 'ace-window)

요약 ace-window

의 대체품입니다 other-window. 후자와는 달리 ace-window창을 선택하기 위해 두 번 이상 호출 할 필요가 없습니다. 한 번의 호출에서 원하는 창을 선택합니다 (여러 프레임에 걸쳐 가능).

창 전환 외에도 ace-window더 많은 작업을 수행 할 수 있습니다 (창 삭제 또는 교체 등), README를 참조하십시오 .


2
이건 재미 있네. 나는 글자가 더 발음된다는 것을 제외하고는 거의 똑같은 일을하는 ace-window것을 보았습니다 switch-window. 우리 둘 다 패키지를 가지고있는 것 같습니다.
milkypostman

네가 옳아. 그들 사이에는 작은 차이가 있습니다. 이것은 2000 개의 패키지가있는 저장소가있을 때 직면해야하는 문제입니다. MELPA에 switch-window제출할 때까지는 알지 ace-window못했습니다.
abo-abo

1
덕분에 ace-window다른 패키지보다 사용자 정의가 더 많습니다. 앞으로도 여전히 도움이 될 수있는 것은 스마트 스왑 작업과 유사한 방식으로 기능을 키 바인딩하는 것입니다. 그러나 해당 창을 먹으면 특정 시점에 더 큰 창이 있고 선택한 크기가 더 작아집니다 (먹은 음식) 창). 이 경우, 비율은 1/2, 1/4 또는 1/3이 될 수있는 것으로 결정되어야한다.
박사 학위

4
설명 추가를 고려하십시오. 당신은 단지 당신이 그것을 좋아한다고 말하고 그것에 링크합니다. 이것이 본질적으로 링크 전용 답변이됩니다.
드류

4
에이스 윈도우의 장점은 무엇입니까? 이 페이지에서 제안 된 14 가지 다른 솔루션보다 왜 사용해야합니까?
Gilles

103

한 가지 방법은을 사용하는 것 windmove입니다. 기본 키 바인딩을 사용하면 현재 활성화 된 키 옆에있는 창으로 전환 할 수 있습니다.

Emacs에 내장되어 있으므로 따로 설치할 필요가 없습니다. init 파일에서 다음과 같은 최소 설정으로 활성화하십시오.

(windmove-default-keybindings)

그런 다음 (직관적으로 사용되는 화살표 당신이 이동하는 방향을 정의) 다음 키를 사용하여 이웃 창으로 전환 할 수 있습니다 : S-<left>, S-<right>, S-<up>, S-<down>.


대신 다른 수정자를 사용 shift하려면을에 인수로 제공 할 수 있습니다 windmove-default-keybindings. 예를 들면 다음과 같습니다.

(windmove-default-keybindings 'meta)

또는

(windmove-default-keybindings 'control)

Emacs Wiki 에서 더 많은 정보 .


16
이것은 받아 들여야 할 답변입니다!
rowman

OMG, 왜 튜토리얼에서 Shift + 화살표 키를 사용하여 창 주위를 이동하지 않습니까! 그것보다 훨씬 낫다 ctrl + o
Didier A.

여기에 다른 답변 중 일부에는 여분의 windmove 구성이 포함되어 있다고 말하고 싶습니다. 아마도 (windmove-default-keybindings 'meta)EmacsWiki에서 제안한 것처럼 함수가 수정 자 키를 인수로 받아 들인다는 것을 언급하기 위해 답을 업데이트 할 가치가 있습니다.
metaturso

이것은 다른 키 바인딩 (또는 창 관리자)과 많은 충돌을 일으 킵니다. 나는 에이스 윈도우를 선호합니다.
azzamsa

나는 비슷한 것을 사용하고 있지만 ( ) 와 함께 움직이고Shift-arrow 있지만 분할이 많은 대형 모니터가 있으면 그러한 움직임이 빨리 다루기 어려워집니다. 어떻게 든 창문 / 분할을 열거하는 것이 더 흥미로울 것입니다. 마찬가지로 ace-window, 미만 키 프레스 및 명백한 알고리즘 즉시 당신이 원하는 번호를 알아낼 수 있습니다.
Hi-Angel

21

other-window입력하기 쉬운 키 시퀀스에 바인딩 할 수 있습니다 .

예를 들어, 나는 한 C-.바인딩 other-windowC-,이전 창으로 이동 수밖에.

(global-set-key (kbd "C-.") #'other-window)
(global-set-key (kbd "C-,") #'prev-window)

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

이것은 여러 창을 이동할 때 특히 유용합니다. Control을 누른 상태에서 하나의 버튼 만 누르면 다음 창으로 이동합니다. 한 번에 세 번 누르는 것보다 훨씬 쉽습니다.


2
C-x o에 대한은 other-window"최악의 기본 이맥스 바로 가기"의 제목에 대한 몇 가지 고체 경쟁자 중 하나입니다. 내 솔루션 (zck 유사) 바인딩하는 것이었다 other windowA (방법)에 쉽게 키 시퀀스를 - 나는 바인딩이 C-;(내은 Caps-Lock과 교환되어 Ctrl있으므로 걸리는 모두가 새끼 손가락의 빠른 탭입니다). BTW, 나는 특정 기능에 전적으로 의존 해요 helmicicles(즉, 아니에요 "반 패키지"또는 아무것도); 간단한 해결책이 여기에서 가장 잘 작동한다고 생각합니다.
iceman

2
+1 이것은 허용되는 대답이어야하며 가장 간단한 대답이어야합니다 (아아, StEx에는 아직 존재하지 않습니다). 기본적으로 작동하며 완벽하게 확장되며 기억하기 쉽습니다. 후자는 이맥스 정글에서 특히 중요하다는 것을 알았습니다. 그곳에서 20 년 이상 생존 한 후, 나는 때때로 vi 사막에 숨어 있음을 느낀다.
Andreas Spindler

간단하고 사용하기 쉽고 구현하기 쉽습니다. 투표가 더 필요합니다.
stewSquared

1
이것은 또한 내가하는 일입니다. 에 사용 M-o합니다 other-window. 일부 모드는 이미 M-o바인딩, 특히 diff-mode, ggtag-mode하고 ibuffer-mode. 각 모드 맵에서 수동으로 바인딩을 해제해야합니다. unbind-key에 의해 제공되는 bind-key.el것은 매우 유용합니다.
Yasushi Shoji

나는 또한 사용 M-o하고 , 추가 힘이 필요할 때에 M-O묶여있다 ace-window.
glucas

13

window-numbering.el!

특정 창을 전환하기 위해 핫키 ", 1", ", 2", ", 3"을 할당합니다 (악한 모드를 사용함에 유의하십시오)

또한 모드 줄에 창 번호를 PINK 색상으로 밑줄로 표시합니다.

무시할 수없는 시각적 힌트입니다.

그건 빠른 방법 창을 전환 할 수 있습니다.

https://github.com/redguardtoo/emacs.d/blob/master/lisp/init-evil.elhttps://github.com/redguardtoo/emacs.d/blob/master/lisp/init-modeline을 확인 하십시오. .el 내 설정입니다.

Sylvain Benner는 스페이스 맥에서 내 아이디어를 채택했지만 키 바인딩은 다릅니다 . 따라서 스페이스 맥을 사용하면 가장 빠른 솔루션을 즉시 얻을 수 있습니다.


2
예. 이 개념은 훌륭합니다. 패키지를 window-number사용 M-<num>하여 흑백 창을 빠르게 전환합니다. 이것과 유사한 개념
unperson325680

1
참고 윈도우 numbering.el은 winum 찬성되지 않습니다 이다, 여기 . FOWW에 대한 창 번호는 작동하지 않았습니다.
Hi-Angel

곧 winum으로 전환 할 수 있습니다. 그러나 창 번호 매기기는 여전히 emacs24 / 25 / 26에서 잘 작동합니다.
chen bin

10

추가 애드온을 사용하지 않아도 C-x o선택적 접두사를 계속 사용 하여 많은 창을 건너 뛸 수 있습니다. 예 : C-u 1 C-x o순서대로 다음 창으로 이동합니다 (즉, 일반으로 얻을 수있는 것 C-x o). C-u 2 C-x o두 개의 창으로 넘어 C-u 3 C-x o가고 세 개의 창으로 넘어갑니다.

other-windowdocstring 에서 발췌 (함수 C-x o:

COUNT는 선택하기 전에 선택한 창부터 시작하여 건너 뛸 창 수를 지정합니다. COUNT가 양수이면 앞으로 COUNT 개의 창을 건너 뜁니다. COUNT가 음수이면 -COUNT 개의 창을 뒤로 건너 뜁니다. COUNT 0은 창을 건너 뛰지 않음을 의미하므로 선택한 창을 선택하십시오. 대화식 호출에서 COUNT는 숫자 접두사 인수입니다. nil을 반환합니다.


여러 개의 창이있을 때 어떤 순서로 따르나요?
stsquad

순서는 주기적 창 순서 입니다.
Dan

2
hmm "순서는 프레임의 창 트리의 깊이 우선 순회에 의해 결정되며, 트리의 리프 노드 인 라이브 창을 검색합니다"는 다음 중 어느 창이 다음에 있는지 추측하려고하는 인간의 뇌에 가장 유용한 설명이 아닙니다. 건너 뛰는 횟수 이것이 내가 에이스 창을 사용하는 이유라고 생각합니다.
stsquad

2
@ stsquad : 아, 동의합니다. 제 머리도 회전합니다. 완전성을 기하기 위해이 답변을 여기에 올렸습니다.
Dan

8

어떤 사람들은 편집자 브리프 (Underware라는 회사가 충분히 생산 한)를 기억할 것입니다.

보이는 창 사이를 전환하는 깔끔한 방법이있었습니다. M- 화살표는 화살표 키의 방향에 따라 커서를 창으로 직접 이동시킵니다.

그래서, 매핑 winmove-left, winmove-right, winmove-upwinmove-down에 함수 M-left, M-right, M-upM-down내 이맥스 파일의 키로는 다음을 -

(global-set-key [M-left] 'windmove-left)          ; move to left window
(global-set-key [M-right] 'windmove-right)        ; move to right window
(global-set-key [M-up] 'windmove-up)              ; move to upper window
(global-set-key [M-down] 'windmove-down)          ; move to lower window

이제 구성이 어수선한 지에 관계없이 창 사이를 쉽게 이동할 수 있습니다. 요즘에는 디스플레이 크기에 따라 상당히 어수선해질 수 있습니다 ...


@Francesco의 답변이 다소 그렇습니까?
Dan

동의한다. 게시하기 전에는 알지 못했습니다.
user2542

2
키 바인딩을 얻는 가장 짧은 방법은 (windmove-default-keybindings 'meta)!
Omar

8

당신이 사용하는 경우 차가워 요 다음 C-x o수 있습니다 당신은에 의해 창을 선택 이름 (또는 자전거로)을.

  • 어떤 접두사 인수로, C-x o평소와 같이 동일 other-window프레임이 인 경우에 하나의 창을 가지고 있지 않는 other-frame.

  • 접두사 arg 를 사용하면 이름 또는 사이클별로 창이나 프레임을 탐색 할 수 C-x o있는 다중 명령 이 있습니다. 창을 탐색하려면 다중 명령을 사용합니다 icicle-select-window. 프레임 간 탐색은을 사용합니다 icicle-select-frame.

사용되는 탐색은 접두사 arg에 따라 다릅니다.

  • 접두사 제로 인수 (예 :) C-0: 선택한 프레임에 여러 개의 icicle-select-window창이있는 경우 후보 와 같은 프레임에 창이 있습니다. 그렇지 않으면 (단일 창 프레임), 이것은입니다 icicle-select-frame.

  • C-u: 선택한 프레임에 여러 개의 창이있는 경우 icicle-select-window모든 보이는 프레임의 창을 후보로 사용하는 창입니다 . 그렇지 않으면 이것은입니다 icicle-select-frame.

  • C-u C-u: icicle-select-window, 모든 프레임의 윈도우를 후보 (아이콘 화되거나 숨겨진 프레임 포함)로 사용합니다.

항상 Icicles 에서와 같이 (a) 완성 , 텍스트를 입력하여 일치하는 후보 세트 (이 경우 창 또는 프레임 이름)를 좁히고 (b) 사이클링 (매칭 후보 중)으로 결합 할 수 있습니다.


4

창 사이를 빠르게 이동하려면 키 코드 를 사용하십시오 . 나는 수정 키에 도달하는 것보다 훨씬 빠릅니다 (그리고 내 손의 긴장도 적습니다).

사용할 패키지를 선택 ace-window하면 여러 창을 쉽게 탐색 할 수 있습니다 other-window.

(require 'key-chord)
(key-chord-define-global "xo" 'ace-window)
(key-chord-mode +1)

분명히 당신이 필요 로하는를 사용 key-chord하고 ace-window, 둘 다 melpa에서 사용할 수 있습니다.


2
이것은 @ abo-abo의 대답이 아닌가?
Dan

1
@ Dan은 키 코드를 사용하지 않습니다. 코드에 메타 또는 수퍼 키가 없다는 점에 유의하십시오. ace-window / something을 사용하더라도 약간 관련이 없습니다. 요점은 자주 사용되는 작업에 수정 자 키를 사용하지 않는 답변을 제공하는 것이 었습니다.
Zavior

1
나는 그것을 보았지만 ace-window@ abo-abo의 대답 에서처럼 작업을하고 있기 때문에 질문을 제기했습니다 . 이 맥락에서 사용할 특정 키 바인딩은 대답이 아닌 주석으로 이해하는 것이 더 좋습니다. 내 두 센트.
Dan

@ Dan, 전반적으로 질문은 신속하게 창을 전환하는 것이 었습니다.이 솔루션이 아직 등장하지 않았다고 생각합니다. 그것에 관해서는 대답을 조금 명확히했습니다.
Zavior

@Zavior는 중요한 점을 제기합니다. 문제는 바인딩 형식이 매우 중요한 창을 빠르게 전환하는 것입니다. 선호하는 라이브러리에 관계없이 key-chord접근성이 뛰어난 키 조합을 바인딩 할 수 있습니다. 바인딩의 예 xoC-x o(1 대 2의 깊이) 보다 빠릅니다 . 이 답변은 기능 선택에 대한 다른 답변과 직교한다는 것을 강조하기 위해 다시 쓰여질 수 있습니다 (그리고 ace-window설명 된 방식으로 묶을 수있는 많은 선택 중 하나 일뿐입니다). 이 답변을 명확하게 유지하십시오!
ebpa

3

여기에 좋은 대답이 있습니다. WinMove의 팬이기도하지만 조직 모드가 M을 사용하여 제목을 조작하기 때문에 C에 바인딩합니다.

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

그것이 정말로 좋은 곳은 Hydra 와 결합하면입니다 . Wiki예제에 따라 내 괴물을 만들었습니다.

(defhydra hydra-windows ()
  "C-arrow = switch, S-arrow = size, M-arrow = move"
  ("C-<left>" windmove-left nil)
  ("C-<right>" windmove-right nil)
  ("C-<up>" windmove-up nil)
  ("C-<down>" windmove-down nil)
  ("S-<left>" hydra-move-splitter-left nil)
  ("S-<right>" hydra-move-splitter-right  nil)
  ("S-<up>" hydra-move-splitter-up nil)
  ("S-<down>" hydra-move-splitter-down nil)
  ("M-<left>" buf-move-left nil)
  ("M-<right>" buf-move-right nil)
  ("M-<up>" buf-move-up nil)
  ("M-<down>" buf-move-down nil)
  ("p" previous-buffer "prev-buf")
  ("n" next-buffer "next-buf")
  ("1" delete-other-windows "1")
  ("d" delete-window "del")
  ("k" kill-buffer "kill")
  ("s" save-buffer "save")
  ("u" (progn (winner-undo) (setq this-command 'winner-undo)) "undo")
  ("r" winner-redo "redo")
  ("b" helm-mini "helm-mini" :exit t)
  ("f" helm-find-files "helm-find" :exit t)
  ("|" (lambda () (interactive) (split-window-right) (windmove-right)))
  ("_" (lambda () (interactive) (split-window-below) (windmove-down)))
  ("q" nil "cancel")
  )

(global-set-key (kbd "M-#") 'hydra-windows/body)

이를 통해 창을 변경하고, 크기를 조정하고, 창에서 창으로 버퍼를 이동하고, 버퍼를 순환하고, 버퍼를 종료하고, 승자 모드를 통해 창 구성을 취소 할 수 있으며, 키도 통합합니다. 히드라를 종료하려면 화살표 나 히드라에없는 다른 키를 누르십시오. hydra 예제 에서 "hydra-move"함수를 찾을 수 있습니다 . hydra 의 가장 큰 장점은 모든 키 바인딩과 "modern"을 기억할 필요가 없기 때문에 일단 hydra에 있으면 모든 것이 단일 키로 제공됩니다. 프레스.


1
처음에 언급 한 키 바인딩을 얻는 더 짧은 방법은 (windmove-default-keybindings 'control)입니다.
Omar

1

당신이 사용하는 경우 evil-mode, 당신은 단지와 숫자 접두사를 사용할 수 있습니다 C-w C-w( evil-window-next당신이 원하는 창을 선택하는). 따라서 : 1 C-w C-w첫 번째 창을 주기적으로 3 C-w C-w선택하고 세 번째 창을 주기적으로 선택하는 방식 등입니다.


이것은 다른 답변 과 결합되어야하는 것처럼 보입니다 : 그것은 악한 바인딩과 똑같은 것입니다.
npostavs

1

Ace Jump를 사용하면 어떤 창이나 프레임에 관계없이 화면의 모든 단어를 포인터로 이동할 수 있으므로 Ace 창 또는 스위치 창을 사용하는 것과 크게 다르지 않습니다.

유리창을 뛰어 넘을 때 포인터를 정밀하게 배치 할 수도 있다는 장점이 있습니다.

나는 여전히 약간 성가 시거나 산만 함을 발견하고 windmove더 많이 사용하고 있다는 것을 알았 습니다. 매우 간단하기 때문에 다른 창이나 프레임에서 읽었고 거기의 지점으로 이동하려고 할 때 여전히 Ace Jump를 사용합니다.


1

평소와 같이이 작업을 수행 할 수있는 다양한 방법이 있습니다. 내가 선호하는 방법은 NumberedWindows 입니다. 그런 다음 Super와 키 1-9를 사용하여 다음 키 바인딩을 설정합니다.

(global-set-key (kbd "s-1") (lambda() (interactive) (window-number-select 1)))

오후 코더에서 읽을 수있는 최근 게시물을 사용 하여이 정확한 주제에 대해 좀 더 자세히 설명합니다 .


이것은 chen bin의 답변 과 어떻게 다릅니 까?
Gilles

구성 예가 있습니다.
트래비스

-1

스위치 창 을 시각적으로 대체하기로 결정할 수도 있습니다.C-x o


1
스위치 윈도우의 장점은 무엇입니까? 이 페이지에서 제안 된 14 가지 다른 솔루션보다 왜 사용해야합니까?
Gilles

어떻게해야합니까? Emacs는 대안, 사용자 정의 및 결정의 자유에 관한 것입니다.
csantosb

2
그것은 여기도 거기도 없습니다. 누군가이 특정 대안을 선택하는 이유는 무엇입니까? 왜 switch-window다른 모든 것 보다 사용하기로 결정했을 까요?
Gilles
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.