ウィンドウをすばやく切り替える方法は?


90

ウィンドウをすばやく切り替えるにはどうすればよいですか?

私はしばしば複数のウィンドウを開いており、それらを切り替える必要があります。今、私はC-x o私が欲しいものに到達するために使用します。これに利用できるより効率的なワークフローはありますか?


回答:


62

私は明らかにこれのためにace-windowを好む。表示されているウィンドウとフレームを切り替えることができます。MELPAにあり、すぐにインストールできます。あとは、バインドするだけです。

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

または、ウィンドウの切り替えは一般的なタスクであるため、短いキーコードを使用することもできます。

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

の概要 ace-window

これはのドロップイン代替品ですother-window。後者とは異なり、ace-windowウィンドウを選択するために2回以上呼び出す必要はありません。1回の呼び出しで(おそらく複数のフレームにわたって)必要なウィンドウを選択します。

ウィンドウの切り替えに加えて、ace-windowさらに多くのことができます(ウィンドウの削除またはスワップなど)。READMEを参照してください。


2
これは面白い。私は使用ace-windowswitch-windowて、文字がより発音されることを除いて、ほぼ同じことを行うように見えるものを見ました。私たちは両方のパッケージを持っている面白いようです。
ミルキーポストマン

あなたが正しい。それらの間にはわずかな違いしかありません。これは、2000個のパッケージを含むリポジトリがある場合に直面しなければならない問題です。私はMELPA switch-windowに提出ace-windowするまで知りませんでした。
abo-abo

1
おかげでace-window、私が推測する他のパッケージよりも多くのカスタマイズがあります。それでも将来の助けになる可能性があるのは、スマートスワップアクションと同様の方法で、そのウィンドウを食い尽くす機能へのキーバインディングです。アップウィンドウ)。この場合、比率は半分、1/4、または3分の1になるように決定する必要があります。
博士号

4
説明を追加することを検討してください。あなたはそれが好きだと言って、それにリンクします。これは本質的にリンクのみの回答になります。
ドリュー

4
ace-windowの利点は何ですか?このページで提案されている他の14のソリューションで使用する必要があるのはなぜですか?
ジル

103

1つの方法はを使用すること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
これは受け入れられた答えであるはずです!
ロウマン

OMG、ウィンドウ内を移動するためのShift +矢印キーに言及しているチュートリアルがないのはなぜですか。ctrl + oよりもずっと良い
ディディエA.

