Я хочу иметь возможность вызывать 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
чтобы open
, но, похоже, это не работает для последующих вызовов, например:
$ open -a Emacs --args --eval='(print "foo")'
$ open -a Emacs --args --eval='(print "bar")'
Это только печатает "foo" в буфере сообщений ... во второй раз, когда Emacs просто выводится на передний план, но сообщение не печатается.
Я не уверен, как open
общается с уже запущенными приложениями, кто-нибудь знает, как я мог узнать? Или есть какой-нибудь способ получить гораздо более подробный журнал того, что происходит, чем буфер Messages
? Ничего интересного не выводится в этот буфер во время сеанса выше, так что я не знаю, как я мог взломать какой-нибудь Emacs Lisp, чтобы сделать то, что я хочу ...
Спасибо!