สลับไปมาระหว่างเค้าโครงหน้าต่าง


24

เมื่อฉันกำหนดค่าเลย์เอาต์ที่กำหนดเองจากนั้นเพียงแค่ต้องดูชั่วคราวในไฟล์เดียวแบบเต็มหน้าจอและเมื่อฉันต้องการเลย์เอาต์นั้นกลับมา - ฉันต้องทำการรีโฟลด้วยตนเอง

ฉันต้องการรหัสปลั๊กอิน / elisp เพื่อบันทึกเลย์เอาต์ของฉันและสามารถสลับไปมาระหว่างเลย์เอาต์ที่บันทึกไว้ได้

UPDATE

ขอบคุณทุกคน.

ข้อเสนอแนะabo-abo ที่จะใช้โหมดผู้ชนะเป็นสิ่งที่ดีจริงๆและฉันได้รับมันทำงานในเวลาศูนย์

wasamasaแนะนำปลั๊กอินที่ยอดเยี่ยมมากมายที่ฉันไม่เคยได้ยินและให้ข้อมูลวิธีใช้รีจิสเตอร์

Jordon Biondoอธิบายให้ฉันทราบถึงวิธีการใช้รีจิสเตอร์และสิ่งนี้เป็นสิ่งที่ฉันต้องการในวิธีที่ง่ายที่สุด

ขอบคุณทุกคน.

คำตอบ:


23

สิ่งที่ต้องทำในตัวคือการลงทะเบียน

ตัวอย่างเช่นใช้C-xrwaเพื่อบันทึกการกำหนดค่าหน้าต่างปัจจุบันเพื่อลงทะเบียน

จากนั้นคุณสามารถใช้ตัวเชื่อมโยงC-x1เพื่อเรียกใช้delete-other-windows

หลังจากที่คุณดูไฟล์เดียวเสร็จแล้วให้ใช้C-xrjaเพื่อย้อนกลับไปยังการกำหนดค่าหน้าต่างที่บันทึกไว้ในการลงทะเบียน

ในระยะสั้น:

C-xrwa (บันทึกการกำหนดค่าลงในการลงทะเบียน)

C-x1 (ลบหน้าต่างอื่น ๆ )

C-xrja (ใช้การกำหนดค่าหน้าต่างที่บันทึกใหม่)


ฉันพบว่าการลงทะเบียนไม่สะดวก แต่ฉันใช้ stack window config ที่กำหนดเองเพื่อจัดการ config ของฉัน

ฉันมีสองการเชื่อมโยงที่ผลักดันการตั้งค่าปัจจุบันลงบนสแต็กและป๊อปและใช้การตั้งค่าด้านบน

ดังนั้นในฉากของคุณฉันจะแสดงการเชื่อมต่อแบบกดแล้ว 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ซึ่งใช้แถบส่วนหัวเพื่อแสดงแท็บ workgroupsและworkgroups2เป็นสองวิธีที่ใหม่กว่าและกว้างขวางกว่าในการแก้ไขปัญหานี้ ฉันเองก็ไม่ชอบและก็เขียนของตัวเองที่อยู่ระหว่างและหวังว่าจะมีข้อบกพร่องและความซับซ้อนน้อยลง


นั่นเป็นสิ่งที่ยอดเยี่ยมเกี่ยวกับการลงทะเบียน แต่ฉันจะใช้มันในกรณีนี้ได้อย่างไร ฉันจะตรวจสอบปลั๊กอินที่คุณระบุไว้เพื่อดูว่าประสบความสำเร็จสำหรับฉันหรือไม่ :)
lukas.pukenis

คุณบันทึกเค้าโครงปัจจุบันของคุณเป็นการลงทะเบียนทำการเปลี่ยนแปลงบางอย่างจากนั้นเมื่อคุณต้องการเปลี่ยนเป็นสถานะเดิมให้เรียกคืนเค้าโครงจากการลงทะเบียน แพ็คเกจที่ฉันระบุไว้ช่วยยกภาระของคุณในการทำสิ่งนี้ทุกครั้งที่คุณต้องการเปลี่ยนเลย์เอาต์
wasamasa

เป็นไปได้หรือไม่ที่จะสร้างการกำหนดค่าหน้าต่างบางอย่างในระหว่างการเริ่มต้น (ในไฟล์. emacs ของฉัน) แล้วบันทึกลงทะเบียน? ฉันพยายาม(window-configuration-to-register "1")เป็นคำสั่งใน. emacs ของฉัน แต่มันไม่ทำงาน
pm

ลองใช้ desktop.el สำหรับสิ่งนั้นมันได้รับการรวมกันอย่างประสบความสำเร็จกับคิ้วก่อน
wasamasa

2

jump-to-registerคุณสามารถบันทึกรูปแบบหน้าต่างปัจจุบันลงทะเบียนแล้วเรียกคืนได้โดยใช้ คำสั่งwindow-configuration-to-registerถูกผูกไว้C-x r wโดยค่าเริ่มต้น

ตัวอย่างเช่นเมื่อคุณได้หน้าต่างของคุณจัดอยู่ในวิธีที่มีประโยชน์ที่คุณสามารถบันทึกไว้ใน registe iโดยใช้: และเรียกคืนรูปแบบในภายหลังโดยใช้C-x r w iC-x r j i


1
ฮาเราสามคนตอบเรื่องการลงทะเบียนในเวลาเดียวกัน
ลูกัส

1

Zygosporeจัดเตรียมการแก้ไขอย่างรวดเร็วสำหรับสถานการณ์ที่คุณเปิดหลายหน้าต่างและต้องการเพิ่มหนึ่งในหน้าต่างชั่วคราว C-x 1มันปรับเปลี่ยนลักษณะการทำงานของ เมื่อคุณเปิดหน้าต่างหลายบานหน้าต่างนั้นจะทำงานเหมือนค่าเริ่มต้นdelete-other-windowsและจะลบหน้าต่างทั้งหมดยกเว้นหน้าต่างที่คุณเปิดดู เมื่อคุณกดปุ่มอีกครั้งจะเป็นการคืนค่าหน้าต่างอื่น ๆ

โหมดผู้ชนะให้วิธีการแก้ปัญหาทั่วไปมากขึ้น แต่ zygospore เหมาะสำหรับการซูมเข้าชั่วคราวในหน้าต่างเดียวในเฟรม สิ่งที่ดีที่สุดคือมันไม่ได้ใช้C-x 1การโยงคีย์ใหม่ - มันกำหนดใหม่ในวิธีที่ง่ายมากดังนั้นจึงไม่มีการผูกใหม่ที่จะเรียนรู้


1

นี่เป็นคำถามที่น่าสนใจ หลายปีที่ผ่านมาฉันตรวจสอบการแก้ปัญหาทั้งหมด เฉพาะ workgroups2.el มีน้ำหนักมากพอที่จะครอบคลุมทุกมุมกรณี

แต่ workgroups2 UI เป็นหายนะ ตัวอย่างเช่นหากคุณเปิดใช้งานโหมดเวิร์กกรุ๊ป (ตามที่แนะนำ README) รูปแบบก่อนหน้านี้จะถูกโหลดโดยอัตโนมัติระหว่างการเริ่มต้น emacs ทำให้การเริ่มต้นช้ามากทุกครั้ง

โซลูชันของฉันคือปฏิบัติต่อเวิร์กกรุ๊ป 2 เป็นชุดของ API แทนเครื่องมือที่ใช้งานได้ ดังนั้นฉันจึงเปลี่ยนการโต้ตอบ UI เริ่มต้นโดยใช้โหมด ivy ( 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))))
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.