Pengaturan dasar server Emacs di bawah OSX


9

Saya baru-baru ini membeli Mac pertama saya dalam satu dekade dan sedang dalam proses mengkonfigurasi itu. Saya seorang pengguna Emacs dan telah menentukan saya ingin hanya Emacs biasa bukan Aquamacs sehingga saya dapat menggunakan konfigurasi yang ada dari sistem operasi lain. Saya telah mencoba mengikuti banyak cara yang saya temukan online (seperti ini , ini dan ini dari situs tempat saya mengunduh Emacs ), dan telah mencoba menggabungkan potongan-potongan dengan berbagai cara, tetapi tidak pernah membuat keadaan menjadi mendekati apa yang saya harapkan / harapkan:

  1. Daemon Emacs mulai berjalan saat startup atau segera setelah saya membutuhkannya ; baik baik saja. Setiap frame Emacs baru didukung oleh server yang sama.
  2. Ketika saya membuka file teks dari Finder file dibuka di Emacs, dalam bingkai grafis yang ada jika memungkinkan.
  3. Jika saya menjalankan Emacs.app, sistem menggunakan kembali daemon emacs yang berjalan di latar bukannya memulai contoh baru dan membuka jendela baru di atasnya. ( ujung topi )
  4. Ketika saya menjalankan Emacs dari terminal, terminal menjalankan bisnisnya tanpa menunggu saya selesai dengan Emacs (kecuali saya menggunakan '-nw')
  5. AFAIK pada titik mana pun selama operasi yang dijelaskan di atas haruskah Emacs berakhir dalam keadaan ("mode edit server?") Di mana ia menunggu saya mengetik C-x #, meskipun saya tidak memiliki pemahaman yang mendalam tentang hal ini.
  6. (Saya akan menganggap ini sebagai bonus). Ada beberapa cara bagi saya untuk memanggil Emacs dari terminal sehingga Emacs menggunakan kembali frame yang ada jika memungkinkan.

Bagaimana saya bisa mengkonfigurasi Emacs untuk berperilaku seperti ini?

Saya khususnya bingung dengan membuat Finder untuk membuka hal-hal di Emacs seperti yang saya inginkan (# 2), karena panduan yang saya temukan umumnya membuat sejumlah alias, Applescripts, bash scripts, dll. Dan saya tidak yakin yang saya ingin memberitahu Finder untuk digunakan untuk membuka file teks.

Terima kasih!

A. @lawlist bertanya, "Apakah frame baru dibuka secara default ketika Anda membuka file baru dari terminal meskipun ada frame yang ada?" Jawabannya adalah jika saya memulai server saat startup seperti yang dijelaskan di sini , buka bingkai, dan kemudian buka file dengan mengetik /Applications/Emacs.app/Contents/MacOS/bin/emacsclient -n <whatever>, saya bisa mendapatkan file untuk dibuka di bingkai yang ada. Jika tidak ada bingkai saat ini terbuka saya harus menggunakan "-nc" atau ketika saya mencoba membuka file tidak ada yang terjadi.

B. @lawlist bertanya, "Apakah Anda ingin daemon berjalan saat login, atau apakah itu cukup untuk memuat Emacs secara manual setelah login?" Menjalankan secara manual akan baik-baik saja.


Bisakah Anda menghitungnya, 1, 2, 3, 4, 5, 6, dan mungkin 7 dan 8. Selain itu, frame baru dibuka secara default saat Anda membuka file baru dari terminal meskipun ada frame yang ada ? Saya tahu beberapa jawaban, tetapi tidak semuanya - jadi angka untuk pertanyaan akan sangat membantu. Apakah Anda ingin daemon berjalan saat login, atau apakah itu cukup untuk memuat Emacs secara manual setelah login?
lawlist

@Luriuri Ranta memiliki jawaban yang bagus. M-x server-startsecara manual akan memulai server sehingga emacsclientdapat berkomunikasi dengannya. Saya telah menempatkan file (server-start)saya init.eldaripada menggunakan daemon saat login - namun, banyak orang lebih suka opsi masuk daemon. Dan tentu saja, .emacsfile tersebut akan menjadi tempat yang cocok untuk (server-start).
lawlist

Berkenaan dengan membuka file dari Finder, saya berasumsi bahwa Anda jauh melampaui tahap membutuhkan sesuatu seperti ini: dummies.com/how-to/content/… Jadi, dengan asumsi bahwa itu tidak mungkin, maka Anda mungkin akan pergi baik-baik saja dengan ns-find-file- yang diaktifkan secara otomatis ketika file dikaitkan dengan Emacs.app. Fungsi file intersep saya di tautan di atas juga memodifikasi ns-find-filejika itu sesuatu yang menarik minat Anda. Tentu saja, Anda perlu Emacs built --with-ns.
hukum

Jawaban:


10

Untuk membuat Emacs.app membuka file dalam bingkai yang sudah ada alih-alih bingkai baru, tambahkan (setq ns-pop-up-frames nil)ke file konfigurasi seperti ~/.emacs.

Anda dapat membuka file dari terminal dengan open -a emacs fileatau emacsclient -n file. Jika Emacs.app tidak terbuka tetapi ada Emacs --daemonproses, untuk beberapa alasan emacsclient -n filetidak berfungsi tetapi emacsclient -nc filetidak.

Pastikan Anda menggunakan emacsclientbiner yang disertakan dengan versi Emacs yang Anda gunakan, sukai /Applications/Emacs.app/Contents/MacOS/bin/emacsclient, atau /usr/local/bin/emacsclientjika Anda menginstal Emacs dengan Homebrew.

Untuk memulai server Emacs saat login, misalnya simpan daftar ini sebagai ~/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 dimuat secara otomatis saat berikutnya Anda masuk, tetapi Anda dapat langsung memuatnya dengan menjalankan launchctl load ~/Library/LaunchAgents/my.emacsdaemon.plist.

Sunting: Saya masih tidak tahu mengapa orang mengaitkan tipe file dengan aplikasi AppleScript, bukan hanya Emacs.app. Skrip dalam jawaban kuzzooroo juga bisa ditulis sebagai skrip shell:

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

Anda dapat menggunakan Platypus untuk menyimpan skrip sebagai aplikasi:

Saya baru saja mulai menggunakan Emacs, tetapi saya memiliki pengaturan yang sama sekali berbeda. Saya membuat aplikasi Emacs saya sendiri dengan membuat salinan iTerm.app, mengubah CFBundleIdentifier di Info.plist sehingga aplikasi tersebut menggunakan file preferensi yang berbeda, dan mengatur perintah default ke /usr/local/bin/emacs. Saya telah menambahkan (server-start)untuk ~/.emacsdan saya membuka kustom aplikasi Emacs saat login. Saya menggunakan Platypus untuk membuat aplikasi yang berjalan emacsclient -n "$@";open -b my.emacsdan saya menjadikannya aplikasi default untuk file teks.


2

Solusi Lauri yang dikombinasikan dengan saran dari komentar sebagian besar telah mengatasi masalah saya. Saya telah menempelkan beberapa Applescript di bawah ini yang saya jahit bersama dari barang-barang yang saya temukan online. Skrip membantu merapikan beberapa kerutan yang tersisa, misalnya, perilakunya sedikit lebih baik jika tidak ada bingkai Emacs saat ini.

EDIT: tujuan skrip harus dikaitkan dengan file .txt di 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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.