Как запустить графический интерфейс Emacs из командной строки в OSX?

91

Как запустить графический интерфейс Emacs из командной строки в OSX?

Я загрузил и установил Emacs с http://emacsformacosx.com/ .

Я приму ответ, соответствующий всем следующим критериям:

  1. Окно emacs открывается перед окном моего терминала.
  2. При вводе «emacs» открывается окно графического интерфейса пользователя Emacs. Поиск файлов в этом окне по умолчанию будет искать в каталоге, откуда я запустил Emacs.
  3. Ввод «emacs foo.txt» при наличии foo.txt запускает окно Emacs с графическим интерфейсом пользователя с загруженным foo.txt.
  4. Ввод «emacs foo.txt», когда foo.txt не существует, запускает окно Emacs с графическим интерфейсом пользователя с пустым текстовым буфером с именем «foo.txt». Выполнение ^ X ^ S в этом буфере сохранит foo.txt в каталоге, из которого я запустил Emacs.
Йохан Валлес
источник
Какому из этих критериев не соответствует ввод emacs в командной строке терминала? Ваши требования описывают поведение по умолчанию в Linux. Я давно не пользовался Mac, но думаю, что уловка заключалась в том, чтобы найти правильную программу для выполнения - может быть, emacs.app?
Тайлер
8
Тайлер, исходя из опыта работы с Linux, я всегда с вами; просто набрав "emacs" в командной строке - все, что мне нужно сделать. Однако выполнение этого в OSX запускает текстовый режим Emacs в окне терминала (что не соответствует критерию 1), а это не то, что я хочу.
Йохан Валлес
1
Йохан - вы тем временем нашли решение? Я борюсь с теми же проблемами и думаю о запуске награды. Особенно раздражает то, что вызов emacs (а не Emacs.app) из командной строки открывает окно в фоновом режиме ...
Alexurba
1
@DougHarris Мои требования соответствуют действительности в любом дистрибутиве Linux, вот откуда они. Я рад, что вы нашли рабочий процесс, который вам подходит. Ура!
Йохан Валлес,
2
Не знаю, работает ли это на OSX, но вы можете попробовать: emacsclient -c -a "" "$@"command
jfs

Ответы:

113

Назовите следующий сценарий "emacs" и поместите его PATHгде-нибудь:

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

Это касается № 2, № 3 и № 4.

Для №1 поместите это где-нибудь в свой файл .emacs:

(x-focus-frame nil)

На сайте emacsformacosx.com теперь есть страница с практическими рекомендациями , откуда взялся верхний фрагмент. Там есть дополнительная информация о запуске emacsclientи подключении Emacs git mergetool.

Дэвид Колдуэлл
источник
1
Спасибо, Дэвид, ты правишь!
Johan Walles
1
Работает отлично. Предстоящая награда.
Tamzin Blake
2
На Mavericks , если я нахожусь в папке ~/fooи хочу открыть bar.txtнабираю , gmacs bar.txtно он создает новый файл на ~/bar.txtвместо открытия ~foo/bar.txt. Я делаю что-то неправильно?
Дэниел Комптон
2
Где находится файл .emacs?
Bren
1
Вы не можете добавить (x-focus-frame nil) где угодно, оно должно быть в выражении (custom-set-variables), которое emacs создаст для вас, как только вы установите что-либо посредством настройки. Просто настройте что-нибудь в строке меню, например, включите "мигающий курсор" (затем выключите, если вам это не нравится), и этот раздел будет создан в вашем .emacs. Кроме того, это вообще проверено? Я не уверен, что emacs на Какао даже будет уважать этот параметр.
Чак Адамс,
71

В вашей оболочке используйте псевдоним команды emacs, чтобы указать на приложение OSX emacs

В моей оболочке (запущенной по умолчанию bash) у меня есть следующее (в моем .bashrc)

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

Затем при вводе emacs в командной строке запускается приложение emacs.

Однако я бы порекомендовал вам открыть копию emacs и просто держать ее в рабочем состоянии. Если это так, и вы хотите загрузить файл в существующую копию emacs, вы можете использовать emacsclient, поместив следующее в свой .bashrc:

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

Затем добавьте следующее в свой файл .emacs, чтобы запустить сервер emacs (который принимает вызовы emacsclient)

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

Затем вы можете ввести

ec .bashrc

чтобы загрузить копию .bashrc в существующий сеанс emacs!

