OSX altında Emacs sunucusunun temel kurulumu


9

Kısa bir süre önce ilk Mac'imi satın aldım ve yapılandırma aşamasındayım. Ben bir Emacs kullanıcısıyım ve mevcut yapılandırmamı diğer işletim sistemlerinden kullanabilmem için sadece düzenli Emacs değil Aquamacs istiyorum . Ben bir sürü aşağıdaki denedim nasıl yapılır buldum çevrimiçi (gibi bu bir , bu bir ve ben Emacs indirdiğiniz sitesinden bu bir ve parçalara yollardan herhangi sayıda birleştirerek denedi, ama asla) alışık olduğum / umduğum şeye yaklaşan şeyleri bile bir duruma getirdim:

  1. Emacs arka plan programı başlangıçta ya da ihtiyacım olduğu anda çalışmaya başlar ; her ikisi de iyidir. Tüm yeni Emacs çerçeveleri aynı sunucu tarafından desteklenir.
  2. Finder'dan bir metin dosyası açtığımda, dosya mümkünse mevcut bir grafik çerçevesinde Emacs'ta açılır.
  3. Emacs.app'ı çalıştırırsam, sistem yeni bir örnek başlatmak ve üzerinde yeni bir pencere açmak yerine arka planda çalışan emacs arka plan programını yeniden kullanır. ( şapka ucu )
  4. Emacs'ı bir terminalden çalıştırdığımda terminal, Emacs ile bitirmemi beklemeden işine devam ediyor ('-nw' kullanmadıkça)
  5. AFAIK, yukarıda açıklanan işlemler sırasında hiçbir noktada Emacs'ın yazmamı beklediği bir duruma ("sunucu düzenleme modu?") C-x #Sahip olmamalı, ancak bunu derinlemesine anlamıyorum.
  6. (Bunu bir bonus olarak değerlendiririm) Emacs'ı bir terminalden çağırmamın bir yolu var, böylece Emacs mümkünse mevcut bir çerçeveyi yeniden kullanıyor.

Emacs'ı böyle davranacak şekilde nasıl yapılandırabilirim?

