Emacs 23, OS X, multi-tty и emacsclient - PullRequest
5 голосов
/ 03 июня 2009

Как мне заставить emacs 23 работать хорошо в многопользовательском режиме на 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

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

Ответы [ 8 ]

6 голосов
/ 26 ноября 2009

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

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

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

(setq ns-pop-up-frames nil)

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

5 голосов
/ 03 июня 2009

Возможно, это сработает, просто вызывая Raise-Frame при подключении клиента:

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

(Это бывает избыточно на моей машине с Linux.)

4 голосов
/ 28 ноября 2012

Некоторые из предложенных решений предлагают использовать «фрейм-рейз». Это поднимет кадр 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)))' \
    "$@"
2 голосов
/ 11 марта 2011

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

(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'
2 голосов
/ 03 июня 2009

AppleScript будет простым:

tell app "Emacs" to activate
1 голос
/ 19 октября 2010

Чтобы расширить ответы, данные Треем Джексоном и комментарием Синглтонеда: в моем файле .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 и использовать их без проблем вместе. Я могу вызвать редактор "inline" с моим текущим потоком терминала, используя псевдоним e, и как только я закончу редактирование в emacs, фокус будет возвращен вызывающему терминалу.

0 голосов
/ 28 октября 2013

Кстати, вот мое решение:
Шаг 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/ Содержание / MacOS / Emacs).

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

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

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

0 голосов
/ 11 января 2010

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

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

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

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

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

...