实施"另存为"使用vscode API

时间:2018-04-12 03:09:35

标签: visual-studio-code vscode-extensions

我一直试图找出实施"另存为"的最佳方法。使用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);
                        });
                    });
            });
    });

我们打开旧文档,然后打开一个新文档(这是一个无标题文档),然后将旧文档的文本插入到新文档中,然后保存新文档。

然后新文档关闭(出于某种原因)。

有人有什么建议吗?

1 个答案:

答案 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});
    });
}