Skip to content
2009/11/15 / highmt

emacsclientwrapper

cygwinのbash上からemacsclientでNTEmacsにパスを渡すときにcygpathによってパスの変換を行うラッパー。

#!/bin/sh
#
# emacsclientwrapper: invoke emacsclient with file path arguments converted using cygpath
#
# emacsclient short options:
#  VHnea:f:d:tc
# emacsclient long options:
#  { "no-wait",          no_argument,       NULL, 'n' }
#  { "eval",             no_argument,       NULL, 'e' }
#  { "help",             no_argument,       NULL, 'H' }
#  { "version",          no_argument,       NULL, 'V' }
#  { "tty",              no_argument,       NULL, 't' }
#  { "nw",               no_argument,       NULL, 't' }
#  { "create-frame",     no_argument,       NULL, 'c' }
#  { "alternate-editor", required_argument, NULL, 'a' }
#  { "server-file",      required_argument, NULL, 'f' }
#  { "socket-name",      required_argument, NULL, 's' } # <- disabled
#  { "display",          required_argument, NULL, 'd' } # <- long option is disabled.
# emacscientwrapper additional options:
#  { "cygpath"           optional_argument, NULL, 257 }
#
# usage example:
#  $ NTEMACSCLIENT=c:/emacs/23.1/bin/emacsclient emacsclientwrapper -n --cygpath=w +10:20 /path/to/file
# 

MYPROGNAME=`basename $0`
TEMP=`getopt -a -o VHnea:f:d:tc \
 --long no-wait,eval,help,version,tty,nw,create-frame,alternate-editor:,server-file:,cygpath:: \
 -n 'emacsclient' -- "$@"`
if [ $? -ne 0 ]; then echo "$MYPROGNAME: line $LINENO: error in getopt" 1>&2 ; exit 1; fi
eval set -- "$TEMP"

while true ; do
  case "$1" in
    --)
      shift ; break ;;
    -n|--no-wait)
      opts="$opts $1" ; shift ;;
    -e|--eval)
      opts="$opts $1" ; shift ;;
    -H|--help)
      opts="$opts $1" ; shift ;;
    -V|--version)
      opts="$opts $1" ; shift ;;
    -t|--tty|--nw)
      opts="$opts $1" ; shift ;;
    -c|--create-frame)
      opts="$opts $1" ; shift ;;
    -a|--alternate-editor)
      opts="$opts $1 \"$2\""  ; shift 2 ;;
    -f|--server-file)
      opts="$opts $1 \"$2\""  ; shift 2 ;;
    -d)
      opts="$opts $1 \"$2\""  ; shift 2 ;;
    --cygpath)
      pathopts=$2             ; shift 2 ;;
    *)
      echo "$MYPROGNAME: line $LINENO: internal error" 1>&2 ; exit 1 ;;
  esac
done

for arg ; do
  case "$arg" in
    +*)
      if [ -z "$(echo $arg | sed 's/\+[0-9][0-9]*\|\+[0-9][0-9]*:[0-9][0-9]*//g')" ] ; then
        args="$args \"$arg\""
      else
        carg=$(cygpath -${pathopts:-w} "$arg")
        if [ $? -ne 0 ]; then echo "$MYPROGNAME: line $LINENO: error in cygpath" 1>&2 ; exit 1; fi
        args="$args \"$carg\""
      fi
      ;;
    *)
        carg=$(cygpath -${pathopts:-w} "$arg")
        if [ $? -ne 0 ]; then echo "$MYPROGNAME: line $LINENO: error in cygpath" 1>&2 ; exit 1; fi
        args="$args \"$carg\""
  esac
done

#echo "emacsclient options:" $opts
#echo "emacsclient arguments:" $args
#echo "cygpath options:" -$pathopts
#echo ${NTEMACSCLIENT:?environment variable not specified} $opts $args

eval ${NTEMACSCLIENT:?environment variable not specified} $opts $args

最初はxargsやらsedやらを駆使してがんばっていたのだけれども、
結局、emacsclientの引数解析を完全にやらないとどの引数がファイルの引数なのかわからず、
こういう形になってしまった。

実際は、cygwin-mount.elを使えばこのようなものは不要なのだが、
22.2のころ、UNCパスがカレントディレクトリにある状態でemacsclientを呼ぶと、
UNCではなくcygwinのパスが渡されてしまうという問題があったので、
今までcygwin-mount.elはロードしない設定にしていた。

23.1ではそのような起きなそうな感じなので、上記スクリプトは没にして
ありがたくcygwin-mount.elを使わせていただくことにしよぅ。

広告
%d人のブロガーが「いいね」をつけました。