Переключение между макетами окон

24

Когда я настраиваю пользовательский макет, а затем просто нужно временно просмотреть один файл в полноэкранном режиме, и как только я хочу вернуть этот макет - мне нужно вручную перекомпоновать его.

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

ОБНОВИТЬ

Спасибо вам всем.

Предложение abo-abo о том, чтобы использовать режим победителя, действительно хорошо, и я заработал его в нулевое время.

Васамаса предложил множество отличных плагинов, о которых я никогда не слышал, и предоставил информацию о том, как использовать регистры.

Джордон Биондо объяснил мне, как использовать регистры, и на самом деле это то, что я хотел, самым простым способом.

Спасибо вам всем.

lukas.pukenis
источник

Ответы:

23

Встроенный способ сделать это с регистрами.

Например, используйте, C-xrwaчтобы сохранить текущую конфигурацию окна, чтобы зарегистрировать.

Тогда вы можете использовать встроенную привязку C-x1для запускаdelete-other-windows

после того, как вы закончите смотреть на один файл, используйте, C-xrjaчтобы вернуться к сохраненной конфигурации окна в реестре a.

Короче:

C-xrwa (сохранить конфигурацию в реестре)

C-x1 (удалить другие окна)

C-xrja (повторно сохранить сохраненную конфигурацию окна)


Хотя я считаю, что регистры громоздки, я использую собственный стек конфигурации окон для управления своими конфигурациями.

У меня есть две привязки, которые помещают текущую конфигурацию в стек, выталкивают и применяют верхнюю конфигурацию.

Итак, в вашем сценарии я бы выполнил привязку push, затем Cx 1, затем выполнил привязку pop.

Вот код:

