창 레이아웃 간 전환


24

사용자 정의 레이아웃을 구성한 다음 하나의 파일을 전체 화면으로 임시로 살펴보고 해당 레이아웃을 다시 원할 경우 수동으로 리플 로우해야합니다.

레이아웃을 저장하고 저장된 레이아웃을 전환 할 수있는 플러그인 / 코드 코드를 원합니다.

최신 정보

모두 감사합니다.

승자 모드를 사용하는 abo-abo 제안은 정말 좋으며 제로 타임에 작동합니다.

wasamasa 는 내가 들어 본 적이없는 훌륭한 플러그인을 제안하고 레지스터 사용 방법에 대한 정보를 제공했습니다.

Jordon Biondo 는 레지스터를 사용하는 방법을 설명했으며 실제로 가장 간단한 방법으로 원했습니다.

모두 감사합니다.

답변:


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

예 : 현재 창 구성과 이맥스는 이벤트 레지스터를 저장하고 데이터를 적용,이 수행 할 수 있습니다 C-x r wC-x r j. 그러나이 방법은 창 레지스터를 기억해야하기 때문에 다루기 어려워집니다.

이를 개선하기위한 몇 가지 패키지가 있습니다. iregister 는이 기본 기능을보다 검사 가능하고 대화식으로 만듭니다. 내가 알고있는 다른 것들은 헤더 바를 사용하여 탭을 표시하는 엘 스크린escreen 과 같은 레지스터에 영향을 미치지 않고 사용합니다. 작업 그룹작업 그룹 2은이 문제에 대한 두 가지 새로운 접근 방식입니다. 나는 개인적으로 어느 것도 마음에 들지 않았기 때문에 중간에 있고 버그와 복잡성이 적은 내 자신작성했습니다 .


레지스터에 대해서는 좋은 점이지만이 경우 어떻게 사용해야합니까? 나를 위해 어떤 성공 :) 만약 내가 볼 나열된 한 플러그인을 확인합니다
lukas.pukenis

현재 레이아웃을 레지스터에 저장하고 일부 변경을 수행 한 다음 이전 상태로 전환하려면 레지스터에서 레이아웃을 복원하십시오. 내가 열거 한 패키지는 레이아웃을 전환 할 때마다이 작업을 수행해야하는 정신적 부담에서 벗어나게합니다.
wasamasa

시작하는 동안 (내 .emacs 파일에서) 특정 창 구성을 만든 다음 레지스터에 저장할 수 있습니까? (window-configuration-to-register "1")내 .emacs에서 명령으로 시도했지만 작동하지 않았습니다.
오후

이를 위해 desktop.el을 사용해보십시오. 이전에는 눈썹과 성공적으로 결합되었습니다.
일와 사마 사

2

현재 창 레이아웃을 레지스터에 저장 한 다음을 사용하여 복원 할 수 jump-to-register있습니다. 이 명령 window-configuration-to-registerC-x r w기본적으로 바인딩되어 있습니다.

예를 들어, 당신이있을 때 당신의 창은 유용한 방법이 등록기에 저장할 수 있습니다 배열 i: 사용 C-x r w i및 사용 후 레이아웃을 복원 C-x r j i.


1
하, 우리 셋은 동시에 레지스터에 대해 대답했습니다.
glucas

1

Zygospore 는 여러 개의 창이 열려 있고 그 중 하나를 일시적으로 최대화하려는 상황에 대한 빠른 수정 사항을 제공합니다. 의 동작을 수정합니다 C-x 1. 여러 개의 창이 열려 있으면 기본값처럼 작동하며 delete-other-windows보고있는 창을 제외한 모든 창을 제거합니다. 다시 누르면 다른 창으로 복원됩니다.

우승자 모드는보다 일반적인 솔루션을 제공하지만 zygospore는 프레임의 단일 창에서 일시적으로 확대하는 데 유용합니다. 가장 좋은 방법은 새로운 키 바인딩을 사용하지 않는다는 것입니다 C-x 1. 매우 직관적 인 방식으로 재정의 하므로 배울 새로운 바인딩이 없습니다.


1

이것은 흥미로운 질문입니다. 몇 년 전에 모든 솔루션을 조사했습니다. workgroups2.el만이 모든 코너 케이스를 감당할 수있을만큼 무겁습니다.

그러나 작업 그룹 2 UI는 재앙입니다. 예를 들어, README가 제안한대로 worksgroup 모드를 활성화하면 emacs 시작 중에 이전 레이아웃이 자동으로로드됩니다. 이렇게하면 시작 시간이 매우 느려집니다.

내 솔루션은 작업 그룹 2를 사용 가능한 도구 대신 API 모음으로 취급하는 것입니다. @ abo-abo에서 ivy-mode ( https://github.com/abo-abo/swiper )를 사용하여 기본 UI 상호 작용을 변경합니다.

여기에 이미지 설명을 입력하십시오

전체 창 전환은 쉽습니다. 승자 모드의 API를 사용하면 충분합니다.

여기에 완전한 코드가 있습니다 ( 위에서 언급했듯이 M-x toggle-full-window, M-x wg-create-workgroupM-x my-wg-switch-workgroup, 또한 스위퍼를 설치해야합니다),

(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))))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.