Основна настройка сервера 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, щоб використовувати для відкриття текстових файлів.

Дякую!

А. @lawlist запитує: "Чи відкривається новий кадр за замовчуванням, коли ви відкриваєте новий файл з терміналу, навіть якщо є існуючий кадр?" Відповідь полягає в тому, що якщо я запускаю сервер при запуску, як описано тут , відкриваю кадр, а потім відкриваю файл, ввівши /Applications/Emacs.app/Contents/MacOS/bin/emacsclient -n <whatever>, я можу змусити файл відкритись у існуючому кадрі. Якщо в даний момент немає відкритого кадру, я повинен використовувати "-nc" або коли я намагаюся відкрити файл, нічого не відбувається.

B. @lawlist запитує: "Ви хочете, щоб демон ввійшов у систему, чи достатньо було б завантажити Emacs вручну після входу?" Запуск вручну було б добре.


Чи можете ви їх пронумерувати, будь ласка, 1, 2, 3, 4, 5, 6, а може бути і 7 і 8. Крім того, чи відкривається новий кадр за замовчуванням, коли ви відкриваєте новий файл з терміналу, навіть якщо є існуючий кадр ? Я знаю деякі відповіді, але не всі - тому цифри для питань були б корисні. Ви хочете, щоб демон ввійшов у систему, чи достатньо було б завантажити Emacs вручну після входу?
законник

@Lauri Ranta має хорошу відповідь. 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>

Пліст завантажується автоматично при наступному вході в систему, але ви можете завантажити його негайно 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.

EDIT: мета скрипту полягає в тому, щоб бути пов’язаним з .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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.