Emacs 23, OS X, multi-tty и emacsclient

Как мне заставить emacs 23 нормально работать в режиме multi-tty в OS X?

Я добавил (server-start) в свой .emacs и обнаружил, что запуск /Applications/Emacs.app/Contents/MacOS/bin/emacsclient -n ~/myfile.txt открывает его в моем emacs.app, но не выводит emacs на передний план.

Итак, как я могу заставить emacs.app выйти на первый план, когда я запускаю emacsclient? (Я подумал о написании функции, которая помещает текущий фрейм на передний план каждый раз при открытии файла, или, возможно, о написании Applescript для выполнения аналогичной работы, которую можно было бы вызывать одновременно с emacsclient)

Emacsclient в emacs.app лучше всего использовать? Я предполагаю, что напишу ему псевдоним, если это так, но кажется странным использовать его, а не что-то в / usr / local / bin

Есть ли у кого-нибудь другие советы или примеры, как заставить это работать?


person Singletoned    schedule 03.06.2009    source источник


Ответы (8)


AppleScript был бы простым:

tell app "Emacs" to activate
person Community    schedule 03.06.2009
comment
Спасибо, отлично работает. Просто чтобы расширить. Я назвал emacs псевдонимом: 'osascript -e' \ '' сообщить приложению Emacs активировать '\' '; / Applications / Emacs.app / Contents / MacOS / bin / emacsclient -n' - person Singletoned; 11.06.2009

У меня есть псевдоним от emacs до

open -a /Applications/Emacs.app "$@"

Если вас раздражает то, что он открывает новый фрейм (окно) для каждого файла - добавьте

(setq ns-pop-up-frames nil)

в ваш .emacs и исправлено.

person mrflip    schedule 25.11.2009

Возможно, это сработает, просто вызовите raise-frame, когда клиент присоединяется:

(add-hook 'server-visit-hook 'call-raise-frame)
(defun call-raise-frame ()
  (raise-frame))

(На моей Linux-машине это оказывается избыточным.)

