Files
vscode-extension-samples/document-paste/src/extension.ts

85 lines
2.7 KiB
TypeScript
Raw Permalink Normal View History

2022-11-04 14:27:02 -07:00
import * as vscode from 'vscode';
/**
* Provider that maintains a count of the number of times it has copied text.
*/
class CopyCountPasteEditProvider implements vscode.DocumentPasteEditProvider {
2024-04-22 18:58:38 -07:00
static readonly kind = vscode.DocumentDropOrPasteEditKind.Empty.append('text', 'custom', 'count');
2024-03-14 16:26:05 -07:00
static readonly countMimeType = 'application/vnd.code.copydemo-copy-count';
2022-11-04 14:27:02 -07:00
private count = 0;
2024-03-14 16:26:05 -07:00
/**
* Invoked on copy. This allows us to modify the `dataTransfer` that is later passed to {@link provideDocumentPasteEdits}.
*/
prepareDocumentPaste(
2022-11-04 14:27:02 -07:00
_document: vscode.TextDocument,
_ranges: readonly vscode.Range[],
dataTransfer: vscode.DataTransfer,
_token: vscode.CancellationToken
2024-03-14 16:26:05 -07:00
) {
// Save off metadata in a custom mimetype
dataTransfer.set(CopyCountPasteEditProvider.countMimeType, new vscode.DataTransferItem(this.count++));
2022-11-04 14:27:02 -07:00
}
2024-03-14 16:26:05 -07:00
/**
* Invoked on paste
*/
2022-11-04 14:27:02 -07:00
async provideDocumentPasteEdits(
_document: vscode.TextDocument,
_ranges: readonly vscode.Range[],
dataTransfer: vscode.DataTransfer,
2024-03-14 16:26:05 -07:00
_context: vscode.DocumentPasteEditContext,
2023-09-13 13:00:05 -07:00
token: vscode.CancellationToken
2024-03-14 16:26:05 -07:00
): Promise<vscode.DocumentPasteEdit[] | undefined> {
// Read our custom metadata
const countDataTransferItem = dataTransfer.get(CopyCountPasteEditProvider.countMimeType);
2022-11-04 14:27:02 -07:00
if (!countDataTransferItem) {
2023-09-13 13:00:05 -07:00
return;
2022-11-04 14:27:02 -07:00
}
2024-03-14 16:26:05 -07:00
const count = await countDataTransferItem.asString();
if (token.isCancellationRequested) {
2023-09-13 13:00:05 -07:00
return;
2022-11-04 14:27:02 -07:00
}
2024-03-14 16:26:05 -07:00
// Also read the text data in the clipboard
const textDataTransferItem = dataTransfer.get('text/plain');
if (!textDataTransferItem) {
2023-09-13 13:00:05 -07:00
return;
}
2022-11-04 14:27:02 -07:00
const text = await textDataTransferItem.asString();
2023-09-13 13:00:05 -07:00
if (token.isCancellationRequested) {
return;
}
2022-11-04 14:27:02 -07:00
// Build a snippet to insert
const snippet = new vscode.SnippetString();
snippet.appendText(`(copy #${count}) ${text}`);
2024-03-14 16:26:05 -07:00
return [
new vscode.DocumentPasteEdit(snippet, "Insert with copy count sample", CopyCountPasteEditProvider.kind),
];
2022-11-04 14:27:02 -07:00
}
}
export function activate(context: vscode.ExtensionContext) {
// Enable our provider in plaintext files
const selector: vscode.DocumentSelector = { language: 'plaintext' };
// Register our provider
context.subscriptions.push(vscode.languages.registerDocumentPasteEditProvider(selector, new CopyCountPasteEditProvider(), {
2024-03-14 16:26:05 -07:00
// List out all kinds of edits that our provider may return
providedPasteEditKinds: [CopyCountPasteEditProvider.kind],
// List out all mime types that our provider may add on copy
copyMimeTypes: [CopyCountPasteEditProvider.countMimeType],
// List out all mime types that our provider should be invoked for on paste
pasteMimeTypes: ['text/plain', CopyCountPasteEditProvider.countMimeType],
2022-11-04 14:27:02 -07:00
}));
}