Так что я устал ждать, пока 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}
? Если нет, что мне делать, чтобы это исправить?
Ход выполнения:
Итак, я получил ответ (см. ответы ниже) на часть вопроса, и теперь я застрял с частью как это исправить?:
Я пытаюсь поместить ${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
и использовать другую переменную среды, но безрезультатно.