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:
- Otworzy się okno emacsa przed moim oknem terminala.
- 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.
- Wpisanie „emacs foo.txt”, gdy istnieje foo.txt, uruchamia okno GUI Emacs z załadowanym plikiem foo.txt.
- 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.
macos
emacs
command-line
Johan Walles
źródło
źródło
emacsclient -c -a "" "$@"
commandOdpowiedzi:
Wywołaj następujący skrypt „emacs” i umieść go
PATH
gdzieś 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
emacsclient
i podłączania Emacsagit mergetool
.źródło
~/foo
i chcę go otworzyć,bar.txt
piszę,gmacs bar.txt
ale~/bar.txt
zamiast otwierania tworzy nowy plik w~foo/bar.txt
. czy robię coś źle?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:
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ć
aby załadować kopię .bashrc do istniejącej sesji emacsa!
źródło
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 "$@" &
źródło
Zakładam, że albo:
Jeśli tak, to myślę, że spełnia to pierwotne cztery kryteria plus jeszcze jedno:
zawsze otwiera się na pierwszy plan (z ramką x-focus).
Otworzy istniejące okno emacsa w trybie dired.
Jeśli emacs już działa i ma serwer, to otworzy się w istniejącym oknie i wyjdzie na pierwszy plan.
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
źródło
W Mountain Lion używam portu Yamamoto Mitsuharu https://github.com/railwaycat/emacs-mac-port z następującym aliasem:
i spełnia wszystkie Twoje kryteria.
źródło
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
Rozpakujmy, co się dzieje:
ec
argumenty do emacsclient i nie-n
czekaj na emacsa przed kontynuowaniem.2> /dev/null
)1
([[ $? == 1 ]]
)źródło
Właśnie zbudowałem emacsa z menadżerem pakietów homebrew zgodnie z tym przewodnikiem: http://www.emacswiki.org/emacs/EmacsForMacOS with brew install --cocoa emacs Następnie należy uruchomić wersję .app, aby pobrać gui, które w moim przypadku było /usr/local/Cellar/emacs/24.3/Emacs.app/Contents/MacOS/Emacs
źródło
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
łą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ć
Środowisko:
źródło
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.
źródło
Skompiluj Emacsa zgodnie z następującymi krokami:
Gotowe! Pobranie i zainstalowanie XQuartz może pomóc, ale to tylko moja opinia.
źródło
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
źródło
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
--args
zapobiega „Open” od spożywania różne opcje przeznaczone do Emacs opcja.źródło
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
pwd
do ś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ć
screen
i funkcji bash, a następujące rozwiązanie działa dla mnie na macOS 10.15.6 i emacs 26.2 zainstalowanym zbrew
:function emacs() { screen -d -m /Applications/Emacs.app/Contents/MacOS/Emacs "$@" }
źródło
screen
wyrzucił mnie, teraz, kiedy uważniej przeczytałem, zdaję sobie sprawę, że masz rację. Moje przeprosiny @ gsingh2011.