GitHub - LuaLS/lua-language-server: A language server that offers Lua language support - programmed in Lua
A language server that offers Lua language support - programmed in Lua - LuaLS/lua-language-server
GitHub - LuaLS/lua-language-server: A language server that offers Lua language support - programmed in Lua favicon https://github.com/sumneko/lua-language-server
GitHub - LuaLS/lua-language-server: A language server that offers Lua language support - programmed in Lua

当初 rustd3d11 のレンダラーを作ろうとして作業を進めていた。 imgui を組み込んで、 glTF をロードして unlit で描画するところまで作ったが、 GUI の作りこみが大変そうな感じだった。 rust は関数オーバーロードが無いので imgui のラッパーの使い勝手が c++ より落ちるなど。 ポインターを渡せるのは素敵なのだが。

nvim-0.5 はおもしろい

ここで寄り道して、 nvim をいじり始めた。 ちょうどバージョン 0.5 がリリースされるタイミングで、0.5 になると lua サポートが強化されて、設定が lua で書けるとのこと。

ということで Windows 向けのソースからのビルドシステムを作って nvim 環境を整備してみた。 lua で記述された plugin をなるべく採用。

GitHub - ousttrue/my_nvim
Contribute to ousttrue/my_nvim development by creating an account on GitHub.
GitHub - ousttrue/my_nvim favicon https://github.com/ousttrue/my_nvim
GitHub - ousttrue/my_nvim

最近常用していた、 vscode の便利さにどこまで追いつけるか。

  • Language Server Protocol。nvim-0.5 から nvim-lsp (luaで書いてある) がある。組み込み
  • Debug Adapter Protocol。nvim-0.5 から nvim-dap (lulで書いてある) がある。https://github.com/mfussenegger/nvim-dap

vscode から lspdap という重要な資産を持ってこれるので慣れればいけそうである。 調べたところ下記のようだった。

  • codelldb(native debugger c++ や rust) は nvim-dap を改造すれば使えた https://github.com/ousttrue/nvim-dap
  • rust-analyzer 動いた
  • python: lsp, dap ともに動きそう
  • lua: lsp, dap ともに動きそう
  • csharp: lsp, dap ともに動きそう(Unityはうまくいかず)

nvim-lsp も nvim-dap も lua で簡単に記述されているので、コードを読めば、たぶんわかる。 あとは、タスクランナーを整備すれば開発環境に使えそう。

luarocks の Windows 運用

lua で記述された nvim のパッケージマネージャー https://github.com/wbthomason/packer.nvim を採用したのだが、 Windows で luarocks 機能が動かなかった。https://luarocks.org/lua のパッケージマネージャー。 ちょっと、古め(vc2017より前)の vc でないとだめぽい。 改造した。

hererocks は、luarocks のインストーラー。 LUA_PATH package.path を理解した。

スタンドアロンの lua インタプリタによるプロジェクト

luarocks が無事に Windows で運用できるようになったので、プロジェクトローカルに必要なライブラリをインストールして、 スタンドアロンの lua インタープリターを起点にしたアプリ開発ができないか探ってみた。 lua インタプリタがアプリ組み込みだと dap の運用がしづらい(port 開けて attach とかになる)のでスタンドアロンの lua インタープリターを推す。

# フォルダ構成
project_root
+ lua(.gitignore) # hererocks でローカルビルドする
+ main.lua

これで、 lspdap が利用できれば快適になるのではないか。

lua の LanguageServer

がしっかり動き、EmmyLua の型ヒントを活用できることが分かった。

https://github.com/neovim/nvim-lspconfig/blob/a21a509417aa530fb7b54020f590fa5ccc67de77/CONFIG.md#sumneko_lua に例があって、

require'lspconfig'.sumneko_lua.setup {
settings = {
Lua = {
workspace = {
-- Make the server aware of Neovim runtime files
library = {
[vim.fn.expand('$VIMRUNTIME/lua')] = true, -- lua標準の型定義がある
[vim.fn.expand('$VIMRUNTIME/lua/vim/lsp')] = true, -- Vimの型定義がある
},
},
},
},
}

インテリセンスが効くし、組み込み関数の型ヒントも追加できる。

lua の DebugAdapter

DebugAdapter も問題なく動いた。 luajit の場合は対応しているものを使うべし。

Lua Debug

https://github.com/actboy168/bee.lua

  • Add error hook (for debugger)
  • Add resume/yield hook (for debugger)

謎の機能で実装されているぽい。

Local Lua Debugger

lua で 3D

ちょっと試したところ、 luajit の FFI を使うのが有望そうという感触を得た。 d3d は lua でやっている人があまりいなかった。

最新の luajit-2.1.0-beta3(lua-5.1仕様) でいく。

imgui の ffi

cimgui ではなく 素の imgui の luajit ffi できるか実験した。

Is it possible to use functions from c++ namespaces with luajit ffi?
I've got a lot of c++ code which contains a lot of functions and classes in namespaces (boost, for example). Now I'm trying to embed LuaJiT2 as script engine, but I cannot find anything about calling
Is it possible to use functions from c++ namespaces with luajit ffi? favicon https://stackoverflow.com/questions/6691651/is-it-possible-to-use-functions-from-c-namespaces-with-luajit-ffi
Is it possible to use functions from c++ namespaces with luajit ffi?
ffi.cdef[[
void Test1_Method1(void) asm("_ZN5Test17Method1Ev");
]]

のように mangling に対応すればできそう。

libclang による コード生成

ということで、 luajit + FFI を中心に imgui ラッパーを作ってレンダラーというか 3D ツールのインフラとなる、 簡単なレンダラーと Gizmo に対応したツールキットを作るという方向になってきた。

imguiluajit FFI の使い勝手が重要。

GitHub - ousttrue/limgui: luajit + ffi + imgui
luajit + ffi + imgui. Contribute to ousttrue/limgui development by creating an account on GitHub.
GitHub - ousttrue/limgui: luajit + ffi + imgui favicon https://github.com/ousttrue/limgui
GitHub - ousttrue/limgui: luajit + ffi + imgui
  • libclang で imgui.h をパースして、luajit FFI 生成と lsp への EmmyLua アノテーション生成を同時にやるツール。