OSX'te komut satırından GUI Emacs nasıl başlatılır?


91

OSX'te komut satırından GUI Emacs'ı nasıl başlatırım?

Emacs'i http://emacsformacosx.com/ adresinden indirip kurdum .

Aşağıdaki kriterlerin tümünü karşılayan bir cevabı kabul edeceğim:

  1. Emacs penceresi terminal penceremin önünde açılıyor .
  2. "Emacs" yazmak bir GUI Emacs penceresi açar. Bu pencerede dosya bulmak, varsayılan olarak Emacs'i başlattığım dizine bakmaya başlayacaktır.
  3. Foo.txt mevcut olduğunda "emacs foo.txt" yazmak foo.txt yüklü bir GUI Emacs penceresi başlatır.
  4. Foo.txt olmadığında "emacs foo.txt" yazmak, "foo.txt" adlı boş bir metin arabelleğine sahip bir GUI Emacs penceresi başlatır. Bu arabellekte ^ X ^ S yapmak foo.txt dosyasını Emacs'i başlattığım dizine kaydedecektir.

Bu kriterlerden hangisi terminal komut istemine 'emacs' girildiğinde karşılanmaz? Gereksinimleriniz, Linux'taki varsayılan davranışı tanımlar. Bir süredir Mac kullanmadım ama bence işin püf noktası çalıştırmak için doğru programı bulmaktı - emacs.app belki?
Tyler

8
Tyler, Linux geçmişinden geliyorum, her şekilde seninleyim; sadece komut istemine "emacs" yazarak yapmam gereken tek şey olmalı. Bunu OSX'te yapmak, terminal penceresinde Emacs metin modunu başlatır (dolayısıyla kriterler 1 başarısız olur) ve istediğim bu değil.
Johan Walles

1
Johan - bu arada bir çözüm buldunuz mu? Ben de aynı sorunlarla mücadele ediyorum ve bir ödül başlatmayı düşünüyorum. Özellikle can sıkıcı olan, komut satırından emacs (Emacs.app değil) çağırmanın arka planda bir pencere
açmasıdır

1
@DougHarris Gereksinimlerim herhangi bir Linux dağıtımındaki gerçekle eşleşiyor, oradan geliyorlar. Size uygun bir iş akışı bulduğunuz için mutluyum. Şerefe!
Johan Walles

2
OSX'te çalışıp çalışmadığını bilmiyorum ama şunu deneyebilirsiniz: emacsclient -c -a "" "$@"command
jfs

Yanıtlar:


113

Aşağıdaki komut dosyasını "emacs" olarak adlandırın ve bir PATHyere koyun :

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

Bu # 2, # 3 ve # 4'ü kapsar.

# 1 için, bunu .emacs dosyanızda bir yere koyun:

(x-focus-frame nil)

Emacsformacosx.com sitesi artık sahip Nasıl Yapılır sayfasını üst pasajı nereden geldiğini olan. Orada emacsclientEmacs'ı çalıştırmak ve bağlamakla ilgili daha fazla bilgi var git mergetool.


1
Teşekkürler David, sen yönet!
Johan Walles

1
Harika çalışıyor. Ödül yakında geliyor.
Tamzin Blake

2
Mavericks'te klasörün içindeysem ~/foove açmak istiyorsam bar.txtyazıyorum gmacs bar.txtama açmak ~/bar.txtyerine yeni bir dosya oluşturuyor ~foo/bar.txt. Yanlış bir şey mi yapıyorum?
Daniel Compton

2
.Emacs dosyası nerede?
Bren

1
(X-focus-frame nil) herhangi bir yere ekleyemezsiniz, özelleştirme yoluyla herhangi bir şey ayarladığınızda emacs'in sizin için oluşturacağı (custom-set-değişkenleri) ifadesinin içinde olması gerekir. "Yanıp sönen imleci" açık (sonra beğenmezseniz kapalı) gibi menü çubuğundan bir şeyi özelleştirin ve bu bölüm .emacs dosyanızda oluşturulacaktır. Ayrıca, bu test edildi mi? Cocoa'daki emac'lerin bu ayara saygı duyacağından bile emin değilim.
Chuck Adams

71

Kabuğunuzda, OSX emacs uygulamasını işaret etmek için 'emacs' komutunu değiştirin

Kabuğumda (varsayılan bash çalıştırılıyor), aşağıdakilere sahibim (.bashrc dosyamda)

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

Ardından, komut satırına emacs yazmak emacs uygulamasını başlatır.

Bununla birlikte, emacs'in bir kopyasını açmanızı ve onu çalışır durumda tutmanızı tavsiye ederim. Durum buysa ve mevcut bir emacs kopyasına bir dosya yüklemek istiyorsanız, emacsclient'i .bashrc dosyanıza aşağıdakileri yerleştirerek kullanabilirsiniz:

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

Ardından emacs sunucusunu başlatmak için .emacs dosyanıza aşağıdakileri ekleyin (emacsclient çağrılarını alan)

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

O zaman yazabilirsin

ec .bashrc

.bashrc'nin bir kopyasını mevcut bir emacs oturumuna yüklemek için!


