Jak uruchomić GUI Emacs z wiersza poleceń w OSX?


91

Jak uruchomić GUI Emacs z wiersza poleceń w OSX?

Pobrałem i zainstalowałem Emacsa z http://emacsformacosx.com/ .

Przyjmuję odpowiedź spełniającą wszystkie poniższe kryteria:

  1. Otworzy się okno emacsa przed moim oknem terminala.
  2. Wpisanie "emacs" uruchamia okno GUI Emacsa. Znajdowanie plików w tym oknie będzie domyślnie szukać w katalogu, z którego uruchomiłem Emacsa.
  3. Wpisanie „emacs foo.txt”, gdy istnieje foo.txt, uruchamia okno GUI Emacs z załadowanym plikiem foo.txt.
  4. Wpisanie „emacs foo.txt”, gdy foo.txt nie istnieje, uruchamia okno GUI Emacs z pustym buforem tekstowym o nazwie „foo.txt”. Wykonanie ^ X ^ S w tym buforze spowoduje zapisanie pliku foo.txt w katalogu, z którego uruchomiłem Emacsa.

Które z tych kryteriów nie jest spełnione po wpisaniu „emacs” w wierszu polecenia terminala? Twoje wymagania opisują domyślne zachowanie w systemie Linux. Od jakiegoś czasu nie używałem Maca, ale myślę, że sztuczka polegała na znalezieniu odpowiedniego programu do wykonania - może emacs.app?
Tyler

8
Tyler, pochodzę z Linuksa. Jestem z wami przez całą drogę; wystarczy wpisać „emacs” po znaku zachęty. Jednak zrobienie tego na OSX uruchamia tryb tekstowy Emacs w oknie terminala (tym samym nie spełnia kryterium 1), a tego nie chcę.
Johan Walles

1
Johan - czy w międzyczasie znalazłeś rozwiązanie? Zmagam się z tymi samymi problemami i myślę o rozpoczęciu nagrody. Szczególnie denerwujące jest to, że wywołanie emacsa (a nie Emacs.app) z linii poleceń otwiera okno w tle ...
alexurba

1
@DougHarris Moje wymagania są zgodne z rzeczywistością w każdej dystrybucji Linuksa, stąd one pochodzą. Cieszę się, że znalazłeś przepływ pracy, który działa dla Ciebie. Twoje zdrowie!
Johan Walles,

2
Nie wiem, czy działa na OSX, ale możesz spróbować: emacsclient -c -a "" "$@"command
jfs

Odpowiedzi:


113

Wywołaj następujący skrypt „emacs” i umieść go PATHgdzieś w swoim :

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

To obejmuje # 2, # 3 i # 4.

# 1 umieść to gdzieś w swoim pliku .emacs:

(x-focus-frame nil)

Witryna emacsformacosx.com ma teraz rozszerzenie stronę Jak to zrobić , czyli tam, gdzie górna fragment pochodzi. Jest tam więcej informacji na temat uruchamiania emacsclienti podłączania Emacsa git mergetool.


1
Dzięki David, rządzisz!
Johan Walles

1
Działa świetnie. Bounty już wkrótce.
Tamzin Blake,

2
Na Mavericks, jeśli jestem w folderze ~/fooi chcę go otworzyć, bar.txtpiszę, gmacs bar.txtale ~/bar.txtzamiast otwierania tworzy nowy plik w ~foo/bar.txt. czy robię coś źle?
Daniel Compton,

2
Gdzie jest plik .emacs?
Bren

1
Nie możesz dodać (x-focus-frame nil) gdziekolwiek, musi to być w wyrażeniu (custom-set-variable), które emacs utworzy dla ciebie, gdy ustawisz cokolwiek przez dostosowanie. Po prostu dostosuj coś z paska menu, na przykład włącz "migający kursor" (a następnie wyłącz, jeśli nie lubisz), a ta sekcja zostanie utworzona w twoim .emacs. Czy jest to w ogóle przetestowane? Nie jestem pewien, czy emacs na kakao nawet uszanuje to ustawienie.
Chuck Adams

71

W swojej powłoce użyj aliasu polecenia „emacs”, aby wskazać aplikację OSX emacs

W mojej powłoce (z domyślnym bash) mam następujące (w moim .bashrc)

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

Następnie wpisanie emacs w wierszu poleceń uruchamia aplikację emacs.

Zalecałbym jednak, abyś otworzył kopię emacsa i po prostu go uruchomił. Jeśli tak jest i chcesz załadować plik do istniejącej kopii emacsa, możesz użyć emacsclienta, umieszczając następujący plik w swoim .bashrc:

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

