Я хочу мати змогу викликати 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ЗМІНУВАЛИ ФАЙЛ ДЖЕРЕЛА - завжди робіть це за допомогою шуфляра!