/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
declare module 'vscode' {
// https://github.com/microsoft/vscode/issues/226562
/**
* A provider that supplies terminal completion items.
*
* Implementations of this interface should return an array of {@link TerminalCompletionItem} or a
* {@link TerminalCompletionList} describing completions for the current command line.
*
* @example
Simple provider returning a single completion
* window.registerTerminalCompletionProvider({
* provideTerminalCompletions(terminal, context) {
* return [{ label: '--help', replacementRange: [Math.max(0, context.cursorPosition - 2), context.cursorPosition] }];
* }
* });
*/
export interface TerminalCompletionProvider {
/**
* Provide completions for the given terminal and context.
* @param terminal The terminal for which completions are being provided.
* @param context Information about the terminal's current state.
* @param token A cancellation token.
* @return A list of completions.
*/
provideTerminalCompletions(terminal: Terminal, context: TerminalCompletionContext, token: CancellationToken): ProviderResult>;
}
/**
* Represents a completion suggestion for a terminal command line.
*
* @example Completion item for `ls -|`
* const item = {
* label: '-A',
* replacementRange: [3, 4], // replace the single character at index 3
* detail: 'List all entries except for . and .. (always set for the super-user)',
* kind: TerminalCompletionItemKind.Flag
* };
*
* The fields on a completion item describe what text should be shown to the user
* and which portion of the command line should be replaced when the item is accepted.
*/
export class TerminalCompletionItem {
/**
* The label of the completion.
*/
label: string | CompletionItemLabel;
/**
* The range in the command line to replace when the completion is accepted. Defined
* as a tuple where the first entry is the inclusive start index and the second entry is the
* exclusive end index.
*/
replacementRange: readonly [number, number];
/**
* The completion's detail which appears on the right of the list.
*/
detail?: string;
/**
* A human-readable string that represents a doc-comment.
*/
documentation?: string | MarkdownString;
/**
* The completion's kind. Note that this will map to an icon. If no kind is provided, a generic icon representing plaintext will be provided.
*/
kind?: TerminalCompletionItemKind;
/**
* Creates a new terminal completion item.
*
* @param label The label of the completion.
* @param replacementRange The inclusive start and exclusive end index of the text to replace.
* @param kind The completion's kind.
*/
constructor(
label: string | CompletionItemLabel,
replacementRange: readonly [number, number],
kind?: TerminalCompletionItemKind
);
}
/**
* The kind of an individual terminal completion item.
*
* The kind is used to render an appropriate icon in the suggest list and to convey the semantic
* meaning of the suggestion (file, folder, flag, commit, branch, etc.).
*/
export enum TerminalCompletionItemKind {
/**
* A file completion item.
* Example: `README.md`
*/
File = 0,
/**
* A folder completion item.
* Example: `src/`
*/
Folder = 1,
/**
* A method completion item.
* Example: `git commit`
*/
Method = 2,
/**
* An alias completion item.
* Example: `ll` as an alias for `ls -l`
*/
Alias = 3,
/**
* An argument completion item.
* Example: `origin` in `git push origin main`
*/
Argument = 4,
/**
* An option completion item. An option value is expected to follow.
* Example: `--locale` in `code --locale en`
*/
Option = 5,
/**
* The value of an option completion item.
* Example: `en-US` in `code --locale en-US`
*/
OptionValue = 6,
/**
* A flag completion item.
* Example: `--amend` in `git commit --amend`
*/
Flag = 7,
/**
* A symbolic link file completion item.
* Example: `link.txt` (symlink to a file)
*/
SymbolicLinkFile = 8,
/**
* A symbolic link folder completion item.
* Example: `node_modules/` (symlink to a folder)
*/
SymbolicLinkFolder = 9,
/**
* A source control commit completion item.
* Example: `abc1234` (commit hash)
*/
ScmCommit = 10,
/**
* A source control branch completion item.
* Example: `main`
*/
ScmBranch = 11,
/**
* A source control tag completion item.
* Example: `v1.0.0`
*/
ScmTag = 12,
/**
* A source control stash completion item.
* Example: `stash@{0}`
*/
ScmStash = 13,
/**
* A source control remote completion item.
* Example: `origin`
*/
ScmRemote = 14,
/**
* A pull request completion item.
* Example: `#42 Add new feature`
*/
PullRequest = 15,
/**
* A closed pull request completion item.
* Example: `#41 Fix bug (closed)`
*/
PullRequestDone = 16,
}
/**
* Context information passed to {@link TerminalCompletionProvider.provideTerminalCompletions}.
*
* It contains the full command line and the current cursor position.
*/
export interface TerminalCompletionContext {
/**
* The complete terminal command line.
*/
readonly commandLine: string;
/**
* The index of the cursor in the command line.
*/
readonly cursorIndex: number;
}
/**
* Represents a collection of {@link TerminalCompletionItem completion items} to be presented
* in the terminal plus {@link TerminalCompletionList.resourceOptions} which indicate
* which file and folder resources should be requested for the terminal's cwd.
*
* @example Create a completion list that requests files for the terminal cwd
* const list = new TerminalCompletionList([
* { label: 'ls', replacementRange: [0, 0], kind: TerminalCompletionItemKind.Method }
* ], { showFiles: true, cwd: Uri.file('/home/user') });
*/
export class TerminalCompletionList {
/**
* Resources that should be shown in the completions list for the cwd of the terminal.
*/
resourceOptions?: TerminalCompletionResourceOptions;
/**
* The completion items.
*/
items: T[];
/**
* Creates a new completion list.
*
* @param items The completion items.
* @param resourceOptions Indicates which resources should be shown as completions for the cwd of the terminal.
*/
constructor(items: T[], resourceOptions?: TerminalCompletionResourceOptions);
}
/**
* Configuration for requesting file and folder resources to be shown as completions.
*
* When a provider indicates that it wants file/folder resources, the terminal will surface completions for files and
* folders that match {@link globPattern} from the provided {@link cwd}.
*/
export interface TerminalCompletionResourceOptions {
/**
* Show files as completion items.
*/
showFiles: boolean;
/**
* Show folders as completion items.
*/
showDirectories: boolean;
/**
* A glob pattern string that controls which files suggest should surface. Note that this will only apply if {@param showFiles} or {@param showDirectories} is set to true.
*/
globPattern?: string;
/**
* The cwd from which to request resources.
*/
cwd: Uri;
}
export namespace window {
/**
* Register a completion provider for terminals.
* @param provider The completion provider.
* @param triggerCharacters Optional characters that trigger completion. When any of these characters is typed,
* the completion provider will be invoked. For example, passing `'-'` would cause the provider to be invoked
* whenever the user types a dash character.
* @returns A {@link Disposable} that unregisters this provider when being disposed.
*
* @example Register a provider for an extension
* window.registerTerminalCompletionProvider({
* provideTerminalCompletions(terminal, context) {
* return new TerminalCompletionList([
* { label: '--version', replacementRange: [Math.max(0, context.cursorPosition - 2), context.cursorPosition] }
* ]);
* }
* });
*
* @example Register a provider with trigger characters
* window.registerTerminalCompletionProvider({
* provideTerminalCompletions(terminal, context) {
* return new TerminalCompletionList([
* { label: '--help', replacementRange: [Math.max(0, context.cursorPosition - 2), context.cursorPosition] }
* ]);
* }
* }, '-');
*/
export function registerTerminalCompletionProvider(provider: TerminalCompletionProvider, ...triggerCharacters: string[]): Disposable;
}
}