Następnie dodaj następujące polecenie do pliku .emacs, aby uruchomić serwer emacs (który odbiera wywołania emacsclient)

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

Następnie możesz pisać

ec .bashrc

aby załadować kopię .bashrc do istniejącej sesji emacsa!


4
Cześć Chris! Twoja pierwsza odpowiedź nie spełnia kryteriów 2 i 4. Twoja druga odpowiedź nie spełnia kryterium 2. Szukam rozwiązania, które spełnia wszystkie ponumerowane kryteria. Pozdrawiam / Johan
Johan Walles

4
Wygląda na to, że wszystkie twoje problemy można by rozwiązać, gdybyś używał samego emacsa do ładowania plików, zamiast polegać na linii poleceń, aby za każdym razem uruchamiać nową instancję. Zwykle uruchamiam emacsa na początku mojego dnia (jeśli nadal nie działa) i używam go do ładowania plików, zmiany katalogów, tworzenia nowych plików i czegokolwiek innego bez dotykania okna terminala.
Chris McMahan

Muszę powiedzieć, że na tej stronie jest kilka pytań, które dotyczą tego pytania, ale jest to jedyne, które w pełni rozwiązuje problem również otwierania pliku, w krótki, elokwentny sposób.
tylerthemiler

3
@tylerthemiler, gdzie jest odpowiedź, która w pełni rozwiązuje problem? Obie odpowiedzi w tej odpowiedzi nie spełniają kryterium 2, a pierwsza nie spełnia również kryterium 4.
Johan Walles,

6
Odrobina taktu może pomóc w uzyskaniu odpowiedzi na pytanie. Więc trochę googluje.
duma

10

To poprawia odpowiedź Davida Caldwella, uruchamiając Emacsa w tle:

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

Jak stwierdzono w drugiej odpowiedzi, dotyczy to punktów 2, 3 i 4. Dla # 1, to gdzieś umieścić w pliku .emacs: (x-focus-frame nil).

Zauważ, że poniższe nie działa u mnie - nie uruchamia Emacsa w katalogu określonym w linii poleceń (np. emacs .)

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

1
To rozwiązuje problem z OSX (być może zaczynając od 10.9 Mavericks). Od wersji 10.9, metoda „niezalecana” zawodzi, gdzie do co najmniej 10.6 niezalecana zsynchronizowała powłokę $ PWD i Emacs (pwd). Odpowiedź Davida może znajdować się gdzie indziej, ale jak sprawić, by wyszukiwarki zrozumiały: „pwd not pwd”?
infogizmo

Oba fragmenty w tej odpowiedzi nie uruchamiają emacsa w odpowiednim katalogu, gdy testowałem na macOS 10.15.6 i Emacs 26.2.
gsingh2011

5

Zakładam, że albo:

  • Uruchom demona emacsa podczas logowania
  • Miej (server-start) w swoim .emacs
  • Nie przejmuj się posiadaniem wielu oddzielnych kopii emacsa

Jeśli tak, to myślę, że spełnia to pierwotne cztery kryteria plus jeszcze jedno:

  1. Okno emacsa otworzy się przed moim oknem terminala.

zawsze otwiera się na pierwszy plan (z ramką x-focus).

  1. Wpisanie "emacs" uruchamia okno GUI Emacsa. Znajdowanie plików w tym oknie będzie domyślnie szukać w katalogu, z którego uruchomiłem Emacsa.

Otworzy istniejące okno emacsa w trybie dired.

  1. Wpisanie "emacs foo.txt", gdy istnieje foo.txt, uruchamia okno GUI Emacs z załadowanym plikiem foo.txt.

Jeśli emacs już działa i ma serwer, to otworzy się w istniejącym oknie i wyjdzie na pierwszy plan.

  1. Wpisanie "emacs foo.txt", gdy foo.txt nie istnieje, uruchamia okno GUI Emacs z pustym buforem tekstowym o nazwie "foo.txt". Wykonanie ^ X ^ S w tym buforze spowoduje zapisanie pliku foo.txt w katalogu, z którego uruchomiłem Emacsa.

Poprawny.

Dodatkowy:

Sterowanie wraca do sesji terminala natychmiast po wpisaniu polecenia.

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

Niesamowite! Wygląda na to, że twoje argumenty i nogi bez argumentów są zamienione.
eriksensei


4

Proste rozwiązanie ...

Tutaj zamieszczono wiele bardzo złożonych rozwiązań tego problemu. To sprawiedliwe, ponieważ wydaje się nietrywialne.

