Bagaimana cara meluncurkan GUI Emacs dari baris perintah di OSX?

91

Bagaimana cara meluncurkan GUI Emacs dari baris perintah di OSX?

Saya telah mengunduh dan menginstal Emacs dari http://emacsformacosx.com/ .

Saya akan menerima jawaban yang memenuhi semua kriteria berikut:

  1. Jendela emacs terbuka di depan jendela terminal saya.
  2. Mengetik "emacs" akan membuka jendela GUI Emacs. Menemukan file di jendela itu secara default akan mencari di direktori tempat saya memulai Emacs.
  3. Mengetik "emacs foo.txt" ketika foo.txt ada akan meluncurkan jendela GUI Emacs dengan foo.txt dimuat.
  4. Mengetik "emacs foo.txt" jika foo.txt tidak ada akan meluncurkan jendela GUI Emacs dengan buffer teks kosong bernama "foo.txt". Melakukan ^ X ^ S di buffer itu akan menyimpan foo.txt di direktori tempat saya memulai Emacs.
Johan Walles
sumber
Manakah dari kriteria tersebut yang tidak terpenuhi dengan memasukkan 'emacs' pada prompt terminal? Persyaratan Anda menjelaskan perilaku default di Linux. Saya sudah lama tidak menggunakan Mac, tetapi menurut saya triknya hanyalah menemukan program yang tepat untuk dieksekusi - mungkin emacs.app?
Tyler
8
Tyler, berasal dari latar belakang Linux. Saya selalu bersama Anda; Saya hanya perlu mengetik "emacs" saat diminta. Melakukan itu di OSX meluncurkan mode teks Emacs di jendela terminal (dengan demikian gagal kriteria 1), dan bukan itu yang saya inginkan.
Johan Walles
1
Johan - apakah Anda sudah menemukan solusi untuk saat ini? Saya bergumul dengan masalah yang sama dan berpikir untuk memulai hadiah. Yang sangat mengganggu adalah memanggil emacs (dan bukan Emacs.app) dari baris perintah membuka jendela di latar belakang ...
alexurba
1
@DougHarris Persyaratan saya sesuai dengan kenyataan di distro Linux mana pun, dari situlah asalnya. Saya senang Anda telah menemukan alur kerja yang sesuai untuk Anda. Bersulang!
Johan Walles
2
Saya tidak tahu apakah ini berfungsi di OSX tetapi Anda dapat mencoba: emacsclient -c -a "" "$@"command
jfs

Jawaban:

113

Panggil skrip berikut "emacs" dan letakkan di PATHtempat Anda :

#!/bin/sh
/Applications/Emacs.app/Contents/MacOS/Emacs "$@"

Itu mencakup # 2, # 3, dan # 4.

Untuk # 1, letakkan ini di suatu tempat di file .emacs Anda:

(x-focus-frame nil)

Situs emacsformacosx.com sekarang memiliki halaman How-To , dari mana cuplikan teratas berasal. Ada lebih banyak info di sana tentang menjalankan emacsclientdan menghubungkan Emacs dengan git mergetool.

David Caldwell
sumber
1
Terima kasih David, Anda memerintah!
Johan Walles
1
Bekerja dengan baik. Bounty segera datang.
Tamzin Blake
2
Di Mavericks jika saya berada di folder ~/foodan ingin membuka, bar.txtsaya mengetik gmacs bar.txttetapi itu membuat file baru di ~/bar.txtalih-alih membuka ~foo/bar.txt. Apakah saya melakukan sesuatu yang salah?
Daniel Compton
2
Di mana file .emacs?
Bren
1
Anda tidak dapat menambahkan (x-focus-frame nil) sembarang tempat, itu harus berada dalam ekspresi (custom-set-variabel), yang akan dibuat oleh emacs untuk Anda setelah Anda mengatur apapun melalui kustomisasi. Cukup sesuaikan sesuatu dari bilah menu, seperti menyetel "kursor berkedip" ke aktif (lalu nonaktifkan jika Anda tidak menyukainya) dan bagian itu akan dibuat di .emacs Anda. Juga, apakah ini bahkan diuji? Saya tidak yakin emacs on Cocoa akan menghargai pengaturan ini.
Chuck Adams
71

Di shell Anda, gunakan alias 'emacs' untuk mengarahkan ke aplikasi OSX emacs

Di shell saya (menjalankan bash default), saya memiliki yang berikut ini (di .bashrc saya)

