Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Neovim × リアルタイムチャット

26b059a7fa4d54ae985894ab232ea101?s=47 higashi
December 28, 2020
34

Neovim × リアルタイムチャット

26b059a7fa4d54ae985894ab232ea101?s=128

higashi

December 28, 2020
Tweet

Transcript

  1. Neovim × リアルタイムチャット @higashi136_2

  2. 名前 : higashi 職業 : 高専 4 年生 好きなもの :

    Vim, Golang, プログラミング GitHub : higashi000 Twitter : @higashi136_2 自己紹介
  3. Vim 関係で関わったもの ・sarahck.vim  →Vim で Slack をするプラグイン ・sleahck.vim  →Vim で

    Slack をするプラグイン ・vimdoc-ja-working  →ドキュメントの翻訳プロジェクト ・slacklog-generator  → vim-jp の log を HTML 化するプロジェクト
  4. こう思ったことは ありませんか?

  5. Vim(Neovim) で .* がしたい!!

  6. .* の幅はとても広い... なんでも Vim でやりたくなってしまう... でもスライド一本で .* すべてを Vim でできるようにするのは厳しい...

  7. .* の幅はとても広い... なんでも Vim でやりたくなってしまう... でもスライド一本で .* すべてを Vim でできるようにするのは厳しい...

    →「 Vim で .* がしたい」 のうち 1 つを紹介
  8. 今回やりたいこと Vim で リアルタイムチャットが したい!!

  9. Vim で WebSocket を使えるようにしよう リアルタイムチャットをするために

  10. Vim で WebSocket を使えるようにしよう → if_python3 使えば行ける...? リアルタイムチャットをするために

  11. Vim で WebSocket を使えるようにしよう → if_python3 使えば行ける...? → websocket-client というライブラリを使うことにした

    リアルタイムチャットをするために
  12. 単純に while True で recv 関数を呼び出してみると... メッセージ受信中は Vim で他の動作ができない リアルタイムチャットをするために

  13. 単純に while True で recv 関数を呼び出してみると... メッセージ受信中は Vim で他の動作ができない -

    メッセージも送信できない リアルタイムチャットをするために
  14. 単純に while True で recv 関数を呼び出してみると... メッセージ受信中は Vim で他の動作ができない -

    メッセージも送信できない →非同期で動かしてあげたい リアルタイムチャットをするために
  15. 単純に while True で recv 関数を呼び出してみると... メッセージ受信中は Vim で他の動作ができない -

    メッセージも送信できない →非同期で動かしてあげたい 非同期処理をうまく実装できなかった;; リアルタイムチャットをするために
  16. 諦めるわけには行かない なんとかしてリアルタイムチャットがしたい

  17. 諦めるわけには行かない なんとかしてリアルタイムチャットがしたい →Neovim の Remote Plugin !!

  18. Vim で リアルタイムチャットが したい!!

  19. Neovim で リアルタイムチャットが したい!!

  20. WebSocket でのメッセージ受信部分 Remote Plugin を使うことで受信しながら他の動作を行えるようになった

  21. WebSocket でのメッセージ受信部分 Remote Plugin を使うことで受信しながら他の動作を行えるようになった が

  22. メッセージの送信ができない

  23. メッセージの送信ができない send という関数を使用してメッセージを送信する予定だった

  24. メッセージの送信ができない send という関数を使用してメッセージを送信する予定だった 実行してもメッセージを受信する関数が終了しないと送信されない

  25. メッセージの送信ができない send という関数を使用してメッセージを送信する予定だった 実行してもメッセージを受信する関数が終了しないと送信されない →いくつかのプラグインのソースコードを読むも解決方法がわからず...

  26. メッセージ送信をなんとかしよう VimScript で書いた関数は実行できた

  27. メッセージ送信をなんとかしよう VimScript で書いた関数は実行できた →system で外部コマンドを実行すればメッセージの送信ができるのでは...?

  28. curl でメッセージを POST して あとはサーバーに任せる!

  29. クライアント側 従来の実装 Neovim logo by Jason Long, and license: CC3.0 サーバー

    メッセージの受信 Python: recv() 他クライアントからのメッ セージ送信 メッセージの送信 Python: send() メッセージ受信 他クライアント 他クライアント 他クライアント
  30. クライアント側 従来の実装 Neovim logo by Jason Long, and license: CC3.0 サーバー

    メッセージの受信 Python: recv() 他クライアントからのメッ セージ送信 メッセージの送信 Python: send() メッセージ受信 他クライアント 他クライアント 他クライアント
  31. クライアント側 従来の実装 Neovim logo by Jason Long, and license: CC3.0 サーバー

    メッセージの受信 Python: recv() 他クライアントからのメッ セージ送信 メッセージの送信 system() + curl メッセージ受信 他クライアント 他クライアント 他クライアント
  32. クライアント側 従来の実装 Neovim logo by Jason Long, and license: CC3.0 サーバー

    メッセージの受信 Python: recv() 他クライアントからのメッ セージ送信 メッセージの送信 system() + curl メッセージ受信 他クライアント 他クライアント 他クライアント
  33. サーバー側の改良に着手 元々 Go で実装していたのでそれを改良する

  34. サーバー側の改良に着手 元々 Go で実装していたのでそれを改良する → リクエストを受け取ったら接続済みクライアントにメッセージを流す

  35. サーバー側の改良に着手 元々 Go で実装していたのでそれを改良する → リクエストを受け取ったら接続済みクライアントにメッセージを流す すんなり終わった

  36. 完成...? ・メッセージの受信 ・メッセージの送信 ともに実装完了 これで試してみることに

  37. デモ https://noa.higashi.dev というページを事前に作成しました QR コードの作成には https://qr.quel.jp/ というサイトを使わせていただきました

  38. デモ ↑部屋の ID を入力します 今回は gorillavim という ID を使います 入力後,ボタンを押し,部屋に移動します

  39. デモ ←表示名 ←発言 ↑送信

  40. Neovim クライアントについて GitHub にて公開しています higashi000/noachat.nvim pynvim と websocket-client を pip

    でインストール必要があります ぜひお試しください
  41. 現在の課題点 ・メッセージ受信中は他の Remote Plugin が使えない →使おうとすると Neovim が固まる ・別のバッファに移動すると固まる ・Vim

    非対応
  42. このプラグインを活かしてできそうなこと ・共同編集 ・Slack RTM API を使用したプラグイン

  43. Neovim × リアルタイムチャット @higashi136_2