Крис МакМахан
источник
4
Привет, Крис! Ваш первый ответ не соответствует критериям 2 и 4. Ваш второй ответ не соответствует критерию 2. Я ищу решение, которое удовлетворяет всем пронумерованным критериям. С уважением / Йохан
Йохан Валлес
4
Кажется, что все ваши проблемы можно было бы решить, если бы вы просто использовали сам emacs для загрузки файлов, а не полагались на командную строку для запуска нового экземпляра каждый раз. Обычно я запускаю emacs в начале своего дня (если он еще не запущен) и использую его для загрузки файлов, изменения каталогов, создания новых файлов и всего остального, что я хочу, даже не касаясь окна терминала.
Крис МакМахан
Я должен сказать, что на этом сайте есть несколько из этих вопросов, которые касаются этого вопроса, но это единственный вопрос, который полностью решает проблему открытия файла в краткой манере.
tylerthemiler
3
@tylerthemiler, где ответ, полностью решающий проблему? Оба ответа в этом ответе не соответствуют критерию 2, а первый также не соответствует 4.
Йохан Валлес,
6
Немного такта имеет большое значение для получения ответа на вопрос. Так что немного погуглить.
дума
10

Это улучшает ответ Дэвида Колдуэлла, запустив Emacs в фоновом режиме:

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

Как указано в другом ответе, это касается № 2, № 3 и № 4. Для # 1, поместить это где - то в вашем файле .emacs: (x-focus-frame nil).

Обратите внимание, что следующее не работает для меня - он не запускает Emacs в каталоге, указанном в командной строке (например, emacs .)

# NOT RECOMMENDED
#!/bin/sh
/Applications/Emacs.app/Contents/MacOS/Emacs "$@" &
Дэвид Дж.
источник
1
Это устраняет проблему с OSX (возможно, начиная с 10.9 Mavericks). Начиная с версии 10.9, "не рекомендуемый" метод не работает, тогда как, по крайней мере, до 10.6 не рекомендуется синхронизировать оболочку $ PWD и Emacs (pwd). Ответ Дэвида может быть в другом месте, но как заставить поисковые системы понять: «pwd not pwd»?
infogizmo 08
Оба фрагмента в этом ответе не запускают emacs в правильном каталоге, когда я тестировал macOS 10.15.6 и Emacs 26.2.
gsingh2011
5

Я полагаю, вы тоже:

  • Запускаем демон emacs при входе в систему
  • Имейте (server-start) в вашем .emacs
  • Не возражайте против того, чтобы было запущено много отдельных копий emacs

Если это так, то я думаю, что это удовлетворяет исходным четырем критериям плюс еще один:

  1. Окно emacs открывается перед окном моего терминала.

он всегда будет открываться на передний план (с x-focus-frame).

  1. При вводе «emacs» открывается окно графического интерфейса пользователя Emacs. Поиск файлов в этом окне по умолчанию будет искать в каталоге, откуда я запустил Emacs.

Он откроет существующее окно emacs в режиме dired.

  1. Ввод "emacs foo.txt" при наличии foo.txt запускает окно Emacs с графическим интерфейсом пользователя с загруженным foo.txt.

Если emacs уже запущен и имеет сервер, он откроется в существующем окне и выйдет на передний план.

  1. Ввод «emacs foo.txt», когда foo.txt не существует, запускает окно графического интерфейса пользователя Emacs с пустым текстовым буфером с именем «foo.txt». Выполнение ^ X ^ S в этом буфере сохранит foo.txt в каталоге, из которого я запустил Emacs.

Верный.

Один дополнительный:

Управление возвращается в сеанс терминала сразу после ввода команды.

~ / 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
Дэйв
источник
Потрясающие! Кажется, ваши аргументы и ноги без аргументов поменялись местами.
eriksensei 09
4

В Mountain Lion я использую порт Ямамото Мицухару https://github.com/railwaycat/emacs-mac-port со следующим псевдонимом:

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

и он удовлетворяет всем вашим критериям.

mforbes
источник
4

Простое решение ...

Здесь размещено множество очень сложных решений этой проблемы. Это справедливо, потому что это кажется нетривиальным.

Однако это решение мне очень подходит.

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

Применение

ec file [...]

