winring.el by BarryWarsaw allows you to switch between named window configurations (“mail”, “irc”, “gnus” etc.) with the C-x 7 prefix command. There is a ring of window configurations for every frame.

To use, make sure this file is on your ‘load-path’ and put the following in your ~/.emacs file:

    (require 'winring)

You can get it from here:

Barry comments upon other existing similar packages in the commentary of the file:

Create or jump wrapper by IanYang:

      (defun iy/winring-jump-or-create (&optional name)
        "Jump to or create configuration by name"
        (let* ((ring (winring-get-ring))
               (n (1- (ring-length ring)))
               (current (winring-name-of-current))
               (lst (list (cons current -1)))
               index item)
          (while (<= 0 n)
            (push (cons (winring-name-of (ring-ref ring n)) n) lst)
            (setq n (1- n)))
          (setq name
                (or name
                     (format "Window configuration name (%s): " current)
                     lst nil 'confirm nil 'winring-name-history current)))
          (setq index (cdr (assoc name lst)))
          (if (eq nil index)
                (switch-to-buffer winring-new-config-buffer-name)
                (winring-set-name name))
            (when (<= 0 index)
              (setq item (ring-remove ring index))
              (winring-restore-configuration item)))))

Specify the name of the first configuration:

        (flet ((winring-next-name nil "default"))

See Also: FrameConfiguration for info on switching between frame configurations (window-manager “windows”).