2011-10-29 14 views
3

emacs組み込み関数または以前選択したウィンドウに連れて行けるelisp関数が必要です。私は(select-window (get-lru-window))だと思っていましたが、何回か実行すると、ウィンドウ間を行き来するのではなく、それらの間を行き来するように思えます。emacsで以前に選択したウィンドウを選択してください

他のアイデアはありますか?

+0

「選択肢2番目の引数NORECORDがnil以外の場合は、このバッファを最近選択したリストの先頭に置かない」というメッセージが表示されます。 ...しかし、あなたが描いているものから逆に聞こえる... –

+0

私はあなたが(ab)バッファリストを使うことができると思います。何かのようなもの(select-window(バッファーウィンドウ(他のバッファー(現在のバッファー)t))) –

+0

Perfect、@AndersWaldenborg - それはhacktacularですが、私の目的のためにうまくいきます。ありがとう! – tonycpsu

答えて

7

emacsで最近選択されたウィンドウを取得する方法はありません(get-lru-windowによって返された最も古いものとは対照的に)。内部的には、emacsはウィンドウ上でuse_timeを追跡し、get-lru-windowはそれを使って「最も古い」ウィンドウを探します。しかし残念ながらそれはelispで公開されていません。

ウィンドウリストはcyclic window orderingになりますが、あなたのケースでは役に立たないです。

しかし、buffer-listは、もっとも最近から使用されているバッファに順序付けされています(まったく厳密には、バッファを最後に移動するための(埋込みバッファ)関数があります)。

これは、「最近選択されたバッファであった別のウィンドウのバッファに切り替えるにはどうすればよいですか」などの問題に変わることができれば可能であることを意味します。現在除いて(最近使用バッファを取得するために使用されている。ここother-buffer

(defun switch-to-previous-buffer-possibly-creating-new-window() 
    (interactive) 
    (pop-to-buffer (other-buffer (current-buffer) t))) 

(defun switch-to-previous-buffer-in-a-different-window() 
    (interactive) 
    (let* ((otherbuf (other-buffer (current-buffer) t)) 
    (otherwin (get-buffer-window otherbuf))) 
(if otherwin 
    (select-window otherwin) 
    (message "Last buffer (%s) is not currently visible" (buffer-name otherbuf))))) 

たり短くし、より機能豊富:

一つの方法は、このような何かをすることです-バッファ)。これは、他のバッファがもう一方のウィンドウのバッファを返さなくなるため、ウィンドウ内のバッファを切り替えない限り正常に動作するはずですが、現在のウィンドウから切り替えたバッファです。

だからではなく、他のバッファを使用して、バッファ・リスト最適な候補を見つけるために私たち自身を歩くことができます:

(defun switch-to-the-window-that-displays-the-most-recently-selected-buffer() 
    (interactive) 
    (let* ((buflist (buffer-list (selected-frame)))  ; get buffer list in this frames ordered 
    (buflist (delq (current-buffer) buflist))  ; if there are multiple windows showing same buffer. 
    (winlist (mapcar 'get-buffer-window buflist)) ; buf->win 
    (winlist (delq nil winlist))     ; remove non displayed windows 
    (winlist (delq (selected-window) winlist))) ; remove current-window 
(if winlist 
    (select-window (car winlist)) 
    (message "Couldn't find a suitable window to switch to")))) 

は、この情報がお役に立てば幸いです。

+0

すばらしいもの - ありがとう! – tonycpsu

1

最後のウィンドウ切り替えがプログラムによって行われた場合は、以前に選択したウィンドウを選択することができます。

(defun your-function() 
    (interactive) 
    (let ((sw (selected-window))) 
    (do-something-useful-and-switch-window) 
    (select-window sw))) 

最後のウィンドウスイッチは手動で行われた場合、それは、その後スイッチバックするために使用されるウィンドウの選択順序のグローバルリストを更新するコマンドを切り替えるウィンドウをオーバーロードすることが可能であるべきです。

関連する問題