2010-08-26 2 views
1

Так я устал ждать Emacs, чтобы загрузить каждый раз заново, и консультационная Emacs Wiki, я написал мне сценарий вызова, такие как:Emacs клиент/сервер и ClearCase просмотров

#!/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 "[email protected]" 

немедленно, однако это не удалось из-за в несвежей гнездо (по другим причинам мой 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 "[email protected]" 

Это работает, но работает с видом 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.elserver-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 "[email protected]" 

Но когда я вижу:

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 и использовать другую переменную среды, но безрезультатно.

ответ

0

ОК, часть тайны решается:

Version 2 не должны использоваться.Кажется, что это работает, потому что:

  1. /sbin/fuser -k ${server} фактически не убивает серверный процесс. Возможно, /sbin/fuser -k -SIGKILL ${server} будет, но я этого не пробовал. Это также может быть вызвано маской зрения ClearCase (используемой манипуляцией на уровне ядра).
  2. rm -f ${server} отсоединяет файл, но не освобождает его, поскольку он все еще используется при запуске процессов.

Таким образом, последний вид запуска сценария вызова в первый раз будет являться владельцем файла сокета $ {server}, а последующие вызовы Emacs будут использовать этот сокет и будут видеть файлы версий этого Посмотреть.

Только представьте себе часы удовольствия отладки это ...


Как для , как это исправить? части, я буду считать трусливый выход, и просто вернуться к одинокой Emacs в представлениях ClearCase:

#!/bin/bash 
# @file: /usr/local/bin/emacs 
# @version: 4 

if [ "${CCVIEW}" ] ; then 
    /opt/emacs/bin/emacs [email protected] 
    exit $? 
fi 

function is_server_up() { 
    local server=/tmp/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 
    done 
fi 

/opt/emacs/bin/emacsclient -c "[email protected]" 
3

Просто к сведению, на самом деле, но я бы не использовать setview.

  • Как уже отмечалось, он создает оболочку (со всеми вопросами в плане общения с демонами)
  • ИТС только для одной точки зрения на время. Вам всегда нужно сделать cleartool pwv, чтобы убедиться, в каком виде вы сейчас работаете при использовании пути /vobs.

Я предпочитаю использовать полный путь динамического зрения:

/view/myView/vobs/... 

Таким образом, не икру оболочки, не устранения неоднозначности, ничего страшного.

+0

Я второй, чтобы использовать полный путь, я использовал это очень успешно в течение многих лет. Даже создали некоторые вспомогательные скрипты, чтобы легко переключаться между представлениями ... –

Смежные вопросы