Як запустити GUI Emacs з командного рядка в OSX?


91

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

Я завантажив та встановив Emacs з http://emacsformacosx.com/ .

Я прийму відповідь, яка відповідає всім наступним критеріям:

  1. Вікно emacs відкривається перед моїм вікном терміналу.
  2. Набравши "emacs", відкриється вікно графічного інтерфейсу Emacs. Пошук файлів у цьому вікні за замовчуванням буде шукати в каталозі, звідки я запустив Emacs.
  3. Введення "emacs foo.txt", коли foo.txt існує, запускає вікно GUI 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
Дякую Девіду, ти правиш!
Йохан Валлес,

1
Чудово працює. Щедрість.
Тамзін Блейк,

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 на Какао навіть поважатиме цей параметр.
Чак Адамс

70

У вашій оболонці псевдонім команди '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. Я шукаю рішення, яке відповідає всім нумерованим критеріям. З повагою / Йохан
Йохан Валлес

3
Здається, всі ваші проблеми можна було б вирішити, якби ви просто використовували саму emacs для завантаження файлів, а не покладалися на командний рядок для кожного запуску нового екземпляра. Зазвичай я запускаю emacs на початку дня (якщо він все ще не працює) і використовую його для завантаження файлів, зміни каталогів, створення нових файлів та іншого, що я хочу, ніколи не торкаючись вікна терміналу.
Chris McMahan,

Потрібно сказати, що на цьому веб-сайті є кілька таких питань, які стосуються цього питання, але це єдине, яке повністю вирішує проблему також відкриття файлу коротким красномовним способом.
tylerthemiler

3
@tylerthemiler, де відповідь, яка повністю вирішує проблему? Обидві відповіді у цій відповіді не відповідають критерію 2, а перша - також 4.
Йохан Уоллес,

5
Трохи тактовності значно допомагає отримати відповідь на запитання. Так само робить трохи гугл.
дума

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 не pwd"?
infogizmo

Обидва фрагменти у цій відповіді не запускають emacs у правильному каталозі, коли я тестував на macOS 10.15.6 та Emacs 26.2.
gsingh2011

5

Я припускаю, що ви:

  • Запустіть демон emacs при вході в систему
  • Майте (запуск сервера) у .emacs
  • Не заперечуйте, якщо працює багато окремих копій emacs

Якщо так, то, я думаю, це відповідає вихідним чотирьом критеріям, плюс ще одному:

  1. Вікно emacs відкривається перед моїм вікном терміналу.

він завжди відкриватиметься на передній план (з х-фокусною рамкою).

  1. Набравши "emacs", відкриється вікно графічного інтерфейсу Emacs. Пошук файлів у цьому вікні за замовчуванням буде шукати в каталозі, звідки я запустив Emacs.

Він відкриє існуюче вікно emacs у режимі "у режимі".

  1. Введення "emacs foo.txt", коли foo.txt існує, запускає вікно GUI 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

4

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

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

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


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


- какао застаріло; використання --with-cocoa замість цього!
Erwin Rooijakkers

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 by name , вам потрібно скористатися

emax .

Середовище:

  • OS X Yosemite Версія 10.10.2
  • GNU Emacs 24.4.2 (x86_64-apple-darwin14.0.0, NS apple-appkit-1343.14) від 13.11.2014

Це працює лише для існуючого файлу, він не створює його, якщо його там немає
Стіофан.

Я використовую 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/$@"

замість цього.


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

0

У всьому з перерахованого вище, використовуючи "відкрити", обов’язково використовуйте параметр "--args"

Не роби цього:

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

Замість цього:

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

що --argsопція запобігає «відкритих» від вживання різних опцій , призначених для Emacs.


З якоїсь причини, коли я тестував це на 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 "$@"
}

Запитання прямо вимагало Emacs у вікні графічного інтерфейсу, і це відкриває Emacs у сеансі терміналу.
Йохан Уоллес
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.