[英]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.script
和donkey.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.