editor にオプションを指定できなくなった R 3.0.2 でもオプションを指定する裏ワザ

自分は tmux のセッションごとに Emacs のサーバを起動していて、次のような設定をしています。

export EMACS_SERVER="server-$(tmux display -p '#S')"
export EDITOR="emacsclient -s ${EMACS_SERVER}"

そうすると、R の options の editor は次のように emacsclient にオプションが付与されたものになります。1

% R -q
> getOption("editor")
[1] "emacsclient -s server-3"

っで、R 3.0.1 だと edit 関数などを実行した時に問題なく emacs で編集できるんですが、R 3.0.2 だと次のようなエラーになります。

> edit(print)
sh: emacsclient -s server-3: command not found
Error in .External2(C_edit, name, file, title, editor) :
  problem with running editor emacsclient -s server-3

どうやらオプション部分まで含めてコマンド名とみなしているようです。

ちょっと調べてみたところ、この変更はリビジョン 63550 で適用されたみたいです。

Index: src/main/edit.c
===================================================================
--- src/main/edit.c	(revision 63549)
+++ src/main/edit.c	(revision 63550)
@@ -164,7 +164,7 @@
     if (ptr_R_EditFile)
 	rc = ptr_R_EditFile(filename);
     else {
-	sprintf(editcmd, "%s %s", cmd, filename);
+	sprintf(editcmd, "'%s' '%s'", cmd, filename); // allow for spaces
 	rc = R_system(editcmd);
     }
     if (rc != 0)

cmd には editor の内容が入っているので、最終的に実行されるコマンドは editor の内容をシングルクォートで括ったものになってしまいます。

どうしたものかなぁと頭を抱えていたんですが、変更内容をよく見ると次のように editor の内容をシングルクォートで括ればよいことに気付きます。

> options(editor = sprintf("'%s'", getOption("editor")))

こうすることで、editcmd は次のような内容になります。

''emacsclient -s server-3'' '/path/to/file'

要は、シングルクォートの直後にシングルクォートを挿入することで、シングルクォートを無効化しています。

本来であればスペースを含むようなコマンドをユーザがシングルクォートで括るべきだと思うんですが、この変更な何なんですかねぇ・・・。
コミットメッセージは “workarounds for when TMPDIR contains spaces” というもので、他にも多くの変更が加えられているので、この箇所の変更がどうして必要だったのかいまいちわかりません><
バグとして報告したら元に戻るかもですね。

  1. ESS は環境変数 EDITOR を参照しないのでデフォルトで “emacsclient” になりますが・・・