Распаковываем что происходит:

  1. передать все ecаргументы в emacsclient и не ( -n) ждать emacs перед продолжением.
    1. Если Emacs уже запущен, все готово, и вы редактируете.
  2. проглотите сообщение об ошибке, отправленное emacsclient, когда emacs не запущен. ( 2> /dev/null)
  3. Обработка кода выхода вручную 1( [[ $? == 1 ]])
    1. откройте Emacs.app и передайте ему аргументы файла (пути будут открываться правильно).
    2. Вы все сделали, и Emacs открыл ваши файлы.
окодо
источник
3

Только что собрал emacs с менеджером пакетов homebrew согласно этому руководству: http://www.emacswiki.org/emacs/EmacsForMacOS с brew install --cocoa emacs После этого нужно запустить версию .app, чтобы получить графический интерфейс, который в моем случае был /usr/local/Cellar/emacs/24.3/Emacs.app/Contents/MacOS/Emacs

Юрий Скворцов
источник
--cocoa устарел; используя вместо этого --with-cocoa!
Эрвин Ройаккерс
3

Дальнейшее улучшение ответа Дэвида Джеймса для меня работает следующим образом:

Согласно инструкциям по открытию файла с терминала, которые можно найти на http://www.emacswiki.org/emacs/EmacsForMacOS#toc20

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

объединив это с ответом Дэвида Джейма, я создал следующий сценарий emax bash и поместил его на свой путь в ~ / bin

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

Предостережение : чтобы заставить emacs открывать текущий каталог в режиме Dired по имени , вам необходимо использовать

emax .

Окружающая среда:

  • OS X Yosemite версии 10.10.2
  • GNU Emacs 24.4.2 (x86_64-apple-darwin14.0.0, NS apple-appkit-1343.14) от 13 ноября 2014 г.
sbecker11
источник
Это работает только для существующего файла, он не создаст его, если его нет
Stíofán.
Я использую macOS 10.15 (Catalina), и кажется, что это работает в первый раз (когда Emacs еще не открыт), но не работает во второй раз (когда окно Emacs уже открыто). Вы знаете, как это исправить?
user102008
1

Другие ответы здесь не совсем сработали для меня. В частности, на моей машине сценарий bash

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

всегда открывает emacs в домашнем каталоге. Чтобы открыть его в текущем рабочем каталоге, мне пришлось сделать

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

вместо.

Jackkamm
источник
1
В моей конкретной сборке / установке этой проблемы нет, но есть проблема с вашим решением. Если вы попытаетесь открыть более одного файла, только первый будет расширен до каталога PWD. Остальные пути не будут иметь префикса $ PWD.
kmarsh
0

Скомпилируйте Emacs, выполнив следующие шаги:

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

Готово! Может помочь загрузка и установка XQuartz, но это только мое мнение.

грабли
источник
0

Это мой сценарий для открытия emacs / emacsclient на 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
источник
0

Во всем вышеперечисленном при использовании "open" убедитесь, что вы используете параметр "--args"

Не делайте этого:

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

Вместо этого:

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

эта --argsопция не позволяет "open" использовать различные опции, предназначенные для Emacs.

пользователь3696153
источник
По какой-то причине, когда я тестировал это на macOS 10.15.6 и Emacs 26.2, рабочий каталог emacs был установлен в мой домашний каталог, то есть я не мог открывать файлы, используя относительные пути. Тем не менее, это решило проблему открытия несуществующих файлов.
gsingh2011
0

Верхний ответ хорош, но я хотел , чтобы Emacs обрабатывать , чтобы работать в фоновом режиме , так что я все еще мог использовать мою оболочку. Этот ответ, похоже, делал то, что я хотел, но не запускал emacs в правильном каталоге, что означало, что требовались абсолютные пути (или хаки для добавления pwdк путям, которые не работали во всех случаях). Более того, простое использование &означало, что если я убью терминал, emacs также будет убит.

Я решил использовать screenи функцию bash, и следующее решение работает для меня на macOS 10.15.6 и emacs 26.2, установленных с brew:

function emacs() {
    screen -d -m /Applications/Emacs.app/Contents/MacOS/Emacs "$@"
}
gsingh2011
источник
Вопрос явно запрашивал Emacs в окне графического интерфейса пользователя, и это открывает Emacs в сеансе терминала.
Йохан Валлес,
@JohanWalles, это открывает Emacs в окне графического интерфейса.
gsingh2011,
screenотбросил меня, теперь, когда я читаю внимательнее, я понимаю, что ты прав Мои извинения @ gsingh2011.
Йохан Валлес,