Emacs открывает файлы в новом фрейме, когда открывается командой «open -a»

20

Я хочу иметь возможность вызывать Emacs из командной строки и запускать графический Emacs, если он не запущен, или посещать файл в уже запущенном Emacs. Я пытался сделать это, и emacsclientя знаю, что это «правильный» способ сделать это, но у меня было много проблем с ним на OS X, он мог случайно произойти сбой, или emacs --daemonпроцесс зависал во время выключения или перезагрузки компьютера, и вообще вялость. Хотя я бы хотел, чтобы это работало, на данный момент на open -aсамом деле работает намного лучше, за исключением одной проблемы, которую я опишу ниже:

Используя open -aкак это:

$ open -a Emacs file.txt

запустит Emacs, если он не запущен, и откроет файл. Но если я делаю это, когда текущий буфер не *scratch*является файлом, то он открывается в новом кадре (то есть в новом системном окне).

Вот пример сеанса:

$ open -a Emacs file.txt

Это запускает Emacs и открывает файл file.txt, так что в нем есть один кадр с этим буфером. Если я переключаюсь в *scratch*буфер и делаю это:

$ open -a Emacs file1.txt

Он открывает этот файл в том же кадре. Теперь есть один кадр с этим открытым файлом, и если я сделаю это:

$ open -a Emacs file2.txt 

Открывается новый кадр, в результате чего открываются два кадра одновременно.

Я попытался поиграться с аргументами командной строки в Emacs, используя --argsпереключатель to open, но, похоже, это не работает для последующих вызовов, например:

$ open -a Emacs --args --eval='(print "foo")'
$ open -a Emacs --args --eval='(print "bar")'

Это только печатает "foo" в буфере сообщений ... во второй раз, когда Emacs просто выводится на передний план, но сообщение не печатается.

Я не уверен, как openобщается с приложениями, которые уже запущены, кто-нибудь знает, как я мог узнать? Или есть какой-нибудь способ получить более подробный журнал того, что происходит, чем Messagesбуфер? Ничего интересного не выводится в этот буфер во время сеанса выше, так что я не знаю, как я мог взломать какой-нибудь Emacs Lisp, чтобы сделать то, что я хочу ...

Благодарность!

michiakig
источник
Я ничего не знаю об OSX, поэтому не могу предоставить ничего конкретного. Однако, если бы я отлаживал это, я бы добавил некоторую синтаксическую ошибку, find-fileа затем установил debug-on-errorна t и проверил трассировку стека для некоторой подсказки о том, как вызывается Emacs. Добавление ошибки к find-fileможет быть таким же простым, как копирование определения функции в буфер с нуля lisp и добавление в него вызова error(например, (error "cause stack trace")НИКОГДА НЕ ИЗМЕНЯЙТЕ ФАЙЛ ИСТОЧНИКА find-file- всегда делайте это с нуля!
Джо Касадонте,
@Joe Спасибо! Это очень хорошая идея, я буду помнить об этом на будущее. Я фактически закончил тем, что пытался использовать emacsclientснова, и запуск его с (server-start)моим, init.elкажется, работает лучше, чем emacs --daemonпри загрузке, что я и пробовал в первый раз, когда попробовал emacsclient.
michiakig

Ответы:

26

Ответ здесь: переменная emacs для «открытия с» в исходном фрейме

Это изменение настроек по умолчанию в новых версиях emacs. Добавлять:

(setq ns-pop-up-frames nil)

в файл .emacs.

Очень рад, что нашел это.

Colin
источник
Это было очень полезно! Вместе с псевдонимом open -a /Applications/Emacs.app $1все работает нормально! Обратите внимание, что я запускаю сервер в моем init, чтобы, например, для git был доступен emacs.
Дрор