In earlier versions of emacs one could use emacs -nw file1 file2 file3
and see three files (and no buffer list) at startup. For recent versions this no longer works. Is it possible to add some code to .emacs
to fix this regression?
It looks like the limit of 2 is hardcoded in startup.el
. One also needs 3, 4...
-
Are you sure those files are not just visited in buffers that are not displayed by default?– DrewCommented Dec 3, 2018 at 2:25
-
Yes, of course. But I want to see them, at the same time.– emberCommented Dec 3, 2018 at 6:33
-
Then please make that clear in the question. Comments can be deleted at any time. Visiting ("opening") a file is not the same as displaying the buffer that visits it. Your question is about Emacs windows more than it is about files or buffers.– DrewCommented Dec 3, 2018 at 15:00
-
See also emacs.stackexchange.com/a/36369/15748– BasilCommented Jan 3, 2019 at 12:33
2 Answers
I think this changed in emacs 25. As you noted, the behavior is currently hard-coded in startup.el: if there are more than 2 buffers to be shown, Emacs uses one of the windows to show the buffer list. You could enter a bug report -- maybe that limit could be exposed as a variable.
For now, your best bet might be to use emacs-startup-hook
, which runs after the command-line options have been processed. You could have a custom function to look at (buffer-list)
and display buffers in separate windows, up to some configurable max number of windows. You'll want to filter out uninteresting buffers -- for example, only display buffers associated with a file.
You may be able to use a package like tile
or splitter
to split up the frame into a suitable number of windows.
-
Yes, thank you. The proper variable is probably not the number of files (by default we want to see them all) but the minimum number of visible lines from each displayed buffer, something in the range 2-6, say. However, maybe I am not sufficiently familiar with emacs internals to code such a startup hook.– emberCommented Dec 4, 2018 at 0:55
Does the following code do what you want?
;; allow more than two windows on initial screen
(add-hook 'window-setup-hook #'foo-show-many-buffers)
(defun foo-show-many-buffers ()
"Call display-buffer for all file arguments."
(let ((tmp (buffer-list)))
(while tmp
(let ((buf (car tmp)))
(setq tmp (cdr tmp))
(if (buffer-file-name buf) (display-buffer buf))))))