4
Merhaba Chris! İlk cevabınız 2. ve 4. kriterlere uymuyor. İkinci cevabınız 2. kriterde başarısız oluyor. Numaralı kriterlerin tümünü karşılayan bir çözüm arıyorum. Saygılarımızla / Johan
Johan Walles

4
Her seferinde yeni bir örnek başlatmak için bir komut satırına güvenmek yerine dosyaları yüklemek için yalnızca emacs'ı kullanırsanız tüm sorunlarınız çözülebilir gibi görünüyor. Genelde emacs'i günümün başında başlatırım (hala çalışmıyorsa) ve terminal penceresine hiç dokunmadan dosyaları yüklemek, dizinleri değiştirmek, yeni dosyalar oluşturmak ve istediğim her şeyi yapmak için kullanırım.
Chris McMahan

Söylemeliyim ki, bu sitede bu soruyu ele alan birkaç soru var, ancak bu, kısa ve anlamlı bir şekilde bir dosya açma sorununu da tamamen çözen tek soru.
tylerthemiler

3
@tylerthemiler, sorunu tam olarak çözen cevap nerede? Bu cevaptaki her iki cevap da kriter 2'de başarısız olur ve ilki de 4'te başarısız olur.
Johan Walles

6
Biraz incelik, bir sorunun yanıtlanmasında uzun bir yol kat eder. Biraz Google'da da öyle.
duma

10

Bu , arka planda Emacs'ı başlatarak David Caldwell'in cevabını iyileştirir :

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

Diğer cevapta belirtildiği gibi, bu # 2, # 3 ve # 4'ü kapsar. 1. için, .emacs dosyasında bu bir yere koymak: (x-focus-frame nil).

Not Aşağıdaki olmadığını değil benim için çalışmak - bu komut satırında belirtilen bir dizinde Emacs başlamaz (örn emacs .)

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

1
Bu, OSX ile ilgili bir sorunu düzeltir (belki 10.9 Mavericks ile başlayarak). 10.9'dan itibaren, "tavsiye edilmeyen" yöntemi başarısız oluyor, en az 10.6'ya kadar, tavsiye edilmeyen kabuk $ PWD ve Emacs (pwd) ile senkronize oluyordu. David'in cevabı başka bir yerde olabilir, ancak arama motorlarının "pwd değil pwd" anlamasını nasıl sağlıyorsunuz?
infogizmo

Bu yanıttaki her iki parçacık da macOS 10.15.6 ve Emacs 26.2'de test ettiğimde doğru dizinde emacs başlatmıyor.
gsingh2011

5

Ben de seni varsayıyorum:

  • Oturum açıldığında emacs arka plan programını başlat
  • .Emac'lerinizde (server-start) var
  • Çok sayıda ayrı emac kopyasının çalışmasına aldırmayın

Eğer öyleyse, bence bu orijinal dört kriteri ve bir tane daha:

  1. Emacs penceresi terminal penceremin önünde açılıyor.

her zaman ön plana açılacaktır (x-odak çerçevesi ile).

  1. "Emacs" yazmak bir GUI Emacs penceresi açar. Bu pencerede dosya bulmak, varsayılan olarak Emacs'i başlattığım dizine bakmaya başlayacaktır.

Yönlendirilmiş modda mevcut bir emacs penceresi açacaktır.

  1. Foo.txt mevcut olduğunda "emacs foo.txt" yazmak foo.txt yüklü bir GUI Emacs penceresi başlatır.

Emacs zaten çalışıyorsa ve bir sunucusu varsa, mevcut pencerede açılacak ve ön plana gelecektir.

  1. Foo.txt olmadığında "emacs foo.txt" yazmak, "foo.txt" adlı boş bir metin arabelleğine sahip bir GUI Emacs penceresi başlatır. Bu arabellekte ^ X ^ S yapmak foo.txt dosyasını Emacs'i başlattığım dizine kaydedecektir.

Doğru.

Bir ekstra:

Komutu yazdıktan hemen sonra kontrol terminal oturumuna geri döner.

~ / 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

Harika! Görünüşe göre argümanlarınız ve argalsız bacaklarınız değişmiş.
eriksensei


4

Basit çözüm ...

Bu soruna birçok karmaşık çözüm burada yayınlanmıştır. Bu adil çünkü önemsiz görünüyor.

Ancak bu çözüm benim için gerçekten işe yarıyor.

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

Kullanım

ec file [...]

Neler olduğunu anlatalım:

  1. tüm ecbağımsız değişkenleri emacsclient'e iletin ve -ndevam etmeden önce emacs için beklemeyin ( ).
    1. Emacs zaten çalışıyorsa, işimiz bitti ve düzenleme yapıyorsunuz.
  2. çalışan bir emac yokken emacsclient tarafından gönderilen hata mesajını yutun. ( 2> /dev/null)
  3. Çıkış kodunu 1( [[ $? == 1 ]]) manuel olarak işleyin
    1. Emacs.app dosyasını açın ve dosya argümanlarını ona iletin (yollar doğru bir şekilde açılacaktır.)
    2. İşiniz bitti ve Emacs dosyalarınızı açtı.