Finder'ın Emacs'ta işleri istediğim gibi açmasını sağlayarak şaşırdım (# 2), çünkü bulduğum kılavuzlar genellikle bir takım takma adlar, Applescripts, bash komut dosyaları vb. Oluşturuyor ve emin değilim ki bu da Finder'a metin dosyalarını açmak için kullanmasını söylemek istiyorum.

Teşekkürler!

A. @lawlist, "Mevcut bir çerçeve olmasına rağmen terminalden yeni bir dosya açtığınızda varsayılan olarak yeni bir çerçeve açılıyor mu?" Diye soruyor. Yanıt, başlangıçta bir sunucuyu burada açıklandığı gibi başlatırsam , bir çerçeve açar ve ardından bir dosyayı yazarak açarsam /Applications/Emacs.app/Contents/MacOS/bin/emacsclient -n <whatever>, dosyayı var olan bir çerçevede açabilmemdir. Şu anda açık olan bir çerçeve yoksa "-nc" kullanmak zorundayım veya bir dosyayı açmaya çalıştığımda hiçbir şey olmuyor.

B. @lawlist, "Daemon'un girişte çalışmasını ister misiniz, yoksa giriş yaptıktan sonra Emacs'ı manuel olarak yüklemek yeterli olur mu?" Elle çalıştırmak iyi olur.


Lütfen onları numaralayabilir misiniz, 1, 2, 3, 4, 5, 6 ve belki 7 ve 8. Ayrıca, mevcut bir çerçeve olsa bile terminalden yeni bir dosya açtığınızda varsayılan olarak yeni bir çerçeve açılıyor. ? Bazı cevapları biliyorum, ama hepsini değil - bu yüzden soruların sayıları yardımcı olacaktır. Arka plan programının oturum açmada çalışmasını istiyor musunuz, yoksa oturum açtıktan sonra Emacs'ı manuel olarak yüklemek yeterli mi?
hukukçu

@ Laura Ranta'nın iyi bir cevabı var. M-x server-startsunucuyu el ile başlatır, böylece emacsclientonunla iletişim kurabilir. Ben yerleştirmiş (server-start)benim de init.elyerine Giriş sırasında cini kullanmanın dosyası - ancak birçok kişi cini giriş seçeneğini tercih ederim. Ve elbette, .emacsdosya için uygun bir yer olurdu (server-start).
hukukçu

Finder'dan dosya açma konusunda, böyle bir şeye ihtiyaç duyduğunuzdan çok daha ötesinde olduğunuzu varsayıyorum : dummies.com/how-to/content/… Yani, yolun dışında olduğunu varsayarak, muhtemelen gidiyorsunuz ns-find-fileEmacs.app ile ilişkilendirildiğinde otomatik olarak etkinleştirilen - ile gayet iyi olun. Yukarıdaki bağlantılardaki kesişim dosyası işlevi de ns-find-fileilginizi çekecek bir şey olup olmadığını değiştirir . Tabii ki, inşa edilmiş Emacs'a ihtiyacınız var --with-ns.
hukukçu

Yanıtlar:


10

Emacs.app dosyalarını yeni bir çerçeve yerine var olan bir çerçevede açmak için, (setq ns-pop-up-frames nil)gibi bir yapılandırma dosyasına ekleyin ~/.emacs.

Sen bir terminalden bir dosya açabilirsiniz open -a emacs fileya emacsclient -n file. Emacs.app açık değilse, ancak bir Emacs --daemonsüreç varsa, bir nedenden dolayı emacsclient -n fileçalışmıyor, ancak çalışıyor emacsclient -nc file.

Kullandığınız emacsclient, gibi Emacs sürümünde bulunan /Applications/Emacs.app/Contents/MacOS/bin/emacsclientveya /usr/local/bin/emacsclientEmacs'ı Homebrew ile yüklediyseniz , ikili dosyayı kullandığınızdan emin olun .

Oturum açarken bir Emacs sunucusu başlatmak için, bu plist'i şu şekilde kaydedin ~/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, bir sonraki girişinizde otomatik olarak yüklenir, ancak çalıştırarak hemen yükleyebilirsiniz launchctl load ~/Library/LaunchAgents/my.emacsdaemon.plist.

Düzenleme: Hala insanların dosya türlerini neden sadece Emacs.app yerine bir AppleScript uygulamasıyla ilişkilendirdiklerini bilmiyorum. Yine de kuzzooroo'nun cevabındaki senaryo bir kabuk senaryosu olarak da yazılabilir:

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

Komut dosyasını bir uygulama olarak kaydetmek için Platypus'u kullanabilirsiniz :

Emacs'ı kullanmaya yeni başladım, ancak tamamen farklı bir kurulumum var. İTerm.app'ın bir kopyasını oluşturarak, uygulamanın farklı bir tercih dosyası kullanması için Info.plist'deki CFBundleIdentifier öğesini değiştirerek ve varsayılan komutu ayarlayarak kendi Emacs uygulamamı yaptım /usr/local/bin/emacs. Eklediğim (server-start)için ~/.emacsve ben Girişte özel Emacs uygulamasını açın. Çalışan bir uygulama oluşturmak için Platypus'u kullandım emacsclient -n "$@";open -b my.emacsve metin dosyaları için varsayılan uygulama yaptım.


2

Lauri'nin çözümü yorumlardan gelen önerilerle birleştiğinde sorunlarımı büyük ölçüde ele aldı. Çevrimiçi bulduğum şeylerden bir araya getirdiğim bazı Applescript'in altına yapıştırdım. Betik, kalan kırışıklıkları gidermeye yardımcı olur, örneğin, mevcut Emacs çerçevesi yoksa davranışı biraz daha iyidir.

EDIT: komut dosyasının amacı Finder'daki .txt dosyalarıyla ilişkilendirilmektir.

-- 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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.