(defvar winstack-stack '()
  "A Stack holding window configurations.
Use `winstack-push' and
`winstack-pop' to modify it.")

(defun winstack-push()
  "Push the current window configuration onto `winstack-stack'."
  (interactive)
  (if (and (window-configuration-p (first winstack-stack))
         (compare-window-configurations (first winstack-stack) (current-window-configuration)))
      (message "Current config already pushed")
    (progn (push (current-window-configuration) winstack-stack)
           (message (concat "pushed " (number-to-string
                                       (length (window-list (selected-frame)))) " frame config")))))

(defun winstack-pop()
  "Pop the last window configuration off `winstack-stack' and apply it."
  (interactive)
  (if (first winstack-stack)
      (progn (set-window-configuration (pop winstack-stack))
             (message "popped"))
    (message "End of window stack")))

Вы можете привязать winstack-pushк чему - то , как C-cC-uи winstack-popв C-cC-oлегко прыгать.

Джордон Биондо
источник
Это очень, очень, очень приятно!
lukas.pukenis
20

Я использую winner-mode. Вот мои настройки:

(winner-mode)
(global-set-key [f7] 'winner-undo)
(global-set-key [C-f7] 'winner-redo)
(global-set-key [f9] 'delete-other-windows)
(global-set-key [C-f9] 'delete-window)

Я не знаю, есть ли способ добавить макет в закладки или что-то в этом роде, но мне достаточно постоянно переключаться на предыдущий макет.

Або-або
источник
ничего себе, просто возможность вернуться к предыдущему макету очень много для меня. Благодарность!
lukas.pukenis
11

Emacs предлагает регистры для сохранения и применения данных, таких как текущая конфигурация окна, это можно сделать с помощью C-x r wи C-x r j. Однако такой подход становится громоздким, так как вам нужно запомнить регистры окна.

Есть несколько пакетов для улучшения этого. iregister делает эту базовую функцию более понятной и интерактивной. Другие, которые мне известны, используют его без влияния на регистры, такие как elscreen и escreen, которые используют панель заголовка для отображения вкладок. рабочие группы и рабочие группы2 - это два новых и более обширных подхода к этой проблеме. Мне лично это тоже не понравилось, и поэтому я написал свой, который где-то посередине, и, надеюсь, меньше ошибок и сложности.

wasamasa
источник
Это отличная вещь о регистрах, но как мне использовать их в этом случае? Я проверю плагины, которые вы перечислили, чтобы увидеть, удастся ли мне что-нибудь :)
lukas.pukenis
Вы сохраняете свой текущий макет в регистр, вносите некоторые изменения, а затем, как только вы хотите переключиться на его старое состояние, восстанавливаете макет из реестра. Пакеты, которые я перечислил, освобождают вас от необходимости делать это каждый раз, когда вы хотите переключить макеты.
васамаса
Можно ли при запуске создать определенную конфигурацию окна (в моем файле .emacs), а затем сохранить ее в реестре? Я пробовал (window-configuration-to-register "1")в качестве команды в моем .emacs, но это не сработало
вечера
Для этого попробуйте использовать desktop.el, он раньше успешно сочетался с бровями.
Васамаса
2

Вы можете сохранить текущий макет окна в регистр, а затем восстановить его с помощью jump-to-register. Команда window-configuration-to-registerпривязана C-x r wпо умолчанию.

Например, когда ваши окна расположены удобным образом, вы можете сохранить их для регистрации, iиспользуя: C-x r w iи восстановить макет позже C-x r j i.

glucas
источник
1
Ха, трое из нас ответили о регистрах одновременно.
glucas
1

Zygospore позволяет быстро исправить ситуацию, когда у вас открыто несколько окон, и вы хотите временно развернуть одно из них. Это изменяет поведение C-x 1. Когда у вас открыто несколько окон, оно ведет себя как по умолчанию delete-other-windowsи удаляет все окна, кроме того, которое вы просматриваете. Когда вы нажмете его снова, он восстанавливает другие окна.

Режим Winner предоставляет более общее решение, но zygospore отлично подходит для временного увеличения одного окна в кадре. Лучше всего то, что он не использует никаких новых сочетаний клавиш - он C-x 1очень интуитивно понятен, поэтому нет новых привязок, которые нужно изучать.

Тайлер
источник
1

Это интересный вопрос. Несколько лет назад я исследовал все решения. Только workgroups2.el достаточно тяжелый, чтобы покрыть все угловые случаи.

Но рабочие группы2 UI это катастрофа. Например, если вы включите режим рабочей группы (как предложено в README), предыдущий макет будет автоматически загружен во время запуска emacs. Это делает запуск крайне медленным КАЖДЫЙ раз.

Мое решение состоит в том, чтобы рассматривать рабочие группы2 как набор API вместо готового к использованию инструмента. Поэтому я изменяю взаимодействие с пользовательским интерфейсом по умолчанию, используя ivy-mode ( https://github.com/abo-abo/swiper ) с @ abo-abo

введите описание изображения здесь

Переключить полное окно легко, достаточно использовать API из режима победителя.

Вот полный код (я использую только M-x toggle-full-window, M-x wg-create-workgroupи M-x my-wg-switch-workgroupвам также нужно установить swiper, как я уже упоминал выше),

(defun toggle-full-window()
  "Toggle the full view of selected window"
  (interactive)
  ;; @see http://www.gnu.org/software/emacs/manual/html_node/elisp/Splitting-Windows.html
  (if (window-parent)
      (delete-other-windows)
    (winner-undo)))

(setq wg-use-default-session-file nil)
;; don't open last workgroup automatically in `wg-open-session',
;; I only want to check available workgroups! Nothing more.
(setq wg-load-last-workgroup nil)
(setq wg-open-this-wg nil)

;(workgroups-mode 1) ; put this one at the bottom of .emacs
;; by default, the sessions are saved in "~/.emacs_workgroups"
(autoload 'wg-create-workgroup "workgroups2" nil t)

(defun my-wg-switch-workgroup ()
  (interactive)
  (let (group-names selected-group)
    (unless (featurep 'workgroups2)
      (require 'workgroups2))
    (setq group-names
          (mapcar (lambda (group)
                    ;; re-shape list for the ivy-read
                    (cons (wg-workgroup-name group) group))
                  (wg-session-workgroup-list (read (f-read-text (file-truename wg-session-file))))))
    (ivy-read "work groups" group-names
              :action (lambda (group)
                        (wg-find-session-file wg-default-session-file)
                        (wg-switch-to-workgroup group)))))

(eval-after-load 'workgroups2
  '(progn
     ;; make sure wg-create-workgroup always success
     (defadvice wg-create-workgroup (around wg-create-workgroup-hack activate)
       (unless (file-exists-p (wg-get-session-file))
         (wg-reset t)
         (wg-save-session t))

       (unless wg-current-session
         ;; code extracted from `wg-open-session'.
         ;; open session but do NOT load any workgroup.
         (let ((session (read (f-read-text (file-truename wg-session-file)))))
           (setf (wg-session-file-name session) wg-session-file)
           (wg-reset-internal (wg-unpickel-session-parameters session))))
       ad-do-it
       ;; save the session file in real time
       (wg-save-session t))

     (defadvice wg-reset (after wg-reset-hack activate)
       (wg-save-session t))

     ;; I'm fine to to override the original workgroup
     (defadvice wg-unique-workgroup-name-p (around wg-unique-workgroup-name-p-hack activate)
       (setq ad-return-value t))))
чен бен
источник