3

David James'in cevabını daha da geliştirmek benim için şu işe yarıyor:

Http://www.emacswiki.org/emacs/EmacsForMacOS#toc20 adresinde bulunan bir terminalden bir dosyayı açma talimatları uyarınca

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

bunu David Jame'in cevabıyla birleştirerek aşağıdaki emax bash betiğini oluşturdum ve ~ / bin adresindeki yoluma yerleştirdim

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

Uyarı : emac'lerin geçerli dizini İsme göre yönetme modunda açmasını sağlamak için şunu kullanmanız gerekir:

emax .

Çevre:

  • OS X Yosemite Sürüm 10.10.2
  • 2014-11-13'ün GNU Emacs 24.4.2 (x86_64-apple-darwin14.0.0, NS apple-appkit-1343.14)

Bu yalnızca mevcut bir dosya için çalışır, orada değilse bir tane oluşturmaz
Stíofán.

MacOS 10.15 (Catalina) kullanıyorum ve görünen o ki bu ilk seferde çalışıyor (Emacs zaten açık değilken), ancak ikinci seferde çalışmıyor (bir Emacs penceresi zaten açıkken). Bunu nasıl düzelteceğinizi biliyor musunuz?
user102008

1

Buradaki diğer cevaplar benim için pek işe yaramadı. Özellikle, benim makinemde bash betiği

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

her zaman ana dizinde emacs açar. Mevcut çalışma dizininde açılmasını sağlamak için yapmam gerekiyordu

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

yerine.


1
Benim özel derlemem / yüklememde bu sorun yok, ancak çözümünüzle ilgili bir sorun var. Birden fazla dosya açmaya çalışırsanız, yalnızca ilki PWD dizinine genişleyecektir. Geri kalanının önünde $ PWD yolu olmayacaktır.
kmarsh

0

Emacs'i aşağıdaki adımlara göre derleyin:

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

Ve bitti! XQuartz'ı indirmek ve kurmak yardımcı olabilir, ancak bu sadece benim fikrim.


0

Bu, osx'te açık emacs / emacsclient komut dosyam.

#!/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

0

Yukarıdakilerin hepsinde "açık" kullanırken - "--args" seçeneğini kullandığınızdan emin olun

Bunu yapma:

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

Bunun yerine şu:

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

--argsopsiyon önler Emacs yönelik çeşitli seçenekler tüketmesini "açık".


Bazı nedenlerden dolayı, bunu macOS 10.15.6 ve Emacs 26.2'de test ettiğimde, emacs çalışma dizini ana dizinime ayarlandı, yani dosyaları göreceli yolları kullanarak açamadım. Bu, var olmayan açık dosyalar sorununu çözdü.
gsingh2011

0

En iyi cevap iyi, ancak emacs işleminin arka planda çalışmasını istedim, böylece kabuğumu kullanmaya devam edebildim. Bu cevap istediğimi yapıyor gibi görünüyordu, ancak doğru dizinde emacs başlatmadı, yani mutlak yollar gerekliydi (veya pwdher durumda çalışmayacak yollara eklemek için hackler ). Ayrıca, sadece kullanarak& , eğer terminali öldürürsem, emac'lerin de öldüreceği anlamına geliyordu.

screenVe bir bash işlevi kullanmaya karar verdim ve aşağıdaki çözüm benim için macOS 10.15.6 ve yüklü emacs 26.2'de çalışıyor brew:

function emacs() {
    screen -d -m /Applications/Emacs.app/Contents/MacOS/Emacs "$@"
}

-d -mKomut satırı bayraklarının anlamı açısından, birlikte kullanıldıklarında özel bir anlamı vardır ve bu nedenle esasen tek bir komut satırı bayrağı olarak düşünülebilir. Açıklama kılavuz sayfasındadır:

Ekranı "ayrılmış" modda başlatın. Bu, yeni bir oturum oluşturur ancak buna eklenmez. Bu, sistem başlatma komut dosyaları için kullanışlıdır.


Soru, bir GUI penceresinde açıkça Emacs istemektedir ve bu, bir terminal oturumunda Emacs'ı açar.
Johan Walles

@JohanWalles, bu Emacs'ı bir GUI penceresinde açar.
gsingh2011

screenbeni attı, şimdi daha dikkatli okuduğuma göre haklı olduğunu anlıyorum. Özür dilerim @ gsingh2011.
Johan Walles

screen -d -mBu vakadaki etkisini açıklamak için düzenleyebilir veya yorum yapabilir misiniz ?
Joshua Goldberg

1
@JoshuaGoldberg, sanırım cevapta buna cevap verdim. Arka planda emacs çalıştırmak ve terminalimin kullanımına devam etmek istedim. Benzer işlevselliği sağlayan başka yanıtlar da vardır, ancak yanlış dizinden başlamak veya emacs işlem ömrünü terminal işlem ömrüne bağlamak gibi bazı olumsuzluklarla birlikte geldiler. Cevabım (ekranı kullanarak) bu eksiklikleri ortadan kaldırıyor.
gsingh2011
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.