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 вручную после входа в систему?"Запуск вручную будет в порядке.

2 ответа2

9

Чтобы 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 и сделали его приложением по умолчанию для текстовых файлов.

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .