簡體   English   中英

讀取與當前文件位於同一目錄中的另一個文件(VS代碼)

[英]Reading another file in the same directory as the current file (VS Code)

我正在創建語言服務器,當前有一個靜態/預加載的完成項目列表。 該語言服務器將在任何.script文件上激活。 在同一目錄中,將存在一個.map文件(任意擴展名,我不是指JS源映射文件)。 映射文件只是一個純文本文檔,其中包含類名和名稱(每個“實體”)的列表。 一個典型的條目可能如下所示:

// entity 237
{
"classname" "func_static"
"name" "func_static_237"
"origin" "200 179.5 -181"
"rotation" "0 -1 0 1 0 0 0 0 1"
}

我試圖將每個名稱/類名對添加到完成列表(名稱是完成項標簽,而類名是詳細信息)。 到目前為止,這是我所做的:

不幸的是,由於單獨存在“類名”的單個情況,因此我選擇使用跨兩行都匹配的正則表達式。 然后,我使用了兩個捕獲組(一個用於名稱,一個用於類名稱)將它們都推入數組。 然后,我遍歷數組中的每一對,並將其添加到完成列表中。

我的想法是,我正在將變量從映射文件預加載到相應的腳本文件中(它們都具有相同的文件名,並且位於同一目錄中)。

代碼如下:

'use strict';

import * as path from 'path';
import * as vscode from 'vscode';
import * as fs from 'fs';

export function activate(context: vscode.ExtensionContext) {

    ...

    // each pair will go into this
    var objArray = new Array;

    function readTextFile() {
        // load the map file
        var text = fs.readFileSync(context.asAbsolutePath(path.join('donkey.map')));
        // match classname and name
        var regex = /\"classname\"\s\"(\w+)\"(?:\r\n|[\r\n])\"name\"\s\"(\w+)\"/g
        getMatches(text.toString(), regex);
    }

    function getMatches(string: string, regex: RegExp) {
        var match;
        while (match = regex.exec(string)){
            // capture group 1 = classname
            // capture group 2 = name
            // pushing name first because it's more important
            objArray.push([match[2], match[1]]);
        }
    }

    var loop1 = function (i: number) {
        // create a new completion item
        vscode.languages.registerCompletionItemProvider('quadscript', {
            provideCompletionItems: function () {
                var compItem = new vscode.CompletionItem(objArray[i][0], vscode.CompletionItemKind.Variable);
                compItem.insertText = ("$" + objArray[i][0]);
                compItem.detail = (objArray[i][1]);
                return [
                    compItem
                ];
            }
        });
    }

    for (var i = 0; i < objArray.length; i++) {
        loop1(i);
    }

    readTextFile();
}

在擴展開發主機中調試擴展時,調試控制台將顯示以下內容:

C:\\ Program Files \\ Microsoft VS Code \\ Code.exe --debugBrkPluginHost = 37535 --debugId = cfbf2c6d-c313-46fa-8c44-4e64f44eb97f --extensionDevelopmentPath = c:\\ Users \\ fyrewire \\ Documents \\ VSCode \\ quadscript

然后,當我鍵入func時,它們將按預期顯示,表明它們已成功從文件中讀取(該文件位於c:\\Users\\thefyrewire\\Documents\\VSCode\\quadscript\\donkey.map ,與調試控制台中所示的extensionDevelopmentPath對應) )。

從另一個文件成功讀取完成項目

接下來,我去c:\\Users\\thefyrewire\\Documents\\test並將donkey.scriptdonkey.map文件移到此處,然后打包並安裝了擴展名。 當我進入腳本文件並顯示完成列表時,func_static項不存在。 我認為這是因為它正在嘗試從.vscode\\extensions\\<extension>\\donkey.map安裝擴展名的位置讀取,該位置在我移動文件時現在不存在。

因此,我嘗試更改讀取地圖文件的路徑,並使用絕對路徑作為測試。

var text = fs.readFileSync("file:///C:/Users/thefyrewire/Documents/test/donkey.map");

調試時,我得到以下信息:

ENOENT:沒有此類文件或目錄,請打開“ C:\\ Program Files \\ Microsoft VS Code \\ file:\\ C:\\ Users \\ thefyrewire \\ Documents \\ test \\ donkey.map”。 關閉警告

使用類似的相對路徑:

var text = fs.readFileSync("./donkey.map");

返回值:

ENOENT:沒有此類文件或目錄,請打開“ C:\\ Program Files \\ Microsoft VS Code \\ donkey.map”。 關閉警告

我嘗試了多種其他fs方法,但它似乎僅從C:\\Program Files\\Microsoft VS Code開始讀取。

所以,最后是我的問題:為了使擴展名能夠與加載了任何腳本文件的目錄相同地動態讀取,我該怎么辦? 任何建議將不勝感激,謝謝!

編輯:我知道這還不清楚。 “腳本文件”並不是指JS腳本文件,它還是自定義語言的一部分(因此是語言服務器)。

您可以使用__dirname

var fs = require('fs')
var path = require('path')

var text = fs.readFileSync(path.join(__dirname, donkey.map));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM