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