LoginSignup
5
6

More than 5 years have passed since last update.

Luaコードを評価するVSCode Extensionを作りました

Posted at

開発したVSCode Extensionの紹介

選択中のコードをLuaコードとして評価した値に置き換えます。
eval.gif

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を開発するときに参考にしていただければ幸いです。

5
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
6