Как мне перечислить не-ECB окна в Emacs? - PullRequest
3 голосов
/ 08 февраля 2012

я сталкивался суть

(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)))))

сегодня, который меняет содержимое буферов в двух окнах, если есть ровно два окна. Проблема для меня в том, что у меня обычно работает ecb, который создает 1 или более дополнительных окон. Я никогда ничего не делал с elisp, кроме методов настройки, которые я получаю из других мест, и это (надеюсь) простое изменение немного выше моего нынешнего понимания.

Я потратил некоторое время на просмотр информации как о ecb, так и о руководстве по emacs, но не могу найти разумного способа определить, есть ли точно два открытых окна, не относящихся к ecb.

Я также пытался использовать такие вещи, как 'bury-buffer' в окнах ecb, поэтому я мог просто предположить, что они не будут в начале списка, но это был ошибочный подход с самого начала.

Итак, мой вопрос, есть ли способ изменить суть, чтобы он работал с ecb? Я предполагаю, что в окнах ecb есть что-то особенное, но я не смог найти ничего, к чему мог бы получить доступ.

Ответы [ 2 ]

3 голосов
/ 08 февраля 2012

Я также пытался использовать такие вещи, как 'bury-buffer' в окнах ecb, поэтому я мог просто предположить, что они не будут в начале списка, но это был ошибочный подход с самого начала.

Немного хак, но вы можете скрыть окна ECB, вызвать swap-windows и показать их снова, вот так:

(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)))))
1 голос
/ 08 февраля 2012

Я опубликую этот ответ, поскольку я написал / обнаружил его с некоторыми пробами и ошибками. Это не то, о чем я просил, а принятый ответ, но у него есть свои достоинства для других, читающих эту ветку.

(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, и что должно возвращать «следующее окно», эта функция почти всегда является той, что я хочу. Тем не менее, он исключает любую проверку на наличие ошибок и не отвечает на вопрос в том виде, в котором он написан, только мое плохо выраженное намерение.

...