Pytanie Jak uruchomić GUac Emacs z linii poleceń w OSX?


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

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

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

  1. Otworzy się okno emacs przed moje okno terminala.
  2. Wpisanie "emacs" uruchamia okno Emacs GUI. Znajdowanie plików w tym oknie domyślnie będzie szukać w katalogu, od którego zacząłem Emacs.
  3. Wpisanie "emacs foo.txt", gdy istnieje foo.txt uruchamia okno GUac Emacs z załadowanym plikiem foo.txt.
  4. Wpisując "emacs foo.txt", gdy robi to plik foo.txt nie exist uruchamia okno GUac Emacs z pustym buforem tekstowym o nazwie "foo.txt". Wykonanie ^ X ^ S w tym buforze spowoduje zapisanie foo.txt w katalogu, od którego zacząłem Emacs.

76
2018-04-16 09:02


pochodzenie


Które z tych kryteriów nie są spełnione, wpisując "emacs" na monicie terminala? Twoje wymagania opisują domyślne zachowanie w Linuksie. Od jakiegoś czasu nie używam komputera Mac, ale myślę, że po prostu znalazłem właściwy program do wykonania - może na emacs.app? - Tyler
Tyler, pochodzący z Linuksa Jestem z tobą do końca; po prostu wpisanie "emacs" w zachęcie powinno być wszystkim, co muszę zrobić. Robiąc to na OSX uruchamia się tryb tekstowy Emacs w oknie terminala (a więc nie spełniając kryteriów 1), a to nie jest to, czego chcę. - Johan Walles
Johan - czy znalazłeś rozwiązanie w międzyczasie? Walczę 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 wiersza poleceń otwiera okno w tle ... - alexurba
@alexurba, nie, nie ma odpowiedzi :( W pewnym sensie przyzwyczajam się do złych zachowań ... Dlaczego ludzie trzymają się błędnej odpowiedzi poniżej, jest również tajemnicą. - Johan Walles
Nie wiem, czy działa na OSX, ale możesz spróbować: emacsclient -c -a "" "$@" dowództwo - jfs


Odpowiedzi:


Nazwij poniższy skrypt "emacs" i umieść go w swoim PATH gdzieś:

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

To obejmuje # 2, # 3 i # 4.

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

(x-focus-frame nil)

The emacsformacosx.com witryna ma teraz Strona z instrukcjami, z którego pochodził najwyższy fragment. Tam jest więcej informacji o uruchomieniu emacsclient i podłączanie Emacsa do git mergetool.


102
2018-05-29 09:20



Dzięki David, rządzisz! - Johan Walles
Działa świetnie. Zbliża się Bounty. - Thom Blake
Dzięki - działa również dla mnie! - ktdh
Wielkie dzięki: D - Tony Han
Na Mavericks, jeśli jestem w folderze ~/foo i chcesz otworzyć bar.txt Piszę gmacs bar.txt ale tworzy nowy plik w ~/bar.txt zamiast otwierać ~foo/bar.txt. czy robię coś źle? - Daniel Compton


W swojej powłoce pseudo polecenie "emacs", aby wskazać aplikację emacs OSX

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, wpisując emacs w linii poleceń, uruchamia się aplikacja emacs.

Zaleciłbym jednak otworzenie kopii emacs i kontynuowanie jej działania. Jeśli tak jest i chcesz załadować plik do istniejącej kopii emacs, możesz użyć emacsclient, umieszczając następujące elementy w .bashrc:

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

Następnie dodaj następujący plik 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 wpisać

ec .bashrc

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


68
2018-04-16 17:31



Cześć Chris! Twoja pierwsza odpowiedź nie spełnia kryteriów 2 i 4. Twoja druga odpowiedź nie spełnia kryterium 2. Szukam rozwiązania spełniającego wszystkie ponumerowane kryteria. Pozdrawiam / Johan - Johan Walles
Wygląda na to, że wszystkie problemy można rozwiązać, jeśli po prostu używałeś samego emacsa do ładowania plików, zamiast polegać na linii poleceń, aby za każdym razem uruchamiać nową instancję. Zazwyczaj uruchamiam emacs na początku mojego dnia (jeśli jeszcze nie działa) i używam go do ładowania plików, zmieniania katalogów, tworzenia nowych plików i czegokolwiek, czego pragnę, bez dotykania okna terminala. - Chris McMahan
Muszę powiedzieć, że jest kilka pytań na tej stronie, które dotyczą tego pytania, ale jest to jedyny, który w pełni rozwiązuje problem otwierania pliku, w krótkim wymownym sposobie. - tylerthemiler
@tylerthemiler, gdzie jest odpowiedź, która w pełni rozwiązuje problem? Obie odpowiedzi w tej odpowiedzi nie spełniają kryterium 2, a pierwsza również nie. 4. - Johan Walles
Trochę taktu przechodzi długą drogę w uzyskaniu odpowiedzi na pytanie. A więc trochę googlowałem. - duma


To się poprawia Odpowiedź Davida Caldwella uruchamiając Emacsa w tle:

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

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

Zauważ, że co następuje nie działa dla mnie - nie uruchamia Emacsa w katalogu określonym w linii poleceń (np. emacs .)

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

8
2017-10-25 18:17



To rozwiązuje problem z OSX (może zaczynając od 10,9 Mavericks). Od wersji 10.9 metoda "niezalecana" kończy się niepowodzeniem, gdzie do co najmniej 10,6 niezalecane było synchronizowanie powłoki $ PWD i Emacs (pwd). Odpowiedź Davida może być gdzie indziej, ale jak zrozumieć wyszukiwarki: "pwd not pwd"? - infogizmo


Na Mountain Lion, używam portu Yamamoto Mitsuharu https://github.com/railwaycat/emacs-mac-port z następującym aliasem:

alias emacs=/Applications/Emacs.app/Contents/MacOS/Emacs

i spełnia wszystkie twoje kryteria.


4
2018-05-05 03:41





Dalsze usprawnienia w odpowiedzi Davida Jamesa są następujące:

Zgodnie z instrukcjami, aby otworzyć plik z terminala znajdującego się 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ące emax skryptu bash i umieściłem go w mojej ścieżce na ~ / bin

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

Zastrzeżenie: aby uzyskać emacs, aby otworzyć bieżący katalog w Dired po imieniu tryb, musisz użyć

emax .

Środowisko:

  • OS X Yosemite Wersja 10.10.2
  • GNU Emacs 24.4.2 (x86_64-apple-darwin14.0.0, NS apple-appkit-1343.14) z dnia 2014-11-13

4
2018-03-27 00:38





Zakładam, że albo:

  • Uruchom demona emacs podczas logowania
  • Mieć (uruchomienie serwera) w .emacs
  • Nie ma nic przeciwko uruchomieniu wielu oddzielnych kopii emacs

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

  1. Okno emacs otworzy się przed moim terminalem.

zawsze otworzy się na pierwszym planie (z ramką x-focus).

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

Otworzy to istniejące okno emacsa w trybie diredowym.

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

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

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

Poprawny.

Jedno dodatkowe:

Kontrola powraca do sesji terminalowej 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

4
2017-07-08 22:50



Niesamowite! Wygląda na to, że twoje argumenty i no-args są włączone. - eriksensei


Po prostu zbudowałem emacs z homebrew package manager zgodnie z tym przewodnikiem: http://www.emacswiki.org/emacs/EmacsForMacOS z instalacją parzenia - emacscocoa Następnie należy uruchomić wersję .app, aby uzyskać GUI, która w moim przypadku to /usr/local/Cellar/emacs/24.3/Emacs.app/Contents/MacOS/Emacs


3
2018-02-17 13:58



--cocoa było przestarzałe; zamiast tego używaj --with-cocoa! - Erwin Rooijakkers


Inne odpowiedzi tutaj nie działały dla mnie. W szczególności na moim komputerze skrypt bash

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

zawsze otwiera emacs 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
2018-05-22 16:13



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 zostanie rozwinięty do katalogu PWD. Reszta nie będzie mieć prefiksu ścieżki $ PWD. - kmarsh


Skompiluj Emacsa zgodnie z następującymi krokami:

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

I gotowe! Może to pomóc w pobraniu i zainstalowaniu XQuartz, ale to tylko moja opinia.


0
2017-08-20 17:21





To jest mój skrypt dla otwartych emacs / emacsclient 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
2017-12-04 03:34





Proste rozwiązanie ...

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

Jednak to rozwiązanie działa bardzo dobrze dla mnie.

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

Stosowanie

ec file [...]

Rozpakujmy to, co się dzieje:

  1. przekazać wszystkie ec argumenty do emacsclient i nie (-n) poczekaj na emacs, zanim przejdziesz dalej.
    1. Jeśli Emacs już działa, my skończymy i edytujesz.
  2. połknąć komunikat o błędzie wysłany przez emacsclient, gdy nie ma uruchomionych emacs. (2> /dev/null)
  3. Ręcznie obsłuż kod wyjścia 1 ([[ $? == 1 ]])
    1. otwórz plik Emacs.app i prześlij do niego argumenty pliku (ścieżki zostaną poprawnie otwarte).
    2. Wszystko gotowe, a Emacs otworzył twoje pliki.

0
2018-04-05 08:10