denopsでVimのGhostTextプラグインを実装した(WIP)

1 min read読了の目安(約1400字

お久し振りです。

前回はジョークプラグインでお茶を濁しましたが、今回はしっかりプラグインを作ってきました。

denopsでGhostTextを実装したものになります。

https://github.com/gamoutatsumi/dps-ghosttext.vim

demo

GhostTextとは

WebSocketを用いてブラウザ上のテキストエリアを任意のテキストエディタで編集するブラウザ向け拡張機能(とそのプロトコル)です。

VSCodeを始めとしてAtomやEmacs、もちろんVimにもGhostTextを実装した拡張機能が存在します。

動機

そんな便利なGhostTextですが、現在確認できるVim向けのGhostText実装はPython(pynvim)を利用したものしかありません。

別にPythonを使うのが悪いという訳ではないのですが、やはりPythonのライブラリをわざわざ入れるのは面倒という層も存在するかと思います。

(ちなみに僕のNeovimは少しだけdark poweredなのでpynvimも入ってます)

そこで、denoランタイムさえ入っていれば依存を考える事なく使えるdenopsでGhostTextを実装する事にしました。

実装

GhostTextはWebSocketを利用するので、サーバを実装する必要があります。

ここではWebSocket及びネゴシエーションで使用するhttpサーバにservestを利用する事にしました。(この為だけにservestにPR出したりした)

実はここでWebSocket用のポートをランダムに確保してあげる必要があるのですが、そのfallback的な実装がめんどくさくて後回しになってます。(なのでうっかりするとすぐ例外吐いて死ぬ)

後はいい感じにバッファ番号とソケットをプラグイン内で管理しつつ、autocmdでよしなにpushしてあげてます。

GhostTextの規格上ではカーソル位置もやり取りするようですが、まだ実装できてないです。(一応動くのでまあヨシ!)

URL(ドメイン名)とファイルタイプの対応は g:dps_ghosttext_ftmap で管理してます。

let g:dps_ghosttext_ftmap["qiita.com"] = "markdown"

↑こんな感じ。(デフォルトではgithub.comとmarkdownが紐付いてます)

実際に使う時は :GhostStart でサーバを起動します。

課題

  • 複数セッションの扱いなど、まだまだバグの温床になってる感じがある(Issue歓迎)
  • カーソル位置の扱いなど、まだまだGhostTextの規格的には足りてないものが多い
  • そもそもどこまでがGhostTextの規格上必要なものなのか分からないのでちゃんと調べる必要がある

まとめ

とりあえず課題まみれなので本気で実用するならもう少し手を加える必要があります。

Issue・PRお待ちしております。