hack のためのネタ帳, etc,,,

未解決案件

状況

vscode の Python extension だと docstring でクラスやメソッドをドキュメンテーションしとくだけで、バルーンヘルプがサクサク出て来て凄く便利だったので、R でも出来んもんかと「GNU R 関数 ヘルプの作り方」でググってみたら、roxygen2 とかいう Doxygen もどきの記法でドキュメンテーション出来るらしいことが分かった。 詳細は以下の文書に書いてあるらしい。
で、これを書いてみたが、vscode 標準添付の R mode だとバルーンヘルプが出て来ない。

roxygen2 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
まともにラッパー書いてみた

続き

つうことで、Remote-WSL 経由で使う

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Wiki内検索

フリーエリア

管理人/副管理人のみ編集できます