Jak ustawić rozmiar okna Emacsa?

103

Próbuję wykryć rozmiar ekranu, na którym uruchamiam emacs, i odpowiednio dostosować rozmiar i pozycję okna, w którym się zaczyna (myślę, że jest to ramka w języku emacs). Próbuję skonfigurować moje .emacs tak, aby zawsze wyświetlało się „rozsądnie duże” okno z lewym górnym rogiem w pobliżu lewego górnego rogu ekranu.

Myślę, że jest to wielka prośba o ogólny przypadek, więc aby trochę zawęzić, najbardziej interesuje mnie GNU Emacs 22 w systemie Windows i (Debian) Linux.

Tom Dunham
źródło

Odpowiedzi:

89

Jeśli chcesz zmienić rozmiar w zależności od rozdzielczości, możesz zrobić coś takiego (dostosowując preferowaną szerokość i rozdzielczości do własnych potrzeb):

(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)

Zauważ, że window-system jest przestarzałe w nowszych wersjach emacsa. Odpowiednim zamiennikiem jest (display-graphic-p). Zobacz odpowiedź na pytanie Jak wykryć, że emacs działa w trybie terminalowym? aby uzyskać więcej informacji.

Bryan Oakley
źródło
Lubię różne liczby, więc (jak sugerujesz) poprawiłem swoje. Działa to jednak świetnie; Dziękuję Ci!
Lindes
Z drugiej strony, bardziej mi się podoba ta wersja - dużo prostsza (łatwa do odczytania i poprawiania) i dobrze odpowiada moim potrzebom. Obie są jednak dobrymi odpowiedziami! +1
lindes
1
Uważaj na wysokość, przynajmniej w Emacs 24.2 na OS X. Jeśli ustawisz ją o jeden wiersz za wysoko, okna utkną w stanie, w którym pierwszy wiersz bufora nie jest widoczny - punkt może tam nawigować, ale okno nie przewija się, aby je pokazać.
Greg Hendershott
2
W przypadku tej metody (i innych wymienionych tutaj) istnieje niewielki artefakt. Emacs otworzy się z określonym rozmiarem i po ułamku sekundy zmieni rozmiar na ustawiony przez nas rozmiar w / e. Ale przejście jest widoczne. Czy istnieje sposób, aby powiedzieć, że emacs rysuje się w żądanym rozmiarze od t = 0 sekund?
stathisk
48

Mam w moim .emacs:

(if (window-system)
  (set-frame-height (selected-frame) 60))

Można też spojrzeć na funkcje set-frame-size, set-frame-positionoraz set-frame-width. Użyj C-h f(aka M-x describe-function), aby wyświetlić szczegółową dokumentację.

Nie jestem pewien, czy istnieje sposób na obliczenie maksymalnej wysokości / szerokości ramki w bieżącym środowisku okienkowym.

Chris Conway
źródło
12
Yay! (if (window-system) (set-frame-size (selected-frame) 124 40))dla wygranej - tak ładne i zwięzłe, i daje mi rozmiar domyślny mojego terminala, który jest miły i znajomy. :) (Oczywiście dostosuj do swoich preferencji.) Dzięki!
Lindes
1
Dla wyjaśnienia: jeśli to umieścisz init.el, dotyczy to tylko początkowej klatki. Jeśli później utworzysz nową klatkę, powyższa funkcja nie przyniesie efektu; nowa ramka będzie miała ustawienia ustawione w default-frame-alist.
David J.
To działa dla mnie, z wyjątkiem tego, że (set-frame-size (selected-frame) 80 24)daje mi ramkę 161 na 48; Jestem na ekranie Hidpi 4K, ale nie spodziewałbym się, że wpłynie to na liczbę znaków.
charliegreen
21

Zaczerpnięte z: 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)))

Pierwsze ustawienie dotyczy wszystkich ramek emacsa, łącznie z pierwszą, która pojawia się po uruchomieniu. Drugie ustawienie dodaje dodatkowe atrybuty do pierwszej klatki. Dzieje się tak, ponieważ czasami dobrze jest znać oryginalną ramkę, w której uruchamiasz emacsa.


źródło
Używałem tej metody przez długi czas do ustawiania wysokości i szerokości ramki ( (width . 80) (height . 40)), ale z jakiegoś powodu przestała działać po uaktualnieniu mojej wersji Xubuntu z 12.04 do 13.10: po uruchomieniu rozmiar klatki był domyślny. Następnie przeszedłem na używanie odpowiedzi Chrisa Conwaya, która mi pasuje.
Teemu Leisti,
17

Najprostszym sposobem znalazłem to zrobić w środowisku X-Window jest poprzez zasobów X . Odpowiednia część mojego .Xdefaults wygląda następująco:

Emacs.geometry: 80x70

Powinieneś być w stanie dodać do niego sufiks ze współrzędnymi lokalizacji + 0 + 0, aby wymusić przeniesienie go do lewego górnego rogu ekranu. (powodem, dla którego tego nie robię, jest to, że od czasu do czasu odradzam nowe ramki i sprawia to, że rzeczy są niejasne, jeśli pojawiają się dokładnie w tym samym miejscu co poprzednia)

Zgodnie z instrukcją ta technika działa również w systemie MS Windows , przechowując zasoby jako pary klucz / wartość w rejestrze. Nigdy tego nie testowałem. To może być świetne, może być o wiele bardziej niewygodne niż zwykła edycja pliku.

JB.
źródło
1
yeap działa również w przypadku okien. Emacs wiki zawiera więcej szczegółów: emacswiki.org/emacs/MsWindowsRegistry
Sa'ad
17

Spróbuj dodać następujący kod do .emacs

(add-to-list 'default-frame-alist '(height . 24))

(add-to-list 'default-frame-alist '(width . 80)) 
norbux
źródło
12

Możesz także użyć parametru -geometry podczas uruchamiania emacsa: emacs -geometry 80x60+20+30da ci okno szerokie na 80 znaków, wysokie na 60, z lewym górnym rogiem 20 pikseli po prawej i 30 pikseli w dół od lewego górnego rogu tła.

Graeme Perrow
źródło
7

Na Ubuntu do:

(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)
ftravers
źródło
5

W systemie Windows można zmaksymalizować ramkę emacsa za pomocą tej funkcji:

(defun w32-maximize-frame ()
  "Maximize the current frame"
  (interactive)
  (w32-send-sys-command 61488))
Jérôme Radix
źródło
1
(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))
NN
źródło
0
(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)

Wolę ustawienia Bryana Oakleya. Jednak wysokość ' nie działa poprawnie w moim GNU Emacs 24.1.1.

WisdomFusion
źródło