Переключення між макетами вікон


24

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

Я хотів би, щоб плагін / elisp код врятував мої макети і міг перемикатися між збереженими макетами.

ОНОВЛЕННЯ

Дякую вам всім.

Пропозиція абобо абобо використовувати режим переможця - це дуже приємно, і я працював у нульовий час.

wasamasa запропонував купу чудових плагінів, про які я ніколи не чув і надав інформацію, як користуватися регістрами.

Джордон Біондо пояснив мені, як користуватися регістрами, і цей матеріал - це насправді те, що я хотів найпростішим способом.

Дякую вам всім.

Відповіді:


23

Вбудований спосіб зробити це за допомогою регістрів.

Наприклад, використовуйте C-xrwaдля збереження поточної конфігурації вікна для реєстрації.

Тоді ви можете використовувати вбудовану прив'язку C-x1для запускуdelete-other-windows

після того, як ви переглянете один файл, використовуйте C-xrjaдля повернення до збереженої конфігурації вікна в регістрі a.

Коротко:

C-xrwa (збереження конфігурації в реєстр)

C-x1 (видалити інші вікна)

C-xrja (повторно застосувати збережену конфігурацію вікна)


Я вважаю, що регістри є непростими, хоча я використовую власні стеки конфігурацій вікна для управління своїми конфігураціями.

У мене є два прив'язки, які висувають поточну конфігурацію на стек, а також спливають і застосовують верхню конфігурацію.

Отже, у вашому сценарії я би виконував прив'язку моїх натискань, потім Cx 1, а потім виконував поп-прив'язку.

Ось код:

(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 - це два новіші та обширніші підходи до цієї проблеми. Мені особисто це не подобалося, і тому я написав своє, що десь посеред і, маю надію, менше помилок і складності.


Це чудові речі про регістри, але як я повинен їх використовувати в цьому випадку? Я перевірю ваші перелічені плагіни, щоб побачити, чи є для мене успіх :)
lukas.pukenis

Ви зберігаєте поточний макет до реєстру, вносите деякі зміни, після чого, перейшовши на старий стан, відновіть макет з реєстру. Перелічені вами пакунки позбавляють вас від душевного тягаря робити це кожного разу, коли ви хочете переключити макети.
wasamasa

чи можливо створити певну конфігурацію вікна під час запуску (у моєму файлі .emacs), а потім зберегти її в реєстрі? Я спробував (window-configuration-to-register "1")як команда в моєму .emacs, але це не спрацювало
вечора

Спробуйте використовувати для цього desktop.el, він раніше успішно поєднувався з бровами.
wasamasa

2

Ви можете зберегти поточний макет вікна до реєстру, а потім відновити його за допомогою jump-to-register. Команда за замовчуванням window-configuration-to-registerприв’язана C-x r w.

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


1
Ха, ми троє відповіли про регістри одночасно.
глюкас

1

Zygospore забезпечує швидке виправлення ситуації, коли у вас відкрито кілька вікон, і ви хочете тимчасово максимально використовувати одне з них. Це змінює поведінку C-x 1. Коли у вас відкрито кілька вікон, воно поводиться як за замовчуванням delete-other-windowsі видаляє всі вікна, крім того, яке ви переглядаєте. Якщо ви знову натиснете його, воно відновить інші вікна.

Режим Winner забезпечує більш загальне рішення, але зигоспора чудово підходить для тимчасового збільшення масштабу одного вікна в кадрі. Найкраще те, що він не використовує C-x 1жодних нових прив'язок клавіатури - він переосмислюється дуже інтуїтивно, тому немає нових прив'язок для навчання.


1

Це цікаве питання. Кілька років тому я досліджував усі рішення. Тільки робочі групи2.el мають велику вагу, щоб покрити всі кутові випадки.

Але інтерфейс робочих груп22 - це катастрофа. Наприклад, якщо увімкнути режим робочої групи (як це запропоновано README), попередній макет буде автоматично завантажений під час запуску emacs. Це робить запуск надзвичайно повільним КОЖЕНО.

Моє рішення - розглядати робочі групи2 як колекцію API, а не корисний інструмент поза коробкою. Тож я змінюю його взаємодію з інтерфейсом користувача за замовчуванням, використовуючи режим плюща ( 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))))
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.