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