alias emacs='open -a /Applications/Emacs.app $1'

Kemudian, mengetik emacs pada baris perintah memulai aplikasi emacs.

Namun, saya akan merekomendasikan Anda untuk membuka salinan emacs dan tetap menjalankannya. Jika demikian, dan Anda ingin memuat file ke salinan emacs yang sudah ada, Anda dapat menggunakan emacsclient dengan menempatkan perintah berikut di .bashrc Anda:

alias ec='/Applications/Emacs.app/Contents/MacOS/bin/emacsclient'

Kemudian tambahkan berikut ini ke file .emacs Anda untuk memulai server emacs (yang menerima panggilan emacsclient)

;;========================================
;; start the emacsserver that listens to emacsclient
(server-start)

Kemudian Anda bisa mengetik

ec .bashrc

untuk memuat salinan .bashrc ke sesi emacs yang sudah ada!

Chris McMahan
sumber
4
Hai Chris! Jawaban pertama Anda gagal kriteria 2 dan 4. Jawaban kedua Anda gagal kriteria 2. Saya mencari solusi yang memenuhi semua kriteria bernomor. Salam / Johan
Johan Walles
4
Tampaknya semua masalah Anda dapat diselesaikan jika Anda hanya menggunakan emacs itu sendiri untuk memuat file, daripada mengandalkan baris perintah untuk meluncurkan instance baru setiap saat. Saya biasanya memulai emacs di awal hari saya (jika tidak masih berjalan), dan menggunakannya untuk memuat file, mengubah direktori, membuat file baru, dan apa pun yang saya inginkan tanpa pernah menyentuh jendela terminal.
Chris McMahan
Saya harus mengatakan, ada beberapa pertanyaan di situs ini yang berhubungan dengan pertanyaan ini, tetapi ini adalah satu-satunya yang sepenuhnya memecahkan masalah juga membuka file, dengan cara yang fasih singkat.
tylerthemiler
3
@tylerthemiler, di manakah jawaban yang sepenuhnya menyelesaikan masalah? Kedua jawaban dalam jawaban ini gagal kriteria 2 dan yang pertama gagal 4 juga.
Johan Walles
6
Sedikit kebijaksanaan akan sangat membantu dalam menjawab pertanyaan. Begitu juga sedikit Googling.
duma
10

Ini meningkatkan jawaban David Caldwell dengan memulai Emacs di latar belakang:

#!/bin/sh
$(/Applications/Emacs.app/Contents/MacOS/Emacs "$@") &

Seperti yang dinyatakan dalam jawaban lain, ini mencakup # 2, # 3, dan # 4. Untuk # 1, menempatkan ini di suatu tempat dalam file Emacs Anda: (x-focus-frame nil).

Perhatikan bahwa berikut ini tidak berfungsi untuk saya - ini tidak memulai Emacs di direktori yang ditentukan pada baris perintah (mis. emacs .)

# NOT RECOMMENDED
#!/bin/sh
/Applications/Emacs.app/Contents/MacOS/Emacs "$@" &
David J.
sumber
1
Ini memperbaiki masalah dengan OSX (mungkin dimulai dengan 10.9 Mavericks). Mulai 10.9, metode "tidak disarankan" gagal, di mana hingga setidaknya 10.6, metode tidak disarankan memang menyinkronkan shell $ PWD dan Emacs (pwd). Jawaban David mungkin ada di tempat lain, tetapi bagaimana Anda membuat mesin telusur memahami: "pwd not pwd"?
infogizmo
Kedua cuplikan dalam jawaban ini tidak memulai emacs di direktori yang benar ketika saya menguji pada macOS 10.15.6 dan Emacs 26.2.
gsingh2011
5

Saya berasumsi bahwa Anda:

  • Jalankan daemon emacs saat login
  • Memiliki (server-start) di .emacs Anda
  • Jangan keberatan menjalankan banyak salinan terpisah dari emacs

Jika demikian, maka menurut saya ini memenuhi empat kriteria asli, ditambah satu lagi:

  1. Jendela emacs terbuka di depan jendela terminal saya.

itu akan selalu terbuka ke latar depan (dengan x-focus-frame).

  1. Mengetik "emacs" akan membuka jendela GUI Emacs. Menemukan file di jendela itu secara default akan mencari di direktori tempat saya memulai Emacs.

