2012-02-07 10 views
3

私は限り二つのウィンドウが正確にあるように、2つのウィンドウ内のバッファの内容を入れ替えthis gistEmacsでECB以外のウィンドウを表示するにはどうすればよいですか?

(defun swap-windows() 
"If you have 2 windows, it swaps them." 
(interactive) 
(cond ((not (= (count-windows) 2)) 
     (message "You need exactly 2 windows to do this.")) 
     (t 
     (let* ((w1 (first (window-list))) 
       (w2 (second (window-list))) 
       (b1 (window-buffer w1)) 
       (b2 (window-buffer w2)) 
       (s1 (window-start w1)) 
       (s2 (window-start w2))) 
      (set-window-buffer w1 b2) 
      (set-window-buffer w2 b1) 
      (set-window-start w1 s2) 
      (set-window-start w2 s1))))) 

今日、出くわしました。私の問題は、通常、1つ以上の余分なウィンドウを作成するecbを実行していることです。私は他の場所から得た方法を調整する以外は実際にelispを使って何もしていません。この(うまくいけば)簡単な変更は私の現在の理解よりも少し上です。

私はecb情報とemacsマニュアルの両方を調べていましたが、ちょうど2つのnon-ecbウィンドウが開いているかどうかを判断する合理的な方法は見つかりませんでした。

私はecbウィンドウに 'bury-buffer'のようなものを使ってみましたので、リストの前にはないと思うかもしれませんが、それはまずは​​間違ったアプローチでした。

私の質問は、ecbで動作するように要点を変更する方法はありますか?私はecbの窓について特別なことがあると仮定していますが、私がアクセスできるものは何も見つかりませんでした。

答えて

3

私はまた、ECBの窓に「埋めバッファ」のようなものを使用してみましたので、私はちょうど彼らがリストの先頭にならないと想定できますが、それはそもそも欠陥のあるアプローチでした。

ハックのビットが、あなたがそうのように、swap-windowsを呼び出し、それらを再度示し、ECBのウィンドウを非表示にすることができます:

 
(defun my-swap-windows() 
    (interactive) 
    (ecb-hide-ecb-windows) 
    (swap-windows) 
    (ecb-show-ecb-windows)) 

をちなみに、私は取得するには、この行を追加する必要がありました働く要旨:

 
(require 'cl) 

編集:私はあなたが説明した問題のサイズを変更するウィンドウを見ていなかったが、ECBのウィンドウを無視して、このコードは非ECBの窓を交換する必要があります。私が書いたよう

 
(require 'cl) 

(defun non-ecb-window-list() 
    (remove-if 
    #'(lambda (window) 
     (find (window-buffer window) (ecb-dedicated-special-buffers))) 
    (window-list))) 

(defun count-non-ecb-windows() 
    (length (non-ecb-window-list))) 

(defun swap-windows() 
"If you have 2 windows, it swaps them." 
(interactive) 
(cond ((not (= (count-non-ecb-windows) 2)) 
     (message "You need exactly 2 windows to do this.")) 
     (t 
     (let* ((w1 (first (non-ecb-window-list))) 
       (w2 (second (non-ecb-window-list))) 
       (b1 (window-buffer w1)) 
       (b2 (window-buffer w2)) 
       (s1 (window-start w1)) 
       (s2 (window-start w2))) 
      (set-window-buffer w1 b2) 
      (set-window-buffer w2 b1) 
      (set-window-start w1 s2) 
      (set-window-start w2 s1))))) 
+0

うーん...確かに可能です。最初の赤面で、私のウィンドウのサイズを変更するようです。または、むしろ、隠れていても均等分割が残っていますが、もう一方が縮小して表示されているときに、最初の(?left?)ウィンドウは同じ幅のままです。 – Chris

+0

自分の答えを更新しました。私の言うとおり、ECBウィンドウのサイズは変更されていませんが、新しいコードはおそらくあなたが望むものに近いでしょう。 –

+0

素晴らしいです、ありがとうございます!私はおそらく、私たちは別のバージョンのemacsを使っていると思います(そして正直言って、私が使っているバージョンは何かを完全には分かっていません...私はMac上で、 、私は手を離れて言うことができませんでした)。 – Chris

1

私が先に行くと、この答えを投稿します、/いくつかのより多くの試行錯誤でそれを発見しました。それは私が尋ねたものではなく、受け入れられた答えですが、それはこのスレッドを読んでいる他の人のために独自のメリットがあります。

(defun swap-windows() 
"Swap two windows." 
(interactive) 
(let* ((w1 (selected-window)) 
    (w2 (next-window)) 
    (b1 (window-buffer w1)) 
    (b2 (window-buffer w2)) 
    (s1 (window-start w1)) 
    (s2 (window-start w2))) 
    (set-window-buffer w1 b2) 
    (set-window-buffer w2 b1) 
    (set-window-start w1 s2) 
    (set-window-start w2 s1))) 

私は基本的に常にC-X oが「次のウィンドウ」が返すことになっているものである、に行くかを知るので、この機能は、私が欲しいものはほとんど常にあります。しかし、それはどんな種類のエラーチェックでもなく、書かれたように質問に本当に答えるわけではありません。

+0

もう一つの実験の後に、 'next-window'は必ずしも「C-x o」が私を連れてきたとは限りません。 – Chris

関連する問題