Я пытаюсь определить размер экрана, на котором я запускаю emacs, и соответствующим образом отрегулировать размер и положение окна, в котором он запускается (я предполагаю, что это фрейм в emacs-speak). Я пытаюсь настроить свой .emacs так, чтобы я всегда получал «достаточно большое» окно с его левым верхним углом в верхнем левом углу моего экрана.
Я предполагаю, что это запрос большой для общего случая, поэтому, чтобы немного сузить круг вопросов, меня больше всего интересует GNU Emacs 22 для Windows и (Debian) Linux.





(setq initial-frame-alist
(append '((width . 263) (height . 112) (top . -5) (left . 5) (font . "4.System VIO"))
initial-frame-alist))
(setq default-frame-alist
(append '((width . 263) (height . 112) (top . -5) (left . 5) (font . "4.System VIO"))
default-frame-alist))
Взято из: http://www.gnu.org/software/emacs/windows/old/faq4.html
(setq default-frame-alist
'((top . 200) (left . 400)
(width . 80) (height . 40)
(cursor-color . "white")
(cursor-type . box)
(foreground-color . "yellow")
(background-color . "black")
(font . "-*-Courier-normal-r-*-*-13-*-*-*-c-*-iso8859-1")))
(setq initial-frame-alist '((top . 10) (left . 30)))
Первый параметр применяется ко всем фреймам emacs, включая первый, который появляется при запуске. Второй параметр добавляет дополнительные атрибуты к первому кадру. Это потому, что иногда полезно знать исходный фрейм, в котором вы запускаете emacs.
Самый простой способ сделать это в среде X-Window - использовать X ресурсы. Соответствующая часть моих .Xdefaults выглядит так:
Emacs.geometry: 80x70
У вас должна быть возможность добавить к нему суффикс + 0 + 0 координат местоположения, чтобы заставить его перемещаться в верхний левый угол вашего дисплея. (причина, по которой я этого не делаю, заключается в том, что я иногда создаю новые кадры, и это сбивает с толку, если они появляются в том же месте, что и предыдущий)
Согласно руководству, этот метод работает и в MS Windows, хранение ресурсов в виде пар ключ / значение в реестре. Я никогда этого не проверял. Это могло бы быть здорово, могло бы быть намного больше неудобств по сравнению с простым редактированием файла.
yeap работает и для окон. Emacs wiki дает более подробную информацию: emacswiki.org/emacs/MsWindowsRegistry
У меня в .emacs есть следующее:
(if (window-system)
(set-frame-height (selected-frame) 60))
Вы также можете посмотреть на функции set-frame-size, set-frame-position и set-frame-width. Используйте C-h f (также известный как M-x describe-function), чтобы получить подробную документацию.
Я не уверен, есть ли способ вычислить максимальную высоту / ширину фрейма в текущей оконной среде.
Ура! (if (window-system) (set-frame-size (selected-frame) 124 40)) для победы - такой красивый и лаконичный, он дает мне размер, установленный в моем Терминале по умолчанию, что приятно и знакомо. :) (Конечно, отрегулируйте в соответствии с предпочтениями.) Спасибо!
Просто чтобы уточнить: если вы поместите это в init.el, это применимо только к начальному кадру. Если после этого вы создадите новый фрейм, вышеуказанная функция не будет работать; новая рама будет иметь настройки, установленные в default-frame-alist.
Это работает для меня, за исключением того, что (set-frame-size (selected-frame) 80 24) дает мне кадр 161 на 48; У меня экран с разрешением 4K hidpi, но я не ожидал, что это повлияет на количество символов.
Если вы хотите изменить размер в соответствии с разрешением, вы можете сделать что-то вроде этого (отрегулировать предпочтительную ширину и разрешение в соответствии с вашими конкретными потребностями):
(defun set-frame-size-according-to-resolution ()
(interactive)
(if window-system
(progn
;; use 120 char wide window for largeish displays
;; and smaller 80 column windows for smaller displays
;; pick whatever numbers make sense for you
(if (> (x-display-pixel-width) 1280)
(add-to-list 'default-frame-alist (cons 'width 120))
(add-to-list 'default-frame-alist (cons 'width 80)))
;; for the height, subtract a couple hundred pixels
;; from the screen height (for panels, menubars and
;; whatnot), then divide by the height of a char to
;; get the height we want
(add-to-list 'default-frame-alist
(cons 'height (/ (- (x-display-pixel-height) 200)
(frame-char-height)))))))
(set-frame-size-according-to-resolution)
Обратите внимание, что оконная система устарела в новых версиях emacs. Подходящая замена - (display-graphic-p). См. этот ответ к вопросу Как определить, что emacs находится в терминальном режиме? для получения дополнительной информации.
Мне нравятся разные числа, поэтому (как вы предлагаете) я изменил свои. Хотя это отлично работает; Спасибо!
Опять же, мне на самом деле больше нравится эта версия - он намного проще (легко читается и настраивается) и хорошо соответствует моим потребностям. Но оба ответа хороши! +1
Будьте осторожны с высотой, по крайней мере, в Emacs 24.2 в OS X. Если вы установите ее на одну строку выше, окна будут застрять в состоянии, когда первая строка буфера не видна - точка может перемещаться туда, но окно не прокручивается, чтобы показать это.
У этого метода (и других перечисленных здесь) есть незначительный артефакт. Emacs откроется с определенным размером и через долю секунды изменится до размера, который мы установили. Но переход виден. Есть ли способ сказать, что emacs отрисовывает себя в желаемом размере от t = 0 секунд?
Вы также можете использовать параметр -geometry при запуске emacs: emacs -geometry 80x60+20+30 предоставит вам окно шириной 80 символов, высотой 60 строк, с верхним левым углом на 20 пикселей вправо и на 30 пикселей вниз от верхнего левого угла фона.
В Windows вы можете сделать фрейм emacs максимальным, используя эту функцию:
(defun w32-maximize-frame ()
"Maximize the current frame"
(interactive)
(w32-send-sys-command 61488))
В Ubuntu сделайте:
(defun toggle-fullscreen ()
(interactive)
(x-send-client-message nil 0 nil "_NET_WM_STATE" 32
'(2 "_NET_WM_STATE_MAXIMIZED_VERT" 0))
(x-send-client-message nil 0 nil "_NET_WM_STATE" 32
'(2 "_NET_WM_STATE_MAXIMIZED_HORZ" 0))
)
(toggle-fullscreen)
(defun set-frame-size-according-to-resolution ()
(interactive)
(if window-system
(progn
;; use 120 char wide window for largeish displays
;; and smaller 80 column windows for smaller displays
;; pick whatever numbers make sense for you
(if (> (x-display-pixel-width) 1280)
(add-to-list 'default-frame-alist (cons 'width 120))
(add-to-list 'default-frame-alist (cons 'width 80)))
;; for the height, subtract a couple hundred pixels
;; from the screen height (for panels, menubars and
;; whatnot), then divide by the height of a char to
;; get the height we want
(add-to-list 'default-frame-alist
(cons 'height (/ (- (x-display-pixel-height) 200)
(frame-char-height)))))))
(set-frame-size-according-to-resolution)
Я предпочитаю настройки Брайана Окли. Однако 'высота не работает должным образом в моем GNU Emacs 24.1.1.
Попробуйте добавить следующий код в .emacs
(add-to-list 'default-frame-alist '(height . 24))
(add-to-list 'default-frame-alist '(width . 80))
Я долгое время использовал этот метод для установки высоты и ширины кадра (
(width . 80) (height . 40)), но по какой-то причине он перестал работать после того, как я обновил свою версию Xubuntu с 12.04 до 13.10: при запуске размер кадра был по умолчанию. Затем я переключился на ответ Криса Конвея, который мне подходит.