Ini akan membuka jendela emacs yang ada dalam mode dired.

  1. Mengetik "emacs foo.txt" ketika foo.txt ada akan meluncurkan jendela GUI Emacs dengan foo.txt dimuat.

Jika emacs sudah berjalan dan memiliki server, maka emacs akan terbuka di jendela yang ada dan muncul di latar depan.

  1. Mengetik "emacs foo.txt" jika foo.txt tidak ada akan meluncurkan jendela GUI Emacs dengan buffer teks kosong bernama "foo.txt". Melakukan ^ X ^ S di buffer itu akan menyimpan foo.txt di direktori tempat saya memulai Emacs.

Benar.

Satu tambahan:

Kontrol kembali ke sesi terminal segera setelah mengetik perintah.

~ / bin / emacs

#!/bin/bash
EMACSPATH=/Applications/Emacs.app/Contents/MacOS

# Check if an emacs server is available 
# (by checking to see if it will evaluate a lisp statement)

if ! (${EMACSPATH}/bin/emacsclient --eval "t"  2> /dev/null > /dev/null )
then
    # There is no server available so,
    # Start Emacs.app detached from the terminal 
    # and change Emac's directory to PWD

    nohup ${EMACSPATH}/Emacs --chdir "${PWD}" "${@}" 2>&1 > /dev/null &
else
    # The emacs server is available so use emacsclient

    if [ -z "${@}" ]
    then
        # There are no arguments, so
        # tell emacs to open a new window

        ${EMACSPATH}/bin/emacsclient --eval "(list-directory \"${PWD}\")"
    else    
        # There are arguments, so
        # tell emacs to open them

        ${EMACSPATH}/bin/emacsclient --no-wait "${@}"
    fi

    # Bring emacs to the foreground

    ${EMACSPATH}/bin/emacsclient --eval "(x-focus-frame nil)"
fi
Dave
sumber
Hebat! Sepertinya kaki args dan no-args Anda berubah.
eriksensei
4

Solusi sederhana ...

Banyak solusi yang sangat kompleks untuk masalah ini diposting di sini. Itu wajar karena terkesan tidak sepele.

Namun, solusi ini bekerja dengan sangat baik untuk saya.

ec() {
  emacsclient -n $@ 2> /dev/null
  if [[ $? == 1 ]]; then
    open -a Emacs.app  -- $@
  fi
}

Pemakaian

ec file [...]

Mari kita bongkar apa yang terjadi:

  1. teruskan semua ecargumen ke emacsclient dan jangan ( -n) tunggu emacs sebelum melanjutkan.
    1. Jika Emacs sudah berjalan, kita sudah selesai dan Anda sedang mengedit.
  2. menelan pesan kesalahan yang dikirim oleh emacsclient ketika tidak ada emacs yang berjalan. ( 2> /dev/null)
  3. Tangani secara manual kode keluar 1( [[ $? == 1 ]])
    1. buka Emacs.app dan berikan argumen file ke dalamnya (jalur akan dibuka dengan benar.)
    2. Anda sudah selesai, dan Emacs telah membuka file Anda.
ocodo
sumber
3

Baru saja membangun emacs dengan manajer paket homebrew sesuai dengan panduan ini: http://www.emacswiki.org/emacs/EmacsForMacOS dengan brew install --cocoa emacs Setelah itu seseorang harus meluncurkan versi .app untuk mendapatkan gui, yang dalam kasus saya adalah /usr/local/Cellar/emacs/24.3/Emacs.app/Contents/MacOS/Emacs

Yuriy Skvortsov
sumber
--cocoa tidak digunakan lagi; menggunakan --dengan-cocoa sebagai gantinya!
Erwin Rooijakkers
3

Lebih jauh memperbaiki tanggapan David James, berikut ini berhasil untuk saya:

Sesuai instruksi untuk membuka file dari terminal yang ditemukan di http://www.emacswiki.org/emacs/EmacsForMacOS#toc20

open -a /Applications/Emacs.app <file-name>

menggabungkan ini dengan tanggapan David Jame Saya telah membuat skrip bash emax berikut dan menempatkannya di jalur saya di ~ / bin

#!/bin/bash
(open -a /Applications/Emacs.app "$@") &

Peringatan : agar emacs membuka direktori saat ini dalam mode Dired by name , Anda perlu menggunakan

emax .

Lingkungan Hidup:

  • OS X Yosemite Versi 10.10.2
  • GNU Emacs 24.4.2 (x86_64-apple-darwin14.0.0, NS apple-appkit-1343.14) dari 2014-11-13