ここでのその他の回答には、冗長なwindmove構成が含まれていると思います。たとえば(windmove-default-keybindings 'meta)、EmacsWikiで提案されているように、関数が引数として修飾キーを受け入れることを示すために、答えを更新する価値があるでしょう。
メタトゥルソ

これにより、他のキーバインド(またはウィンドウマネージャー)との多くの競合が発生します。私はace-windowが好きです。
azzamsa

私は似たようなものを使用しています(私は一緒に動き回っていますShift-arrowが、あなたがたくさんのスプリットを持つ大きなモニターを持っているとき、そのような動きはすぐに扱いにくくなります。何らかの方法でウィンドウ/分割を列挙する方がより興味深いでしょう。に似てace-windowいますが、キーを押す回数が少なく、必要な数をすぐに把握するための明らかなアルゴリズムがあります。
ハイエンジェル

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キーを押したままにすると、ボタンを1つ押すだけで次のウィンドウに移動できます。これは、1回の移動で3回押すよりもはるかに簡単です。


2
+1 C-x ofor other-windowは、「最悪のデフォルトemacsショートカット」のタイトルに対する数少ない堅実な候補の1つです。私の解決策(zckに似ています)はother window、(方法)簡単なキーシーケンスに再バインドすることでした-私はそれをバインドしていますC-;(そして私のものCaps-Lockと交換されるCtrlので、必要なのは小指をすばやくタップするだけです)。ところで、私はhelmandの特定の機能に完全に依存していますicicles(つまり、「アンチパッケージ」などではありません)。ここでは、単純な解決策が最適に機能すると思います。
アイスマン

2
+1これは受け入れられた答えであり、最も単純な答えでもあるはずです(また、StExにはそのようなものはまだ存在しません)。箱から出してすぐに動作し、完璧にスケーリングし、記憶するのは簡単です。後者は、Emacsジャングルで特に重要だと思いました。そこに生き残った後、20年以上は、時々私は自分自身がyearningly ... VIの砂漠に潜んで見つける
アンドレアス・スピンドラー

シンプルで使いやすく、実装が簡単です。これにはさらに投票が必要です。
stewSquared

1
これも私がやっていることです。に使用M-oother-windowます。いくつかのモードがすでに持っているM-o結合、とりわけdiff-modeggtag-modeibuffer-mode。各モードマップで手動でバインドを解除する必要があります。unbind-keyによって提供されるbind-key.elは非常に便利です。
靖商事

私が使用M-oだけでなく、としているM-Oにバインドされたace-window私は、追加の電力を必要とするときのために。
グルーカス

13

window-numbering.el!

ホットキー "、1"、 "、2"、 "、3"を割り当てて特定のウィンドウを切り替えます(悪モードを使用していることに注意してください)

さらに、モードラインに下線付きのピンク色でウィンドウ番号を表示します。

これは決して無視できない視覚的なヒントですが、

これがウィンドウを切り替える最も簡単な方法です。

https://github.com/redguardtoo/emacs.d/blob/master/lisp/init-evil.elおよびhttps://github.com/redguardtoo/emacs.d/blob/master/lisp/init-modelineを確認してください私の設定では.el

Sylvain Bennerはspacemacsで私の考えを採用しましたが、キーバインドは異なります。したがって、spacemacsを使用すると、すぐに使用できる最速のソリューションが得られます。


2
うん。このコンセプトは素晴らしいです。パッケージを使用window-numberしてM-<num>、b / wウィンドウをすばやく切り替えます。これと似た概念
unperson325680

1
window-numbering.elはここにあるwinumを支持して廃止されることに注意してください。FWIW私のためのウィンドウナンバリングは動作しませんでした。
ハイエンジェル

すぐにウィナムに切り替えるかもしれません。ただし、emacs24 / 25/26でもウィンドウ番号は正常に機能します。
陳ビン

10

追加のアドオンを使用C-x oせずに、オプションのプレフィックスを使用して、その数のウィンドウをスキップできます。たとえばC-u 1 C-x o、次のウィンドウ(つまり、plainで取得するものC-x o)にC-u 2 C-x o移動し、2ウィンドウ上にC-u 3 C-x o移動し、3ウィンドウ上に移動します。

other-windowdocstring からの抜粋(以下によって呼び出される関数C-x o

COUNTは、選択する前に、選択したウィンドウからスキップするウィンドウの数を指定します。COUNTが正の場合、COUNTウィンドウを前方にスキップします。COUNTが負の場合、-COUNTウィンドウを後方にスキップします。COUNTゼロは、ウィンドウをスキップしないことを意味するため、選択したウィンドウを選択します。対話式呼び出しでは、COUNTは数値のプレフィックス引数です。nilを返します。


複数のウィンドウがある場合、どの順序に従いますか?
stsquad 14年

順序は、循環ウィンドウ順序です。
ダン

2
hmm「順序は、フレームのウィンドウツリーの深さ優先走査によって決定され、ツリーのリーフノードであるライブウィンドウを取得する」は、次のウィンドウを推測しようとする人間の脳にとって最も役立つ説明ではありませんスキップする数。これが私がace-windowを使用する理由だと思います。
stsquad 14年

2
@stsquad:ああ、私はあなたに同意します-それは私の頭も回転させます。完全を期すために、この回答をここに掲載します。
ダン

8

一部の人々は、エディターブリーフを覚えているかもしれません(おもしろいことにUnderwareと呼ばれる会社によって作成されました)。

目に見えるウィンドウを切り替えるきちんとした方法がありました。M-arrowは、矢印キーの方向に合わせてカーソルを直接ウィンドウに移動します。

だから、私はマッピングされwinmove-leftwinmove-rightwinmove-upwinmove-downに機能をM-leftM-rightM-upM-down私の.emacsファイルに次のようにキーを-

(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の答えではないでしょうか?
ダン

同意する。私は私の投稿する前に気づかなかった。
user2542 14年

2
これらのキーバインドを取得するはるかに短い方法は(windmove-default-keybindings 'meta)
オマー

8

あなたが使用している場合はつららをその後、C-x oあなたがして、Windowsを選択することができます名前(またはサイクルによって)。

  • 接頭辞arg C-x oother-windowない場合は、フレームにウィンドウが1つしかない場合を除き、通常と同じですother-frame

  • 前置引数では、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の答えではないでしょうか?
ダン

1
@Danはキーコードを使用していません。コードにメタキーまたはスーパーキーがないことに注意してください。ace-window /他の何かを使用するかどうかは少し無関係です。ポイントは、非常に一般的に使用される操作に修飾キーを使用しない答えを与えることでした。
ザビエル14年

1
私はそれを見ましたが、ace-window@ abo-aboの答えのように仕事をしているので、私は質問を提起しました。この文脈では、使用する特定のキーバインドは、答えではなくコメントとしてより意味があると思います。ちょうど私の2セント。
ダン

@Dan、全体的にはウィンドウをすばやく切り替えることについての質問でしたが、この解決策はまだ出されていないと思います。それに関して少し答えを明確にしました。
ザビエル14年

@Zaviorは重要なポイントを提起します。問題は、ウィンドウをすばやく切り替えることです。そのためには、バインディングの形式が非常に重要です。好みのライブラリに関係なく、key-chord非常にアクセスしやすいキーの組み合わせをバインドできます。のバインド例 xoは、C-x o(1対2の深さ)より高速です。この答えは、答えが関数選択に関する他の答えと直交していることを強調するために言い換えることができます(そしてace-window、説明された方法でバインドできる多くの選択肢の1つにすぎません)。この答えは明確にしてください!
-ebpa

3

ここでいくつかの良い答えは、私はWinMoveのファンでもありますが、org-modeは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の素晴らしいところは、すべてのキーバインドと「modeful」を覚える必要がないため、hydraにアクセスすると、すべてが単一のキーとして利用できることです。押す。


1
最初に言及したキーバインドを取得するより短い方法は(windmove-default-keybindings 'control)です。
オマー

1

を使用する場合はevil-modeC-w C-wevil-window-next)で数字のプレフィックスを使用して、必要なウィンドウを選択できます。したがって1 C-w C-w、最初のウィンドウを循環順に3 C-w C-w選択し、3番目のウィンドウを循環順に選択する、などです。


これは、他の答えと組み合わせる必要があるように思われます。それは同じことであり、悪に固有のバインディングがあります。
npostavs

1

Ace Jumpを使用すると、ウィンドウやフレームに関係なく、画面上のすべての単語にポインターを移動できるため、Ace WindowやSwitch Windowを使用する場合とそれほど変わりません。

利点は、ウィンドウをジャンプしている間、ポインタをある程度の精度で配置できることです。

私はまだそれが少し面倒または気が散ることがあり、windmove非常にシンプルであるため、もっと使用していますが、別のウィンドウまたはフレームで読んでいてその場所に移動したいときはAce Jumpを使用します。


1

いつものように、これを達成するための100の異なる方法があります。私の好ましい方法は、NumberedWindowsを使用することです。次に、スーパーとキー1〜9を使用して次のキーバインドを設定します。

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

この正確なテーマについては、Afternoon Coderで読むことができる最近の私の投稿でもう少し詳しく説明します。


これはchen binの答えとどう違うのですか?
ジル

設定例があります。
トラビス

-1

また、スイッチウィンドウを視覚的な代替として使用することもできます。C-x o


1
切り替えウィンドウの利点は何ですか?このページで提案されている他の14のソリューションで使用する必要があるのはなぜですか?
ジル

どのように言うべきですか?Emacsは、選択肢、カスタマイズ、決定の自由がすべてです。
csantosb

2
それはここでもそこでもありません。なぜ誰かがこの特定の選択肢を選ぶのでしょうか?switch-window他のすべてを使用することに決めたのはなぜですか?
ジル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.