Использование Emacs в качестве сервера и открытие только одного окна, которое должно быть максимизировано

Я хотел бы запустить свой Emacs в режиме демона, а затем использовать emacsclient для реального отображения вещей. Однако, если я запускаю emacsclient filename, он отображается в терминале, а это не то, что мне нужно; Вместо этого я должен передать ему опцию -c.

Однако эта опция всегда создает новый кадр, а это не то, что мне нужно - я бы предпочел просто иметь один кадр и открывать что-то в новом буфере в том же кадре, если он уже существует. ; в противном случае он должен сделать мне новую рамку. Однако я не уверен, как это сделать.

Кроме того, я хочу, чтобы этот один кадр был максимизирован, чего я обычно добиваюсь в своем стартовом Emacs с опцией -mm; как я могу гарантировать, что кадр, сделанный emacsclient, также будет максимизирован?


person Koz Ross    schedule 30.07.2014    source источник
comment
Я не уверен в вашем первоначальном вызове emacsclient (т. е. до того, как вы открыли свой первый фрейм), но когда графический фрейм уже открыт, emacsclient filename посещает filename в существующем фрейме (по крайней мере, для меня). Всегда он открывается в терминале для вас или только когда у вас нет графического фрейма?   -  person Dan    schedule 30.07.2014
comment
@Dan: Только когда у меня нет существующего фрейма. Есть ли способ заставить его использовать фрейм по умолчанию вместо терминала? По сути, я хотел бы иметь команду, которая а) открывает фрейм, если его нет; и б) если есть фрейм, открывает документ в том же фрейме в новом буфере.   -  person Koz Ross    schedule 31.07.2014


Ответы (3)


Чтобы максимизировать каждый новый кадр, вы можете добавить это в свой .emacs:

(modify-all-frames-parameters '((fullscreen . maximized))))
person juanleon    schedule 30.07.2014
comment
Разве modify-all-frames-parameters не разовая сделка для любых фреймов, которые открыты в данный момент? Возможно, вы имели в виду (add-to-list 'default-frame-alist . . .? Вот ссылка на некоторый код, который я использую для OSX и Windows для управления точным размером кадра с помощью пикселей, хотя для этого может потребоваться более новая или разработчикская сборка Emacs: stackoverflow.com/a/18711628/2112489 - person lawlist; 30.07.2014
comment
modify-all-frames-parameters (по крайней мере, в моей версии emacs, 24.3) действуют на кадры, которые еще предстоит создать. - person juanleon; 31.07.2014

Следующий скрипт делает следующее:

  • запустить сервер Emacs при необходимости
  • если нет открытых фреймов, открыть новый
  • открыть данный файл(ы) в текущем кадре
#!/bin/bash

# Selected options for "emacsclient"
#
# -c          Create a new frame instead of trying to use the current
#             Emacs frame.
#
# -e          Evaluate the FILE arguments as ELisp expressions.
#
# -n          Don't wait for the server to return.
#
# -t          Open a new Emacs frame on the current terminal.
#
# Note that the "-t" and "-n" options are contradictory: "-t" says to
# take control of the current text terminal to create a new client frame,
# while "-n" says not to take control of the text terminal.  If you
# supply both options, Emacs visits the specified files(s) in an existing
# frame rather than a new client frame, negating the effect of "-t".

# check whether an Emacs server is already running
pgrep -l "^emacs$" > /dev/null

# otherwise, start Emacs server daemon
if [ $? -ne 0 ]; then
    emacs --daemon
fi

# return a list of all frames on $DISPLAY
emacsclient -e "(frames-on-display-list \"$DISPLAY\")" &>/dev/null

# open frames detected, so open files in current frame
if [ $? -eq 0 ]; then
    emacsclient -n -t "$@"
# no open frames detected, so open new frame
else
    emacsclient -n -c "$@"
fi

Редактировать: исправлено расширение позиционных аргументов (2017-12-31).

person mzuther    schedule 18.01.2015
comment
Это отлично работает для терминала emacs. Если вы хотите вместо этого использовать emacs с графическим интерфейсом, измените строку с emacsclient -n -t $* на emacsclient -n -a emacs $* - person Jounathaen; 18.04.2017
comment
@Jounathaen Оба работают, так что для меня это ничего не меняет (Emacs 24.5). Но это может быть иначе для других версий Emacs... - person mzuther; 24.04.2017

Установлен ли ваш DISPLAY env в терминале, где вы используете emacsclient? Потому что поведение, которое вы запрашиваете, должно быть поведением по умолчанию (я имею в виду поведение повторного использования существующих фреймов).

person neal    schedule 30.07.2014
comment
Когда я выполняю echo $DISPLAY, я получаю вывод :0 - person Koz Ross; 31.07.2014