我想打开的文件有一个简单的加密(它来自一个软件,但我有加密的许可)。如果我以纯文本的形式打开它,它就不是人类所能读的。为了简单起见,只需假设每一个字符都被移动了一点。
如果分机是对的,我想要改变它。
Openinig应该对文件进行解密,这样就可以编辑它了。关闭应该再次加密它,所以读取文件的程序能够这样做。
我将逻辑作为Notepad++插件运行,但我不知道如何在VSCode中实现它。
当前正在为解密文件设置语言服务器。这看起来挺好的。我可以在它的任何地方实现逻辑,而不会造成很大的性能损失?
发布于 2020-10-22 00:36:30
当文本编辑器更改为新打开的文件时,可以使用onDidOpenTextDocument
和onDidChangeActiveTextEditor
事件运行代码。然后在onDidChangeActiveTextEditor
事件中,读取文档的内容,运行解密函数,然后使用TextEditor.edit
函数将文本替换为解密文本。
若要在保存文件后加密,请使用onDidSaveTextDocument
函数读取保存的文件,对内容进行加密,然后将加密的文本写入保存的文件。
import * as vscode from 'vscode';
import * as path from 'path';
let steveChannel: vscode.OutputChannel | undefined;
let lastOpenFile = '' ;
// ----------------------------------- activate -----------------------------------
export function activate(context: vscode.ExtensionContext)
{
steveChannel_writeLine(`activate`);
vscode.window.onDidChangeActiveTextEditor((editor) =>
{
// text editor has been changed to a newly opened text file.
if ( lastOpenFile == editor?.document.fileName )
{
let document = editor.document;
const doc_text = editor.document.getText();
const uc_text = doc_text.toUpperCase();
// update contents of text editor to uppercase text.
editor.edit(editBuilder =>
{
const range = doc_entireDocRange(document) ;
editBuilder.replace( range, uc_text);
});
}
});
vscode.workspace.onDidOpenTextDocument((d) =>
{
const ext = path.extname(d.fileName) ;
if ( ext == '.txt')
{
steveChannel_writeLine(`file opened ${d.fileName}`);
// save name of most recently opened .txt file.
// Use in change text editor event to detect when the text editor
// contains the contents of a newly opened text file.
lastOpenFile = d.fileName ;
}
});
vscode.workspace.onDidSaveTextDocument((d) =>
{
const ext = path.extname(d.fileName);
if (ext == '.txt')
{
steveChannel_writeLine(`file saved ${d.fileName}`);
}
});
}
// ---------------------------------- deactivate ----------------------------------
// this method is called when your extension is deactivated
export function deactivate() {}
// ---------------------------- steveChannel_writeLine ----------------------------
function steveChannel_writeLine(line: string)
{
if (!steveChannel)
{
steveChannel = vscode.window.createOutputChannel('steve');
}
steveChannel.appendLine(line);
}
// ----------------------------- doc_entireDocRange -----------------------------
function doc_entireDocRange( doc: vscode.TextDocument )
{
let invalidRange = new vscode.Range(0, 0, doc.lineCount /*intentionally missing the '-1' */, 0);
let docRange = doc.validateRange(invalidRange);
return docRange ;
}
https://stackoverflow.com/questions/64457293
复制相似问题