person Trey Jackson    schedule 03.06.2009
comment
У меня это не работает. Я поместил его в .emacs и оценил, но это не имеет никакого эффекта. - person Singletoned; 03.06.2009
comment
Если вы готовы к этому, вы можете попробовать отладить это. На первом шаге в Emacs переместите точку внутри функции call-raise-frame defun и выполните M-x edebug-defun. Затем подключитесь с помощью emacsclient. Emacs должен войти в отладчик, который должен показать ваш .emacs (или любой другой буфер, содержащий 'call-raise-frame) маленькой стрелкой рядом со строкой (raise-frame). Строка режима должна быть окружена [] (что означает, что вы выполняете отладку). В этот момент вы сможете сделать M-x поднять фрейм. Конечно, в Linux каждое действие в отладчике увеличивает фрейм, уменьшая полезность отладки. - person Trey Jackson; 03.06.2009
comment
Я играл с этим и пытался отладить его. Похоже, что поднять фрейм вообще не работает в моей версии Emacs 23 (следующий шаг скомпилирован из исходников около 20 минут назад). Я не могу понять, почему это не работает. У меня даже установлен server-raise-frame на t. - person Singletoned; 11.06.2009
comment
У меня не работает с Emacs.app 23, скомпилированным вчера для Mac OSX: | - person simao; 20.06.2009
comment
У меня работает (текущая сборка CocoaEmacs). Убедитесь, что вы используете двоичный файл emacsclient из пакета приложения. - person jkp; 19.10.2010

Некоторые из предложенных решений предполагают использование «подъёмной рамы». Это поднимет фрейм emacs, но не сфокусирует его. Когда вы запускаете emacs из окна терминала, emacs по-прежнему будет находиться под окном терминала, потому что окно терминала сохраняет фокус. Я использую 'select-frame-set-input-focus', чтобы поднять и сделать фокус.

Примеры:

/Applications/Emacs.app/Contents/MacOS/bin/emacsclient -n ~/myfile.txt \
    --eval '(select-frame-set-input-focus (nth 0 (frame-list)))'

Я предпочитаю запускать отдельный экземпляр emacs, поэтому, когда я выхожу с "^ X ^ C", я не теряю все окна. Для этого у меня есть сценарий оболочки:

#!/bin/bash
/Applications/Emacs.app/Contents/MacOS/Emacs \
    --eval '(select-frame-set-input-focus (nth 0 (frame-list)))' \
    "$@"
person Alex Tomlinson    schedule 28.11.2012

Я использую что-то подобное в моем .emacs, чтобы вызывать server-start только в том случае, если сервер еще не запущен:

(if (file-exists-p
 (concat (getenv "TMPDIR") "emacs"
         (number-to-string
          (user-real-uid)) "/server"))
nil (server-start))

Затем пару изменений в моем .zshrc, чтобы я мог бездумно запускать ec в качестве своей команды редактора из оболочки:

# I use the Emacs package from emacsformacosx.com
alias emacs='open -a emacs'
alias emacsclient='/Applications/Emacs.app/Contents/MacOS/bin/emacsclient'
alias ec='emacsclient -a /Applications/Emacs.app/Contents/MacOS/Emacs'
export EDITOR='ec'
person markhellewell    schedule 11.03.2011

Чтобы расширить ответы Трея Джексона и комментарий Singletoned: у меня в файле .emacs есть следующее:

;;;
;;; Run in server-mode so other sessions can connet
;;;
(defun call-raise-frame ()
   (raise-frame))
(defun end-server-edit ()
   (shell-command "osascript -e \"tell application \\\"System Events\\\" to keystroke tab using command down\""))
(add-hook 'server-visit-hook 'call-raise-frame)
(add-hook 'server-done-hook 'end-server-edit)
(server-start)

И в моем файле инициализации оболочки у меня есть следующие псевдонимы:

alias e='emacsclient'      # edit
alias enw='emacsclient -n' #edit (no wait)

Теперь я могу открыть оболочку бок о бок с моим экземпляром CocoaEmacs и без проблем использовать их вместе. Я могу вызвать редактор "встроенный" с моим текущим потоком терминала, используя псевдоним e, и как только я закончу редактирование в emacs, фокус будет возвращен вызывающему терминалу.

person jkp    schedule 19.10.2010

Я определяю эту функцию в моем .emacs

(defun ns-raise-emacs ()
  (ns-do-applescript "tell application \"Emacs\" to activate"))

Затем используйте это, чтобы поднять раму:

emacsclient -e '(ns-raise-emacs)'

Я рекомендую делать это так, а не вызывать osascript. Кажется, что он реагирует быстрее (иногда значительно быстрее), чем при использовании osascript.

person pheaver    schedule 10.01.2010

fwiw, вот мое решение:
шаг 1: создайте сценарий в / usr / local / bin / emacs со следующим содержимым:

#!/usr/bin/bash
emacsclient -c --alternate-editor='/Applications/Emacs.app/Contents/MacOS/Emacs'  "$@" 2>/dev/null

Шаг 2. Сделайте его исполняемым через: chmod + x / usr / local / bin / emacs

шаг 3. в ваш файл ~ / .emacs добавьте следующее:

(server-start)  

(defun ns-raise-emacs ()  
(ns-do-applescript "tell application \"Emacs\" to activate"))  

(ns-raise-emacs)  

(add-hook 'server-visit-hook 'raise-frame)  
;;(add-hook 'server-visit-hook 'ns-raise-emacs)

объяснение:

Если запущен сценарий emacs в / usr / local / bin / emacs и в данный момент не запущен сервер emacs, emacsclient вызовет альтернативный редактор, которым в данном случае является редактор Emacs (/Applications/Emacs.app/Contents/MacOS / Emacs).

На шаге 3 кажется, что первоначальный вызов (ns-raise-emacs) необходим для того, чтобы начальное окно Emacs отображалось поверх всего остального.

(add-hook 'server-visit-hook 'raise-frame) предназначен для того, чтобы последующие кадры показывались поверх всего остального.

В качестве альтернативы, если вы предпочитаете, чтобы все фреймы Emacs отображались поверх всего остального каждый раз, когда вы вызываете emacs из командной строки, вы можете раскомментировать строку (add-hook 'server-visit-hook 'ns-raise-emacs).

person Gino    schedule 28.10.2013