我一直试图找出实施"另存为"的最佳方法。使用vscode扩展API。
到目前为止,这里有最好的:
// First turn the path we were given into an absolute path
// Relative paths are interpreted as relative to the original file
const newFileAbsolutePath = path.isAbsolute(saveFileDetails.newPath) ?
saveFileDetails.newPath :
path.resolve(path.dirname(saveFileDetails.filePath), saveFileDetails.newPath);
// Create an "untitled-scheme" path so that VSCode will let us create a new file with a given path
const newFileUri = vscode.Uri.parse("untitled:" + newFileAbsolutePath);
// Now we need to copy the content of the current file,
// then create a new file at the given path, insert the content,
// save it and open the document
return vscode.workspace.openTextDocument(saveFileDetails.filePath)
.then((oldDoc) => {
return vscode.workspace.openTextDocument(newFileUri)
.then((newDoc) => {
return vscode.window.showTextDocument(newDoc, 1, false)
.then((editor) => {
return editor.edit((editBuilder) => {
editBuilder.insert(new vscode.Position(0, 0), oldDoc.getText());
})
.then(() => {
return newDoc.save()
.then(() => EditorOperationResponse.Completed);
});
});
});
});
我们打开旧文档,然后打开一个新文档(这是一个无标题文档),然后将旧文档的文本插入到新文档中,然后保存新文档。
然后新文档关闭(出于某种原因)。
有人有什么建议吗?
答案 0 :(得分:2)
这似乎是一个已知问题,由untitled://
方案的使用引起:
TextDocument.save() closes untitled documents (#29156)
目前,你可以通过再次重新打开文件来解决这个问题,因为你知道最终的URI(与报告问题的人的情况不同)。
newDoc.save().then((completed) => {
const finalUri = vscode.Uri.file(newFileAbsolutePath);
vscode.workspace.openTextDocument(finalUri).then((doc) => {
vscode.window.showTextDocument(doc, {preview: false});
})
});
不幸的是,这确实导致了明显的“闪烁”效应。为了避免这种情况,我建议简单地绕过VSCode API并使用fs
作为文件IO,并且仅使用vscode
来显示文件末尾。这也简化了代码:
import * as fs from 'fs';
function runCommand() {
// obtain newFileAbsolutePath / oldFileAbsolutePath
var oldDocText = fs.readFileSync(oldFileAbsolutePath);
fs.writeFileSync(newFileAbsolutePath, oldDocText);
const finalUri = vscode.Uri.file(newFileAbsolutePath);
vscode.workspace.openTextDocument(finalUri).then((doc) => {
vscode.window.showTextDocument(doc, {preview: false});
});
}