Так что я устал от ожидания загрузки Emacs каждый раз заново, и, обратившись к Emacs Wiki , я написал мне скрипт вызова, такой как:
#!/bin/bash
# @file: /usr/local/bin/emacs
# @version: 1
server=/tmp/emacs${UID}/server
if [ ! -S ${server} ] ; then
/opt/emacs/bin/emacs --daemon
until [ -S ${server} ] ; do
sleep 1s
done
fi
/opt/emacs/bin/emacsclient -c "$@"
Сразу же, однако онне удалось из-за устаревшего сокета (по несвязанным причинам мой emacs --daemon
был неожиданно убит): поэтому я написал:
#!/bin/bash
# @file: /usr/local/bin/emacs
# @version: 2
server=/tmp/emacs${UID}/server
if ! /sbin/fuser ${server} 2> /dev/null ; then
/sbin/funser -k ${server}
rm -f ${server}
fi
if [ ! -S ${server} ] ; then
/opt/emacs/bin/emacs --daemon
until [ -S ${server} ] ; do
sleep 1s
done
fi
/opt/emacs/bin/emacsclient -c "$@"
Это сработало, но при работе с представлениями ClearCase я заметил морщинку:
В Unix команда ClearCase:
cleartool setview myview-myuser
создает вложенную оболочку с измененной иерархией файловой системы: несколько новых монтирований в /vobs/
, использующих mvfs, и видимых только этой оболочке.
Для каждой такой новой оболочки команда /sbin/fuser ${server}
возвращает 1 (ошибка) при первом запуске моего сценария вызова Emacs.Таким образом:
- Для версии 1: Существует только один демон, но клиенты Emacs не могут видеть монтирования mvfs в
/vobs/
. - Для версии 2: Есть нескольковсе демоны используют один и тот же сокет $ {server}.
Итак, мои вопросы: Можно ли использовать версию 2?Если да, как это может работать, если все демоны, очевидно, используют один и тот же сокет ${server}
?Если нет, что я должен сделать, чтобы это исправить?
Прогресс:
Итак, я получил ответ (см. Ответы ниже) на частьвопрос, и теперь я застрял с как это исправить? part:
Я собираюсь поставить ${server}
под /vobs/
и, таким образом, позволить ClearCase решить мою проблему самому.,Мне нужно только выяснить, может ли и как Emacs разрешить мне сделать это:
Согласно моему /opt/emacs/share/emacs/23.2/lisp/server.el
, server-socket-dir
коренится в значении переменной окружения ${TMPDIR}
, поэтому я попытался:
#!/bin/bash
# @file: /usr/local/bin/emacs
# @version: 3
[ "${CCVIEW}" ] && TMPDIR="/vbos/misc/tmp" || TMPDIR="/tmp"
export TMPDIR
function is_server_up() {
local server=${TMPDIR}/emacs${UID}/server
[ -e ${mysock} ] && /sbin/fuser ${server}
}
if ! is_server_up ; then
/opt/emacs/bin/emacs --daemon
until is_server_up ; do
sleep 1s
echo "DEBUG: sleeping"
done
fi
/opt/emacs/bin/emacsclient -c "$@"
Но при запуске из представления ClearCase я вижу:
Loading ~/.emacs.d/this-module.el (source)...
Loading ~/.emacs.d/this-module.el (source)...done
Loading ~/.emacs.d/that-module.el (source)...
Loading ~/.emacs.d/that-module.el (source)...done
... snip ...
Starting Emacs daemon.
ESC [ A
ESC
ESC [
ESC [ a
M-[ A is undefined
... и он никогда не завершается.
Я также пытался пропатчить server.el
и использовать другую переменную среды, но безрезультатно.