Я хочу иметь возможность вызывать 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
- всегда делайте это с нуля!