sbecker11
sumber
Ini hanya berfungsi untuk file yang sudah ada, tidak akan membuatnya jika tidak ada
Stíofán.
Saya menggunakan macOS 10.15 (Catalina), dan tampaknya ini berfungsi pertama kali (saat Emacs belum dibuka), tetapi tidak berfungsi untuk kedua kalinya (saat jendela Emacs sudah terbuka). Apakah Anda tahu cara memperbaikinya?
pengguna102008
1

Jawaban lain di sini tidak cukup berhasil untuk saya. Secara khusus, di komputer saya, skrip bash

#!/bin/sh
/Applications/Emacs.app/Contents/MacOS/Emacs "$@" 

selalu membuka emacs di direktori home. Untuk membukanya di direktori kerja saat ini, saya harus melakukannya

#!/bin/sh
/Applications/Emacs.app/Contents/MacOS/Emacs "$PWD/$@"

sebagai gantinya.

jackkamm
sumber
1
Build / install khusus saya tidak memiliki masalah itu, tetapi ada masalah dengan solusi Anda. Jika Anda mencoba membuka lebih dari satu file, hanya file pertama yang akan diperluas ke direktori PWD. Sisanya tidak akan memiliki jalur $ PWD yang diawali.
kmarsh
0

Kompilasi Emacs menurut langkah-langkah berikut:

./configure --with-x --prefix=/usr
make
sudo make install

Dan Anda selesai! Mungkin membantu untuk mengunduh dan menginstal XQuartz, tapi itu hanya pendapat saya.

menyapu
sumber
0

Ini adalah skrip saya untuk membuka emacs / emacsclient di osx.

#!/bin/bash

# Ensure (server-start) is added in your emacs init script.

EMACS=/Applications/MacPorts/Emacs.app/Contents/MacOS/Emacs
EMACSCLIENT=/Applications/Macports/Emacs.app/\
Contents/MacOS/bin/emacsclient

# test if client already exsit.
$EMACSCLIENT -e "(frames-on-display-list)" &>/dev/null

# use emacsclient to connect existing server.
if [ $? -eq 0 ]; then
    $EMACSCLIENT -n "$@"
# open emacs.app instead.
else
    `$EMACS "$@"` &
fi
Koren.H
sumber
0

Dalam semua hal di atas saat menggunakan "open" - pastikan Anda menggunakan opsi "--args"

Jangan lakukan ini:

alias emacs='open -a /Applications/Emacs.app $1'

Sebaliknya ini:

alias emacs='open -a /Applications/Emacs.app --args $1'

yang --argspilihan mencegah "terbuka" dari mengkonsumsi berbagai pilihan dimaksudkan untuk Emacs.

pengguna3696153
sumber
Untuk beberapa alasan, ketika saya menguji ini di macOS 10.15.6 dan Emacs 26.2, direktori kerja emacs disetel ke direktori home saya, yang berarti saya tidak dapat membuka file menggunakan jalur relatif. Ini memperbaiki masalah membuka file yang tidak ada.
gsingh2011
0

The top Jawabannya adalah baik, tapi aku ingin emacs memproses untuk berjalan di latar belakang sehingga saya masih bisa menggunakan shell saya. Jawaban ini tampaknya melakukan apa yang saya inginkan, tetapi tidak memulai emacs di direktori yang benar, yang berarti jalur absolut diperlukan (atau peretasan untuk menambahkan pwdke jalur yang tidak akan berfungsi di semua kasus). Selanjutnya cukup menggunakan& berarti jika saya mematikan terminal, emacs juga akan terbunuh.

Saya memutuskan untuk menggunakan screendan fungsi bash, dan solusi berikut berfungsi untuk saya di macOS 10.15.6 dan emacs 26.2 yang diinstal dengan brew:

function emacs() {
    screen -d -m /Applications/Emacs.app/Contents/MacOS/Emacs "$@"
}
gsingh2011
sumber
Pertanyaan tersebut secara eksplisit meminta Emacs di jendela GUI, dan ini membuka Emacs di sesi terminal.
Johan Walles
@JohanWalles, ini membuka Emacs di jendela GUI.
gsingh2011
screenmembuang saya, sekarang setelah saya membaca lebih cermat, saya menyadari bahwa Anda benar. Saya minta maaf @ gsingh2011.
Johan Walles