開発したVSCode Extensionの紹介
選択中のコードをLuaコードとして評価した値に置き換えます。
DLページ
リポジトリ
コード解説
Luaの評価にはfengariを使っています。JavaScriptで実装されたLuaVMです。
https://fengari.io/
import * as vscode from 'vscode';
export function activate(context: vscode.ExtensionContext) {
// Luaを評価するために必要なモジュールをロード
const lua = require('fengari/src/lua.js');
const lauxlib = require('fengari/src/lauxlib.js');
const lualib = require('fengari/src/lualib.js');
const { to_luastring } = require("fengari/src/fengaricore.js");
// 文字列をLuaコードとして評価し、評価した値を文字列で返す関数
// fengari のテストコードを見て適当に作ったので、仕組みはよくわかっていない・・・
function eval_as_lua_code(code: string): string {
let L = lauxlib.luaL_newstate();
lualib.luaL_openlibs(L);
lauxlib.luaL_loadstring(L, to_luastring(code));
lua.lua_call(L, 0, -1);
return lua.lua_tojsstring(L, -1);
}
// コマンド lua_eval.replace を定義
let disposable = vscode.commands.registerCommand('lua_eval.replace', () => {
// 現在アクティブなエディタを取得
const editor = vscode.window.activeTextEditor;
if (editor !== undefined) {
// エディタ上の選択領域を取得する
const selections = editor.selections;
// エディタを編集するためにコールバックを渡す
editor.edit(builder => {
// 全ての選択領域を順番に処理していく
for (const selection of selections) {
// 選択領域のテキストを取得する
var text = editor.document.getText(selection);
// 選択領域のテキストを、Luaコードとして評価したものと置き換える
builder.replace(selection, eval_as_lua_code(text));
}
});
}
});
context.subscriptions.push(disposable);
}
export function deactivate() { }
似たようなExtensionを開発するときに参考にしていただければ幸いです。