U mnie jednak to rozwiązanie działa naprawdę dobrze.

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

Stosowanie

ec file [...]

Rozpakujmy, co się dzieje:

  1. przekaż wszystkie ecargumenty do emacsclient i nie -nczekaj na emacsa przed kontynuowaniem.
    1. Jeśli Emacs już działa, wszystko skończyliśmy i Ty edytujesz.
  2. połknąć komunikat o błędzie wysłany przez emacsclient, gdy nie jest uruchomiony emacs. ( 2> /dev/null)
  3. Ręcznie obsłuż kod zakończenia 1( [[ $? == 1 ]])
    1. otwórz Emacs.app i przekaż mu argumenty pliku (ścieżki zostaną poprawnie otwarte).
    2. Wszystko gotowe, a Emacs otworzył twoje pliki.


3

Dalsze ulepszanie odpowiedzi Davida Jamesa działa dla mnie:

Zgodnie z instrukcjami otwierania pliku z terminala pod adresem http://www.emacswiki.org/emacs/EmacsForMacOS#toc20

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

łącząc to z odpowiedzią Davida Jame'a stworzyłem następujący skrypt bash emax i umieściłem go w mojej ścieżce w ~ / bin

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

Uwaga : aby emacs otworzył bieżący katalog w trybie Dired by name , musisz użyć

emax .

Środowisko:

  • OS X Yosemite w wersji 10.10.2
  • GNU Emacs 24.4.2 (x86_64-apple-darwin14.0.0, NS apple-appkit-1343.14) z 13.11.2014

Działa to tylko dla istniejącego pliku, nie utworzy takiego, jeśli go tam nie ma
Stíofán.

Używam macOS 10.15 (Catalina) i wygląda na to, że działa to za pierwszym razem (gdy Emacs nie jest jeszcze otwarty), ale nie działa za drugim razem (gdy okno Emacsa jest już otwarte). Czy wiesz, jak to naprawić?
user102008

1

Inne odpowiedzi tutaj nie do końca mi odpowiadały. W szczególności na moim komputerze skrypt bash

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

zawsze otwiera emacsa w katalogu domowym. Aby go otworzyć w bieżącym katalogu roboczym, musiałem to zrobić

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

zamiast.


1
Moja konkretna kompilacja / instalacja nie ma tego problemu, ale jest problem z Twoim rozwiązaniem. Jeśli spróbujesz otworzyć więcej niż jeden plik, tylko pierwszy rozwinie się do katalogu PWD. Reszta nie będzie miała prefiksu ścieżki $ PWD.
kmarsh

0

Skompiluj Emacsa zgodnie z następującymi krokami:

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

Gotowe! Pobranie i zainstalowanie XQuartz może pomóc, ale to tylko moja opinia.


0

To jest mój skrypt dla otwartego emacsa / emacsclienta na 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

0

We wszystkich powyższych przypadkach, gdy używasz "open" - upewnij się, że używasz opcji "--args"

Nie rób tego:

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

Zamiast tego:

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

że --argszapobiega „Open” od spożywania różne opcje przeznaczone do Emacs opcja.


Z jakiegoś powodu, kiedy testowałem to na macOS 10.15.6 i Emacs 26.2, katalog roboczy emacsa był ustawiony na mój katalog domowy, co oznacza, że ​​nie mogłem otwierać plików przy użyciu ścieżek względnych. To rozwiązało jednak problem otwartych nieistniejących plików.
gsingh2011

0

Top odpowiedź jest dobra, ale chciałem się emacs przetwarzać działać w tle, dzięki czemu mogę nadal używać powłokę. Ta odpowiedź wydawała się robić to, co chciałem, ale nie uruchamiała emacsa w odpowiednim katalogu, co oznacza, że ​​wymagane były ścieżki bezwzględne (lub hacki do dołączania pwddo ścieżek, które nie działałyby we wszystkich przypadkach). Co więcej, po prostu używając& oznaczało, że gdybym zabił terminal, emacs również zostałby zabity.

Zdecydowałem się użyć screeni funkcji bash, a następujące rozwiązanie działa dla mnie na macOS 10.15.6 i emacs 26.2 zainstalowanym z brew:

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

Pytanie wyraźnie wymagało Emacsa w oknie GUI, a to otwiera Emacsa w sesji terminala.
Johan Walles

@JohanWalles, to otwiera Emacsa w oknie GUI.
gsingh2011

screenwyrzucił mnie, teraz, kiedy uważniej przeczytałem, zdaję sobie sprawę, że masz rację. Moje przeprosiny @ gsingh2011.
Johan Walles
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.