Базовая настройка сервера Emacs под OSX

9

Недавно я купил свой первый Mac за десять лет и сейчас нахожусь в процессе его настройки. Я - пользователь Emacs и решил, что хочу использовать обычные Emacs, а не Aquamacs, чтобы я мог использовать свою существующую конфигурацию из других операционных систем. Я пытался следовать многим инструкциям, которые я нашел в Интернете (например, этот , этот и этот с сайта, с которого я скачал Emacs ), и пытался объединить эти фрагменты любым количеством способов, но никогда привел вещи в состояние, даже приближающееся к тому, к чему я привык / на что надеялся:

  1. Демон Emacs запускается либо при запуске, либо как только он мне понадобится ; либо в порядке. Любые новые фреймы Emacs поддерживаются тем же сервером.
  2. Когда я открываю текстовый файл из Finder, файл открывается в Emacs, если возможно, в существующей графической рамке.
  3. Если я запускаю Emacs.app, система повторно использует демон emacs, работающий в фоновом режиме, вместо того, чтобы запускать новый экземпляр и открывать в нем новое окно. ( шляпа подсказка )
  4. Когда я запускаю Emacs из терминала, терминал работает, не дожидаясь, пока я закончу с Emacs (если я не использую '-nw')
  5. AFAIK ни в коем случае во время операций, описанных выше, не должен Emacs оказаться в состоянии («режим редактирования сервера?»), Где он ждет, пока я наберу текст C-x #, хотя я не очень хорошо понимаю это.
  6. (Я бы расценил это как бонус) Для меня есть некоторый способ вызывать Emacs из терминала, чтобы Emacs повторно использовал существующий фрейм, если это возможно.

Как я могу настроить Emacs так?

