Podstawowa konfiguracja serwera Emacs pod OSX

9

Niedawno kupiłem pierwszego Maca od dekady i właśnie go konfiguruję. Jestem użytkownikiem Emacsa i zdecydowałem, że chcę tylko zwykłego Emacsa, a nie Aquamaca, aby móc korzystać z mojej istniejącej konfiguracji z innych systemów operacyjnych. Próbowałem śledzić wiele poradników, które znalazłem w Internecie (takich jak ten , ten i ten ze strony, z której pobrałem Emacsa ) i próbowałem łączyć te elementy na wiele sposobów, ale nigdy wprowadziłem rzeczy w stan zbliżający się do tego, do czego jestem przyzwyczajony / mam nadzieję:

  1. Demon Emacsa zaczyna działać albo przy starcie, albo tak szybko, jak go potrzebuję ; albo jedno jest w porządku. Wszelkie nowe ramki Emacsa są wspierane przez ten sam serwer.
  2. Kiedy otwieram plik tekstowy z Findera, plik otwiera się w Emacsie, jeśli to możliwe, w istniejącej ramce graficznej.
  3. Jeśli uruchomię Emacs.app, system ponownie użyje demona emacs działającego w tle zamiast uruchamiać nowe wystąpienie i otwierać w nim nowe okno. ( czapka )
  4. Kiedy uruchamiam Emacsa z terminala, terminal wykonuje swoją działalność bez czekania, aż skończę z Emacsem (chyba że użyję „-nw”)
  5. AFAIK w żadnym momencie podczas operacji opisanych powyżej Emacs nie powinien skończyć w stanie („tryb edycji serwera?”), W którym czeka na mnie napisanie C-x #, chociaż nie mam głębokiego zrozumienia tego.
  6. (Uznałbym to za bonus) Jest jakiś sposób na wywołanie Emacsa z terminala, aby Emacs ponownie wykorzystał istniejącą ramkę, jeśli to możliwe.

Jak skonfigurować Emacsa, aby zachowywał się w ten sposób?

Jestem szczególnie zakłopotany tym, że Finder otwierał rzeczy w Emacsie w taki sposób, w jaki chcę (# 2), ponieważ znalezione przewodniki generalnie tworzą wiele aliasów, skryptów Apple, skryptów bash itp. I nie jestem pewien którego chcę powiedzieć Finderowi, aby otwierał pliki tekstowe.

Dzięki!

A. @lawlist pyta: „Czy nowa ramka jest domyślnie otwierana po otwarciu nowego pliku z terminala, nawet jeśli istnieje już ramka?” Odpowiedź jest taka, że ​​jeśli uruchomię serwer podczas uruchamiania zgodnie z opisem tutaj , otworzę ramkę, a następnie otworzę plik, wpisując /Applications/Emacs.app/Contents/MacOS/bin/emacsclient -n <whatever>, mogę otworzyć plik w istniejącej ramce. Jeśli aktualnie nie ma otwartej ramki, muszę użyć „-nc” lub gdy próbuję otworzyć plik, nic się nie dzieje.

B. @lawlist pyta: „Czy chcesz, aby demon działał podczas logowania, czy wystarczy ładowanie Emacsa ręcznie po zalogowaniu?” Uruchamianie ręczne byłoby w porządku.

kuzzooroo
źródło
Czy możesz je ponumerować, 1, 2, 3, 4, 5, 6, a może 7 i 8. Ponadto nowa ramka jest domyślnie otwierana po otwarciu nowego pliku z terminala, mimo że istnieje już ramka ? Znam niektóre odpowiedzi, ale nie wszystkie - więc pomocne byłyby liczby do pytań. Czy chcesz, aby demon działał przy logowaniu, czy wystarczy ładowanie Emacsa ręcznie po zalogowaniu?
prawnik
@Lauri Ranta ma dobrą odpowiedź. M-x server-startręcznie uruchomi serwer, aby emacsclientmógł się z nim komunikować. Umieściłem (server-start)w swoim init.elpliku zamiast używania demona przy logowaniu - jednak wiele osób woli opcję logowania demona. Oczywiście .emacsplik byłby odpowiednim miejscem dla (server-start).
prawnik
Jeśli chodzi o otwieranie plików z Findera, zakładam , że jesteś daleko poza etapem potrzebowania czegoś takiego: dummies.com/how-to/content/… Zakładając, że to nie przeszkadza , to prawdopodobnie masz zamiar w porządku ns-find-file- który jest aktywowany automatycznie, gdy plik jest powiązany z Emacs.app. Moja funkcja pliku przechwytującego w powyższych linkach również modyfikuje, ns-find-fileczy to Cię interesuje. Oczywiście potrzebujesz zbudowanego Emacsa --with-ns.
prawnik

Odpowiedzi:

10

Aby Emacs.app otwierał pliki w istniejącej ramce zamiast w nowej ramce, dodaj (setq ns-pop-up-frames nil)do pliku konfiguracyjnego, takiego jak ~/.emacs.

Możesz otworzyć plik z terminala za pomocą open -a emacs filelub emacsclient -n file. Jeśli Emacs.app nie jest otwarty, ale istnieje Emacs --daemonproces, z jakiegoś powodu emacsclient -n filenie działa, ale emacsclient -nc filedziała.

Upewnij się, że używasz emacsclientpliku binarnego dołączonego do wersji Emacsa, której używasz, np. /Applications/Emacs.app/Contents/MacOS/bin/emacsclientLub /usr/local/bin/emacsclientjeśli zainstalowałeś Emacsa z Homebrew.

Aby uruchomić serwer Emacsa przy logowaniu, na przykład zapisz tę listę jako ~/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>

List jest ładowany automatycznie przy następnym logowaniu, ale można go załadować natychmiast po uruchomieniu launchctl load ~/Library/LaunchAgents/my.emacsdaemon.plist.

Edycja: Nadal nie wiem, dlaczego ludzie kojarzą typy plików z aplikacją AppleScript zamiast tylko Emacs.app. Skrypt w odpowiedzi kuzzooroo można również napisać jako skrypt powłoki:

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

Za pomocą Dziobaka możesz zapisać skrypt jako aplikację:

Właśnie zacząłem używać Emacsa, ale mam zupełnie inną konfigurację. Zrobiłem własną aplikację Emacs, wykonując kopię iTerm.app, zmieniając CFBundleIdentifier w Info.plist, tak aby aplikacja używała innego pliku preferencji, i ustawiając domyślne polecenie na /usr/local/bin/emacs. Dodałem (server-start)do ~/.emacsi otworzyć niestandardową aplikację Emacs przy logowaniu. Użyłem Platypus do stworzenia działającej aplikacji emacsclient -n "$@";open -b my.emacsi ustawiłem ją jako domyślną aplikację do plików tekstowych.

Lri
źródło
2

Rozwiązanie Lauriego w połączeniu z sugestiami z komentarzy w dużej mierze rozwiązało moje problemy. Wkleiłem poniżej część Applescript, którą zszyłem z rzeczy znalezionych w Internecie. Skrypt pomaga wygładzić pozostałe zmarszczki, np. Jego zachowanie jest nieco lepsze, jeśli nie ma bieżącej ramki Emacsa.

EDYCJA: celem skryptu jest skojarzenie z plikami .txt w Finderze.

-- 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
źródło