Homepage: https://www.emacswiki.org/emacs/download/oneonone.el
Author: Drew Adams
Updated:
Frame configuration that uses one frame per window
Frame configuration that uses one frame per window.
This library is part of One-on-One Emacs, a collection of
libraries that try to make Emacs more frame-oriented and less
window-oriented.
This library sets up Emacs to use multiple frames: individual
frames are used, by default, instead of Emacs windows. That is,
the default is to use a frame for each Emacs window: one window on
one frame.
You can configure each of the frames defined here.
Default properties are defined here for normal frames and
"special" frames, which show "special-display buffers" (see Emacs
manual for info on such frames).
In addition, these user options control the creation of three
separate, specialized frames:
- `1on1-*Help*-frame-flag' - `*Help*' buffer frame
- `1on1-*Completions*-frame-flag' - `*Completions*' buffer frame
- `1on1-minibuffer-frame-flag' - minibuffer frame
Buffers `*Help*' and `*Completions*' are always displayed in their
own frames. In addition, if `1on1-*Help*-frame-flag' or
`1on1-*Completions*-frame-flag' is non-nil, then the `*Help*' or
`*Completions*' frame has a special (customizable) appearance.
If `1on1-minibuffer-frame-flag' is non-nil (the default value),
then the minibuffer is shown in its own frame,
`1on1-minibuffer-frame'; this is the only frame to have a
minibuffer. If you customize `1on1-minibuffer-frame-flag' to nil,
then each frame will have its own minibuffer, as usual, and there
will be no standalone minibuffer frame.
By default, if you use a standalone minibuffer frame, it is
automatically sized to the full width of your display and placed
at the bottom of the display.
If you use a standalone minibuffer frame then option
`minibuffer-auto-raise' can make a difference. This library does
not change the option value. A value of nil can make sense for
some window managers that force the refocusing of a frame whenever
it is raised. If you use MS Windows then this is not a problem:
command `1on1-emacs' sets the Windows-specific option
`w32-grab-focus-on-raise' to nil, so that frame raising and
focusing are decoupled. So on MS Windows, at least, a non-nil
value for `minibuffer-auto-raise' can make sense.
If `1on1-fit-minibuffer-frame-flag' is non-nil,
`1on1-minibuffer-frame-flag' is non-nil, and you also use library
`fit-frame.el', then, whenever the minibuffer is active, the
minibuffer frame height is automatically adjusted to fit its
content after each command or user event (e.g. each key press).
Options `1on1-fit-minibuffer-frame-max-height' and
`1on1-fit-minibuffer-frame-max-height-percent' define the maximum
possible height for this behavior. In addition, if you bind
`1on1-fit-minibuffer-frame' to a key (I use `M-up'), then you can
use that key repeatedly to increase the height by one line, even
beyond the maximum.
To help you perceive changes to different minibuffer recursion
levels, the background color of the minibuffer frame is changed
slightly with each recursion-depth change.
If `1on1-minibuffer-frame-flag' is non-nil then you can have the
standalone minibuffer frame be automatically repositioned near the
cursor (point). To do that, customize option
`1on1-move-minibuffer-frame-near-point'. Available only for Emacs
24 and later. For best results use this feature with Icicles.
This library is especially useful if used in combination with
One-on-One Emacs libraries `autofit-frame.el', which automatically
fits frames to their sole window, and `fit-frame.el', which lets
you fit a frame to its selected window manually. Library
`autofit-frame.el' uses library `fit-frame.el'.
Because Emacs is not really designed to be frame-oriented, there
are many built-in and standard functions that produce
less-than-optimal results when frames, instead of windows, are the
default. In other One-on-One Emacs libraries, I have fixed most
of these built-in functions to play well with frames.
For more information on One-on-One Emacs see
https://www.emacswiki.org/emacs/OneOnOneEmacs.
To use this library, put the following at the *END* of your init
file, `.emacs' (or `_emacs'). In particular, if your init file
contains a `custom-set-variables' expression, then the following
must appear *AFTER* that expression, in order for this to take
into account your customizations of any `1on1-' user options.
(require 'oneonone)
(1on1-emacs)
Initial frame: By default, the initial Emacs frame is like all
other normal (non-special-display) frames; that is,
`initial-frame-alist' effectively uses the frame properties
defined in `default-frame-alist'. If you would like the initial
frame to be different, set `default-frame-alist' to nil after
requiring `oneonone.el' but before executing `1on1-emacs':
(require 'oneonone)
(setq default-frame-alist nil)
(setq initial-frame-alist '((background-color . "White"))); e.g.
(1on1-emacs)
If you want the text cursor to change to a box when Emacs is idle,
then add this line also to your init file:
(toggle-box-cursor-when-idle 1) ; Turn on box cursor when idle.
Info and Customize frames: I recommend that you put the following
code in your init file, so that Info and Customize buffers will
display in their own frames. Which code to use depends on your
version of GNU Emacs.
(cond
((< emacs-major-version 21)
(remove-hook 'same-window-buffer-names "*info*"))
((= emacs-major-version 21)
(remove-hook 'same-window-buffer-names "*info*")
(remove-hook 'same-window-regexps "\\`\\*Customiz.*\\*\\'"))
(t
(remove-hook 'same-window-regexps "\\*info\\*\\(\\|<[0-9]+>\\)")
(remove-hook 'same-window-regexps "\\`\\*Customiz.*\\*\\'")))
Recommended `M-up' key bindings (requires library `fit-frame.el').
(The reason for the conditionals is to handle all Emacs versions.)
(define-key minibuffer-local-map
[(meta up)] '1on1-fit-minibuffer-frame)
(unless (eq minibuffer-local-map
(keymap-parent minibuffer-local-completion-map))
(define-key minibuffer-local-must-match-map
[(meta up)] '1on1-fit-minibuffer-frame)
(define-key minibuffer-local-completion-map
[(meta up)] '1on1-fit-minibuffer-frame))
(when (boundp 'minibuffer-local-filename-completion-map)
(define-key minibuffer-local-filename-completion-map
[(meta up)] '1on1-fit-minibuffer-frame))
(when (boundp 'minibuffer-local-must-match-filename-map)
(define-key minibuffer-local-must-match-filename-map
[(meta up)] '1on1-fit-minibuffer-frame))
(when (boundp 'minibuffer-local-filename-must-match-map)
(define-key minibuffer-local-filename-must-match-map
[(meta up)] '1on1-fit-minibuffer-frame))
(when (boundp 'minibuffer-local-isearch-map)
(unless (eq minibuffer-local-map
(keymap-parent minibuffer-local-isearch-map))
(define-key minibuffer-local-isearch-map
[(meta up)] '1on1-fit-minibuffer-frame)))
(when (boundp 'minibuffer-local-shell-command-map)
(unless (eq minibuffer-local-map
(keymap-parent minibuffer-local-shell-command-map))
(define-key minibuffer-local-shell-command-map
[(meta up)] '1on1-fit-minibuffer-frame)))
(when (boundp 'minibuffer-inactive-mode-map)
(define-key minibuffer-inactive-mode-map
[(meta up)] '1on1-fit-minibuffer-frame))))
By default, `oneonone.el' sets the width of the bottom and right
dividers, which separate Emacs windows, to 2 instead of 0. This
lets you more easily notice where to drag with your mouse, to
resize windows. If you use Emacs 24.4 or later then I also
recommend that you consider customizing face `window-divider', to
further highlight the dividers.
Notes on user options defined here:
---------------------------------
Some non-option variables are used here only as conveniences to
define frame-parameter alists. They are defined using `defvar',
not `defcustom', because you cannot use Customize to define them
independently of the alist user options they help to define. The
alists themselves are the variables to customize. If you want to
change the `defvar' variables individually and then use them to
set the alist variables, then use `setq', not Customize, to change
them, and restart Emacs for their changes to take effect.
Changes to any user options defined here take effect as soon as
`1on1-emacs' is executed, so you can do `M-x 1on1-emacs' to see
their changes (no need to restart Emacs).
User options `1on1-color-minibuffer-frame-on-setup-increment' and
`1on1-color-minibuffer-frame-on-exit-increment' determine how much
to change the color of the minibuffer frame when the minibuffer is
entered and exited. They are hue increments, and should be
opposite in sign.
They should cancel each other out, so that the color returns to
what it was initially at any given minibuffer depth. However,
because of the way HSV and RGB color-component conversion works,
the best cancellation does not necessarily occur when these
options have the same absolute value. And how much their absolute
values should differ depends on that magnitude. It is best to
just set one of these to an increment you like, and then fiddle
with the other until they more or less cancel.
Commands defined here:
`1on1-emacs', `1on1-fit-minibuffer-frame',
`1on1-ORIG-abort-recursive-edit', `1on1-ORIG-top-level',
`1on1-ORIG-y-or-n-p', `1on1-other-frame',
`1on1-set-box-cursor-when-idle-interval',
`1on1-set-cursor-type', `1on1-toggle-box-cursor-when-idle'.
User options defined here:
`1on1-*Completions*-frame-flag',
`1on1-*Completions*-frame-at-right-flag',
`1on1-*Help*-frame-flag',
`1on1-active-minibuffer-frame-background',
`1on1-active-mode-line-background',
`1on1-change-cursor-on-input-method-flag',
`1on1-change-cursor-on-overwrite/read-only-flag',
`1on1-color-minibuffer-frame-on-exit-increment',
`1on1-color-minibuffer-frame-on-setup-increment',
`1on1-color-mode-line-flag',
`1on1-completions-frame-background',
`1on1-completions-frame-mouse+cursor-color',
`1on1-completions-frame-width',
`1on1-completions-frame-zoom-font-difference',
`1on1-default-frame-cursor-color',
`1on1-default-frame-cursor-color-input-method',
`1on1-default-frame-cursor-type',
`1on1-default-frame-cursor-type-overwrite/read-only',
`1on1-default-frame-alist', `1on1-help-frame-background',
`1on1-help-frame-mouse+cursor-color',
`1on1-inactive-minibuffer-frame-background',
`1on1-inactive-mode-line-background',
`isearch-minibuffer-frame-background',
`1on1-minibuffer-frame-alist', `1on1-minibuffer-frame-flag',
`1on1-minibuffer-frame-left',
`1on1-minibuffer-frame-top/bottom',
`1on1-minibuffer-frame-width',
`1on1-minibuffer-frame-width-percent',
`1on1-move-minibuffer-frame-near-point' (Emacs 24+),
`1on1-remap-other-frame-command-flag',
`1on1-special-display-frame-alist', `1on1-task-bar-height'
(Emacs < 24.4).
Non-interactive functions defined here:
`1on1-box-cursor-when-idle',
`1on1-change-cursor-on-input-method',
`1on1-change-cursor-on-overwrite/read-only',
`1on1-color-minibuffer-frame-on-exit',
`1on1-color-minibuffer-frame-on-setup',
`1on1-color-isearch-minibuffer-frame',
`1on1-display-*Completions*-frame', `1on1-display-*Help*-frame',
`1on1-filter-no-default-minibuffer',
`1on1-flash-ding-minibuffer-frame',
`1on1-last-non-minibuffer-buffer', `1on1-minibuffer-prompt-end',
`1on1-reset-minibuffer-frame', `1on1-remove-if',
`1on1-reposition-minibuffer-frame' (Emacs 24+),
`1on1-set-minibuffer-frame-top/bottom',
`1on1-set-minibuffer-frame-width',
`1on1-setup-minibuffer-frame-coloring', `1on1-setup-mode-line'.
Non-option variables defined here:
`1on1-box-cursor-when-idle-p',
`1on1-box-cursor-when-idle-interval',
`1on1-box-cursor-when-idle-timer',
`1on1-default-frame-background', `1on1-default-frame-font',
`1on1-default-frame-foreground',
`1on1-default-frame-menu-bar-lines',
`1on1-default-frame-mouse-color', `1on1-default-frame-size',
`1on1-default-frame-upper-left-corner', `1on1-divider-width',
`1on1-last-cursor-type', `1on1-minibuffer-frame',
`1on1-minibuffer-frame-background',
`1on1-minibuffer-frame-bottom-offset',
`1on1-minibuffer-frame-cursor-color',
`1on1-minibuffer-frame-font',
`1on1-minibuffer-frame-foreground',
`1on1-minibuffer-frame-height',
`1on1-minibuffer-frame-mouse-color',
`1on1-move-minibuffer-frame-max-left-top' (Emacs 24+),
`1on1-special-frame-background',
`1on1-special-frame-cursor-color', `1on1-special-frame-font',
`1on1-special-frame-foreground',
`1on1-special-frame-menu-bar-lines',
`1on1-special-frame-mouse-color', `1on1-special-frame-size',
`1on1-special-frame-upper-left-corner'.
***** NOTE: These EMACS PRIMITIVES have been REDEFINED HERE:
`abort-recursive-edit', `top-level' -
Reset color of minibuffer frame to "inactive" color.
`y-or-n-p' - Temporarily color minibuffer frame to "active" color.
Acknowledgements:
The cursor-changing on input method and read-only was inspired by
Juri Linkov . Joe Casadonte
wrote a similar hook (`joc-cursor-type-set-hook'), which he got
from Steve Kemp...