Я особенно озадачен тем, что Finder открывает вещи в Emacs именно так, как я хочу (# 2), поскольку найденные мной руководства обычно создают несколько псевдонимов, Applescripts, сценариев bash и т. Д., И я не уверен который я хочу сказать Finder использовать для открытия текстовых файлов.

Спасибо!

A. @lawlist спрашивает: «Открывается ли новый фрейм по умолчанию, когда вы открываете новый файл из терминала, даже если фрейм уже существует?» Ответ заключается в том, что если я запускаю сервер при запуске, как описано здесь , открываю фрейм, а затем открываю файл, печатая /Applications/Emacs.app/Contents/MacOS/bin/emacsclient -n <whatever>, я могу получить файл для открытия в существующем фрейме. Если в данный момент нет открытого фрейма, я должен использовать «-nc» или когда я пытаюсь открыть файл, ничего не происходит.

Б. @lawlist спрашивает: «Вы хотите, чтобы демон работал при входе в систему или было бы достаточно загрузить Emacs вручную после входа в систему?» Запуск вручную будет в порядке.

kuzzooroo
источник
Можете ли вы нумеровать их, пожалуйста, 1, 2, 3, 4, 5, 6, а может быть, 7 и 8. Кроме того, по умолчанию открывается новый фрейм, когда вы открываете новый файл из терминала, даже если фрейм уже существует. ? Я знаю некоторые ответы, но не все - поэтому цифры для вопросов будут полезны. Вы хотите, чтобы демон работал при входе в систему или было бы достаточно загрузить Emacs вручную после входа в систему?
юрист
@ Лаури Ранта имеет хороший ответ. M-x server-startвручную запустит сервер, чтобы emacsclientможно было с ним общаться. Я поместил (server-start)в свой init.elфайл вместо использования демона при входе в систему - однако, многие люди предпочитают вариант входа в систему демона. И, конечно, .emacsфайл будет подходящим местом для (server-start).
юрист
Что касается открытия файлов из Finder, я предполагаю, что вы далеко за пределами стадии необходимости чего-то вроде этого: dummies.com/how-to/content/… Итак, если это не так, то вы, вероятно, собираетесь чтобы быть в порядке с ns-find-file- который активируется автоматически, когда файл связан с Emacs.app. Моя функция перехвата файла в ссылках выше также изменяет, ns-find-fileесли это то, что вас интересует. Конечно, вам нужен встроенный Emacs --with-ns.
юрист

Ответы:

10

Чтобы Emacs.app открывал файлы в существующем фрейме вместо нового фрейма, добавьте (setq ns-pop-up-frames nil)в файл конфигурации, например ~/.emacs.

Вы можете открыть файл из терминала с помощью open -a emacs fileили emacsclient -n file. Если Emacs.app не открыт, но есть Emacs --daemonпроцесс, по какой-то причине emacsclient -n fileон не работает, но emacsclient -nc fileработает.

Убедитесь, что вы используете emacsclientбинарный файл, включенный в версию Emacs, которую вы используете, например /Applications/Emacs.app/Contents/MacOS/bin/emacsclient, или /usr/local/bin/emacsclientесли вы установили Emacs с Homebrew.

Чтобы запустить сервер Emacs при входе в систему, например, сохраните этот список как ~/Library/LaunchAgents/my.emacsdaemon.plist:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>my.emacsdaemon</string>
  <key>ProgramArguments</key>
  <array>
    <string>/Applications/Emacs.app/Contents/MacOS/Emacs</string>
    <string>--daemon</string>
  </array>
  <key>RunAtLoad</key>
  <true/>
  <key>KeepAlive</key>
  <true/> <!-- run the program again if it terminates -->
</dict>
</plist>

Plist загружается автоматически при следующем входе в систему, но вы можете загрузить его немедленно, запустив launchctl load ~/Library/LaunchAgents/my.emacsdaemon.plist.

Изменить: Я до сих пор не знаю, почему люди связывают типы файлов с приложением AppleScript, а не просто Emacs.app. Скрипт в ответе kuzzooroo также может быть написан как скрипт оболочки:

macos=/Applications/Emacs.app/Contents/MacOS
if pgrep -qf 'Emacs.*--daemon'; then
  [[ $($macos/bin/emacsclient -e '(<= 2 (length (visible-frame-list)))') = t ]] && args=-nc || args=-n
else
  $macos/Emacs --daemon
  args=-nc
fi
$macos/bin/emacsclient $args "$@"
open -a /Applications/Emacs.app

Вы можете использовать Platypus, чтобы сохранить скрипт как приложение:

Я только начал использовать Emacs, но у меня совершенно другие настройки. Я сделал свое собственное приложение Emacs, сделав копию iTerm.app, изменив CFBundleIdentifier в Info.plist, чтобы приложение использовало другой файл настроек, и установив для команды по умолчанию значение /usr/local/bin/emacs. Я добавил (server-start)к ~/.emacsи я открыть пользовательское приложение Emacs при входе в систему. Я использовал Platypus для создания приложения, которое запускается, emacsclient -n "$@";open -b my.emacsи сделал его приложением по умолчанию для текстовых файлов.

LRI
источник
2

Решение Лаури в сочетании с предложениями из комментариев в значительной степени решило мои проблемы. Я вставил ниже некоторый Applescript, который я собрал из материалов, которые я нашел в Интернете. Скрипт помогает сгладить некоторые оставшиеся складки, например, его поведение немного лучше, если в настоящее время нет кадра Emacs.

РЕДАКТИРОВАТЬ: цель сценария состоит в том, чтобы быть связанным с файлами .txt в Finder.

-- http://superuser.com/questions/457484/how-to-open-emacs-from-macs-finder
-- https://gist.github.com/ambethia/304964#comment-799519
on run {input}
    set filepath to quoted form of POSIX path of input
    tell application "Terminal"
        try
            -- we look for <= 2 because Emacs --daemon seems to always have an entry in visibile-frame-list even if there isn't
            set frameVisible to do shell script "/Applications/Emacs.app/Contents/MacOS/bin/emacsclient -e '(<= 2 (length (visible-frame-list)))'"
            if frameVisible is "t" then
                do shell script "/Applications/Emacs.app/Contents/MacOS/bin/emacsclient -n " & filepath
            else
                -- there is a not a visible frame, launch one
                do shell script "/Applications/Emacs.app/Contents/MacOS/bin/emacsclient -c -n " & filepath
            end if
        on error
            -- daemon is not running, start the daemon and open a frame     
            do shell script "/Applications/Emacs.app/Contents/MacOS/Emacs --daemon"
            do shell script "/Applications/Emacs.app/Contents/MacOS/bin/emacsclient -c -n"
        end try
    end tell

    -- bring the visible frame to the front
    tell application "Emacs" to activate

    return input
end run
kuzzooroo
источник