2つ以上開いているときに2つのウィンドウを切り替える方法


8

シナリオ:複数(2つ以上)のウィンドウを開いています。そのうちの2つと積極的に協力しています。1つのコマンドで、あるウィンドウから別のウィンドウに、またその逆にジャンプするにはどうすればよいですか?

私はエースウィンドウを使います。素晴らしいですが、毎回ウィンドウ番号を押したくありません。next-window/ については知ってprev-windowいますが、これらは2つの異なるコマンドです。

私が探しているのは、別のウィンドウを選択したときに以前のウィンドウが何であったかを記憶し、そのウィンドウに戻るものです。繰り返し呼び出されると、最後の2つのウィンドウを切り替えますAlt- Tabスタイル。

どこを見ますか?


fnプラスキーの矢印キーの1つを使用して、ミニバッファー(アクティブな場合)の内外を含む任意の方向に移動しますwindmove。組み込みのライブラリを参照してください。
弁護士リスト2017年

@lawlist:私はwindmoveについて知っています。私が探しているのは、特にウィンドウ間に他のウィンドウがいくつかある場合は、必要な方向を考えない方法です。
9000年

回答:


6

独自のコマンドを作成する1つの方法は、組み込みget-mru-window関数を使用することです。

例えば:

(defun my-flip-window ()
  (interactive)
  (let ((win  (get-mru-window nil nil t)))
    (when win (select-window win))))

これにより、現在選択されているウィンドウではない、現在のフレームで最も最近使用されたウィンドウが検索されます。

以下は、可視フレーム全体で機能するバリエーションです。

(defun my-flip-window ()
  (interactive)
  (let ((win  (get-mru-window 'visible nil t)))
    (when win
      (select-frame-set-input-focus (window-frame win))
      (select-window win))))

コメントで述べたように、ウィンドウが1つしかない場合(最新のバッファーに切り替える場合)に機能するバリエーションがあります。

(defun flip-window ()
  (interactive)
  (let ((win  (get-mru-window 'visible t t)))
    (if win
        (progn
          (select-frame-set-input-focus (window-frame win))
          (select-window win))
      (mode-line-other-buffer))))

1
ばっちり成功!これは私がまとめたものよりはるかに優れています。で素敵な発見get-mru-window
ダン

1
これを構成に追加してバリエーションを追加しました。フレーム/ウィンドウが1つしかない場合(get-mru-windowはnilを返す)、次にを呼び出しますmode-line-other-buffer。このようにして、どのウィンドウ構成でも2つのバッファー間を行き来する1つのキーがあります。
グルカ2017年

すごい。最後のバリエーション@glucasが大好きです。ありがとうございました。これが私が書いた方法です。それが最善の方法ですか?(defun my-switch-to-previous-window()(interactive)(let((win(get-mru-window nil nil t)))(if win(select-window win)(mode-line-other-buffer ))))
prosoitos

6

を既に使用している場合はace-window、コマンドaw-flip-windowを使用して2つのウィンドウ間を前後に切り替えることができます。デフォルトでは、これはnace-windowにバインドされていますaw-dispatch-alist

つまりn、ウィンドウ番号の代わりにace-windowを押してヒットすると、前のウィンドウに戻ります。aw-flip-window他のキーにバインドすることもできます。

これは、ace-windowで以前に選択されたウィンドウにのみ戻ることに注意してください。他のコマンドでウィンドウを頻繁に切り替える場合は、より一般的な解決策が必要になる場合があります。


4

簡単にテストされた、最後にアクセスしたウィンドウに切り替える簡単なコマンドを次に示します。

(defvar recent-window nil
  "The most recently visited window.")

(defun switch-to-recent-window ()
  "Switch to the most recently visited window, as stored in
`recent-window'."
  (interactive)
  (let ((current (car (window-list))))
    (if recent-window
        (select-window recent-window)
      (message (concat "No recent window selected, "
                       "so I'm setting this window "
                       "as the most recent.")))
    (setq recent-window current)))

ありがとうございました!できます。私がパッケージを作成し、帰属表示をしてもよろしいですか?
9000年

どういたしまして。もちろん、パッケージで自由に使用してください。ただし、コードは(まだ)非常にインテリジェントではないことに注意してください。next-windowまたはなどのコマンドを使用して他のウィンドウに切り替えた場合other-window、その変更はrecent-window変数に反映されません。使用する明らかなフックがないため、この部分を修正するには、他の関数の束全体に対するアドバイスを定義する必要がある場合があります。
ダン

1
私はあなたが使うことができると思いますbuffer-list-update-hook、それはアクティブウィンドウが変わったときに呼び出されます(後select-window)。そのフックは他の場合に呼び出されますが、最後のウィンドウを追跡するために使用できます。
グルカ2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.