vscode の Python extension だと
docstring でクラスやメソッドをドキュメンテーションしとくだけで、バルーンヘルプがサクサク出て来て凄く便利だったので、R でも出来んもんかと「
GNU R 関数 ヘルプの作り方」でググってみたら、roxygen2 とかいう Doxygen もどきの記法でドキュメンテーション出来るらしいことが分かった。
- Qiita / wakuteka / 2017-05-09: こわくないRパッケージ開発!2016
詳細は以下の文書に書いてあるらしい。
で、これを書いてみたが、vscode 標準添付の R mode だとバルーンヘルプが出て来ない。
「
roxygen2 vscode」でググってみると、
- Before I Sleep / 2018-02-22: Going Alt-RStats with VSCode
が見つかって、Yuki Ueda 氏の vscode-R
- GitHub / lkuyadeu / vscode-R
- VisualStudio / Marketplace / Visual Studio Code / Programming Language / R
が推してあった。
ただ、これだけではバルーンヘルプが出てくれなくて、
key piece として紹介されている
- VisualStudio / Marketplace / Visual Studio Code / Programming Language / R LSP Client
に加えて、R 本体に languageserver パッケージを追加する必要があるとかなんとか紹介されている。
ところがしかし、この2つをいれても上手く動いてくれない。
まず、hover しても Loading... ってバルーンヘルプが表示されて、そのまま何も起こらない。
どうも R Language Server との上手く通信出来てない模様。
とりあえず、vscode-R は Ctrl+Enter とかしてみると、vscode の TERMINAL の中に R を起動してカーソール行または選択されたテキストをが R に送るのだが、起動メッセージをはじめとしてマルチバイトコードが見事に文字化けしている。
Debug にチェック入れてみると、R LSP Client も同様の問題が生じているのか、
received: Content-Length: 206
received payload.
handling request: textDocument/hover
internal error: {"message":" �֐��łȂ����̂�K�p���悤�Ƃ��܂��� ","call":{}}
deliver: ["Response","Response","Message","R6"]
received: Content-Length: 62
received payload.
unknown notification: $/cancelRequest
のような感じでやはりエラーの箇所に文字化けが絡んでそうな雰囲気が。
試しに "r.lsp.lang" に "ja_JP.Shift_JIS" とか設定してみたが何も効果はなく、
"Shift_JIS" とか設定してみたところ、
received: Content-Length: 206
received payload.
handling request: textDocument/hover
internal error: {"message":"attempt to apply non-function","call":{}}
deliver: ["Response","Response","Message","R6"]
[Error - 19:37:25] Request textDocument/hover failed.
Message: {"message":"attempt to apply non-function","call":{}}
Code: -32603
のように、エラー中の文字化けは解消した。
が、しかし、何言ってんだ?このエラーは?
関数じゃない物に call を試みたって言ってるようだが、hover したキーワードの事なのか、vscode の extension 内の変数の事なのか?
文字化けが原因かと思ったら、どうも文字化けとは無関係な原因で失敗しているような雰囲気だ。
これはどうしろと?
ちょっと、楽にはクリア出来そうにはなさそうな雰囲気。
Python 羨ま。
あと、もう一つ困った事としては、vscode-R が CMD 上で CD してから R を起動しようとするため、UNC 上のフォルダで作業しているときに vscode-R から R を呼ぶと
'\\host\share\dir'
上記の現在のディレクトリで CMD.EXE を開始しました。
UNC パスはサポートされません。Windows ディレクトリを既定で使用します。
みたいに言われて、getwd() が %SYSTEMROOT% の状態で起動してしまう。
R 自体は setwd() で UNC 食わせても大丈夫なのだが、前述のようにマルチバイトが化けるため、パスにマルチバイトが混じってると setwd() できない。
例によって、Remote-WSL に逃げるべき案件かと思いきや、WSL は UNC は自動で mount されないので
Error: Command failed: C:\WINDOWS\System32\wsl.exe -d Ubuntu wslpath -u '\\host\share\dir'
wslpath: \\host\share\dir: No such file or directory
これ、結構辛い。
sudo mount -t drvfs //host/share /mnt/host%3Fshare
みたいにぶら下げてるために
/etc/fstab に
//host/share /mnt/host%3Fshare drvfs defaults 0 0
のようなエントリーを追加して
/usr/local/bin/wslpath に
#!/usr/bin/env bash
MP1='\\host\share'
while (( 0 < $# )); do
case "$1" in
"$MP1"*)
echo /mnt/host%3Fshare$(sed -E 's:\\:/:g' <<<"${1:$((${#MP1}+1))}")
exit
;;
*)
ARGS+=( "$1" )
shift
;;
esac
done
/bin/wslpath "${ARGS[@]}"
みたいなラッパー書いとけば Remote-WSL 可能になった。
追記: 2020-01-22
まともにラッパー書いてみた