/****************************************************************** MIT License http://www.opensource.org/licenses/mit-license.php Author Qiming Zhao (https://github.com/chemzqm) *******************************************************************/ /// import cp from 'child_process' declare module 'coc.nvim' { // Language server protocol interfaces {{ export interface Thenable { then(onfulfilled?: (value: T) => TResult | Thenable, onrejected?: (reason: any) => TResult | Thenable): Thenable // eslint-disable-next-line @typescript-eslint/unified-signatures then(onfulfilled?: (value: T) => TResult | Thenable, onrejected?: (reason: any) => void): Thenable } export interface Disposable { /** * Dispose this object. */ dispose(): void } export namespace Disposable { function create(func: () => void): Disposable } /** * The declaration of a symbol representation as one or many [locations](#Location). */ export type Declaration = Location | Location[] /** * Information about where a symbol is declared. * * Provides additional metadata over normal [location](#Location) declarations, including the range of * the declaring symbol. * * Servers should prefer returning `DeclarationLink` over `Declaration` if supported * by the client. */ export type DeclarationLink = LocationLink export type ProgressToken = number | string export interface WorkDoneProgressBegin { kind: 'begin' /** * Mandatory title of the progress operation. Used to briefly inform about * the kind of operation being performed. * * Examples: "Indexing" or "Linking dependencies". */ title: string /** * Controls if a cancel button should show to allow the user to cancel the * long running operation. Clients that don't support cancellation are allowed * to ignore the setting. */ cancellable?: boolean /** * Optional, more detailed associated progress message. Contains * complementary information to the `title`. * * Examples: "3/25 files", "project/src/module2", "node_modules/some_dep". * If unset, the previous progress message (if any) is still valid. */ message?: string /** * Optional progress percentage to display (value 100 is considered 100%). * If not provided infinite progress is assumed and clients are allowed * to ignore the `percentage` value in subsequent in report notifications. * * The value should be steadily rising. Clients are free to ignore values * that are not following this rule. */ percentage?: number } export interface WorkDoneProgressReport { kind: 'report' /** * Controls enablement state of a cancel button. This property is only valid if a cancel * button got requested in the `WorkDoneProgressStart` payload. * * Clients that don't support cancellation or don't support control the button's * enablement state are allowed to ignore the setting. */ cancellable?: boolean /** * Optional, more detailed associated progress message. Contains * complementary information to the `title`. * * Examples: "3/25 files", "project/src/module2", "node_modules/some_dep". * If unset, the previous progress message (if any) is still valid. */ message?: string /** * Optional progress percentage to display (value 100 is considered 100%). * If not provided infinite progress is assumed and clients are allowed * to ignore the `percentage` value in subsequent in report notifications. * * The value should be steadily rising. Clients are free to ignore values * that are not following this rule. */ percentage?: number } /** * The file event type */ export namespace FileChangeType { /** * The file got created. */ const Created = 1 /** * The file got changed. */ const Changed = 2 /** * The file got deleted. */ const Deleted = 3 } export type FileChangeType = 1 | 2 | 3 /** * An event describing a file change. */ export interface FileEvent { /** * The file's uri. */ uri: string /** * The change type. */ type: FileChangeType } export interface WorkDoneProgressEnd { kind: 'end' /** * Optional, a final message indicating to for example indicate the outcome * of the operation. */ message?: string } /** * A literal to identify a text document in the client. */ export interface TextDocumentIdentifier { /** * The text document's uri. */ uri: string } /** * A parameter literal used in requests to pass a text document and a position inside that * document. */ export interface TextDocumentPositionParams { /** * The text document. */ textDocument: TextDocumentIdentifier /** * The position inside the text document. */ position: Position } export interface WorkspaceFolder { /** * The associated URI for this workspace folder. */ uri: string /** * The name of the workspace folder. Used to refer to this * workspace folder in the user interface. */ name: string } /** * An event describing a change to a text document. */ export interface TextDocumentContentChange { /** * The range of the document that changed. */ range: Range /** * The new text for the provided range. */ text: string } /** * The workspace folder change event. */ export interface WorkspaceFoldersChangeEvent { /** * The array of added workspace folders */ added: WorkspaceFolder[] /** * The array of the removed workspace folders */ removed: WorkspaceFolder[] } /** * An event that is fired when a [document](#LinesTextDocument) will be saved. * * To make modifications to the document before it is being saved, call the * [`waitUntil`](#TextDocumentWillSaveEvent.waitUntil)-function with a thenable * that resolves to an array of [text edits](#TextEdit). */ export interface TextDocumentWillSaveEvent { /** * The document that will be saved. */ document: LinesTextDocument /** * The reason why save was triggered. */ reason: 1 | 2 | 3 } /** * A document filter denotes a document by different properties like * the [language](#LinesTextDocument.languageId), the [scheme](#Uri.scheme) of * its resource, or a glob-pattern that is applied to the [path](#LinesTextDocument.fileName). * * Glob patterns can have the following syntax: * - `*` to match one or more characters in a path segment * - `?` to match on one character in a path segment * - `**` to match any number of path segments, including none * - `{}` to group conditions (e.g. `**​/*.{ts,js}` matches all TypeScript and JavaScript files) * - `[]` to declare a range of characters to match in a path segment (e.g., `example.[0-9]` to match on `example.0`, `example.1`, …) * - `[!...]` to negate a range of characters to match in a path segment (e.g., `example.[!0-9]` to match on `example.a`, `example.b`, but not `example.0`) * * @sample A language filter that applies to typescript files on disk: `{ language: 'typescript', scheme: 'file' }` * @sample A language filter that applies to all package.json paths: `{ language: 'json', pattern: '**package.json' }` */ export type DocumentFilter = { /** A language id, like `typescript`. */ language: string /** A Uri [scheme](#Uri.scheme), like `file` or `untitled`. */ scheme?: string /** A glob pattern, like `*.{ts,js}`. */ pattern?: string } | { /** A language id, like `typescript`. */ language?: string /** A Uri [scheme](#Uri.scheme), like `file` or `untitled`. */ scheme: string /** A glob pattern, like `*.{ts,js}`. */ pattern?: string } | { /** A language id, like `typescript`. */ language?: string /** A Uri [scheme](#Uri.scheme), like `file` or `untitled`. */ scheme?: string /** A glob pattern, like `*.{ts,js}`. */ pattern: string } /** * A document selector is the combination of one or many document filters. * * @sample `let sel:DocumentSelector = [{ language: 'typescript' }, { language: 'json', pattern: '**∕tsconfig.json' }]`; */ export type DocumentSelector = (string | DocumentFilter)[] /** * A selection range represents a part of a selection hierarchy. A selection range * may have a parent selection range that contains it. */ export interface SelectionRange { /** * The [range](#Range) of this selection range. */ range: Range /** * The parent selection range containing this range. Therefore `parent.range` must contain `this.range`. */ parent?: SelectionRange } /** * MarkedString can be used to render human readable text. It is either a markdown string * or a code-block that provides a language and a code snippet. The language identifier * is semantically equal to the optional language identifier in fenced code blocks in GitHub * issues. See https://help.github.com/articles/creating-and-highlighting-code-blocks/#syntax-highlighting * * The pair of a language and a value is an equivalent to markdown: * ```${language} * ${value} * ``` * * Note that markdown strings will be sanitized - that means html will be escaped. * @deprecated use MarkupContent instead. */ export type MarkedString = string | { language: string value: string } /** * The result of a hover request. */ export interface Hover { /** * The hover's content */ contents: MarkupContent | MarkedString | MarkedString[] /** * An optional range */ range?: Range } /** * The definition of a symbol represented as one or many [locations](#Location). * For most programming languages there is only one location at which a symbol is * defined. * * Servers should prefer returning `DefinitionLink` over `Definition` if supported * by the client. */ export type Definition = Location | Location[] /** * Information about where a symbol is defined. * * Provides additional metadata over normal [location](#Location) definitions, including the range of * the defining symbol */ export type DefinitionLink = LocationLink /** * How a signature help was triggered. */ export namespace SignatureHelpTriggerKind { /** * Signature help was invoked manually by the user or by a command. */ const Invoked: 1 /** * Signature help was triggered by a trigger character. */ const TriggerCharacter: 2 /** * Signature help was triggered by the cursor moving or by the document content changing. */ const ContentChange: 3 } export type SignatureHelpTriggerKind = 1 | 2 | 3 /** * Represents the signature of something callable. A signature * can have a label, like a function-name, a doc-comment, and * a set of parameters. */ export interface SignatureInformation { /** * The label of this signature. Will be shown in * the UI. */ label: string /** * The human-readable doc-comment of this signature. Will be shown * in the UI but can be omitted. */ documentation?: string | MarkupContent /** * The parameters of this signature. */ parameters?: ParameterInformation[] } /** * Represents a parameter of a callable-signature. A parameter can * have a label and a doc-comment. */ export interface ParameterInformation { /** * The label of this parameter information. * * Either a string or an inclusive start and exclusive end offsets within its containing * signature label. (see SignatureInformation.label). The offsets are based on a UTF-16 * string representation as `Position` and `Range` does. * * *Note*: a label of type string should be a substring of its containing signature label. * Its intended use case is to highlight the parameter label part in the `SignatureInformation.label`. */ label: string | [number, number] /** * The human-readable doc-comment of this signature. Will be shown * in the UI but can be omitted. */ documentation?: string | MarkupContent } /** * Signature help represents the signature of something * callable. There can be multiple signature but only one * active and only one active parameter. */ export interface SignatureHelp { /** * One or more signatures. */ signatures: SignatureInformation[] /** * The active signature. Set to `null` if no * signatures exist. */ activeSignature: number | null /** * The active parameter of the active signature. Set to `null` * if the active signature has no parameters. */ activeParameter: number | null } /** * Additional information about the context in which a signature help request was triggered. * * @since 3.15.0 */ export interface SignatureHelpContext { /** * Action that caused signature help to be triggered. */ triggerKind: SignatureHelpTriggerKind /** * Character that caused signature help to be triggered. * * This is undefined when `triggerKind !== SignatureHelpTriggerKind.TriggerCharacter` */ triggerCharacter?: string /** * `true` if signature help was already showing when it was triggered. * * Retriggers occur when the signature help is already active and can be caused by actions such as * typing a trigger character, a cursor move, or document content changes. */ isRetrigger: boolean /** * The currently active `SignatureHelp`. * * The `activeSignatureHelp` has its `SignatureHelp.activeSignature` field updated based on * the user navigating through available signatures. */ activeSignatureHelp?: SignatureHelp } /** * Represents a folding range. */ export interface FoldingRange { /** * The zero-based line number from where the folded range starts. */ startLine: number /** * The zero-based character offset from where the folded range starts. If not defined, defaults to the length of the start line. */ startCharacter?: number /** * The zero-based line number where the folded range ends. */ endLine: number /** * The zero-based character offset before the folded range ends. If not defined, defaults to the length of the end line. */ endCharacter?: number /** * Describes the kind of the folding range such as `comment' or 'region'. The kind * is used to categorize folding ranges and used by commands like 'Fold all comments'. See * [FoldingRangeKind](#FoldingRangeKind) for an enumeration of standardized kinds. */ kind?: string } /** * A symbol kind. */ export namespace SymbolKind { const File: 1 const Module: 2 const Namespace: 3 const Package: 4 const Class: 5 const Method: 6 const Property: 7 const Field: 8 const Constructor: 9 const Enum: 10 const Interface: 11 const Function: 12 const Variable: 13 const Constant: 14 const String: 15 const Number: 16 const Boolean: 17 const Array: 18 const Object: 19 const Key: 20 const Null: 21 const EnumMember: 22 const Struct: 23 const Event: 24 const Operator: 25 const TypeParameter: 26 } export type SymbolKind = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 /** * Represents information about programming constructs like variables, classes, * interfaces etc. */ export interface SymbolInformation { /** * The name of this symbol. */ name: string /** * The kind of this symbol. */ kind: SymbolKind /** * Indicates if this symbol is deprecated. */ deprecated?: boolean /** * The location of this symbol. The location's range is used by a tool * to reveal the location in the editor. If the symbol is selected in the * tool the range's start information is used to position the cursor. So * the range usually spans more than the actual symbol's name and does * normally include thinks like visibility modifiers. * * The range doesn't have to denote a node range in the sense of a abstract * syntax tree. It can therefore not be used to re-construct a hierarchy of * the symbols. */ location: Location /** * The name of the symbol containing this symbol. This information is for * user interface purposes (e.g. to render a qualifier in the user interface * if necessary). It can't be used to re-infer a hierarchy for the document * symbols. */ containerName?: string } /** * Represents programming constructs like variables, classes, interfaces etc. * that appear in a document. Document symbols can be hierarchical and they * have two ranges: one that encloses its definition and one that points to * its most interesting range, e.g. the range of an identifier. */ export interface DocumentSymbol { /** * The name of this symbol. Will be displayed in the user interface and therefore must not be * an empty string or a string only consisting of white spaces. */ name: string /** * More detail for this symbol, e.g the signature of a function. */ detail?: string /** * The kind of this symbol. */ kind: SymbolKind /** * Indicates if this symbol is deprecated. */ deprecated?: boolean /** * The range enclosing this symbol not including leading/trailing whitespace but everything else * like comments. This information is typically used to determine if the the clients cursor is * inside the symbol to reveal in the symbol in the UI. */ range: Range /** * The range that should be selected and revealed when this symbol is being picked, e.g the name of a function. * Must be contained by the the `range`. */ selectionRange: Range /** * Children of this symbol, e.g. properties of a class. */ children?: DocumentSymbol[] } export interface FormattingOptions { /** * If indentation is based on spaces (`insertSpaces` = true), the number of spaces that make an indent. */ tabSize: number /** * Is indentation based on spaces? */ insertSpaces: boolean /** * Trim trailing whitespaces on a line. * * @since 3.15.0 */ trimTrailingWhitespace?: boolean /** * Insert a newline character at the end of the file if one does not exist. * * @since 3.15.0 */ insertFinalNewline?: boolean /** * Trim all newlines after the final newline at the end of the file. * * @since 3.15.0 */ trimFinalNewlines?: boolean } /** * Contains additional diagnostic information about the context in which * a [code action](#CodeActionProvider.provideCodeActions) is run. */ export interface CodeActionContext { /** * An array of diagnostics known on the client side overlapping the range provided to the * `textDocument/codeAction` request. They are provided so that the server knows which * errors are currently presented to the user for the given range. There is no guarantee * that these accurately reflect the error state of the resource. The primary parameter * to compute code actions is the provided range. */ diagnostics: Diagnostic[] /** * Requested kind of actions to return. * * Actions not of this kind are filtered out by the client before being shown. So servers * can omit computing them. */ only?: string[] } /** * A document highlight kind. */ export namespace DocumentHighlightKind { /** * A textual occurrence. */ const Text: 1 /** * Read-access of a symbol, like reading a variable. */ const Read: 2 /** * Write-access of a symbol, like writing to a variable. */ const Write: 3 } export type DocumentHighlightKind = 1 | 2 | 3 /** * A document highlight is a range inside a text document which deserves * special attention. Usually a document highlight is visualized by changing * the background color of its range. */ export interface DocumentHighlight { /** * The range this highlight applies to. */ range: Range /** * The highlight kind, default is [text](#DocumentHighlightKind.Text). */ kind?: DocumentHighlightKind } /** * A document link is a range in a text document that links to an internal or external resource, like another * text document or a web site. */ export interface DocumentLink { /** * The range this link applies to. */ range: Range /** * The uri this link points to. */ target?: string /** * The tooltip text when you hover over this link. * * If a tooltip is provided, is will be displayed in a string that includes instructions on how to * trigger the link, such as `{0} (ctrl + click)`. The specific instructions vary depending on OS, * user settings, and localization. * * @since 3.15.0 */ tooltip?: string /** * A data entry field that is preserved on a document link between a * DocumentLinkRequest and a DocumentLinkResolveRequest. */ data?: any } /** * Represents a color in RGBA space. */ export interface Color { /** * The red component of this color in the range [0-1]. */ readonly red: number /** * The green component of this color in the range [0-1]. */ readonly green: number /** * The blue component of this color in the range [0-1]. */ readonly blue: number /** * The alpha component of this color in the range [0-1]. */ readonly alpha: number } /** * Represents a color range from a document. */ export interface ColorInformation { /** * The range in the document where this color appears. */ range: Range /** * The actual color value for this color range. */ color: Color } export interface ColorPresentation { /** * The label of this color presentation. It will be shown on the color * picker header. By default this is also the text that is inserted when selecting * this color presentation. */ label: string /** * An [edit](#TextEdit) which is applied to a document when selecting * this presentation for the color. When `falsy` the [label](#ColorPresentation.label) * is used. */ textEdit?: TextEdit /** * An optional array of additional [text edits](#TextEdit) that are applied when * selecting this color presentation. Edits must not overlap with the main [edit](#ColorPresentation.textEdit) nor with themselves. */ additionalTextEdits?: TextEdit[] } /** * A code lens represents a [command](#Command) that should be shown along with * source text, like the number of references, a way to run tests, etc. * * A code lens is _unresolved_ when no command is associated to it. For performance * reasons the creation of a code lens and resolving should be done to two stages. */ export interface CodeLens { /** * The range in which this code lens is valid. Should only span a single line. */ range: Range /** * The command this code lens represents. */ command?: Command /** * An data entry field that is preserved on a code lens item between * a [CodeLensRequest](#CodeLensRequest) and a [CodeLensResolveRequest] * (#CodeLensResolveRequest) */ data?: any } /** * Represents the connection of two locations. Provides additional metadata over normal [locations](#Location), * including an origin range. */ export interface LocationLink { /** * Span of the origin of this link. * * Used as the underlined span for mouse definition hover. Defaults to the word range at * the definition position. */ originSelectionRange?: Range /** * The target resource identifier of this link. */ targetUri: string /** * The full target range of this link. If the target for example is a symbol then target range is the * range enclosing this symbol not including leading/trailing whitespace but everything else * like comments. This information is typically used to highlight the range in the editor. */ targetRange: Range /** * The range that should be selected and revealed when this link is being followed, e.g the name of a function. * Must be contained by the the `targetRange`. See also `DocumentSymbol#range` */ targetSelectionRange: Range } /** * The LocationLink namespace provides helper functions to work with * [LocationLink](#LocationLink) literals. */ export namespace LocationLink { /** * Creates a LocationLink literal. * @param targetUri The definition's uri. * @param targetRange The full range of the definition. * @param targetSelectionRange The span of the symbol definition at the target. * @param originSelectionRange The span of the symbol being defined in the originating source file. */ function create(targetUri: string, targetRange: Range, targetSelectionRange: Range, originSelectionRange?: Range): LocationLink /** * Checks whether the given literal conforms to the [LocationLink](#LocationLink) interface. */ function is(value: any): value is LocationLink } export type MarkupKind = 'plaintext' | 'markdown' /** * Describes the content type that a client supports in various * result literals like `Hover`, `ParameterInfo` or `CompletionItem`. * * Please note that `MarkupKinds` must not start with a `$`. This kinds * are reserved for internal usage. */ export namespace MarkupKind { /** * Plain text is supported as a content format */ const PlainText: 'plaintext' /** * Markdown is supported as a content format */ const Markdown: 'markdown' } /** * A `MarkupContent` literal represents a string value which content is interpreted base on its * kind flag. Currently the protocol supports `plaintext` and `markdown` as markup kinds. * * If the kind is `markdown` then the value can contain fenced code blocks like in GitHub issues. * See https://help.github.com/articles/creating-and-highlighting-code-blocks/#syntax-highlighting * * Here is an example how such a string can be constructed using JavaScript / TypeScript: * ```ts * let markdown: MarkdownContent = { * kind: MarkupKind.Markdown, * value: [ * '# Header', * 'Some text', * '```typescript', * 'someCode();', * '```' * ].join('\n') * }; * ``` * * *Please Note* that clients might sanitize the return markdown. A client could decide to * remove HTML from the markdown to avoid script execution. */ export interface MarkupContent { /** * The type of the Markup */ kind: MarkupKind /** * The content itself */ value: string } /** * The kind of a completion entry. */ export namespace CompletionItemKind { const Text: 1 const Method: 2 const Function: 3 const Constructor: 4 const Field: 5 const Variable: 6 const Class: 7 const Interface: 8 const Module: 9 const Property: 10 const Unit: 11 const Value: 12 const Enum: 13 const Keyword: 14 const Snippet: 15 const Color: 16 const File: 17 const Reference: 18 const Folder: 19 const EnumMember: 20 const Constant: 21 const Struct: 22 const Event: 23 const Operator: 24 const TypeParameter: 25 } export type CompletionItemKind = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 /** * Defines whether the insert text in a completion item should be interpreted as * plain text or a snippet. */ export namespace InsertTextFormat { /** * The primary text to be inserted is treated as a plain string. */ const PlainText: 1 /** * The primary text to be inserted is treated as a snippet. * * A snippet can define tab stops and placeholders with `$1`, `$2` * and `${3:foo}`. `$0` defines the final tab stop, it defaults to * the end of the snippet. Placeholders with equal identifiers are linked, * that is typing in one will update others too. * * See also: https://github.com/microsoft/vscode/blob/main/src/vs/editor/contrib/snippet/snippet.md */ const Snippet: 2 } export type InsertTextFormat = 1 | 2 /** * A completion item represents a text snippet that is * proposed to complete text that is being typed. */ export interface CompletionItem { /** * The label of this completion item. By default * also the text that is inserted when selecting * this completion. */ label: string /** * The kind of this completion item. Based of the kind * an icon is chosen by the editor. */ kind?: CompletionItemKind /** * Tags for this completion item. * * @since 3.15.0 */ tags?: number[] /** * A human-readable string with additional information * about this item, like type or symbol information. */ detail?: string /** * A human-readable string that represents a doc-comment. */ documentation?: string | MarkupContent /** * Indicates if this item is deprecated. * @deprecated Use `tags` instead. */ deprecated?: boolean /** * Select this item when showing. * * *Note* that only one completion item can be selected and that the * tool / client decides which item that is. The rule is that the *first* * item of those that match best is selected. */ preselect?: boolean /** * A string that should be used when comparing this item * with other items. When `falsy` the [label](#CompletionItem.label) * is used. */ sortText?: string /** * A string that should be used when filtering a set of * completion items. When `falsy` the [label](#CompletionItem.label) * is used. */ filterText?: string /** * A string that should be inserted into a document when selecting * this completion. When `falsy` the [label](#CompletionItem.label) * is used. * * The `insertText` is subject to interpretation by the client side. * Some tools might not take the string literally. For example * VS Code when code complete is requested in this example `con` * and a completion item with an `insertText` of `console` is provided it * will only insert `sole`. Therefore it is recommended to use `textEdit` instead * since it avoids additional client side interpretation. */ insertText?: string /** * The format of the insert text. The format applies to both the `insertText` property * and the `newText` property of a provided `textEdit`. If omitted defaults to * `InsertTextFormat.PlainText`. */ insertTextFormat?: InsertTextFormat /** * An [edit](#TextEdit) which is applied to a document when selecting * this completion. When an edit is provided the value of * [insertText](#CompletionItem.insertText) is ignored. * * *Note:* The text edit's range must be a [single line] and it must contain the position * at which completion has been requested. */ textEdit?: TextEdit /** * An optional array of additional [text edits](#TextEdit) that are applied when * selecting this completion. Edits must not overlap (including the same insert position) * with the main [edit](#CompletionItem.textEdit) nor with themselves. * * Additional text edits should be used to change text unrelated to the current cursor position * (for example adding an import statement at the top of the file if the completion item will * insert an unqualified type). */ additionalTextEdits?: TextEdit[] /** * An optional set of characters that when pressed while this completion is active will accept it first and * then type that character. *Note* that all commit characters should have `length=1` and that superfluous * characters will be ignored. */ commitCharacters?: string[] /** * An optional [command](#Command) that is executed *after* inserting this completion. *Note* that * additional modifications to the current document should be described with the * [additionalTextEdits](#CompletionItem.additionalTextEdits)-property. */ command?: Command /** * An data entry field that is preserved on a completion item between * a [CompletionRequest](#CompletionRequest) and a [CompletionResolveRequest] * (#CompletionResolveRequest) */ data?: any } /** * Represents a collection of [completion items](#CompletionItem) to be presented * in the editor. */ export interface CompletionList { /** * This list it not complete. Further typing results in recomputing this list. */ isIncomplete: boolean /** * The completion items. */ items: CompletionItem[] } /** * How a completion was triggered */ export namespace CompletionTriggerKind { /** * Completion was triggered by typing an identifier (24x7 code * complete), manual invocation (e.g Ctrl+Space) or via API. */ const Invoked: 1 /** * Completion was triggered by a trigger character specified by * the `triggerCharacters` properties of the `CompletionRegistrationOptions`. */ const TriggerCharacter: 2 /** * Completion was re-triggered as current completion list is incomplete */ const TriggerForIncompleteCompletions: 3 } export type CompletionTriggerKind = 1 | 2 | 3 /** * Contains additional information about the context in which a completion request is triggered. */ export interface CompletionContext { /** * How the completion was triggered. */ triggerKind: CompletionTriggerKind, /** * The trigger character (a single character) that has trigger code complete. * Is undefined if `triggerKind !== CompletionTriggerKind.TriggerCharacter` */ triggerCharacter?: string option?: CompleteOption } /** * Represents a reference to a command. Provides a title which * will be used to represent a command in the UI and, optionally, * an array of arguments which will be passed to the command handler * function when invoked. */ export interface Command { /** * Title of the command, like `save`. */ title: string /** * The identifier of the actual command handler. */ command: string /** * Arguments that the command handler should be * invoked with. */ arguments?: any[] } export interface TextDocumentEdit { /** * The text document to change. */ textDocument: { uri: string version: number | null } /** * The edits to be applied. */ edits: TextEdit[] } /** * A workspace edit represents changes to many resources managed in the workspace. The edit * should either provide `changes` or `documentChanges`. If documentChanges are present * they are preferred over `changes` if the client can handle versioned document edits. */ export interface WorkspaceEdit { /** * Holds changes to existing resources. */ changes?: { [uri: string]: TextEdit[] } /** * Depending on the client capability `workspace.workspaceEdit.resourceOperations` document changes * are either an array of `TextDocumentEdit`s to express changes to n different text documents * where each text document edit addresses a specific version of a text document. Or it can contain * above `TextDocumentEdit`s mixed with create, rename and delete file / folder operations. * * Whether a client supports versioned document edits is expressed via * `workspace.workspaceEdit.documentChanges` client capability. * * If a client neither supports `documentChanges` nor `workspace.workspaceEdit.resourceOperations` then * only plain `TextEdit`s using the `changes` property are supported. */ documentChanges?: (TextDocumentEdit | CreateFile | RenameFile | DeleteFile)[] } interface ResourceOperation { kind: string } /** * Delete file options */ export interface DeleteFileOptions { /** * Delete the content recursively if a folder is denoted. */ recursive?: boolean /** * Ignore the operation if the file doesn't exist. */ ignoreIfNotExists?: boolean } /** * Delete file operation */ export interface DeleteFile extends ResourceOperation { /** * A delete */ kind: 'delete' /** * The file to delete. */ uri: string /** * Delete options. */ options?: DeleteFileOptions } /** * Options to create a file. */ export interface CreateFileOptions { /** * Overwrite existing file. Overwrite wins over `ignoreIfExists` */ overwrite?: boolean /** * Ignore if exists. */ ignoreIfExists?: boolean } /** * Create file operation. */ export interface CreateFile extends ResourceOperation { /** * A create */ kind: 'create' /** * The resource to create. */ uri: string /** * Additional options */ options?: CreateFileOptions } /** * Rename file options */ export interface RenameFileOptions { /** * Overwrite target if existing. Overwrite wins over `ignoreIfExists` */ overwrite?: boolean /** * Ignores if target exists. */ ignoreIfExists?: boolean } /** * Rename file operation */ export interface RenameFile extends ResourceOperation { /** * A rename */ kind: 'rename' /** * The old (existing) location. */ oldUri: string /** * The new location. */ newUri: string /** * Rename options. */ options?: RenameFileOptions } /** * Represents a related message and source code location for a diagnostic. This should be * used to point to code locations that cause or related to a diagnostics, e.g when duplicating * a symbol in a scope. */ export interface DiagnosticRelatedInformation { /** * The location of this related diagnostic information. */ location: Location /** * The message of this related diagnostic information. */ message: string } /** * The diagnostic's severity. */ export namespace DiagnosticSeverity { /** * Reports an error. */ const Error: 1 /** * Reports a warning. */ const Warning: 2 /** * Reports an information. */ const Information: 3 /** * Reports a hint. */ const Hint: 4 } export type DiagnosticSeverity = 1 | 2 | 3 | 4 /** * The diagnostic tags. * * @since 3.15.0 */ export namespace DiagnosticTag { /** * Unused or unnecessary code. * * Clients are allowed to render diagnostics with this tag faded out instead of having * an error squiggle. */ const Unnecessary: 1 /** * Deprecated or obsolete code. * * Clients are allowed to rendered diagnostics with this tag strike through. */ const Deprecated: 2 } export type DiagnosticTag = 1 | 2 /** * Represents a diagnostic, such as a compiler error or warning. Diagnostic objects * are only valid in the scope of a resource. */ export interface Diagnostic { /** * The range at which the message applies */ range: Range /** * The diagnostic's severity. Can be omitted. If omitted it is up to the * client to interpret diagnostics as error, warning, info or hint. */ severity?: DiagnosticSeverity /** * The diagnostic's code, which usually appear in the user interface. */ code?: number | string /** * A human-readable string describing the source of this * diagnostic, e.g. 'typescript' or 'super lint'. It usually * appears in the user interface. */ source?: string /** * The diagnostic's message. It usually appears in the user interface */ message: string /** * Additional metadata about the diagnostic. */ tags?: DiagnosticTag[] /** * An array of related diagnostic information, e.g. when symbol-names within * a scope collide all definitions can be marked via this property. */ relatedInformation?: DiagnosticRelatedInformation[] } /** * The Diagnostic namespace provides helper functions to work with * [Diagnostic](#Diagnostic) literals. */ export namespace Diagnostic { /** * Creates a new Diagnostic literal. */ function create(range: Range, message: string, severity?: DiagnosticSeverity, code?: number | string, source?: string, relatedInformation?: DiagnosticRelatedInformation[]): Diagnostic /** * Checks whether the given literal conforms to the [Diagnostic](#Diagnostic) interface. */ function is(value: any): value is Diagnostic } /** * A code action represents a change that can be performed in code, e.g. to fix a problem or * to refactor code. * * A CodeAction must set either `edit` and/or a `command`. If both are supplied, the `edit` is applied first, then the `command` is executed. */ export interface CodeAction { /** * A short, human-readable, title for this code action. */ title: string /** * The kind of the code action. * * Used to filter code actions. */ kind?: CodeActionKind /** * The diagnostics that this code action resolves. */ diagnostics?: Diagnostic[] /** * Marks this as a preferred action. Preferred actions are used by the `auto fix` command and can be targeted * by keybindings. * * A quick fix should be marked preferred if it properly addresses the underlying error. * A refactoring should be marked preferred if it is the most reasonable choice of actions to take. * * @since 3.15.0 */ isPreferred?: boolean /** * The workspace edit this code action performs. */ edit?: WorkspaceEdit /** * A command this code action executes. If a code action * provides a edit and a command, first the edit is * executed and then the command. */ command?: Command /** * Id of client that provide codeAction. */ clientId?: string } /** * The kind of a code action. * * Kinds are a hierarchical list of identifiers separated by `.`, e.g. `"refactor.extract.function"`. * * The set of kinds is open and client needs to announce the kinds it supports to the server during * initialization. */ export type CodeActionKind = string /** * A set of predefined code action kinds */ export namespace CodeActionKind { /** * Empty kind. */ const Empty: CodeActionKind /** * Base kind for quickfix actions: 'quickfix' */ const QuickFix: CodeActionKind /** * Base kind for refactoring actions: 'refactor' */ const Refactor: CodeActionKind /** * Base kind for refactoring extraction actions: 'refactor.extract' * * Example extract actions: * * - Extract method * - Extract function * - Extract variable * - Extract interface from class * - ... */ const RefactorExtract: CodeActionKind /** * Base kind for refactoring inline actions: 'refactor.inline' * * Example inline actions: * * - Inline function * - Inline variable * - Inline constant * - ... */ const RefactorInline: CodeActionKind /** * Base kind for refactoring rewrite actions: 'refactor.rewrite' * * Example rewrite actions: * * - Convert JavaScript function to class * - Add or remove parameter * - Encapsulate field * - Make method static * - Move method to base class * - ... */ const RefactorRewrite: CodeActionKind /** * Base kind for source actions: `source` * * Source code actions apply to the entire file. */ const Source: CodeActionKind /** * Base kind for an organize imports source action: `source.organizeImports` */ const SourceOrganizeImports: CodeActionKind /** * Base kind for auto-fix source actions: `source.fixAll`. * * Fix all actions automatically fix errors that have a clear fix that do not require user input. * They should not suppress errors or perform unsafe fixes such as generating new types or classes. * * @since 3.15.0 */ const SourceFixAll: CodeActionKind } /** * Position in a text document expressed as zero-based line and character offset. * The offsets are based on a UTF-16 string representation. So a string of the form * `a𐐀b` the character offset of the character `a` is 0, the character offset of `𐐀` * is 1 and the character offset of b is 3 since `𐐀` is represented using two code * units in UTF-16. * * Positions are line end character agnostic. So you can not specify a position that * denotes `\r|\n` or `\n|` where `|` represents the character offset. */ export interface Position { /** * Line position in a document (zero-based). * If a line number is greater than the number of lines in a document, it defaults back to the number of lines in the document. * If a line number is negative, it defaults to 0. */ line: number /** * Character offset on a line in a document (zero-based). Assuming that the line is * represented as a string, the `character` value represents the gap between the * `character` and `character + 1`. * * If the character value is greater than the line length it defaults back to the * line length. * If a line number is negative, it defaults to 0. */ character: number } /** * The Position namespace provides helper functions to work with * [Position](#Position) literals. */ export namespace Position { /** * Creates a new Position literal from the given line and character. * @param line The position's line. * @param character The position's character. */ function create(line: number, character: number): Position /** * Checks whether the given liternal conforms to the [Position](#Position) interface. */ function is(value: any): value is Position } /** * Represents a typed event. * * A function that represents an event to which you subscribe by calling it with * a listener function as argument. * * @example * item.onDidChange(function(event) { console.log("Event happened: " + event); }); */ export interface Event { /** * A function that represents an event to which you subscribe by calling it with * a listener function as argument. * * @param listener The listener function will be called when the event happens. * @param thisArgs The `this`-argument which will be used when calling the event listener. * @param disposables An array to which a [disposable](#Disposable) will be added. * @return A disposable which unsubscribes the event listener. */ (listener: (e: T) => any, thisArgs?: any, disposables?: Disposable[]): Disposable } export namespace Event { const None: Event } export interface EmitterOptions { onFirstListenerAdd?: Function onLastListenerRemove?: Function } export class Emitter { constructor(_options?: EmitterOptions | undefined) /** * For the public to allow to subscribe * to events from this Emitter */ get event(): Event /** * To be kept private to fire an event to * subscribers */ fire(event: T): any dispose(): void } /** * Represents a location inside a resource, such as a line * inside a text file. */ export interface Location { uri: string range: Range } /** * The Location namespace provides helper functions to work with * [Location](#Location) literals. */ export namespace Location { /** * Creates a Location literal. * @param uri The location's uri. * @param range The location's range. */ function create(uri: string, range: Range): Location /** * Checks whether the given literal conforms to the [Location](#Location) interface. */ function is(value: any): value is Location } /** * A range in a text document expressed as (zero-based) start and end positions. * * If you want to specify a range that contains a line including the line ending * character(s) then use an end position denoting the start of the next line. * For example: * ```ts * { * start: { line: 5, character: 23 } * end : { line 6, character : 0 } * } * ``` */ export interface Range { /** * The range's start position */ start: Position /** * The range's end position. */ end: Position } /** * The Range namespace provides helper functions to work with * [Range](#Range) literals. */ export namespace Range { /** * Create a new Range liternal. * @param start The range's start position. * @param end The range's end position. */ function create(start: Position, end: Position): Range /** * Create a new Range liternal. * @param startLine The start line number. * @param startCharacter The start character. * @param endLine The end line number. * @param endCharacter The end character. */ function create(startLine: number, startCharacter: number, endLine: number, endCharacter: number): Range /** * Checks whether the given literal conforms to the [Range](#Range) interface. */ function is(value: any): value is Range } /** * A text edit applicable to a text document. */ export interface TextEdit { /** * The range of the text document to be manipulated. To insert * text into a document create a range where start === end. */ range: Range /** * The string to be inserted. For delete operations use an * empty string. */ newText: string } /** * The TextEdit namespace provides helper function to create replace, * insert and delete edits more easily. */ export namespace TextEdit { /** * Creates a replace text edit. * @param range The range of text to be replaced. * @param newText The new text. */ function replace(range: Range, newText: string): TextEdit /** * Creates a insert text edit. * @param position The position to insert the text at. * @param newText The text to be inserted. */ function insert(position: Position, newText: string): TextEdit /** * Creates a delete text edit. * @param range The range of text to be deleted. */ function del(range: Range): TextEdit function is(value: any): value is TextEdit } /** * Defines a CancellationToken. This interface is not * intended to be implemented. A CancellationToken must * be created via a CancellationTokenSource. */ export interface CancellationToken { /** * Is `true` when the token has been cancelled, `false` otherwise. */ readonly isCancellationRequested: boolean /** * An [event](#Event) which fires upon cancellation. */ readonly onCancellationRequested: Event } export namespace CancellationToken { const None: CancellationToken const Cancelled: CancellationToken function is(value: any): value is CancellationToken } export class CancellationTokenSource { get token(): CancellationToken cancel(): void dispose(): void } /** * Represents a line of text, such as a line of source code. * * TextLine objects are __immutable__. When a {@link LinesTextDocument document} changes, * previously retrieved lines will not represent the latest state. */ export interface TextLine { /** * The zero-based line number. */ readonly lineNumber: number /** * The text of this line without the line separator characters. */ readonly text: string /** * The range this line covers without the line separator characters. */ readonly range: Range /** * The range this line covers with the line separator characters. */ readonly rangeIncludingLineBreak: Range /** * The offset of the first character which is not a whitespace character as defined * by `/\s/`. **Note** that if a line is all whitespace the length of the line is returned. */ readonly firstNonWhitespaceCharacterIndex: number /** * Whether this line is whitespace only, shorthand * for {@link TextLine.firstNonWhitespaceCharacterIndex} === {@link TextLine.text TextLine.text.length}. */ readonly isEmptyOrWhitespace: boolean } /** * A simple text document. Not to be implemented. The document keeps the content * as string. */ export interface TextDocument { /** * The associated URI for this document. Most documents have the __file__-scheme, indicating that they * represent files on disk. However, some documents may have other schemes indicating that they are not * available on disk. * * @readonly */ readonly uri: string /** * The identifier of the language associated with this document. * * @readonly */ readonly languageId: string /** * The version number of this document (it will increase after each * change, including undo/redo). * * @readonly */ readonly version: number /** * Get the text of this document. A substring can be retrieved by * providing a range. * * @param range (optional) An range within the document to return. * If no range is passed, the full content is returned. * Invalid range positions are adjusted as described in [Position.line](#Position.line) * and [Position.character](#Position.character). * If the start range position is greater than the end range position, * then the effect of getText is as if the two positions were swapped. * @return The text of this document or a substring of the text if a * range is provided. */ getText(range?: Range): string /** * Converts a zero-based offset to a position. * * @param offset A zero-based offset. * @return A valid [position](#Position). */ positionAt(offset: number): Position /** * Converts the position to a zero-based offset. * Invalid positions are adjusted as described in [Position.line](#Position.line) * and [Position.character](#Position.character). * * @param position A position. * @return A valid zero-based offset. */ offsetAt(position: Position): number /** * The number of lines in this document. * * @readonly */ readonly lineCount: number } export interface LinesTextDocument extends TextDocument { /** * Total length of TextDocument. */ readonly length: number /** * End position of TextDocument. */ readonly end: Position /** * 'eol' option of related buffer. When enabled additional `\n` will be * added to the end of document content */ readonly rol: boolean /** * Lines of TextDocument. */ readonly lines: ReadonlyArray /** * Returns a text line denoted by the line number. Note * that the returned object is *not* live and changes to the * document are not reflected. * * @param line or position * @return A {@link TextLine line}. */ lineAt(lineOrPos: number | Position): TextLine } /** * @since 3.16.0 */ export interface SemanticTokensLegend { /** * The token types a server uses. */ tokenTypes: string[] /** * The token modifiers a server uses. */ tokenModifiers: string[] } /** * @since 3.16.0 */ export interface SemanticTokens { /** * An optional result id. If provided and clients support delta updating * the client will include the result id in the next semantic token request. * A server can then instead of computing all semantic tokens again simply * send a delta. */ resultId?: string /** * The actual tokens. */ data: number[] } /** * @since 3.16.0 */ export interface SemanticTokensEdit { /** * The start offset of the edit. */ start: number /** * The count of elements to remove. */ deleteCount: number /** * The elements to insert. */ data?: number[] } /** * @since 3.16.0 */ export interface SemanticTokensDelta { readonly resultId?: string /** * The semantic token edits to transform a previous result into a new result. */ edits: SemanticTokensEdit[] } /** * The result of a linked editing range request. * * @since 3.16.0 */ export interface LinkedEditingRanges { /** * A list of ranges that can be edited together. The ranges must have * identical length and contain identical text content. The ranges cannot overlap. */ ranges: Range[] /** * An optional word pattern (regular expression) that describes valid contents for * the given ranges. If no pattern is provided, the client configuration's word * pattern will be used. */ wordPattern?: string } /** * Represents programming constructs like functions or constructors in the context * of call hierarchy. * * @since 3.16.0 */ export interface CallHierarchyItem { /** * The name of this item. */ name: string /** * The kind of this item. */ kind: SymbolKind /** * Tags for this item. */ tags?: number[] /** * More detail for this item, e.g. the signature of a function. */ detail?: string /** * The resource identifier of this item. */ uri: string /** * The range enclosing this symbol not including leading/trailing whitespace but everything else, e.g. comments and code. */ range: Range /** * The range that should be selected and revealed when this symbol is being picked, e.g. the name of a function. * Must be contained by the [`range`](#CallHierarchyItem.range). */ selectionRange: Range /** * A data entry field that is preserved between a call hierarchy prepare and * incoming calls or outgoing calls requests. */ data?: unknown } /** * Represents an incoming call, e.g. a caller of a method or constructor. * * @since 3.16.0 */ export interface CallHierarchyIncomingCall { /** * The item that makes the call. */ from: CallHierarchyItem /** * The ranges at which the calls appear. This is relative to the caller * denoted by [`this.from`](#CallHierarchyIncomingCall.from). */ fromRanges: Range[] } /** * Represents an outgoing call, e.g. calling a getter from a method or a method from a constructor etc. * * @since 3.16.0 */ export interface CallHierarchyOutgoingCall { /** * The item that is called. */ to: CallHierarchyItem /** * The range at which this item is called. This is the range relative to the caller, e.g the item * passed to [`provideCallHierarchyOutgoingCalls`](#CallHierarchyItemProvider.provideCallHierarchyOutgoingCalls) * and not [`this.to`](#CallHierarchyOutgoingCall.to). */ fromRanges: Range[] } /** * Moniker uniqueness level to define scope of the moniker. * * @since 3.16.0 */ export namespace UniquenessLevel { /** * The moniker is only unique inside a document */ export const document = 'document' /** * The moniker is unique inside a project for which a dump got created */ export const project = 'project' /** * The moniker is unique inside the group to which a project belongs */ export const group = 'group' /** * The moniker is unique inside the moniker scheme. */ export const scheme = 'scheme' /** * The moniker is globally unique */ export const global = 'global' } export type UniquenessLevel = 'document' | 'project' | 'group' | 'scheme' | 'global' /** * The moniker kind. * * @since 3.16.0 */ export enum MonikerKind { /** * The moniker represent a symbol that is imported into a project */ import = 'import', /** * The moniker represents a symbol that is exported from a project */ export = 'export', /** * The moniker represents a symbol that is local to a project (e.g. a local * variable of a function, a class not visible outside the project, ...) */ local = 'local' } /** * Moniker definition to match LSIF 0.5 moniker definition. * * @since 3.16.0 */ export interface Moniker { /** * The scheme of the moniker. For example tsc or .Net */ scheme: string /** * The identifier of the moniker. The value is opaque in LSIF however * schema owners are allowed to define the structure if they want. */ identifier: string /** * The scope in which the moniker is unique */ unique: UniquenessLevel /** * The moniker kind if known. */ kind?: MonikerKind } export type InlayHintKind = 1 | 2 /** * An inlay hint label part allows for interactive and composite labels * of inlay hints. * * @since 3.17.0 * @proposed */ export interface InlayHintLabelPart { /** * The value of this label part. */ value: string /** * The tooltip text when you hover over this label part. Depending on * the client capability `inlayHint.resolveSupport` clients might resolve * this property late using the resolve request. */ tooltip?: string | MarkupContent /** * An optional source code location that represents this * label part. * * The editor will use this location for the hover and for code navigation * features: This part will become a clickable link that resolves to the * definition of the symbol at the given location (not necessarily the * location itself), it shows the hover that shows at the given location, * and it shows a context menu with further code navigation commands. * * Depending on the client capability `inlayHint.resolveSupport` clients * might resolve this property late using the resolve request. */ location?: Location /** * An optional command for this label part. * * Depending on the client capability `inlayHint.resolveSupport` clients * might resolve this property late using the resolve request. */ command?: Command } /** * Inlay hint information. * * @since 3.17.0 * @proposed */ export interface InlayHint { /** * The position of this hint. */ position: Position /** * The label of this hint. A human readable string or an array of * InlayHintLabelPart label parts. * * *Note* that neither the string nor the label part can be empty. */ label: string | InlayHintLabelPart[] /** * The kind of this hint. Can be omitted in which case the client * should fall back to a reasonable default. */ kind?: InlayHintKind /** * Optional text edits that are performed when accepting this inlay hint. * * *Note* that edits are expected to change the document so that the inlay * hint (or its nearest variant) is now part of the document and the inlay * hint itself is now obsolete. */ textEdits?: TextEdit[] /** * The tooltip text when you hover over this item. */ tooltip?: string | MarkupContent /** * Render padding before the hint. * * Note: Padding should use the editor's background color, not the * background color of the hint itself. That means padding can be used * to visually align/separate an inlay hint. */ paddingLeft?: boolean /** * Render padding after the hint. * * Note: Padding should use the editor's background color, not the * background color of the hint itself. That means padding can be used * to visually align/separate an inlay hint. */ paddingRight?: boolean /** * A data entry field that is preserved on a inlay hint between * a `textDocument/inlayHint` and a `inlayHint/resolve` request. */ data?: any } // }} // nvim interfaces {{ type VimValue = | number | boolean | string | number[] | { [key: string]: any } // see `:h nvim_set_client_info()` for details. export interface VimClientInfo { name: string version: { major?: number minor?: number patch?: number prerelease?: string commit?: string } type: 'remote' | 'embedder' | 'host' methods?: { [index: string]: any } attributes?: { [index: string]: any } } export interface UiAttachOptions { rgb?: boolean ext_popupmenu?: boolean ext_tabline?: boolean ext_wildmenu?: boolean ext_cmdline?: boolean ext_linegrid?: boolean ext_hlstate?: boolean } export interface ChanInfo { id: number stream: 'stdio' | 'stderr' | 'socket' | 'job' mode: 'bytes' | 'terminal' | 'rpc' pty?: number buffer?: number client?: VimClientInfo } /** * Returned by nvim_get_commands api. */ export interface VimCommandDescription { name: string bang: boolean bar: boolean register: boolean definition: string count?: number | null script_id: number complete?: string nargs?: string range?: string complete_arg?: string } export interface NvimFloatOptions { standalone?: boolean focusable?: boolean relative?: 'editor' | 'cursor' | 'win' anchor?: 'NW' | 'NE' | 'SW' | 'SE' height: number width: number row: number col: number } export interface ExtmarkOptions { id?: number // 0-based inclusive. end_line?: number // 0-based exclusive. end_col?: number // name of the highlight group used to highlight this mark. hl_group?: string hl_mode?: 'replace' | 'combine' | 'blend' hl_eol?: boolean // A list of [text, highlight] tuples virt_text?: [string, string | string[]][] virt_text_pos?: 'eol' | 'overlay' | 'right_align' virt_text_win_col?: number virt_text_hide?: boolean virt_lines?: [string, string | string[]][][] virt_lines_above?: boolean virt_lines_leftcol?: boolean right_gravity?: boolean end_right_gravity?: boolean priority?: number } export interface ExtmarkDetails { end_col: number end_row: number priority: number hl_group?: string virt_text?: [string, string][] virt_lines?: [string, string | string][][] } export interface NvimProc { ppid: number name: string pid: number } export interface SignPlaceOption { id?: number group?: string name: string lnum: number priority?: number } export interface SignUnplaceOption { group?: string id?: number } export interface SignPlacedOption { /** * Use '*' for all group, default to '' as unnamed group. */ group?: string id?: number lnum?: number } export interface SignItem { group: string id: number lnum: number name: string priority: number } export interface HighlightItem { hlGroup: string /** * 0 based */ lnum: number /** * 0 based */ colStart: number /** * 0 based */ colEnd: number } export interface ExtendedHighlightItem extends HighlightItem { combine?: boolean start_incl?: boolean end_incl?: boolean } export interface HighlightOption { /** * 0 based start line, default to 0. */ start?: number /** * 0 based end line, default to 0. */ end?: number /** * Default to 0 on vim8, 4096 on neovim */ priority?: number /** * Buffer changedtick to match. */ changedtick?: number } export interface BufferKeymapOption { nowait?: boolean silent?: boolean script?: boolean expr?: boolean unique?: boolean } export interface BufferHighlight { /** * Name of the highlight group to use */ hlGroup?: string /** * Namespace to use or -1 for ungrouped highlight */ srcId?: number /** * Line to highlight (zero-indexed) */ line?: number /** * Start of (byte-indexed) column range to highlight */ colStart?: number /** * End of (byte-indexed) column range to highlight, or -1 to highlight to end of line */ colEnd?: number } export interface BufferClearHighlight { srcId?: number lineStart?: number lineEnd?: number } interface BaseApi { /** * unique identify number */ id: number /** * Check if same by compare id. */ equals(other: T): boolean /** * Request to vim, name need to be nvim_ prefixed and supported by vim. * * @param {string} name - nvim function name * @param {VimValue[]} args * @returns {Promise} */ request(name: string, args?: VimValue[]): Promise /** * Send notification to vim, name need to be nvim_ prefixed and supported * by vim */ notify(name: string, args?: VimValue[]): void /** * Retrieves scoped variable, returns null when value doesn't exist. */ getVar(name: string): Promise /** * Set scoped variable by request. * * @param {string} name * @param {VimValue} value * @returns {Promise} */ setVar(name: string, value: VimValue): Promise /** * Set scoped variable by notification. */ setVar(name: string, value: VimValue, isNotify: true): void /** * Delete scoped variable by notification. */ deleteVar(name: string): void /** * Retrieves a scoped option, doesn't exist for tabpage. */ getOption(name: string): Promise /** * Set scoped option by request, doesn't exist for tabpage. */ setOption(name: string, value: VimValue): Promise /** * Set scoped variable by notification, doesn't exist for tabpage. */ setOption(name: string, value: VimValue, isNotify: true): void } export interface Neovim extends BaseApi { /** * Echo error message to vim and log error stack. */ echoError(msg: unknown): void /** * Check if `nvim_` function exists. */ hasFunction(name: string): boolean /** * Get channelid used by coc.nvim. */ channelId: Promise /** * Create buffer instance by id. */ createBuffer(id: number): Buffer /** * Create window instance by id. */ createWindow(id: number): Window /** * Create tabpage instance by id. */ createTabpage(id: number): Tabpage /** * Stop send subsequent notifications. * This method **must** be paired with `nvim.resumeNotification` in a sync manner. */ pauseNotification(): void /** * Send paused notifications by nvim_call_atomic request * * @param {boolean} redrawVim Redraw vim on vim8 to update the screen * * **Note**: avoid call async function between pauseNotification and * resumeNotification. */ resumeNotification(redrawVim?: boolean): Promise<[VimValue[], [string, number, string] | null]> /** * Send paused notifications by nvim_call_atomic notification * * @param {boolean} redrawVim Redraw vim to update the screen * @param {true} notify * @returns {void} */ resumeNotification(redrawVim: boolean, notify: true): void /** * Send redraw command to vim, does nothing on neovim since it's not necessary on most cases. */ redrawVim(): void /** * Get list of current buffers. */ buffers: Promise /** * Get current buffer. */ buffer: Promise /** * Set current buffer */ setBuffer(buffer: Buffer): Promise /** * Get list of current tabpages. */ tabpages: Promise /** * Get current tabpage. */ tabpage: Promise /** * Set current tabpage */ setTabpage(tabpage: Tabpage): Promise /** * Get list of current windows. */ windows: Promise /** * Get current window. */ window: Promise /** * Set current window. */ setWindow(window: Window): Promise /** * Get information of all channels, * **Note:** works on neovim only. */ chans: Promise /** * Get information of channel by id, * **Note:** works on neovim only. */ getChanInfo(id: number): Promise /** * Creates a new namespace, or gets an existing one. * `:h nvim_create_namespace()` */ createNamespace(name?: string): Promise /** * Gets existing, non-anonymous namespaces. * * @return dict that maps from names to namespace ids. */ namespaces: Promise<{ [name: string]: number }> /** * Gets a map of global (non-buffer-local) Ex commands. * * @return Map of maps describing commands. */ getCommands(opt?: { builtin: boolean }): Promise<{ [name: string]: VimCommandDescription }> /** * Get list of all runtime paths */ runtimePaths: Promise /** * Set global working directory. * **Note:** works on neovim only. */ setDirectory(dir: string): Promise /** * Get current line. */ line: Promise /** * Creates a new, empty, unnamed buffer. * * **Note:** works on neovim only. */ createNewBuffer(listed?: boolean, scratch?: boolean): Promise /** * Create float window of neovim. * * **Note:** works on neovim only, use high level api provided by window * module is recommended. */ openFloatWindow(buffer: Buffer, enter: boolean, options: NvimFloatOptions): Promise /** * Set current line. */ setLine(line: string): Promise /** * Gets a list of global (non-buffer-local) |mapping| definitions. * `:h nvim_get_keymap` * * **Note:** works on neovim only. */ getKeymap(mode: string): Promise /** * Gets the current mode. |mode()| "blocking" is true if Nvim is waiting for input. * * **Note:** blocking would always be false when used with vim. */ mode: Promise<{ mode: string; blocking: boolean }> /** * Returns a map of color names and RGB values. * * **Note:** works on neovim only. */ colorMap(): Promise<{ [name: string]: number }> /** * Returns the 24-bit RGB value of a |nvim_get_color_map()| color name or * "#rrggbb" hexadecimal string. * * **Note:** works on neovim only. */ getColorByName(name: string): Promise /** * Gets a highlight definition by id. |hlID()| * * **Note:** works on neovim only. */ getHighlight(nameOrId: string | number, isRgb?: boolean): Promise /** * Get a highlight by name, return rgb by default. * * **Note:** works on neovim only. */ getHighlightByName(name: string, isRgb?: boolean): Promise /** * Get a highlight by id, return rgb by default. * * **Note:** works on neovim only. */ getHighlightById(id: number, isRgb?: boolean): Promise /** * Delete current line in buffer. */ deleteCurrentLine(): Promise /** * Evaluates a VimL expression (:help expression). Dictionaries * and Lists are recursively expanded. On VimL error: Returns a * generic error; v:errmsg is not updated. * */ eval(expr: string): Promise /** * Executes lua, it's possible neovim client does not support this * * **Note:** works on neovim only. */ lua(code: string, args?: VimValue[]): Promise /** * Calls a VimL |Dictionary-function| with the given arguments. */ callDictFunction(dict: object | string, fname: string, args: VimValue | VimValue[]): Promise /** * Call a vim function. * * @param {string} fname - function name * @param {VimValue | VimValue[]} args * @returns {Promise} */ call(fname: string, args?: VimValue | VimValue[]): Promise /** * Call a vim function by notification. */ call(fname: string, args: VimValue | VimValue[], isNotify: true): void /** * Call a vim function with timer of timeout 0. * * @param {string} fname - function name * @param {VimValue | VimValue[]} args * @returns {Promise} */ callTimer(fname: string, args?: VimValue | VimValue[]): Promise /** * Call a vim function with timer of timeout 0 by notification. */ callTimer(fname: string, args: VimValue | VimValue[], isNotify: true): void /** * Call async vim function that accept callback as argument * by using notifications. */ callAsync(fname: string, args?: VimValue | VimValue[]): Promise /** * Calls many API methods atomically. */ callAtomic(calls: [string, VimValue[]][]): Promise<[any[], any[] | null]> /** * Executes an ex-command by request. */ command(arg: string): Promise /** * Executes an ex-command by notification. */ command(arg: string, isNotify: true): void /** * Runs a command and returns output. * * @deprecated Use exec() instead. */ commandOutput(arg: string): Promise /** * Executes Vimscript (multiline block of Ex-commands), like * anonymous |:source| */ exec(src: string, output?: boolean): Promise /** * Gets a v: variable. */ getVvar(name: string): Promise /** * `:h nvim_feedkeys` */ feedKeys(keys: string, mode: string, escapeCsi: boolean): Promise /** * Queues raw user-input. Unlike |nvim_feedkeys()|, this uses a * low-level input buffer and the call is non-blocking (input is * processed asynchronously by the eventloop). * * On execution error: does not fail, but updates v:errmsg. * * **Note:** works on neovim only. */ input(keys: string): Promise /** * Parse a VimL Expression. */ parseExpression(expr: string, flags: string, highlight: boolean): Promise /** * Get process info, neovim only. * * **Note:** works on neovim only. */ getProc(pid: number): Promise /** * Gets the immediate children of process `pid`. * * **Note:** works on neovim only. */ getProcChildren(pid: number): Promise /** * Replaces terminal codes and |keycodes| (, , ...) * in a string with the internal representation. * * **Note:** works on neovim only. */ replaceTermcodes(str: string, fromPart: boolean, doIt: boolean, special: boolean): Promise /** * Gets width(display cells) of string. */ strWidth(str: string): Promise /** * Gets a list of dictionaries representing attached UIs. * * **Note:** works on neovim only. */ uis: Promise /** * Subscribe to nvim event broadcasts. * * **Note:** works on neovim only. */ subscribe(event: string): Promise /** * Unsubscribe to nvim event broadcasts * * **Note:** works on neovim only. */ unsubscribe(event: string): Promise /** * Activates UI events on the channel. * * **Note:** works on neovim only. */ uiAttach(width: number, height: number, options: UiAttachOptions): Promise /** * `:h nvim_ui_try_resize` * * **Note:** works on neovim only. */ uiTryResize(width: number, height: number): Promise /** * Deactivates UI events on the channel. * * **Note:** works on neovim only. */ uiDetach(): Promise /** * Quit vim. */ quit(): Promise } export interface Buffer extends BaseApi { id: number /** Total number of lines in buffer */ length: Promise /** * Get lines of buffer. */ lines: Promise /** * Get changedtick of buffer. */ changedtick: Promise /** * Add buffer keymap by notification. */ setKeymap(mode: string, lhs: string, rhs: string, opts?: BufferKeymapOption): void /** * Removes an ext mark by notification. * * @public * @param {number} ns_id - Namespace id * @param {number} id - Extmark id */ deleteExtMark(ns_id: number, id: number): void /** * Gets the position (0-indexed) of an extmark. * * @param {number} ns_id - Namespace id * @param {number} id - Extmark id * @param {Object} opts - Optional parameters. * @returns {Promise<[] | [number, number] | [number, number, ExtmarkDetails]>} */ getExtMarkById(ns_id: number, id: number, opts?: { details?: boolean }): Promise<[] | [number, number] | [number, number, ExtmarkDetails]> /** * Gets extmarks in "traversal order" from a |charwise| region defined by * buffer positions (inclusive, 0-indexed |api-indexing|). * * Region can be given as (row,col) tuples, or valid extmark ids (whose * positions define the bounds). 0 and -1 are understood as (0,0) and (-1,-1) * respectively, thus the following are equivalent: * * nvim_buf_get_extmarks(0, my_ns, 0, -1, {}) * nvim_buf_get_extmarks(0, my_ns, [0,0], [-1,-1], {}) * * @param {number} ns_id - Namespace id * @param {[number, number] | number} start * @param {[number, number] | number} end * @param {Object} opts * @returns {Promise<[number, number, number, ExtmarkDetails?][]>} */ getExtMarks(ns_id: number, start: [number, number] | number, end: [number, number] | number, opts?: { details?: boolean limit?: number }): Promise<[number, number, number, ExtmarkDetails?][]> /** * Creates or updates an extmark by notification, `:h nvim_buf_set_extmark`. * * @param {number} ns_id * @param {number} line * @param {number} col * @param {ExtmarkOptions} opts * @returns {void} */ setExtMark(ns_id: number, line: number, col: number, opts?: ExtmarkOptions): void /** * Add sign to buffer by notification. * * @param {SignPlaceOption} sign */ placeSign(sign: SignPlaceOption): void /** * Unplace signs by notification */ unplaceSign(opts: SignUnplaceOption): void /** * Get signs by group name or id and lnum. * * @param {SignPlacedOption} opts */ getSigns(opts: SignPlacedOption): Promise /** * Get highlight items by namespace (end inclusive). * * @param {string} ns Namespace key or id. * @param {number} start 0 based line number, default to 0. * @param {number} end 0 based line number, default to -1. */ getHighlights(ns: string, start?: number, end?: number): Promise /** * Update namespaced highlights in range by notification. * Priority default to 0 on vim and 4096 on neovim. * Note: timer used for whole buffer highlights for better performance. * * @param {string} ns Namespace key. * @param {HighlightItem[]} highlights Highlight items. * @param {HighlightOption} opts Highlight options. */ updateHighlights(ns: string, highlights: ExtendedHighlightItem[], opts?: HighlightOption): void /** * Gets a map of buffer-local |user-commands|. * * **Note:** works on neovim only. */ getCommands(options?: {}): Promise /** * Get lines of buffer, get all lines by default. */ getLines(opts?: { start: number, end: number, strictIndexing?: boolean }): Promise /** * Set lines of buffer given indices use request. */ setLines(lines: string[], opts?: { start: number, end: number, strictIndexing?: boolean }): Promise /** * Set lines of buffer given indices use notification. */ setLines(lines: string[], opts: { start: number, end: number, strictIndexing?: boolean }, isNotify: true): void /** * Set virtual text for a line * * @public * @deprecated Use `setExtMark()` instead. * @param {number} src_id - Source group to use or 0 to use a new group, or -1 * @param {number} line - Line to annotate with virtual text (zero-indexed) * @param {Chunk[]} chunks - List with [text, hl_group] * @param {[index} opts * @returns {Promise} */ setVirtualText(src_id: number, line: number, chunks: [string, string][], opts?: { [index: string]: any }): Promise /** * Append a string or list of lines to end of buffer */ append(lines: string[] | string): Promise /** * Get buffer name. */ name: Promise /** * Set buffer name. */ setName(name: string): Promise /** * Check if buffer valid. */ valid: Promise /** * Get mark position given mark name * * **Note:** works on neovim only. */ mark(name: string): Promise<[number, number]> /** * Gets a list of buffer-local |mapping| definitions. * * @return Array of maparg()-like dictionaries describing mappings. * The "buffer" key holds the associated buffer handle. */ getKeymap(mode: string): Promise /** * Check if buffer loaded. */ loaded: Promise /** * Returns the byte offset for a line. * * Line 1 (index=0) has offset 0. UTF-8 bytes are counted. EOL is * one byte. 'fileformat' and 'fileencoding' are ignored. The * line index just after the last line gives the total byte-count * of the buffer. A final EOL byte is counted if it would be * written, see 'eol'. * * Unlike |line2byte()|, throws error for out-of-bounds indexing. * Returns -1 for unloaded buffer. * * @return {Number} Integer byte offset, or -1 for unloaded buffer. */ getOffset(index: number): Promise /** * Adds a highlight to buffer, checkout |nvim_buf_add_highlight|. * * Note: when `srcId = 0`, request is made for new `srcId`, otherwire, use notification. * Note: `hlGroup` as empty string is not supported. * * @deprecated use `highlightRanges()` instead. */ addHighlight(opts: BufferHighlight): Promise /** * Clear highlights of specified lins. * * @deprecated use clearNamespace() instead. */ clearHighlight(args?: BufferClearHighlight) /** * Add highlight to ranges by notification, works on both vim & neovim. * * Works on neovim and `workspace.isVim && workspace.env.textprop` is true * * @param {string | number} srcId Unique key or namespace number. * @param {string} hlGroup Highlight group. * @param {Range[]} ranges List of highlight ranges */ highlightRanges(srcId: string | number, hlGroup: string, ranges: Range[]): void /** * Clear namespace by id or name by notification, works on both vim & neovim. * * Works on neovim and `workspace.isVim && workspace.env.textprop` is true * * @param key Unique key or namespace number, use -1 for all namespaces * @param lineStart Start of line, 0 based, default to 0. * @param lineEnd End of line, 0 based, default to -1. */ clearNamespace(key: number | string, lineStart?: number, lineEnd?: number) } export interface Window extends BaseApi { /** * The windowid that not change within a Vim session */ id: number /** * Buffer in window. */ buffer: Promise /** * Tabpage contains window. */ tabpage: Promise /** * Cursor position as [line, col], 1 based. */ cursor: Promise<[number, number]> /** * Window height. */ height: Promise /** * Window width. */ width: Promise /** * Set cursor position by request. */ setCursor(pos: [number, number]): Promise /** * Set cursor position by notification. */ setCursor(pos: [number, number], isNotify: true): void /** * Set height */ setHeight(height: number): Promise /** * Set height by notification. */ setHeight(height: number, isNotify: true): void /** * Set width. */ setWidth(width: number): Promise /** * Set width by notification. */ setWidth(width: number, isNotify: true): void /** * Get window position, not work with vim8's popup. */ position: Promise<[number, number]> /** 0-indexed, on-screen window position(row) in display cells. */ row: Promise /** 0-indexed, on-screen window position(col) in display cells. */ col: Promise /** * Check if window valid. */ valid: Promise /** * Get window number, throws for invalid window. */ number: Promise /** * Config float window with options. * * **Note:** works on neovim only. */ setConfig(options: NvimFloatOptions): Promise /** * Config float window with options by send notification. * * **Note:** works on neovim only. */ setConfig(options: NvimFloatOptions, isNotify: true): void /** * Gets window configuration. * * **Note:** works on neovim only. * * @returns Map defining the window configuration, see |nvim_open_win()| */ getConfig(): Promise /** * Close window by send request. */ close(force: boolean): Promise /** * Close window by send notification. */ close(force: boolean, isNotify: true): void /** * Add highlight to ranges by request (matchaddpos is used) * * @return {Promise} match ids. */ highlightRanges(hlGroup: string, ranges: Range[], priority?: number): Promise /** * Add highlight to ranges by notification (matchaddpos is used) */ highlightRanges(hlGroup: string, ranges: Range[], priority: number, isNotify: true): void /** * Clear match of highlight group by send notification. */ clearMatchGroup(hlGroup: string): void /** * Clear match of match ids by send notification. */ clearMatches(ids: number[]): void } export interface Tabpage extends BaseApi { /** * tabpage number. */ number: Promise /** * Is current tabpage valid. */ valid: Promise /** * Returns all windows of tabpage. */ windows: Promise /** * Current window of tabpage. */ window: Promise } // }} // vscode-uri {{ export interface UriComponents { scheme: string authority: string path: string query: string fragment: string } /** * Uniform Resource Identifier (URI) http://tools.ietf.org/html/rfc3986. * This class is a simple parser which creates the basic component parts * (http://tools.ietf.org/html/rfc3986#section-3) with minimal validation * and encoding. * * ```txt * foo://example.com:8042/over/there?name=ferret#nose * \_/ \______________/\_________/ \_________/ \__/ * | | | | | * scheme authority path query fragment * | _____________________|__ * / \ / \ * urn:example:animal:ferret:nose * ``` */ export class Uri implements UriComponents { static isUri(thing: any): thing is Uri /** * scheme is the 'http' part of 'http://www.msft.com/some/path?query#fragment'. * The part before the first colon. */ readonly scheme: string /** * authority is the 'www.msft.com' part of 'http://www.msft.com/some/path?query#fragment'. * The part between the first double slashes and the next slash. */ readonly authority: string /** * path is the '/some/path' part of 'http://www.msft.com/some/path?query#fragment'. */ readonly path: string /** * query is the 'query' part of 'http://www.msft.com/some/path?query#fragment'. */ readonly query: string /** * fragment is the 'fragment' part of 'http://www.msft.com/some/path?query#fragment'. */ readonly fragment: string /** * @internal */ protected constructor(scheme: string, authority?: string, path?: string, query?: string, fragment?: string, _strict?: boolean) /** * @internal */ protected constructor(components: UriComponents) /** * Returns a string representing the corresponding file system path of this URI. * Will handle UNC paths, normalizes windows drive letters to lower-case, and uses the * platform specific path separator. * * * Will *not* validate the path for invalid characters and semantics. * * Will *not* look at the scheme of this URI. * * The result shall *not* be used for display purposes but for accessing a file on disk. * * * The *difference* to `URI#path` is the use of the platform specific separator and the handling * of UNC paths. See the below sample of a file-uri with an authority (UNC path). * * ```ts const u = URI.parse('file://server/c$/folder/file.txt') u.authority === 'server' u.path === '/shares/c$/file.txt' u.fsPath === '\\server\c$\folder\file.txt' ``` * * Using `URI#path` to read a file (using fs-apis) would not be enough because parts of the path, * namely the server name, would be missing. Therefore `URI#fsPath` exists - it's sugar to ease working * with URIs that represent files on disk (`file` scheme). */ readonly fsPath: string with(change: { scheme?: string authority?: string | null path?: string | null query?: string | null fragment?: string | null }): Uri /** * Creates a new URI from a string, e.g. `http://www.msft.com/some/path`, * `file:///usr/home`, or `scheme:with/path`. * * @param value A string which represents an URI (see `URI#toString`). */ static parse(value: string, _strict?: boolean): Uri /** * Creates a new URI from a file system path, e.g. `c:\my\files`, * `/usr/home`, or `\\server\share\some\path`. * * The *difference* between `URI#parse` and `URI#file` is that the latter treats the argument * as path, not as stringified-uri. E.g. `URI.file(path)` is **not the same as** * `URI.parse('file://' + path)` because the path might contain characters that are * interpreted (# and ?). See the following sample: * ```ts const good = URI.file('/coding/c#/project1'); good.scheme === 'file'; good.path === '/coding/c#/project1'; good.fragment === ''; const bad = URI.parse('file://' + '/coding/c#/project1'); bad.scheme === 'file'; bad.path === '/coding/c'; // path is now broken bad.fragment === '/project1'; ``` * * @param path A file system path (see `URI#fsPath`) */ static file(path: string): Uri static from(components: { scheme: string authority?: string path?: string query?: string fragment?: string }): Uri /** * Creates a string representation for this URI. It's guaranteed that calling * `URI.parse` with the result of this function creates an URI which is equal * to this URI. * * * The result shall *not* be used for display purposes but for externalization or transport. * * The result will be encoded using the percentage encoding and encoding happens mostly * ignore the scheme-specific encoding rules. * * @param skipEncoding Do not encode the result, default is `false` */ toString(skipEncoding?: boolean): string toJSON(): UriComponents } // }} // vim interfaces {{ /** * See `:h complete-items` */ export interface VimCompleteItem { word: string abbr?: string menu?: string info?: string kind?: string icase?: number equal?: number dup?: number empty?: number user_data?: string } export interface LocationListItem { bufnr: number lnum: number end_lnum: number col: number end_col: number text: string type: string } export interface QuickfixItem { uri?: string module?: string range?: Range text?: string type?: string filename?: string bufnr?: number lnum?: number end_lnum?: number col?: number end_col?: number valid?: boolean nr?: number } // }} // provider interfaces {{ /** * A provider result represents the values a provider, like the [`HoverProvider`](#HoverProvider), * may return. For once this is the actual result type `T`, like `Hover`, or a thenable that resolves * to that type `T`. In addition, `null` and `undefined` can be returned - either directly or from a * thenable. * * The snippets below are all valid implementations of the [`HoverProvider`](#HoverProvider): * * ```ts * let a: HoverProvider = { * provideHover(doc, pos, token): ProviderResult { * return new Hover('Hello World') * } * } * * let b: HoverProvider = { * provideHover(doc, pos, token): ProviderResult { * return new Promise(resolve => { * resolve(new Hover('Hello World')) * }) * } * } * * let c: HoverProvider = { * provideHover(doc, pos, token): ProviderResult { * return; // undefined * } * } * ``` */ export type ProviderResult = | T | undefined | null | Thenable /** * Supported provider names. */ export type ProviderName = 'rename' | 'onTypeEdit' | 'documentLink' | 'documentColor' | 'foldingRange' | 'format' | 'codeAction' | 'workspaceSymbols' | 'formatRange' | 'formatOnType' | 'hover' | 'signature' | 'documentSymbol' | 'documentHighlight' | 'definition' | 'declaration' | 'typeDefinition' | 'reference' | 'implementation' | 'codeLens' | 'selectionRange' | 'callHierarchy' | 'semanticTokens' | 'linkedEditing' /** * The completion item provider interface defines the contract between extensions and * [IntelliSense](https://code.visualstudio.com/docs/editor/intellisense). * * Providers can delay the computation of the [`detail`](#CompletionItem.detail) * and [`documentation`](#CompletionItem.documentation) properties by implementing the * [`resolveCompletionItem`](#CompletionItemProvider.resolveCompletionItem)-function. However, properties that * are needed for the initial sorting and filtering, like `sortText`, `filterText`, `insertText`, and `range`, must * not be changed during resolve. * * Providers are asked for completions either explicitly by a user gesture or -depending on the configuration- * implicitly when typing words or trigger characters. */ export interface CompletionItemProvider { /** * Provide completion items for the given position and document. * * @param document The document in which the command was invoked. * @param position The position at which the command was invoked. * @param token A cancellation token. * @param context How the completion was triggered. * * @return An array of completions, a [completion list](#CompletionList), or a thenable that resolves to either. * The lack of a result can be signaled by returning `undefined`, `null`, or an empty array. */ provideCompletionItems( document: LinesTextDocument, position: Position, token: CancellationToken, context?: CompletionContext ): ProviderResult /** * Given a completion item fill in more data, like [doc-comment](#CompletionItem.documentation) * or [details](#CompletionItem.detail). * * The editor will only resolve a completion item once. * * @param item A completion item currently active in the UI. * @param token A cancellation token. * @return The resolved completion item or a thenable that resolves to of such. It is OK to return the given * `item`. When no result is returned, the given `item` will be used. */ resolveCompletionItem?( item: CompletionItem, token: CancellationToken ): ProviderResult } /** * The hover provider interface defines the contract between extensions and * the [hover](https://code.visualstudio.com/docs/editor/intellisense)-feature. */ export interface HoverProvider { /** * Provide a hover for the given position and document. Multiple hovers at the same * position will be merged by the editor. A hover can have a range which defaults * to the word range at the position when omitted. * * @param document The document in which the command was invoked. * @param position The position at which the command was invoked. * @param token A cancellation token. * @return A hover or a thenable that resolves to such. The lack of a result can be * signaled by returning `undefined` or `null`. */ provideHover( document: LinesTextDocument, position: Position, token: CancellationToken ): ProviderResult } /** * The definition provider interface defines the contract between extensions and * the [go to definition](https://code.visualstudio.com/docs/editor/editingevolved#_go-to-definition) * and peek definition features. */ export interface DefinitionProvider { /** * Provide the definition of the symbol at the given position and document. * * @param document The document in which the command was invoked. * @param position The position at which the command was invoked. * @param token A cancellation token. * @return A definition or a thenable that resolves to such. The lack of a result can be * signaled by returning `undefined` or `null`. */ provideDefinition( document: LinesTextDocument, position: Position, token: CancellationToken ): ProviderResult } /** * The definition provider interface defines the contract between extensions and * the [go to definition](https://code.visualstudio.com/docs/editor/editingevolved#_go-to-definition) * and peek definition features. */ export interface DeclarationProvider { /** * Provide the declaration of the symbol at the given position and document. */ provideDeclaration( document: LinesTextDocument, position: Position, token: CancellationToken ): ProviderResult } /** * The signature help provider interface defines the contract between extensions and * the [parameter hints](https://code.visualstudio.com/docs/editor/intellisense)-feature. */ export interface SignatureHelpProvider { /** * Provide help for the signature at the given position and document. * * @param document The document in which the command was invoked. * @param position The position at which the command was invoked. * @param token A cancellation token. * @return Signature help or a thenable that resolves to such. The lack of a result can be * signaled by returning `undefined` or `null`. */ provideSignatureHelp( document: LinesTextDocument, position: Position, token: CancellationToken, context: SignatureHelpContext ): ProviderResult } /** * The type definition provider defines the contract between extensions and * the go to type definition feature. */ export interface TypeDefinitionProvider { /** * Provide the type definition of the symbol at the given position and document. * * @param document The document in which the command was invoked. * @param position The position at which the command was invoked. * @param token A cancellation token. * @return A definition or a thenable that resolves to such. The lack of a result can be * signaled by returning `undefined` or `null`. */ provideTypeDefinition( document: LinesTextDocument, position: Position, token: CancellationToken ): ProviderResult } /** * Value-object that contains additional information when * requesting references. */ export interface ReferenceContext { /** * Include the declaration of the current symbol. */ includeDeclaration: boolean } /** * The reference provider interface defines the contract between extensions and * the [find references](https://code.visualstudio.com/docs/editor/editingevolved#_peek)-feature. */ export interface ReferenceProvider { /** * Provide a set of project-wide references for the given position and document. * * @param document The document in which the command was invoked. * @param position The position at which the command was invoked. * @param context * @param token A cancellation token. * @return An array of locations or a thenable that resolves to such. The lack of a result can be * signaled by returning `undefined`, `null`, or an empty array. */ provideReferences( document: LinesTextDocument, position: Position, context: ReferenceContext, token: CancellationToken ): ProviderResult } /** * Folding context (for future use) */ export interface FoldingContext {} /** * The folding range provider interface defines the contract between extensions and * [Folding](https://code.visualstudio.com/docs/editor/codebasics#_folding) in the editor. */ export interface FoldingRangeProvider { /** * Returns a list of folding ranges or null and undefined if the provider * does not want to participate or was cancelled. * * @param document The document in which the command was invoked. * @param context Additional context information (for future use) * @param token A cancellation token. */ provideFoldingRanges( document: LinesTextDocument, context: FoldingContext, token: CancellationToken ): ProviderResult } /** * The document symbol provider interface defines the contract between extensions and * the [go to symbol](https://code.visualstudio.com/docs/editor/editingevolved#_go-to-symbol)-feature. */ export interface DocumentSymbolProvider { /** * Provide symbol information for the given document. * * @param document The document in which the command was invoked. * @param token A cancellation token. * @return An array of document highlights or a thenable that resolves to such. The lack of a result can be * signaled by returning `undefined`, `null`, or an empty array. */ provideDocumentSymbols( document: LinesTextDocument, token: CancellationToken ): ProviderResult } /** * The implementation provider interface defines the contract between extensions and * the go to implementation feature. */ export interface ImplementationProvider { /** * Provide the implementations of the symbol at the given position and document. * * @param document The document in which the command was invoked. * @param position The position at which the command was invoked. * @param token A cancellation token. * @return A definition or a thenable that resolves to such. The lack of a result can be * signaled by returning `undefined` or `null`. */ provideImplementation( document: LinesTextDocument, position: Position, token: CancellationToken ): ProviderResult } /** * The workspace symbol provider interface defines the contract between extensions and * the [symbol search](https://code.visualstudio.com/docs/editor/editingevolved#_open-symbol-by-name)-feature. */ export interface WorkspaceSymbolProvider { /** * Project-wide search for a symbol matching the given query string. It is up to the provider * how to search given the query string, like substring, indexOf etc. To improve performance implementors can * skip the [location](#SymbolInformation.location) of symbols and implement `resolveWorkspaceSymbol` to do that * later. * * The `query`-parameter should be interpreted in a *relaxed way* as the editor will apply its own highlighting * and scoring on the results. A good rule of thumb is to match case-insensitive and to simply check that the * characters of *query* appear in their order in a candidate symbol. Don't use prefix, substring, or similar * strict matching. * * @param query A non-empty query string. * @param token A cancellation token. * @return An array of document highlights or a thenable that resolves to such. The lack of a result can be * signaled by returning `undefined`, `null`, or an empty array. */ provideWorkspaceSymbols( query: string, token: CancellationToken ): ProviderResult /** * Given a symbol fill in its [location](#SymbolInformation.location). This method is called whenever a symbol * is selected in the UI. Providers can implement this method and return incomplete symbols from * [`provideWorkspaceSymbols`](#WorkspaceSymbolProvider.provideWorkspaceSymbols) which often helps to improve * performance. * * @param symbol The symbol that is to be resolved. Guaranteed to be an instance of an object returned from an * earlier call to `provideWorkspaceSymbols`. * @param token A cancellation token. * @return The resolved symbol or a thenable that resolves to that. When no result is returned, * the given `symbol` is used. */ resolveWorkspaceSymbol?( symbol: SymbolInformation, token: CancellationToken ): ProviderResult } /** * The rename provider interface defines the contract between extensions and * the [rename](https://code.visualstudio.com/docs/editor/editingevolved#_rename-symbol)-feature. */ export interface RenameProvider { /** * Provide an edit that describes changes that have to be made to one * or many resources to rename a symbol to a different name. * * @param document The document in which the command was invoked. * @param position The position at which the command was invoked. * @param newName The new name of the symbol. If the given name is not valid, the provider must return a rejected promise. * @param token A cancellation token. * @return A workspace edit or a thenable that resolves to such. The lack of a result can be * signaled by returning `undefined` or `null`. */ provideRenameEdits( document: LinesTextDocument, position: Position, newName: string, token: CancellationToken ): ProviderResult /** * Optional function for resolving and validating a position *before* running rename. The result can * be a range or a range and a placeholder text. The placeholder text should be the identifier of the symbol * which is being renamed - when omitted the text in the returned range is used. * * @param document The document in which rename will be invoked. * @param position The position at which rename will be invoked. * @param token A cancellation token. * @return The range or range and placeholder text of the identifier that is to be renamed. The lack of a result can signaled by returning `undefined` or `null`. */ prepareRename?( document: LinesTextDocument, position: Position, token: CancellationToken ): ProviderResult } /** * The document formatting provider interface defines the contract between extensions and * the formatting-feature. */ export interface DocumentFormattingEditProvider { /** * Provide formatting edits for a whole document. * * @param document The document in which the command was invoked. * @param options Options controlling formatting. * @param token A cancellation token. * @return A set of text edits or a thenable that resolves to such. The lack of a result can be * signaled by returning `undefined`, `null`, or an empty array. */ provideDocumentFormattingEdits( document: LinesTextDocument, options: FormattingOptions, token: CancellationToken ): ProviderResult } /** * The document formatting provider interface defines the contract between extensions and * the formatting-feature. */ export interface DocumentRangeFormattingEditProvider { /** * Provide formatting edits for a range in a document. * * The given range is a hint and providers can decide to format a smaller * or larger range. Often this is done by adjusting the start and end * of the range to full syntax nodes. * * @param document The document in which the command was invoked. * @param range The range which should be formatted. * @param options Options controlling formatting. * @param token A cancellation token. * @return A set of text edits or a thenable that resolves to such. The lack of a result can be * signaled by returning `undefined`, `null`, or an empty array. */ provideDocumentRangeFormattingEdits( document: LinesTextDocument, range: Range, options: FormattingOptions, token: CancellationToken ): ProviderResult } /** * The code action interface defines the contract between extensions and * the [light bulb](https://code.visualstudio.com/docs/editor/editingevolved#_code-action) feature. * * A code action can be any command that is [known](#commands.getCommands) to the system. */ export interface CodeActionProvider { /** * Provide commands for the given document and range. * * @param document The document in which the command was invoked. * @param range The selector or range for which the command was invoked. This will always be a selection if * there is a currently active editor. * @param context Context carrying additional information. * @param token A cancellation token. * @return An array of commands, quick fixes, or refactorings or a thenable of such. The lack of a result can be * signaled by returning `undefined`, `null`, or an empty array. */ provideCodeActions( document: LinesTextDocument, range: Range, context: CodeActionContext, token: CancellationToken ): ProviderResult<(Command | CodeAction)[]> /** * Given a code action fill in its [`edit`](#CodeAction.edit)-property. Changes to * all other properties, like title, are ignored. A code action that has an edit * will not be resolved. * * @param codeAction A code action. * @param token A cancellation token. * @return The resolved code action or a thenable that resolves to such. It is OK to return the given * `item`. When no result is returned, the given `item` will be used. */ resolveCodeAction?(codeAction: T, token: CancellationToken): ProviderResult } /** * Metadata about the type of code actions that a [CodeActionProvider](#CodeActionProvider) providers */ export interface CodeActionProviderMetadata { /** * [CodeActionKinds](#CodeActionKind) that this provider may return. * * The list of kinds may be generic, such as `CodeActionKind.Refactor`, or the provider * may list our every specific kind they provide, such as `CodeActionKind.Refactor.Extract.append('function`)` */ readonly providedCodeActionKinds?: ReadonlyArray } /** * The document highlight provider interface defines the contract between extensions and * the word-highlight-feature. */ export interface DocumentHighlightProvider { /** * Provide a set of document highlights, like all occurrences of a variable or * all exit-points of a function. * * @param document The document in which the command was invoked. * @param position The position at which the command was invoked. * @param token A cancellation token. * @return An array of document highlights or a thenable that resolves to such. The lack of a result can be * signaled by returning `undefined`, `null`, or an empty array. */ provideDocumentHighlights( document: LinesTextDocument, position: Position, token: CancellationToken ): ProviderResult } /** * The document link provider defines the contract between extensions and feature of showing * links in the editor. */ export interface DocumentLinkProvider { /** * Provide links for the given document. Note that the editor ships with a default provider that detects * `http(s)` and `file` links. * * @param document The document in which the command was invoked. * @param token A cancellation token. * @return An array of [document links](#DocumentLink) or a thenable that resolves to such. The lack of a result * can be signaled by returning `undefined`, `null`, or an empty array. */ provideDocumentLinks(document: LinesTextDocument, token: CancellationToken): ProviderResult /** * Given a link fill in its [target](#DocumentLink.target). This method is called when an incomplete * link is selected in the UI. Providers can implement this method and return incomple links * (without target) from the [`provideDocumentLinks`](#DocumentLinkProvider.provideDocumentLinks) method which * often helps to improve performance. * * @param link The link that is to be resolved. * @param token A cancellation token. */ resolveDocumentLink?(link: DocumentLink, token: CancellationToken): ProviderResult } /** * A code lens provider adds [commands](#Command) to source text. The commands will be shown * as dedicated horizontal lines in between the source text. */ export interface CodeLensProvider { /** * Compute a list of [lenses](#CodeLens). This call should return as fast as possible and if * computing the commands is expensive implementors should only return code lens objects with the * range set and implement [resolve](#CodeLensProvider.resolveCodeLens). * * @param document The document in which the command was invoked. * @param token A cancellation token. * @return An array of code lenses or a thenable that resolves to such. The lack of a result can be * signaled by returning `undefined`, `null`, or an empty array. */ provideCodeLenses(document: LinesTextDocument, token: CancellationToken): ProviderResult /** * This function will be called for each visible code lens, usually when scrolling and after * calls to [compute](#CodeLensProvider.provideCodeLenses)-lenses. * * @param codeLens code lens that must be resolved. * @param token A cancellation token. * @return The given, resolved code lens or thenable that resolves to such. */ resolveCodeLens?(codeLens: CodeLens, token: CancellationToken): ProviderResult } /** * The document formatting provider interface defines the contract between extensions and * the formatting-feature. */ export interface OnTypeFormattingEditProvider { /** * Provide formatting edits after a character has been typed. * * The given position and character should hint to the provider * what range the position to expand to, like find the matching `{` * when `}` has been entered. * * @param document The document in which the command was invoked. * @param position The position at which the command was invoked. * @param ch The character that has been typed. * @param options Options controlling formatting. * @param token A cancellation token. * @return A set of text edits or a thenable that resolves to such. The lack of a result can be * signaled by returning `undefined`, `null`, or an empty array. */ provideOnTypeFormattingEdits(document: LinesTextDocument, position: Position, ch: string, options: FormattingOptions, token: CancellationToken): ProviderResult } /** * The document color provider defines the contract between extensions and feature of * picking and modifying colors in the editor. */ export interface DocumentColorProvider { /** * Provide colors for the given document. * * @param document The document in which the command was invoked. * @param token A cancellation token. * @return An array of [color information](#ColorInformation) or a thenable that resolves to such. The lack of a result * can be signaled by returning `undefined`, `null`, or an empty array. */ provideDocumentColors(document: LinesTextDocument, token: CancellationToken): ProviderResult /** * Provide [representations](#ColorPresentation) for a color. * * @param color The color to show and insert. * @param context A context object with additional information * @param token A cancellation token. * @return An array of color presentations or a thenable that resolves to such. The lack of a result * can be signaled by returning `undefined`, `null`, or an empty array. */ provideColorPresentations(color: Color, context: { document: LinesTextDocument; range: Range }, token: CancellationToken): ProviderResult } export interface TextDocumentContentProvider { /** * An event to signal a resource has changed. */ onDidChange?: Event /** * Provide textual content for a given uri. * * The editor will use the returned string-content to create a readonly * [document](#LinesTextDocument). Resources allocated should be released when * the corresponding document has been [closed](#workspace.onDidCloseTextDocument). * * @param uri An uri which scheme matches the scheme this provider was [registered](#workspace.registerTextDocumentContentProvider) for. * @param token A cancellation token. * @return A string or a thenable that resolves to such. */ provideTextDocumentContent(uri: Uri, token: CancellationToken): ProviderResult } export interface SelectionRangeProvider { /** * Provide selection ranges starting at a given position. The first range must [contain](#Range.contains) * position and subsequent ranges must contain the previous range. */ provideSelectionRanges(document: LinesTextDocument, positions: Position[], token: CancellationToken): ProviderResult } /** * The call hierarchy provider interface describes the contract between extensions * and the call hierarchy feature which allows to browse calls and caller of function, * methods, constructor etc. */ export interface CallHierarchyProvider { /** * Bootstraps call hierarchy by returning the item that is denoted by the given document * and position. This item will be used as entry into the call graph. Providers should * return `undefined` or `null` when there is no item at the given location. * * @param document The document in which the command was invoked. * @param position The position at which the command was invoked. * @param token A cancellation token. * @returns A call hierarchy item or a thenable that resolves to such. The lack of a result can be * signaled by returning `undefined` or `null`. */ prepareCallHierarchy(document: LinesTextDocument, position: Position, token: CancellationToken): ProviderResult /** * Provide all incoming calls for an item, e.g all callers for a method. In graph terms this describes directed * and annotated edges inside the call graph, e.g the given item is the starting node and the result is the nodes * that can be reached. * * @param item The hierarchy item for which incoming calls should be computed. * @param token A cancellation token. * @returns A set of incoming calls or a thenable that resolves to such. The lack of a result can be * signaled by returning `undefined` or `null`. */ provideCallHierarchyIncomingCalls(item: CallHierarchyItem, token: CancellationToken): ProviderResult /** * Provide all outgoing calls for an item, e.g call calls to functions, methods, or constructors from the given item. In * graph terms this describes directed and annotated edges inside the call graph, e.g the given item is the starting * node and the result is the nodes that can be reached. * * @param item The hierarchy item for which outgoing calls should be computed. * @param token A cancellation token. * @returns A set of outgoing calls or a thenable that resolves to such. The lack of a result can be * signaled by returning `undefined` or `null`. */ provideCallHierarchyOutgoingCalls(item: CallHierarchyItem, token: CancellationToken): ProviderResult } /** * The document semantic tokens provider interface defines the contract between extensions and * semantic tokens. */ export interface DocumentSemanticTokensProvider { /** * An optional event to signal that the semantic tokens from this provider have changed. */ // TODO: SemantiTokens onDidChangeSemanticTokens?: Event /** * Tokens in a file are represented as an array of integers. The position of each token is expressed relative to * the token before it, because most tokens remain stable relative to each other when edits are made in a file. * * --- * In short, each token takes 5 integers to represent, so a specific token `i` in the file consists of the following array indices: * * - at index `5*i` - `deltaLine`: token line number, relative to the previous token * - at index `5*i+1` - `deltaStart`: token start character, relative to the previous token (relative to 0 or the previous token's start if they are on the same line) * - at index `5*i+2` - `length`: the length of the token. A token cannot be multiline. * - at index `5*i+3` - `tokenType`: will be looked up in `SemanticTokensLegend.tokenTypes`. We currently ask that `tokenType` < 65536. * - at index `5*i+4` - `tokenModifiers`: each set bit will be looked up in `SemanticTokensLegend.tokenModifiers` * * --- * ### How to encode tokens * * Here is an example for encoding a file with 3 tokens in a uint32 array: * ``` * { line: 2, startChar: 5, length: 3, tokenType: "property", tokenModifiers: ["private", "static"] }, * { line: 2, startChar: 10, length: 4, tokenType: "type", tokenModifiers: [] }, * { line: 5, startChar: 2, length: 7, tokenType: "class", tokenModifiers: [] } * ``` * * 1. First of all, a legend must be devised. This legend must be provided up-front and capture all possible token types. * For this example, we will choose the following legend which must be passed in when registering the provider: * ``` * tokenTypes: ['property', 'type', 'class'], * tokenModifiers: ['private', 'static'] * ``` * * 2. The first transformation step is to encode `tokenType` and `tokenModifiers` as integers using the legend. Token types are looked * up by index, so a `tokenType` value of `1` means `tokenTypes[1]`. Multiple token modifiers can be set by using bit flags, * so a `tokenModifier` value of `3` is first viewed as binary `0b00000011`, which means `[tokenModifiers[0], tokenModifiers[1]]` because * bits 0 and 1 are set. Using this legend, the tokens now are: * ``` * { line: 2, startChar: 5, length: 3, tokenType: 0, tokenModifiers: 3 }, * { line: 2, startChar: 10, length: 4, tokenType: 1, tokenModifiers: 0 }, * { line: 5, startChar: 2, length: 7, tokenType: 2, tokenModifiers: 0 } * ``` * * 3. The next step is to represent each token relative to the previous token in the file. In this case, the second token * is on the same line as the first token, so the `startChar` of the second token is made relative to the `startChar` * of the first token, so it will be `10 - 5`. The third token is on a different line than the second token, so the * `startChar` of the third token will not be altered: * ``` * { deltaLine: 2, deltaStartChar: 5, length: 3, tokenType: 0, tokenModifiers: 3 }, * { deltaLine: 0, deltaStartChar: 5, length: 4, tokenType: 1, tokenModifiers: 0 }, * { deltaLine: 3, deltaStartChar: 2, length: 7, tokenType: 2, tokenModifiers: 0 } * ``` * * 4. Finally, the last step is to inline each of the 5 fields for a token in a single array, which is a memory friendly representation: * ``` * // 1st token, 2nd token, 3rd token * [ 2,5,3,0,3, 0,5,4,1,0, 3,2,7,2,0 ] * ``` * * @see [SemanticTokensBuilder](#SemanticTokensBuilder) for a helper to encode tokens as integers. * *NOTE*: When doing edits, it is possible that multiple edits occur until VS Code decides to invoke the semantic tokens provider. * *NOTE*: If the provider cannot temporarily compute semantic tokens, it can indicate this by throwing an error with the message 'Busy'. */ provideDocumentSemanticTokens(document: LinesTextDocument, token: CancellationToken): ProviderResult /** * Instead of always returning all the tokens in a file, it is possible for a `DocumentSemanticTokensProvider` to implement * this method (`provideDocumentSemanticTokensEdits`) and then return incremental updates to the previously provided semantic tokens. * * --- * ### How tokens change when the document changes * * Suppose that `provideDocumentSemanticTokens` has previously returned the following semantic tokens: * ``` * // 1st token, 2nd token, 3rd token * [ 2,5,3,0,3, 0,5,4,1,0, 3,2,7,2,0 ] * ``` * * Also suppose that after some edits, the new semantic tokens in a file are: * ``` * // 1st token, 2nd token, 3rd token * [ 3,5,3,0,3, 0,5,4,1,0, 3,2,7,2,0 ] * ``` * It is possible to express these new tokens in terms of an edit applied to the previous tokens: * ``` * [ 2,5,3,0,3, 0,5,4,1,0, 3,2,7,2,0 ] // old tokens * [ 3,5,3,0,3, 0,5,4,1,0, 3,2,7,2,0 ] // new tokens * * edit: { start: 0, deleteCount: 1, data: [3] } // replace integer at offset 0 with 3 * ``` * * *NOTE*: If the provider cannot compute `SemanticTokensEdits`, it can "give up" and return all the tokens in the document again. * *NOTE*: All edits in `SemanticTokensEdits` contain indices in the old integers array, so they all refer to the previous result state. */ provideDocumentSemanticTokensEdits?(document: LinesTextDocument, previousResultId: string, token: CancellationToken): ProviderResult } /** * The document range semantic tokens provider interface defines the contract between extensions and * semantic tokens. */ export interface DocumentRangeSemanticTokensProvider { /** * @see [provideDocumentSemanticTokens](#DocumentSemanticTokensProvider.provideDocumentSemanticTokens). */ provideDocumentRangeSemanticTokens(document: LinesTextDocument, range: Range, token: CancellationToken): ProviderResult } export interface LinkedEditingRangeProvider { /** * For a given position in a document, returns the range of the symbol at the position and all ranges * that have the same content. A change to one of the ranges can be applied to all other ranges if the new content * is valid. An optional word pattern can be returned with the result to describe valid contents. * If no result-specific word pattern is provided, the word pattern from the language configuration is used. * * @param document The document in which the provider was invoked. * @param position The position at which the provider was invoked. * @param token A cancellation token. * @return A list of ranges that can be edited together */ provideLinkedEditingRanges(document: LinesTextDocument, position: Position, token: CancellationToken): ProviderResult } /** * The inlay hints provider interface defines the contract between extensions and * the inlay hints feature. */ export interface InlayHintsProvider { /** * An optional event to signal that inlay hints from this provider have changed. */ onDidChangeInlayHints?: Event /** * Provide inlay hints for the given range and document. * * *Note* that inlay hints that are not {@link Range.contains contained} by the given range are ignored. * * @param document The document in which the command was invoked. * @param range The range for which inlay hints should be computed. * @param token A cancellation token. * @return An array of inlay hints or a thenable that resolves to such. */ provideInlayHints(document: TextDocument, range: Range, token: CancellationToken): ProviderResult /** * Given an inlay hint fill in {@link InlayHint.tooltip tooltip}, {@link InlayHint.textEdits text edits}, * or complete label {@link InlayHintLabelPart parts}. * * *Note* that the editor will resolve an inlay hint at most once. * * @param hint An inlay hint. * @param token A cancellation token. * @return The resolved inlay hint or a thenable that resolves to such. It is OK to return the given `item`. When no result is returned, the given `item` will be used. */ resolveInlayHint?(hint: T, token: CancellationToken): ProviderResult } // }} // Classes {{ /** * A semantic tokens builder can help with creating a `SemanticTokens` instance * which contains delta encoded semantic tokens. */ export class SemanticTokensBuilder { constructor(legend?: SemanticTokensLegend) /** * Add another token. * * @public * @param line The token start line number (absolute value). * @param char The token start character (absolute value). * @param length The token length in characters. * @param tokenType The encoded token type. * @param tokenModifiers The encoded token modifiers. */ push(line: number, char: number, length: number, tokenType: number, tokenModifiers?: number): void /** * Add another token. Use only when providing a legend. * * @public * @param range The range of the token. Must be single-line. * @param tokenType The token type. * @param tokenModifiers The token modifiers. */ push(range: Range, tokenType: string, tokenModifiers?: string[]): void /** * Finish and create a `SemanticTokens` instance. * * @public */ build(resultId?: string): SemanticTokens } export interface Document { readonly buffer: Buffer /** * Document is attached to vim. */ readonly attached: boolean /** * Is command line document. */ readonly isCommandLine: boolean /** * `buftype` option of buffer. */ readonly buftype: string /** * Text document that synchronized. */ readonly textDocument: LinesTextDocument /** * Fired when document change. */ readonly onDocumentChange: Event /** * Get current buffer changedtick. */ readonly changedtick: number /** * Scheme of document. */ readonly schema: string /** * Line count of current buffer. */ readonly lineCount: number /** * Window ID when buffer create, could be -1 when no window associated. */ readonly winid: number /** * Returns if current document is opended with previewwindow */ readonly previewwindow: boolean /** * Check if document changed after last synchronize */ readonly dirty: boolean /** * Buffer number */ readonly bufnr: number /** * Content of textDocument. */ readonly content: string /** * Converted filetype. */ readonly filetype: string /** * Main filetype of buffer, first part when buffer filetype contains dots. * Same as filetype most of the time. */ readonly languageId: string readonly uri: string readonly version: number /** * Apply text edits to document. `nvim_buf_set_text()` is used when possible * * @param {TextEdit[]} edits * @param {boolean} joinUndo - Join further changes with the previous undo block by `:undojoin`. * @param {boolean | Position} move - Move the cursor when true or from custom position. * @returns {Promise} */ applyEdits(edits: TextEdit[], joinUndo?: boolean, move?: boolean | Position): Promise /** * Change individual lines. * * @param {[number, string][]} lines * @returns {void} */ changeLines(lines: [number, string][]): Promise /** * Get offset from lnum & col */ getOffset(lnum: number, col: number): number /** * Check string is word. */ isWord(word: string): boolean /** * Word range at position. * * @param {Position} position * @param {string} extraChars Extra characters that should be keyword. * @param {boolean} current Use current lines instead of textDocument, default to true. * @returns {Range | null} */ getWordRangeAtPosition(position: Position, extraChars?: string, current?: boolean): Range | null /** * Get ranges of word in textDocument. */ getSymbolRanges(word: string): Range[] /** * Get line for buffer * * @param {number} line 0 based line index. * @param {boolean} current Use textDocument lines when false, default to true. * @returns {string} */ getline(line: number, current?: boolean): string /** * Get range of current lines, zero indexed, end exclude. */ getLines(start?: number, end?: number): string[] /** * Get variable value by key, defined by `b:coc_{key}` */ getVar(key: string, defaultValue?: T): T /** * Get position from lnum & col */ getPosition(lnum: number, col: number): Position /** * Adjust col with new valid character before position. */ fixStartcol(position: Position, valids: string[]): number /** * Get current content text. */ getDocumentContent(): string } /** * Represents a {@link TextEditor text editor}'s {@link TextEditor.options options}. */ export interface TextEditorOptions { /** * The size in spaces a tab takes. This is used for two purposes: * - the rendering width of a tab character; * - the number of spaces to insert when {@link TextEditorOptions.insertSpaces insertSpaces} is true. * * When getting a text editor's options, this property will always be a number (resolved). */ tabSize: number /** * When pressing Tab insert {@link TextEditorOptions.tabSize n} spaces. * When getting a text editor's options, this property will always be a boolean (resolved). */ insertSpaces: boolean } /** * Represents an editor that is attached to a {@link TextDocument document}. */ export interface TextEditor { /** * The tabpagenr of current editor. */ readonly tabpagenr: number /** * The window id of current editor. */ readonly winid: number /** * The window number of current editor. */ readonly winnr: number /** * The document associated with this text editor. The document will be the same for the entire lifetime of this text editor. */ readonly document: Document /** * The current visible ranges in the editor (vertically). * This accounts only for vertical scrolling, and not for horizontal scrolling. */ readonly visibleRanges: readonly Range[] /** * Text editor options. */ readonly options: TextEditorOptions } export interface FloatWinConfig { maxHeight?: number maxWidth?: number preferTop?: boolean autoHide?: boolean offsetX?: number title?: string border?: number[] cursorline?: boolean close?: boolean highlight?: string borderhighlight?: string modes?: string[] shadow?: boolean winblend?: number focusable?: boolean excludeImages?: boolean } export interface Documentation { /** * Filetype used for highlight, markdown is supported. */ filetype: string /** * Content of document. */ content: string /** * Byte offset (0 based) that should be undelined. */ active?: [number, number] highlights?: HighlightItem[] } /** * Float window factory for create float around current cursor, works on vim and neovim. * Use `workspace.floatSupported` to check if float could work. * * Float windows are automatic reused and hidden on specific events including: * - BufEnter * - InsertEnter * - InsertLeave * - MenuPopupChanged * - CursorMoved * - CursorMovedI */ export class FloatFactory implements Disposable { get bufnr(): number | undefined get buffer(): Buffer | null get window(): Window | null activated(): Promise constructor(nvim: Neovim) /** * Show documentations in float window/popup around cursor. * Window and buffer are reused when possible. * Window is closed automatically on change buffer, InsertEnter, CursorMoved and CursorMovedI. * * @param docs List of documentations. * @param config Configuration for floating window/popup. */ show(docs: Documentation[], config?: FloatWinConfig): Promise /** * Close float window. */ close(): void dispose(): void } /** * A file glob pattern to match file paths against. This can either be a glob pattern string * (like `**​/*.{ts,js}` or `*.{ts,js}`) or a {@link RelativePattern relative pattern}. * * Glob patterns can have the following syntax: * * `*` to match one or more characters in a path segment * * `?` to match on one character in a path segment * * `**` to match any number of path segments, including none * * `{}` to group conditions (e.g. `**​/*.{ts,js}` matches all TypeScript and JavaScript files) * * `[]` to declare a range of characters to match in a path segment (e.g., `example.[0-9]` to match on `example.0`, `example.1`, …) * * `[!...]` to negate a range of characters to match in a path segment (e.g., `example.[!0-9]` to match on `example.a`, `example.b`, but not `example.0`) * * Note: a backslash (`\`) is not valid within a glob pattern. If you have an existing file * path to match against, consider to use the {@link RelativePattern relative pattern} support * that takes care of converting any backslash into slash. Otherwise, make sure to convert * any backslash to slash when creating the glob pattern. */ export type GlobPattern = string | RelativePattern /** * A relative pattern is a helper to construct glob patterns that are matched * relatively to a base file path. The base path can either be an absolute file * path as string or uri or a {@link WorkspaceFolder workspace folder}, which is the * preferred way of creating the relative pattern. */ export class RelativePattern { /** * A base file path to which this pattern will be matched against relatively. */ baseUri: Uri /** * A file glob pattern like `*.{ts,js}` that will be matched on file paths * relative to the base path. * * Example: Given a base of `/home/work/folder` and a file path of `/home/work/folder/index.js`, * the file glob pattern will match on `index.js`. */ pattern: string /** * Creates a new relative pattern object with a base file path and pattern to match. This pattern * will be matched on file paths relative to the base. * * Example: * ```ts * const folder = vscode.workspace.workspaceFolders?.[0]; * if (folder) { * * // Match any TypeScript file in the root of this workspace folder * const pattern1 = new vscode.RelativePattern(folder, '*.ts'); * * // Match any TypeScript file in `someFolder` inside this workspace folder * const pattern2 = new vscode.RelativePattern(folder, 'someFolder/*.ts'); * } * ``` * * @param base A base to which this pattern will be matched against relatively. It is recommended * to pass in a {@link WorkspaceFolder workspace folder} if the pattern should match inside the workspace. * Otherwise, a uri or string should only be used if the pattern is for a file path outside the workspace. * @param pattern A file glob pattern like `*.{ts,js}` that will be matched on paths relative to the base. */ constructor(base: WorkspaceFolder | Uri | string, pattern: string) } /** * Build buffer with lines and highlights */ export class Highlighter { constructor(srcId?: number) /** * Add a line with highlight group. */ addLine(line: string, hlGroup?: string): void /** * Add lines without highlights. */ addLines(lines: string[]): void /** * Add text with highlight. */ addText(text: string, hlGroup?: string): void /** * Get line count */ get length(): number /** * Render lines to buffer at specified range. * Since notifications is used, use `nvim.pauseNotification` & `nvim.resumeNotification` * when you need to wait for the request finish. * * @param {Buffer} buffer * @param {number} start * @param {number} end * @returns {void} */ render(buffer: Buffer, start?: number, end?: number): void } export interface ListConfiguration { get(key: string, defaultValue?: T): T previousKey(): string nextKey(): string dispose(): void } export interface ListActionOptions { /** * No prompt stop and window switch when invoked. */ persist?: boolean /** * Reload list after action invoked. */ reload?: boolean /** * Support multiple items as execute argument. */ parallel?: boolean /** * Tab positioned list should be persisted (no window switch) on action invoke. */ tabPersist?: boolean } export interface CommandTaskOption { /** * Command to run. */ cmd: string /** * Arguments of command. */ args: string[] /** * Current working directory. */ cwd?: string env?: NodeJS.ProcessEnv /** * Runs for each line, return undefined for invalid item. */ onLine: (line: string) => ListItem | undefined } export abstract class BasicList implements IList { /** * Unique name, must be provided by implementation class. */ name: string /** * Default action name invoked by by default, must be provided by implementation class. */ defaultAction: string /** * Registered actions. */ readonly actions: ListAction[] /** * Arguments configuration of list. */ options: ListArgument[] protected nvim: Neovim protected disposables: Disposable[] protected config: ListConfiguration constructor(nvim: Neovim) /** * Should align columns when true. */ get alignColumns(): boolean get hlGroup(): string get previewHeight(): string get splitRight(): boolean /** * Parse argument string array for argument object from `this.options`. * Could be used inside `this.loadItems()` */ protected parseArguments(args: string[]): { [key: string]: string | boolean } /** * Get configurations of current list */ protected getConfig(): WorkspaceConfiguration /** * Add an action */ protected addAction(name: string, fn: (item: ListItem, context: ListContext) => ProviderResult, options?: ListActionOptions): void /** * Add action that support multiple selection. */ protected addMultipleAction(name: string, fn: (item: ListItem[], context: ListContext) => ProviderResult, options?: ListActionOptions): void /** * Create task from command task option. */ protected createCommandTask(opt: CommandTaskOption): ListTask /** * Add location related actions, should be called in constructor. */ protected addLocationActions(): void protected convertLocation(location: Location | LocationWithLine | string): Promise /** * Jump to location * * @method */ protected jumpTo(location: Location | LocationWithLine | string, command?: string): Promise /** * Preview location. * * @method */ protected previewLocation(location: Location, context: ListContext): Promise /** * Preview lines. * * @method */ protected preview(options: PreviewOptions, context: ListContext): Promise /** * Use for syntax highlights, invoked after buffer loaded. */ doHighlight(): void /** * Invoked for listItems or listTask, could throw error when failed to load. */ abstract loadItems(context: ListContext, token?: CancellationToken): Promise } export class Mutex { /** * Returns true when task is running. */ get busy(): boolean /** * Resolved release function that must be called after task finish. */ acquire(): Promise<() => void> /** * Captrue the async task function that ensures to be executed one by one. */ use(f: () => Promise): Promise } // }} // functions {{ export interface AnsiItem { foreground?: string background?: string bold?: boolean italic?: boolean underline?: boolean text: string } export interface ParsedUrlQueryInput { [key: string]: unknown } export interface FetchOptions { /** * Default to 'GET' */ method?: string /** * Default no timeout */ timeout?: number /** * Always return buffer instead of parsed response. */ buffer?: boolean /** * Data send to server. */ data?: string | { [key: string]: any } | Buffer /** * Plain object added as query of url */ query?: ParsedUrlQueryInput headers?: any /** * User for http basic auth, should use with password */ user?: string /** * Password for http basic auth, should use with user */ password?: string } export interface DownloadOptions extends Omit { /** * Folder that contains downloaded file or extracted files by untar or unzip */ dest: string /** * Remove the specified number of leading path elements for *untar* only, default to `1`. */ strip?: number /** * If true, use untar for `.tar.gz` filename */ extract?: boolean | 'untar' | 'unzip' onProgress?: (percent: string) => void } export type ResponseResult = string | Buffer | { [name: string]: any } /** * Parse ansi result from string contains ansi characters. */ export function ansiparse(str: string): AnsiItem[] /** * Send request to server for response, supports: * * - Send json data and parse json response. * - Throw error for failed response statusCode. * - Timeout support (no timeout by default). * - Send buffer (as data) and receive data (as response). * - Proxy support from user configuration & environment. * - Redirect support, limited to 3. * - Support of gzip & deflate response content. * * @return Parsed object if response content type is application/json, text if content type starts with `text/` */ export function fetch(url: string, options?: FetchOptions, token?: CancellationToken): Promise /** * Download file from url, with optional untar/unzip support. * * Note: you may need to set `strip` to 0 when using untar as extract method. * * @param {string} url * @param {DownloadOptions} options contains dest folder and optional onProgress callback */ export function download(url: string, options: DownloadOptions, token?: CancellationToken): Promise interface ExecOptions { cwd?: string env?: NodeJS.ProcessEnv shell?: string timeout?: number maxBuffer?: number killSignal?: string uid?: number gid?: number windowsHide?: boolean } /** * Dispose all disposables. */ export function disposeAll(disposables: Disposable[]): void /** * Concurrent run async functions with limit support. */ export function concurrent(arr: T[], fn: (val: T) => Promise, limit?: number): Promise /** * Create promise resolved after ms milliseconds. */ export function wait(ms: number): Promise /** * Run command with `child_process.exec` */ export function runCommand(cmd: string, opts?: ExecOptions, timeout?: number): Promise /** * Check if process with pid is running */ export function isRunning(pid: number): boolean /** * Check if command is executable. */ export function executable(command: string): boolean /** * Watch single file for change, the filepath needs to be exists file. * * @param filepath Full path of file. * @param onChange Handler on file change detected. */ export function watchFile(filepath: string, onChange: () => void): Disposable // }} // commands module {{ export interface CommandItem { id: string internal?: boolean execute(...args: any[]): any } /** * Namespace for dealing with commands of coc.nvim */ export namespace commands { /** * Registered commands. */ export const commandList: CommandItem[] /** * Execute specified command. * * @deprecated use `executeCommand()` instead. */ export function execute(command: { name: string, arguments?: any[] }): void /** * Check if command is registered. * * @param id Unique id of command. */ export function has(id: string): boolean /** * Registers a command that can be invoked via a keyboard shortcut, * a menu item, an action, or directly. * * Registering a command with an existing command identifier twice * will cause an error. * * @param command A unique identifier for the command. * @param impl A command handler function. * @param thisArg The `this` context used when invoking the handler function. * @return Disposable which unregisters this command on disposal. */ export function registerCommand(id: string, impl: (...args: any[]) => void, thisArg?: any, internal?: boolean): Disposable /** * Executes the command denoted by the given command identifier. * * * *Note 1:* When executing an editor command not all types are allowed to * be passed as arguments. Allowed are the primitive types `string`, `boolean`, * `number`, `undefined`, and `null`, as well as [`Position`](#Position), [`Range`](#Range), [`URI`](#URI) and [`Location`](#Location). * * *Note 2:* There are no restrictions when executing commands that have been contributed * by extensions. * * @param command Identifier of the command to execute. * @param rest Parameters passed to the command function. * @return A promise that resolves to the returned value of the given command. `undefined` when * the command handler function doesn't return anything. */ export function executeCommand(command: string, ...rest: any[]): Promise /** * Open uri with external tool, use `open` on mac, use `xdg-open` on linux. */ export function executeCommand(command: 'vscode.open', uri: string | Uri): Promise /** * Reload current buffer by `:edit` command. */ export function executeCommand(command: 'workbench.action.reloadWindow'): Promise /** * Insert snippet at range of current buffer. * * @param edit Contains snippet text and range to replace. */ export function executeCommand(command: 'editor.action.insertSnippet', edit: TextEdit, ultisnip?: UltiSnippetOption): Promise /** * Invoke specified code action. */ export function executeCommand(command: 'editor.action.doCodeAction', action: CodeAction): Promise /** * Trigger coc.nvim's completion at current cursor position. */ export function executeCommand(command: 'editor.action.triggerSuggest'): Promise /** * Trigger signature help at current cursor position. */ export function executeCommand(command: 'editor.action.triggerParameterHints'): Promise /** * Add ranges to cursors session for multiple cursors. */ export function executeCommand(command: 'editor.action.addRanges', ranges: Range[]): Promise /** * Restart coc.nvim service by `:CocRestart` command. */ export function executeCommand(command: 'editor.action.restart'): Promise /** * Show locations by location list or vim's quickfix list. */ export function executeCommand(command: 'editor.action.showReferences', filepath: string | undefined, position: Position | undefined, locations: Location[]): Promise /** * Invoke rename action at position of specified uri. */ export function executeCommand(command: 'editor.action.rename', uri: string, position: Position): Promise /** * Run format action for current buffer. */ export function executeCommand(command: 'editor.action.format'): Promise } // }} // events module {{ type EventResult = void | Promise type MoveEvents = 'CursorMoved' | 'CursorMovedI' | 'CursorHold' | 'CursorHoldI' type BufEvents = 'BufHidden' | 'BufEnter' | 'BufWritePost' | 'InsertLeave' | 'TermOpen' | 'InsertEnter' | 'BufCreate' | 'BufUnload' | 'BufWritePre' | 'Enter' type EmptyEvents = 'FocusGained' | 'FocusLost' | 'InsertSnippet' type InsertChangeEvents = 'TextChangedP' | 'TextChangedI' type TaskEvents = 'TaskExit' | 'TaskStderr' | 'TaskStdout' type WindowEvents = 'WinLeave' | 'WinEnter' type AllEvents = BufEvents | EmptyEvents | MoveEvents | TaskEvents | WindowEvents | InsertChangeEvents | 'CompleteDone' | 'TextChanged' | 'MenuPopupChanged' | 'InsertCharPre' | 'FileType' | 'BufWinEnter' | 'BufWinLeave' | 'VimResized' | 'DirChanged' | 'OptionSet' | 'Command' | 'BufReadCmd' | 'GlobalChange' | 'InputChar' | 'WinLeave' | 'MenuInput' | 'PromptInsert' | 'FloatBtnClick' | 'InsertSnippet' | 'PromptKeyPress' type OptionValue = string | number | boolean type PromptWidowKeys = 'C-j' | 'C-k' | 'C-n' | 'C-p' | 'up' | 'down' export interface CursorPosition { readonly bufnr: number readonly lnum: number readonly col: number readonly insert: boolean } export interface InsertChange { /** * 1 based line number */ readonly lnum: number /** * 1 based column number */ readonly col: number /** * Text before cursor. */ readonly pre: string /** * Insert character that cause change of this time. */ readonly insertChar: string | undefined readonly changedtick: number } export interface PopupChangeEvent { readonly completed_item: VimCompleteItem readonly height: number readonly width: number readonly row: number readonly col: number readonly size: number readonly scrollbar: boolean } /** * Used for listen to events send from vim. */ export namespace events { /** * Latest cursor position. */ export const cursor: Readonly /** * Latest pum position, is true when pum positioned above current line. */ export const pumAlignTop: boolean /** * Insert mode detected by latest events. */ export const insertMode: boolean /** * Popup menu is visible. */ export const pumvisible: boolean /** * Wait for any of event in events to fire, resolve undefined when timeout or CancellationToken requested. * @param events Event names to wait. * @param timeoutOrToken Timeout in miniseconds or CancellationToken. * @return A [disposable](#Disposable) that unregisters this provider when being disposed. */ export function race(events: AllEvents[], timeoutOrToken?: number | CancellationToken): Promise<{ name: AllEvents, args: unknown[] } | undefined> /** * Attach handler to buffer events. */ export function on(event: BufEvents, handler: (bufnr: number) => EventResult, thisArg?: any, disposables?: Disposable[]): Disposable /** * Attach handler to mouse move events. */ export function on(event: MoveEvents, handler: (bufnr: number, cursor: [number, number]) => EventResult, thisArg?: any, disposables?: Disposable[]): Disposable /** * Attach handler to TextChangedI or TextChangedP. */ export function on(event: InsertChangeEvents, handler: (bufnr: number, info: InsertChange) => EventResult, thisArg?: any, disposables?: Disposable[]): Disposable /** * Attach handler to window event. */ export function on(event: WindowEvents, handler: (winid: number) => EventResult, thisArg?: any, disposables?: Disposable[]): Disposable /** * Attach handler to float button click. */ export function on(event: 'FloatBtnClick', handler: (bufnr: number, index: number) => EventResult, thisArg?: any, disposables?: Disposable[]): Disposable /** * Attach handler to keypress in prompt window. * Key could only be 'C-j', 'C-k', 'C-n', 'C-p', 'up' and 'down' */ export function on(event: 'PromptKeyPress', handler: (bufnr: number, key: PromptWidowKeys) => EventResult, thisArg?: any, disposables?: Disposable[]): Disposable /** * Fired on vim's TextChanged event. */ export function on(event: 'TextChanged', handler: (bufnr: number, changedtick: number) => EventResult, thisArg?: any, disposables?: Disposable[]): Disposable export function on(event: 'TaskExit', handler: (id: string, code: number) => EventResult, thisArg?: any, disposables?: Disposable[]): Disposable export function on(event: 'TaskStderr' | 'TaskStdout', handler: (id: string, lines: string[]) => EventResult, thisArg?: any, disposables?: Disposable[]): Disposable /** * Fired on vim's BufReadCmd event. */ export function on(event: 'BufReadCmd', handler: (scheme: string, fullpath: string) => EventResult, thisArg?: any, disposables?: Disposable[]): Disposable /** * Fired on vim's VimResized event. */ export function on(event: 'VimResized', handler: (columns: number, lines: number) => EventResult, thisArg?: any, disposables?: Disposable[]): Disposable export function on(event: 'MenuPopupChanged', handler: (event: PopupChangeEvent, cursorline: number) => EventResult, thisArg?: any, disposables?: Disposable[]): Disposable export function on(event: 'CompleteDone', handler: (item: VimCompleteItem) => EventResult, thisArg?: any, disposables?: Disposable[]): Disposable export function on(event: 'InsertCharPre', handler: (character: string) => EventResult, thisArg?: any, disposables?: Disposable[]): Disposable export function on(event: 'FileType', handler: (filetype: string, bufnr: number) => EventResult, thisArg?: any, disposables?: Disposable[]): Disposable export function on(event: 'BufWinEnter' | 'BufWinLeave', handler: (bufnr: number, winid: number) => EventResult, thisArg?: any, disposables?: Disposable[]): Disposable export function on(event: 'DirChanged', handler: (cwd: string) => EventResult, thisArg?: any, disposables?: Disposable[]): Disposable export function on(event: 'OptionSet' | 'GlobalChange', handler: (option: string, oldVal: OptionValue, newVal: OptionValue) => EventResult, thisArg?: any, disposables?: Disposable[]): Disposable export function on(event: 'InputChar', handler: (session: string, character: string, mode: number) => EventResult, thisArg?: any, disposables?: Disposable[]): Disposable export function on(event: 'PromptInsert', handler: (value: string, bufnr: number) => EventResult, thisArg?: any, disposables?: Disposable[]): Disposable export function on(event: 'Command', handler: (name: string) => EventResult, thisArg?: any, disposables?: Disposable[]): Disposable /** * Fired after user insert character and made change to the buffer. * Fired after TextChangedI & TextChangedP event. */ export function on(event: 'TextInsert', handler: (bufnr: number, info: InsertChange, character: string) => EventResult, thisArg?: any, disposables?: Disposable[]): Disposable export function on(event: EmptyEvents, handler: () => EventResult, thisArg?: any, disposables?: Disposable[]): Disposable export function on(event: AllEvents[], handler: (...args: unknown[]) => EventResult, thisArg?: any, disposables?: Disposable[]): Disposable } // }} // file events {{ /** * An event that is fired after files are created. */ export interface FileCreateEvent { /** * The files that got created. */ readonly files: ReadonlyArray } /** * An event that is fired when files are going to be created. * * To make modifications to the workspace before the files are created, * call the [`waitUntil](#FileWillCreateEvent.waitUntil)-function with a * thenable that resolves to a [workspace edit](#WorkspaceEdit). */ export interface FileWillCreateEvent { /** * A cancellation token. */ readonly token: CancellationToken /** * The files that are going to be created. */ readonly files: ReadonlyArray /** * Allows to pause the event and to apply a [workspace edit](#WorkspaceEdit). * * *Note:* This function can only be called during event dispatch and not * in an asynchronous manner: * * ```ts * workspace.onWillCreateFiles(event => { * // async, will *throw* an error * setTimeout(() => event.waitUntil(promise)); * * // sync, OK * event.waitUntil(promise); * }) * ``` * * @param thenable A thenable that delays saving. */ waitUntil(thenable: Thenable): void } /** * An event that is fired when files are going to be deleted. * * To make modifications to the workspace before the files are deleted, * call the [`waitUntil](#FileWillCreateEvent.waitUntil)-function with a * thenable that resolves to a [workspace edit](#WorkspaceEdit). */ export interface FileWillDeleteEvent { /** * The files that are going to be deleted. */ readonly files: ReadonlyArray /** * Allows to pause the event and to apply a [workspace edit](#WorkspaceEdit). * * *Note:* This function can only be called during event dispatch and not * in an asynchronous manner: * * ```ts * workspace.onWillCreateFiles(event => { * // async, will *throw* an error * setTimeout(() => event.waitUntil(promise)); * * // sync, OK * event.waitUntil(promise); * }) * ``` * * @param thenable A thenable that delays saving. */ waitUntil(thenable: Thenable): void } /** * An event that is fired after files are deleted. */ export interface FileDeleteEvent { /** * The files that got deleted. */ readonly files: ReadonlyArray } /** * An event that is fired after files are renamed. */ export interface FileRenameEvent { /** * The files that got renamed. */ readonly files: ReadonlyArray<{ oldUri: Uri, newUri: Uri }> } /** * An event that is fired when files are going to be renamed. * * To make modifications to the workspace before the files are renamed, * call the [`waitUntil](#FileWillCreateEvent.waitUntil)-function with a * thenable that resolves to a [workspace edit](#WorkspaceEdit). */ export interface FileWillRenameEvent { /** * The files that are going to be renamed. */ readonly files: ReadonlyArray<{ oldUri: Uri, newUri: Uri }> /** * Allows to pause the event and to apply a [workspace edit](#WorkspaceEdit). * * *Note:* This function can only be called during event dispatch and not * in an asynchronous manner: * * ```ts * workspace.onWillCreateFiles(event => { * // async, will *throw* an error * setTimeout(() => event.waitUntil(promise)); * * // sync, OK * event.waitUntil(promise); * }) * ``` * * @param thenable A thenable that delays saving. */ waitUntil(thenable: Thenable): void } // }} // languages module {{ export interface DocumentSymbolProviderMetadata { /** * A human-readable string that is shown when multiple outlines trees show for one document. */ label?: string } export namespace languages { /** * Create a diagnostics collection. * * @param name The [name](#DiagnosticCollection.name) of the collection. * @return A new diagnostic collection. */ export function createDiagnosticCollection(name?: string): DiagnosticCollection /** * Register a formatting provider that works on type. The provider is active when the user enables the setting `coc.preferences.formatOnType`. * * Multiple providers can be registered for a language. In that case providers are sorted * by their [score](#languages.match) and the best-matching provider is used. Failure * of the selected provider will cause a failure of the whole operation. * * @param selector A selector that defines the documents this provider is applicable to. * @param provider An on type formatting edit provider. * @param triggerCharacters Trigger character that should trigger format on type. * @return A [disposable](#Disposable) that unregisters this provider when being disposed. */ export function registerOnTypeFormattingEditProvider(selector: DocumentSelector, provider: OnTypeFormattingEditProvider, triggerCharacters: string[]): Disposable /** * Register a completion provider. * * Multiple providers can be registered for a language. In that case providers are sorted * by their [score](#languages.match) and groups of equal score are sequentially asked for * completion items. The process stops when one or many providers of a group return a * result. A failing provider (rejected promise or exception) will not fail the whole * operation. * * A completion item provider can be associated with a set of `triggerCharacters`. When trigger * characters are being typed, completions are requested but only from providers that registered * the typed character. Because of that trigger characters should be different than [word characters](#LanguageConfiguration.wordPattern), * a common trigger character is `.` to trigger member completions. * * @param name Name of completion source. * @param shortcut Shortcut used in completion menu. * @param selector Document selector of created completion source. * @param provider A completion provider. * @param triggerCharacters Trigger completion when the user types one of the characters. * @param priority Higher priority would shown first. * @param allCommitCharacters Commit characters of completion source. * @return A [disposable](#Disposable) that unregisters this provider when being disposed. */ export function registerCompletionItemProvider(name: string, shortcut: string, selector: DocumentSelector | null, provider: CompletionItemProvider, triggerCharacters?: string[], priority?: number, allCommitCharacters?: string[]): Disposable /** * Register a code action provider. * * Multiple providers can be registered for a language. In that case providers are asked in * parallel and the results are merged. A failing provider (rejected promise or exception) will * not cause a failure of the whole operation. * * @param selector A selector that defines the documents this provider is applicable to. * @param provider A code action provider. * @param clientId Optional id of language client. * @param codeActionKinds Optional supported code action kinds. * @return A [disposable](#Disposable) that unregisters this provider when being disposed. */ export function registerCodeActionProvider(selector: DocumentSelector, provider: CodeActionProvider, clientId: string | undefined, codeActionKinds?: string[]): Disposable /** * Register a hover provider. * * Multiple providers can be registered for a language. In that case providers are asked in * parallel and the results are merged. A failing provider (rejected promise or exception) will * not cause a failure of the whole operation. * * @param selector A selector that defines the documents this provider is applicable to. * @param provider A hover provider. * @return A [disposable](#Disposable) that unregisters this provider when being disposed. */ export function registerHoverProvider(selector: DocumentSelector, provider: HoverProvider): Disposable /** * Register a selection range provider. * * Multiple providers can be registered for a language. In that case providers are asked in * parallel and the results are merged. A failing provider (rejected promise or exception) will * not cause a failure of the whole operation. * * @param selector A selector that defines the documents this provider is applicable to. * @param provider A selection range provider. * @return A [disposable](#Disposable) that unregisters this provider when being disposed. */ export function registerSelectionRangeProvider(selector: DocumentSelector, provider: SelectionRangeProvider): Disposable /** * Register a signature help provider. * * Multiple providers can be registered for a language. In that case providers are sorted * by their [score](#languages.match) and called sequentially until a provider returns a * valid result. * * @param selector A selector that defines the documents this provider is applicable to. * @param provider A signature help provider. * @param triggerCharacters Trigger signature help when the user types one of the characters, like `,` or `(`. * @param metadata Information about the provider. * @return A [disposable](#Disposable) that unregisters this provider when being disposed. */ export function registerSignatureHelpProvider(selector: DocumentSelector, provider: SignatureHelpProvider, triggerCharacters?: string[]): Disposable /** * Register a document symbol provider. * * Multiple providers can be registered for a language. In that case providers only first provider * are asked for result. * * @param selector A selector that defines the documents this provider is applicable to. * @param provider A document symbol provider. * @param metadata Optional meta data. * @return A [disposable](#Disposable) that unregisters this provider when being disposed. */ export function registerDocumentSymbolProvider(selector: DocumentSelector, provider: DocumentSymbolProvider, metadata?: DocumentSymbolProviderMetadata): Disposable /** * Register a folding range provider. * * Multiple providers can be registered for a language. In that case providers only first provider * are asked for result. * * A failing provider (rejected promise or exception) will * not cause a failure of the whole operation. * * @param selector A selector that defines the documents this provider is applicable to. * @param provider A folding range provider. * @return A [disposable](#Disposable) that unregisters this provider when being disposed. */ export function registerFoldingRangeProvider(selector: DocumentSelector, provider: FoldingRangeProvider): Disposable /** * Register a document highlight provider. * * Multiple providers can be registered for a language. In that case providers are sorted * by their [score](#languages.match) and groups sequentially asked for document highlights. * The process stops when a provider returns a `non-falsy` or `non-failure` result. * * @param selector A selector that defines the documents this provider is applicable to. * @param provider A document highlight provider. * @return A [disposable](#Disposable) that unregisters this provider when being disposed. */ export function registerDocumentHighlightProvider(selector: DocumentSelector, provider: any): Disposable /** * Register a code lens provider. * * Multiple providers can be registered for a language. In that case providers are asked in * parallel and the results are merged. A failing provider (rejected promise or exception) will * not cause a failure of the whole operation. * * @param selector A selector that defines the documents this provider is applicable to. * @param provider A code lens provider. * @return A [disposable](#Disposable) that unregisters this provider when being disposed. */ export function registerCodeLensProvider(selector: DocumentSelector, provider: CodeLensProvider): Disposable /** * Register a document link provider. * * Multiple providers can be registered for a language. In that case providers are asked in * parallel and the results are merged. A failing provider (rejected promise or exception) will * not cause a failure of the whole operation. * * @param selector A selector that defines the documents this provider is applicable to. * @param provider A document link provider. * @return A [disposable](#Disposable) that unregisters this provider when being disposed. */ export function registerDocumentLinkProvider(selector: DocumentSelector, provider: DocumentLinkProvider): Disposable /** * Register a color provider. * * Multiple providers can be registered for a language. In that case providers are asked in * parallel and the results are merged. A failing provider (rejected promise or exception) will * not cause a failure of the whole operation. * * @param selector A selector that defines the documents this provider is applicable to. * @param provider A color provider. * @return A [disposable](#Disposable) that unregisters this provider when being disposed. */ export function registerDocumentColorProvider(selector: DocumentSelector, provider: DocumentColorProvider): Disposable /** * Register a definition provider. * * Multiple providers can be registered for a language. In that case providers are asked in * parallel and the results are merged. A failing provider (rejected promise or exception) will * not cause a failure of the whole operation. * * @param selector A selector that defines the documents this provider is applicable to. * @param provider A definition provider. * @return A [disposable](#Disposable) that unregisters this provider when being disposed. */ export function registerDefinitionProvider(selector: DocumentSelector, provider: DefinitionProvider): Disposable /** * Register a declaration provider. * * Multiple providers can be registered for a language. In that case providers are asked in * parallel and the results are merged. A failing provider (rejected promise or exception) will * not cause a failure of the whole operation. * * @param selector A selector that defines the documents this provider is applicable to. * @param provider A declaration provider. * @return A [disposable](#Disposable) that unregisters this provider when being disposed. */ export function registerDeclarationProvider(selector: DocumentSelector, provider: DeclarationProvider): Disposable /** * Register a type definition provider. * * Multiple providers can be registered for a language. In that case providers are asked in * parallel and the results are merged. A failing provider (rejected promise or exception) will * not cause a failure of the whole operation. * * @param selector A selector that defines the documents this provider is applicable to. * @param provider A type definition provider. * @return A [disposable](#Disposable) that unregisters this provider when being disposed. */ export function registerTypeDefinitionProvider(selector: DocumentSelector, provider: TypeDefinitionProvider): Disposable /** * Register an implementation provider. * * Multiple providers can be registered for a language. In that case providers are asked in * parallel and the results are merged. A failing provider (rejected promise or exception) will * not cause a failure of the whole operation. * * @param selector A selector that defines the documents this provider is applicable to. * @param provider An implementation provider. * @return A [disposable](#Disposable) that unregisters this provider when being disposed. */ export function registerImplementationProvider(selector: DocumentSelector, provider: ImplementationProvider): Disposable /** * Register a reference provider. * * Multiple providers can be registered for a language. In that case providers are asked in * parallel and the results are merged. A failing provider (rejected promise or exception) will * not cause a failure of the whole operation. * * @param selector A selector that defines the documents this provider is applicable to. * @param provider A reference provider. * @return A [disposable](#Disposable) that unregisters this provider when being disposed. */ export function registerReferencesProvider(selector: DocumentSelector, provider: ReferenceProvider): Disposable /** * Register a rename provider. * * Multiple providers can be registered for a language. In that case providers are sorted * by their [score](#workspace.match) and asked in sequence. The first provider producing a result * defines the result of the whole operation. * * @param selector A selector that defines the documents this provider is applicable to. * @param provider A rename provider. * @return A [disposable](#Disposable) that unregisters this provider when being disposed. */ export function registerRenameProvider(selector: DocumentSelector, provider: RenameProvider): Disposable /** * Register a workspace symbol provider. * * Multiple providers can be registered. In that case providers are asked in parallel and * the results are merged. A failing provider (rejected promise or exception) will not cause * a failure of the whole operation. * * @param provider A workspace symbol provider. * @return A [disposable](#Disposable) that unregisters this provider when being disposed. */ export function registerWorkspaceSymbolProvider(provider: WorkspaceSymbolProvider): Disposable /** * Register a formatting provider for a document. * * Multiple providers can be registered for a language. In that case providers are sorted * by their priority. Failure of the selected provider will cause a failure of the whole operation. * * @param selector A selector that defines the documents this provider is applicable to. * @param provider A document formatting edit provider. * @param priority default to 0. * @return A [disposable](#Disposable) that unregisters this provider when being disposed. */ export function registerDocumentFormatProvider(selector: DocumentSelector, provider: DocumentFormattingEditProvider, priority?: number): Disposable /** * Register a formatting provider for a document range. * * *Note:* A document range provider is also a [document formatter](#DocumentFormattingEditProvider) * which means there is no need to [register](#languages.registerDocumentFormattingEditProvider) a document * formatter when also registering a range provider. * * Multiple providers can be registered for a language. In that case provider with highest priority is used. * Failure of the selected provider will cause a failure of the whole operation. * * @param selector A selector that defines the documents this provider is applicable to. * @param provider A document range formatting edit provider. * @param priority default to 0. * @return A [disposable](#Disposable) that unregisters this provider when being disposed. */ export function registerDocumentRangeFormatProvider(selector: DocumentSelector, provider: DocumentRangeFormattingEditProvider, priority?: number): Disposable /** * Register a call hierarchy provider. * * @param selector A selector that defines the documents this provider is applicable to. * @param provider A call hierarchy provider. * @return A {@link Disposable} that unregisters this provider when being disposed. */ export function registerCallHierarchyProvider(selector: DocumentSelector, provider: CallHierarchyProvider): Disposable /** * Register a semantic tokens provider for a whole document. * * Multiple providers can be registered for a language. In that case providers are sorted * by their {@link languages.match score} and the best-matching provider is used. Failure * of the selected provider will cause a failure of the whole operation. * * @param selector A selector that defines the documents this provider is applicable to. * @param provider A document semantic tokens provider. * @return A {@link Disposable} that unregisters this provider when being disposed. */ export function registerDocumentSemanticTokensProvider(selector: DocumentSelector, provider: DocumentSemanticTokensProvider, legend: SemanticTokensLegend): Disposable /** * Register a semantic tokens provider for a document range. * * *Note:* If a document has both a `DocumentSemanticTokensProvider` and a `DocumentRangeSemanticTokensProvider`, * the range provider will be invoked only initially, for the time in which the full document provider takes * to resolve the first request. Once the full document provider resolves the first request, the semantic tokens * provided via the range provider will be discarded and from that point forward, only the document provider * will be used. * * Multiple providers can be registered for a language. In that case providers are sorted * by their {@link languages.match score} and the best-matching provider is used. Failure * of the selected provider will cause a failure of the whole operation. * * @param selector A selector that defines the documents this provider is applicable to. * @param provider A document range semantic tokens provider. * @return A {@link Disposable} that unregisters this provider when being disposed. */ export function registerDocumentRangeSemanticTokensProvider(selector: DocumentSelector, provider: DocumentRangeSemanticTokensProvider, legend: SemanticTokensLegend): Disposable /** * Register a linked editing range provider. * * Multiple providers can be registered for a language. In that case providers are sorted * by their {@link languages.match score} and the best-matching provider that has a result is used. Failure * of the selected provider will cause a failure of the whole operation. * * @param selector A selector that defines the documents this provider is applicable to. * @param provider A linked editing range provider. * @return A {@link Disposable} that unregisters this provider when being disposed. */ export function registerLinkedEditingRangeProvider(selector: DocumentSelector, provider: LinkedEditingRangeProvider): Disposable /** * Register a inlay hints provider. * * Multiple providers can be registered for a language. In that case providers are asked in * parallel and the results are merged. A failing provider (rejected promise or exception) will * not cause a failure of the whole operation. * * @param selector A selector that defines the documents this provider is applicable to. * @param provider An inlay hints provider. * @return A {@link Disposable} that unregisters this provider when being disposed. */ export function registerInlayHintsProvider(selector: DocumentSelector, provider: InlayHintsProvider): Disposable } // }} // services module {{ export enum ServiceStat { Initial, Starting, StartFailed, Running, Stopping, Stopped, } export interface IServiceProvider { // unique service id id: string name: string client?: LanguageClient selector: DocumentSelector // current state state: ServiceStat start(): Promise dispose(): void stop(): Promise | void restart(): Promise | void onServiceReady: Event } export namespace services { /** * Register languageClient as service provider. */ export function registLanguageClient(client: LanguageClient): Disposable /** * Register service, nothing happens when `service.id` already exists. */ export function regist(service: IServiceProvider): Disposable /** * Get service by id. */ export function getService(id: string): IServiceProvider /** * Stop service by id. */ export function stop(id: string): Promise /** * Stop running service or start stopped service. */ export function toggle(id: string): Promise } // }} // sources module {{ /** * Source options to create source that could respect configuration from `coc.source.{name}` */ export type SourceConfig = Omit export interface SourceStat { name: string priority: number triggerCharacters: string[] type: 'native' | 'remote' | 'service' shortcut: string filepath: string disabled: boolean filetypes: string[] } export enum SourceType { Native, Remote, Service, } export interface CompleteResult { items: VimCompleteItem[] isIncomplete?: boolean startcol?: number source?: string priority?: number } // option on complete & should_complete export interface CompleteOption { /** * Current buffer number. */ readonly bufnr: number /** * Current line. */ readonly line: string /** * Column to start completion, determined by iskeyword options of buffer. */ readonly col: number /** * Input text. */ readonly input: string readonly filetype: string readonly filepath: string /** * Word under cursor. */ readonly word: string /** * Trigger character, could be empty string. */ readonly triggerCharacter: string /** * Col of cursor, 1 based. */ readonly colnr: number readonly linenr: number readonly synname: string /** * Black list words specified by user. */ readonly blacklist: string[] /** * Buffer changetick */ readonly changedtick: number /** * Is trigger for in complete completion. */ readonly triggerForInComplete?: boolean } export interface ISource { /** * Identifier name */ name: string /** * @deprecated use documentSelector instead. */ filetypes?: string[] /** * Filters of document. */ documentSelector?: DocumentSelector enable?: boolean shortcut?: string priority?: number sourceType?: SourceType /** * Should only be used when completion is triggered, requirs `triggerPatterns` or `triggerCharacters` defined. */ triggerOnly?: boolean triggerCharacters?: string[] // regex to detect trigger completion, ignored when triggerCharacters exists. triggerPatterns?: RegExp[] disableSyntaxes?: string[] filepath?: string // should the first character always match firstMatch?: boolean refresh?(): Promise /** * For disable/enable */ toggle?(): void /** * Triggered on BufEnter, used for cache normally */ onEnter?(bufnr: number): void /** * Check if this source should doComplete * * @public * @param {CompleteOption} opt * @returns {Promise } */ shouldComplete?(opt: CompleteOption): Promise /** * Run completion * * @public * @param {CompleteOption} opt * @param {CancellationToken} token * @returns {Promise} */ doComplete(opt: CompleteOption, token: CancellationToken): ProviderResult /** * Action for complete item on complete item selected * * @public * @param {VimCompleteItem} item * @param {CancellationToken} token * @returns {Promise} */ onCompleteResolve?(item: VimCompleteItem, token: CancellationToken): ProviderResult /** * Action for complete item on complete done * * @public * @param {VimCompleteItem} item * @returns {Promise} */ onCompleteDone?(item: VimCompleteItem, opt: CompleteOption): ProviderResult shouldCommit?(item: VimCompleteItem, character: string): boolean } export namespace sources { /** * Names of registered sources. */ export const names: ReadonlyArray export const sources: ReadonlyArray /** * Check if source exists by name. */ export function has(name: string): boolean /** * Get source by name. */ export function getSource(name: string): ISource | null /** * Add source to sources list. * * Note: Use `sources.createSource()` for regist new source is recommended for * user configuration support. */ export function addSource(source: ISource): Disposable /** * Create source by source config, configurations starts with `coc.source.{name}` * are automatically supported. * * `name` and `doComplete()` must be provided in config. */ export function createSource(config: SourceConfig): Disposable /** * Get list of all source stats. */ export function sourceStats(): SourceStat[] /** * Call refresh for _name_ source or all sources. */ export function refresh(name?: string): Promise /** * Toggle state of _name_ source. */ export function toggleSource(name: string): void /** * Remove source by name. */ export function removeSource(name: string): void } // }} // TreeView related {{ export interface TreeItemLabel { label: string highlights?: [number, number][] } export interface TreeItemIcon { text: string hlGroup: string } /** * Collapsible state of the tree item */ export enum TreeItemCollapsibleState { /** * Determines an item can be neither collapsed nor expanded. Implies it has no children. */ None = 0, /** * Determines an item is collapsed */ Collapsed = 1, /** * Determines an item is expanded */ Expanded = 2 } export class TreeItem { /** * A human-readable string describing this item. When `falsy`, it is derived from {@link TreeItem.resourceUri resourceUri}. */ label?: string | TreeItemLabel /** * Description rendered less prominently after label. */ description?: string /** * The icon path or {@link ThemeIcon} for the tree item. * When `falsy`, {@link ThemeIcon.Folder Folder Theme Icon} is assigned, if item is collapsible otherwise {@link ThemeIcon.File File Theme Icon}. * When a file or folder {@link ThemeIcon} is specified, icon is derived from the current file icon theme for the specified theme icon using {@link TreeItem.resourceUri resourceUri} (if provided). */ icon?: TreeItemIcon /** * Optional id for the tree item that has to be unique across tree. The id is used to preserve the selection and expansion state of the tree item. * * If not provided, an id is generated using the tree item's resourceUri when exists. **Note** that when labels change, ids will change and that selection and expansion state cannot be kept stable anymore. */ id?: string /** * The {@link Uri} of the resource representing this item. * * Will be used to derive the {@link TreeItem.label label}, when it is not provided. * Will be used to derive the icon from current file icon theme, when {@link TreeItem.iconPath iconPath} has {@link ThemeIcon} value. */ resourceUri?: Uri /** * The tooltip text when you hover over this item. */ tooltip?: string | MarkupContent /** * The {@link Command} that should be executed when the tree item is selected. * * Please use `vscode.open` or `vscode.diff` as command IDs when the tree item is opening * something in the editor. Using these commands ensures that the resulting editor will * appear consistent with how other built-in trees open editors. */ command?: Command /** * {@link TreeItemCollapsibleState} of the tree item. */ collapsibleState?: TreeItemCollapsibleState /** * @param label A human-readable string describing this item * @param collapsibleState {@link TreeItemCollapsibleState} of the tree item. Default is {@link TreeItemCollapsibleState.None} */ constructor(label: string | TreeItemLabel, collapsibleState?: TreeItemCollapsibleState) /** * @param resourceUri The {@link Uri} of the resource representing this item. * @param collapsibleState {@link TreeItemCollapsibleState} of the tree item. Default is {@link TreeItemCollapsibleState.None} */ constructor(resourceUri: Uri, collapsibleState?: TreeItemCollapsibleState) } /** * Action resolved by {@link TreeDataProvider} */ export interface TreeItemAction { /** * Label text in menu. */ title: string handler: (item: T) => ProviderResult } /** * Options for creating a {@link TreeView} */ export interface TreeViewOptions { /** * bufhidden option for TreeView, default to 'wipe' */ bufhidden?: 'hide' | 'unload' | 'delete' | 'wipe' /** * Fixed width for window, default to true */ winfixwidth?: boolean /** * Enable filter feature, default to false */ enableFilter?: boolean /** * Disable indent of leaves without children, default to false */ disableLeafIndent?: boolean /** * A data provider that provides tree data. */ treeDataProvider: TreeDataProvider /** * Whether the tree supports multi-select. When the tree supports multi-select and a command is executed from the tree, * the first argument to the command is the tree item that the command was executed on and the second argument is an * array containing all selected tree items. */ canSelectMany?: boolean } /** * The event that is fired when an element in the {@link TreeView} is expanded or collapsed */ export interface TreeViewExpansionEvent { /** * Element that is expanded or collapsed. */ readonly element: T } /** * The event that is fired when there is a change in {@link TreeView.selection tree view's selection} */ export interface TreeViewSelectionChangeEvent { /** * Selected elements. */ readonly selection: T[] } /** * The event that is fired when there is a change in {@link TreeView.visible tree view's visibility} */ export interface TreeViewVisibilityChangeEvent { /** * `true` if the {@link TreeView tree view} is visible otherwise `false`. */ readonly visible: boolean } /** * Represents a Tree view */ export interface TreeView extends Disposable { /** * Event that is fired when an element is expanded */ readonly onDidExpandElement: Event> /** * Event that is fired when an element is collapsed */ readonly onDidCollapseElement: Event> /** * Currently selected elements. */ readonly selection: T[] /** * Event that is fired when the {@link TreeView.selection selection} has changed */ readonly onDidChangeSelection: Event> /** * Event that is fired when {@link TreeView.visible visibility} has changed */ readonly onDidChangeVisibility: Event /** * `true` if the {@link TreeView tree view} is visible otherwise `false`. * * **NOTE:** is `true` when TreeView visible on other tab. */ readonly visible: boolean /** * Window id used by TreeView. */ readonly windowId: number | undefined /** * An optional human-readable message that will be rendered in the view. * Setting the message to null, undefined, or empty string will remove the message from the view. */ message?: string /** * The tree view title is initially taken from viewId of TreeView * Changes to the title property will be properly reflected in the UI in the title of the view. */ title?: string /** * An optional human-readable description which is rendered less prominently in the title of the view. * Setting the title description to null, undefined, or empty string will remove the description from the view. */ description?: string /** * Reveals the given element in the tree view. * If the tree view is not visible then the tree view is shown and element is revealed. * * By default revealed element is selected. * In order to not to select, set the option `select` to `false`. * In order to focus, set the option `focus` to `true`. * In order to expand the revealed element, set the option `expand` to `true`. To expand recursively set `expand` to the number of levels to expand. * **NOTE:** You can expand only to 3 levels maximum. * * **NOTE:** The {@link TreeDataProvider} that the `TreeView` {@link window.createTreeView is registered with} with must implement {@link TreeDataProvider.getParent getParent} method to access this API. */ reveal(element: T, options?: { select?: boolean, focus?: boolean, expand?: boolean | number }): Thenable /** * Create tree view in new window. * * **NOTE:** TreeView with same viewId in current tab would be disposed. * * @param splitCommand The command to open TreeView window, default to 'belowright 30vs' * @return `true` if window shown. */ show(splitCommand?: string): Promise } /** * A data provider that provides tree data */ export interface TreeDataProvider { /** * An optional event to signal that an element or root has changed. * This will trigger the view to update the changed element/root and its children recursively (if shown). * To signal that root has changed, do not pass any argument or pass `undefined` or `null`. */ onDidChangeTreeData?: Event /** * Get {@link TreeItem} representation of the `element` * * @param element The element for which {@link TreeItem} representation is asked for. * @return {@link TreeItem} representation of the element */ getTreeItem(element: T): TreeItem | Thenable /** * Get the children of `element` or root if no element is passed. * * @param element The element from which the provider gets children. Can be `undefined`. * @return Children of `element` or root if no element is passed. */ getChildren(element?: T): ProviderResult /** * Optional method to return the parent of `element`. * Return `null` or `undefined` if `element` is a child of root. * * **NOTE:** This method should be implemented in order to access {@link TreeView.reveal reveal} API. * * @param element The element for which the parent has to be returned. * @return Parent of `element`. */ getParent?(element: T): ProviderResult /** * Called on hover to resolve the {@link TreeItem.tooltip TreeItem} property if it is undefined. * Called on tree item click/open to resolve the {@link TreeItem.command TreeItem} property if it is undefined. * Only properties that were undefined can be resolved in `resolveTreeItem`. * Functionality may be expanded later to include being called to resolve other missing * properties on selection and/or on open. * * Will only ever be called once per TreeItem. * * onDidChangeTreeData should not be triggered from within resolveTreeItem. * * *Note* that this function is called when tree items are already showing in the UI. * Because of that, no property that changes the presentation (label, description, etc.) * can be changed. * * @param item Undefined properties of `item` should be set then `item` should be returned. * @param element The object associated with the TreeItem. * @param token A cancellation token. * @return The resolved tree item or a thenable that resolves to such. It is OK to return the given * `item`. When no result is returned, the given `item` will be used. */ resolveTreeItem?(item: TreeItem, element: T, token: CancellationToken): ProviderResult /** * Called with current element to resolve actions. * Called when user press 'actions' key. * * @param item Resolved item. * @param element The object under cursor. */ resolveActions?(item: TreeItem, element: T): ProviderResult[]> } // }} // workspace module {{ /** * An event describing the change in Configuration */ export interface ConfigurationChangeEvent { /** * Returns `true` if the given section for the given resource (if provided) is affected. * * @param section Configuration name, supports _dotted_ names. * @param resource A resource URI. * @return `true` if the given section for the given resource (if provided) is affected. */ affectsConfiguration(section: string, resource?: string): boolean } export interface WillSaveEvent extends TextDocumentWillSaveEvent { /** * Allows to pause the event loop and to apply [pre-save-edits](#TextEdit). * Edits of subsequent calls to this function will be applied in order. The * edits will be *ignored* if concurrent modifications of the document happened. * * *Note:* This function can only be called during event dispatch and not * in an asynchronous manner: * * ```ts * workspace.onWillSaveTextDocument(event => { * // async, will *throw* an error * setTimeout(() => event.waitUntil(promise)); * * // sync, OK * event.waitUntil(promise); * }) * ``` * * @param thenable A thenable that resolves to [pre-save-edits](#TextEdit). */ waitUntil(thenable: Thenable): void } export interface KeymapOption { /** * Use request instead of notify, default true */ sync: boolean /** * Cancel completion before invoke callback, default true */ cancel: boolean /** * Use for keymap, default false */ silent: boolean /** * Enable repeat support for repeat.vim, default false */ repeat: boolean } export interface DidChangeTextDocumentParams { /** * The document that did change. The version number points * to the version after all provided content changes have * been applied. */ readonly textDocument: { version: number uri: string } /** * The actual content changes. The content changes describe single state changes * to the document. So if there are two content changes c1 (at array index 0) and * c2 (at array index 1) for a document in state S then c1 moves the document from * S to S' and c2 from S' to S''. So c1 is computed on the state S and c2 is computed * on the state S'. */ readonly contentChanges: ReadonlyArray /** * Buffer number of document. */ readonly bufnr: number /** * Original content before change */ readonly original: string /** * Original lines before change */ readonly originalLines: ReadonlyArray } export interface EditerState { document: LinesTextDocument position: Position } export type MapMode = 'n' | 'i' | 'v' | 'x' | 's' | 'o' export interface Autocmd { /** * Vim event or event set. */ event: string | string[] /** * Callback functions that called with evaled arguments. */ callback: Function /** * Match pattern, default to `*`. */ pattern?: string /** * Vim expression that eval to arguments of callback, default to `[]` */ arglist?: string[] /** * Use request when `true`, use notification by default. */ request?: boolean /** * `this` of callback. */ thisArg?: any } export interface Env { /** * |completeopt| option of (neo)vim. */ readonly completeOpt: string /** * |runtimepath| option of (neo)vim. */ readonly runtimepath: string /** * |guicursor| option of (neo)vim */ readonly guicursor: string /** * Could use float window on neovim, always false on vim. */ readonly floating: boolean /** * |sign_place()| and |sign_unplace()| can be used when true. */ readonly sign: boolean /** * Root directory of extensions. */ readonly extensionRoot: string /** * Process id of (neo)vim. */ readonly pid: number /** * Total columns of screen. */ readonly columns: number /** * Total lines of screen. */ readonly lines: number /** * Is true when |CompleteChanged| event is supported. */ readonly pumevent: boolean /** * |cmdheight| option of (neo)vim. */ readonly cmdheight: number /** * Value of |g:coc_filetype_map| */ readonly filetypeMap: { [index: string]: string } /** * Is true when not using neovim. */ readonly isVim: boolean /** * Is cygvim when true. */ readonly isCygwin: boolean /** * Is macvim when true. */ readonly isMacvim: boolean /** * Is true when iTerm.app is used on mac. */ readonly isiTerm: boolean /** * version of (neo)vim, on vim it's like: 8020750, on neoivm it's like: 0.5.0 */ readonly version: string /** * |v:progpath| value, could be empty. */ readonly progpath: string /** * Is true when dialog feature is supported, which need vim >= 8.2.750 or neovim >= 0.4.0 */ readonly dialog: boolean /** * Is true when vim's textprop is supported. */ readonly textprop: boolean } /** * Store & retrieve most recent used items. */ export interface Mru { /** * Load iems from mru file */ load(): Promise /** * Add item to mru file. */ add(item: string): Promise /** * Remove item from mru file. */ remove(item: string): Promise /** * Remove the data file. */ clean(): Promise } /** * Option to create task that runs in (neo)vim. */ export interface TaskOptions { /** * The command to run, without arguments */ cmd: string /** * Arguments of command. */ args?: string[] /** * Current working directory of the task, Default to current vim's cwd. */ cwd?: string /** * Additional environment key-value pairs. */ env?: { [key: string]: string } /** * Use pty when true. */ pty?: boolean /** * Detach child process when true. */ detach?: boolean } /** * Controls long running task started by (neo)vim. * Useful to keep the task running after CocRestart. */ export interface Task extends Disposable { /** * Fired on task exit with exit code. */ onExit: Event /** * Fired with lines on stdout received. */ onStdout: Event /** * Fired with lines on stderr received. */ onStderr: Event /** * Start task, task will be restarted when already running. * * @param {TaskOptions} opts * @returns {Promise} */ start(opts: TaskOptions): Promise /** * Stop task by SIGTERM or SIGKILL */ stop(): Promise /** * Check if the task is running. */ running: Promise } /** * A simple json database. */ export interface JsonDB { filepath: string /** * Get data by key. * * @param {string} key unique key allows dot notation. * @returns {any} */ fetch(key: string): any /** * Check if key exists * * @param {string} key unique key allows dot notation. */ exists(key: string): boolean /** * Delete data by key * * @param {string} key unique key allows dot notation. */ delete(key: string): void /** * Save data with key */ push(key: string, data: number | null | boolean | string | { [index: string]: any }): void /** * Empty db file. */ clear(): void /** * Remove db file. */ destroy(): void } export interface RenameEvent { oldUri: Uri newUri: Uri } export interface FileSystemWatcher { readonly ignoreCreateEvents: boolean readonly ignoreChangeEvents: boolean readonly ignoreDeleteEvents: boolean readonly onDidCreate: Event readonly onDidChange: Event readonly onDidDelete: Event readonly onDidRename: Event dispose(): void } export interface ConfigurationInspect { key: string defaultValue?: T globalValue?: T workspaceValue?: T } export interface WorkspaceConfiguration { /** * Return a value from this configuration. * * @param section Configuration name, supports _dotted_ names. * @return The value `section` denotes or `undefined`. */ get(section: string): T | undefined /** * Return a value from this configuration. * * @param section Configuration name, supports _dotted_ names. * @param defaultValue A value should be returned when no value could be found, is `undefined`. * @return The value `section` denotes or the default. */ get(section: string, defaultValue: T): T /** * Check if this configuration has a certain value. * * @param section Configuration name, supports _dotted_ names. * @return `true` if the section doesn't resolve to `undefined`. */ has(section: string): boolean /** * Retrieve all information about a configuration setting. A configuration value * often consists of a *default* value, a global or installation-wide value, * a workspace-specific value * * *Note:* The configuration name must denote a leaf in the configuration tree * (`editor.fontSize` vs `editor`) otherwise no result is returned. * * @param section Configuration name, supports _dotted_ names. * @return Information about a configuration setting or `undefined`. */ inspect(section: string): ConfigurationInspect | undefined /** * Update a configuration value. The updated configuration values are persisted. * * * @param section Configuration name, supports _dotted_ names. * @param value The new value. * @param isUser if true, always update user configuration */ update(section: string, value: any, isUser?: boolean): void /** * Readable dictionary that backs this configuration. */ readonly [key: string]: any } export interface BufferSyncItem { /** * Called on buffer unload. */ dispose: () => void /** * Called on buffer content change. */ onChange?(e: DidChangeTextDocumentParams): void /** * Called on TextChangedI & TextChanged events. */ onTextChange?(): void } export interface BufferSync { /** * Current items. */ readonly items: Iterable /** * Get created item by uri */ getItem(uri: string): T | undefined /** * Get created item by bufnr */ getItem(bufnr: number): T | undefined dispose: () => void } export namespace workspace { export const nvim: Neovim /** * Current buffer number, could be wrong since vim could not send autocmd as expected. * * @deprecated will be removed in the feature. */ export const bufnr: number /** * Current document. */ export const document: Promise /** * Environments or current (neo)vim. */ export const env: Env /** * Float window or popup can work. */ export const floatSupported: boolean /** * Current working directory of vim. */ export const cwd: string /** * Current workspace root. */ export const root: string /** * @deprecated aliased to root. */ export const rootPath: string /** * Not neovim when true. */ export const isVim: boolean /** * Is neovim when true. */ export const isNvim: boolean /** * All filetypes of loaded documents. */ export const filetypes: ReadonlySet /** * All languageIds of loaded documents. */ export const languageIds: ReadonlySet /** * Root directory of coc.nvim */ export const pluginRoot: string /** * Current `&completeopt` of vim, may not correct. */ export const completeOpt: string /** * Exists channel names. */ export const channelNames: ReadonlyArray /** * Loaded documents that attached. */ export const documents: ReadonlyArray /** * Current document array. */ export const textDocuments: ReadonlyArray /** * Current workspace folders. */ export const workspaceFolders: ReadonlyArray /** * Directory paths of workspaceFolders. */ export const folderPaths: ReadonlyArray /** * Current workspace folder, could be null when vim started from user's home. * * @deprecated */ export const workspaceFolder: WorkspaceFolder | null export const onDidCreateFiles: Event export const onDidRenameFiles: Event export const onDidDeleteFiles: Event export const onWillCreateFiles: Event export const onWillRenameFiles: Event export const onWillDeleteFiles: Event /** * Event fired on workspace folder change. */ export const onDidChangeWorkspaceFolders: Event /** * Event fired after document create. */ export const onDidOpenTextDocument: Event /** * Event fired after document unload. */ export const onDidCloseTextDocument: Event /** * Event fired on document change. */ export const onDidChangeTextDocument: Event /** * Event fired before document save. */ export const onWillSaveTextDocument: Event /** * Event fired after document save. */ export const onDidSaveTextDocument: Event /** * Event fired on configuration change. Configuration change could by many * reasons, including: * * - Changes detected from `coc-settings.json`. * - Change to document that using another configuration file. * - Configuration change by call update API of WorkspaceConfiguration. */ export const onDidChangeConfiguration: Event /** * Fired when vim's runtimepath change detected. */ export const onDidRuntimePathChange: Event> /** * Returns a path that is relative to the workspace folder or folders. * * When there are no {@link workspace.workspaceFolders workspace folders} or when the path * is not contained in them, the input is returned. * * @param pathOrUri A path or uri. When a uri is given its {@link Uri.fsPath fsPath} is used. * @param includeWorkspaceFolder When `true` and when the given path is contained inside a * workspace folder the name of the workspace is prepended. Defaults to `true` when there are * multiple workspace folders and `false` otherwise. * @return A path relative to the root or the input. */ export function asRelativePath(pathOrUri: string | Uri, includeWorkspaceFolder?: boolean): string /** * Opens a document. Will return early if this document is already open. Otherwise * the document is loaded and the {@link workspace.onDidOpenTextDocument didOpen}-event fires. * * The document is denoted by an {@link Uri}. Depending on the {@link Uri.scheme scheme} the * following rules apply: * * `file`-scheme: Open a file on disk (`openTextDocument(Uri.file(path))`). Will be rejected if the file * does not exist or cannot be loaded. * * `untitled`-scheme: Open a blank untitled file with associated path (`openTextDocument(Uri.file(path).with({ scheme: 'untitled' }))`). * The language will be derived from the file name. * * For all other schemes contributed {@link TextDocumentContentProvider text document content providers} and * {@link FileSystemProvider file system providers} are consulted. * * *Note* that the lifecycle of the returned document is owned by the editor and not by the extension. That means an * {@linkcode workspace.onDidCloseTextDocument onDidClose}-event can occur at any time after opening it. * * @param uri Identifies the resource to open. * @return A promise that resolves to a {@link Document document}. */ export function openTextDocument(uri: Uri): Thenable /** * A short-hand for `openTextDocument(Uri.file(fileName))`. * * @see {@link openTextDocument} * @param fileName A name of a file on disk. * @return A promise that resolves to a {@link Document document}. */ export function openTextDocument(fileName: string): Thenable /** * Create new namespace id by name. * * @deprecated Latest neovim requires namespace created by neoivm. */ export function createNameSpace(name: string): number /** * Like vim's has(), but for version check only. * Check patch on neovim and check nvim on vim would return false. * * For example: * - has('nvim-0.6.0') * - has('patch-7.4.248') */ export function has(feature: string): boolean /** * Register autocmd on vim. * * Note: avoid request autocmd when possible since vim could be blocked * forever when request triggered during request. */ export function registerAutocmd(autocmd: Autocmd): Disposable /** * Watch for vim's global option change. */ export function watchOption(key: string, callback: (oldValue: any, newValue: any) => Thenable | void, disposables?: Disposable[]): void /** * Watch for vim's global variable change, works on neovim only. */ export function watchGlobal(key: string, callback?: (oldValue: any, newValue: any) => Thenable | void, disposables?: Disposable[]): void /** * Check if selector match document. */ export function match(selector: DocumentSelector, document: LinesTextDocument): number /** * Findup from filename or filenames from current filepath or root. * * @return fullpath of file or null when not found. */ export function findUp(filename: string | string[]): Promise /** * Get possible watchman binary path. */ export function getWatchmanPath(): string | null /** * Get configuration by section and optional resource uri. */ export function getConfiguration(section?: string, resource?: string): WorkspaceConfiguration /** * Get created document by uri or bufnr. */ export function getDocument(uri: number | string): Document /** * Apply WorkspaceEdit. */ export function applyEdit(edit: WorkspaceEdit): Promise /** * Convert location to quickfix item. */ export function getQuickfixItem(loc: Location | LocationLink, text?: string, type?: string, module?: string): Promise /** * Convert locations to quickfix list. */ export function getQuickfixList(locations: Location[]): Promise> /** * Populate locations to UI. */ export function showLocations(locations: Location[]): Promise /** * Get content of line by uri and line. */ export function getLine(uri: string, line: number): Promise /** * Get WorkspaceFolder of uri */ export function getWorkspaceFolder(uri: string): WorkspaceFolder | undefined /** * Get content from buffer or file by uri. */ export function readFile(uri: string): Promise /** * Get current document and position. */ export function getCurrentState(): Promise /** * Get format options of uri or current buffer. */ export function getFormatOptions(uri?: string): Promise /** * Jump to location. */ export function jumpTo(uri: string, position?: Position | null, openCommand?: string): Promise /** * Create a file in vim and disk */ export function createFile(filepath: string, opts?: CreateFileOptions): Promise /** * Load uri as document, buffer would be invisible if not loaded. */ export function loadFile(uri: string): Promise /** * Load the files that not loaded */ export function loadFiles(uris: string[]): Promise /** * Rename file in vim and disk */ export function renameFile(oldPath: string, newPath: string, opts?: RenameFileOptions): Promise /** * Delete file from vim and disk. */ export function deleteFile(filepath: string, opts?: DeleteFileOptions): Promise /** * Open resource by uri */ export function openResource(uri: string): Promise /** * Resolve full path of module from yarn or npm global directory. */ export function resolveModule(name: string): Promise /** * Run nodejs command */ export function runCommand(cmd: string, cwd?: string, timeout?: number): Promise /** * Expand filepath with `~` and/or environment placeholders */ export function expand(filepath: string): string /** * Call a function by use notifications, useful for functions like |input| that could block vim. */ export function callAsync(method: string, args: any[]): Promise /** * registerTextDocumentContentProvider */ export function registerTextDocumentContentProvider(scheme: string, provider: TextDocumentContentProvider): Disposable /** * Register unique keymap uses `(coc-{key})` as lhs * Throw error when {key} already exists. * * @param {MapMode[]} modes - array of 'n' | 'i' | 'v' | 'x' | 's' | 'o' * @param {string} key - unique name * @param {Function} fn - callback function * @param {Partial} opts * @returns {Disposable} */ export function registerKeymap(modes: MapMode[], key: string, fn: () => ProviderResult, opts?: Partial): Disposable /** * Register expr key-mapping. */ export function registerExprKeymap(mode: 'i' | 'n' | 'v' | 's' | 'x', key: string, fn: () => ProviderResult, buffer?: boolean): Disposable /** * Register local key-mapping. */ export function registerLocalKeymap(mode: 'n' | 'v' | 's' | 'x', key: string, fn: () => ProviderResult, notify?: boolean): Disposable /** * Register for buffer sync objects, created item should be disposable * and provide optional `onChange` which called when document change. * * The document is always attached and not command line buffer. * * @param create Called for each attached document and on document create. * @returns Disposable */ export function registerBufferSync(create: (doc: Document) => T | undefined): BufferSync /** * Create a FileSystemWatcher instance, when watchman doesn't exist, the * returned FileSystemWatcher can still be used, but not work at all. */ export function createFileSystemWatcher(globPattern: string, ignoreCreate?: boolean, ignoreChange?: boolean, ignoreDelete?: boolean): FileSystemWatcher /** * Find files across all {@link workspace.workspaceFolders workspace folders} in the workspace. * * @example * findFiles('**​/*.js', '**​/node_modules/**', 10) * * @param include A {@link GlobPattern glob pattern} that defines the files to search for. The glob pattern * will be matched against the file paths of resulting matches relative to their workspace. * Use a {@link RelativePattern relative pattern} to restrict the search results to a {@link WorkspaceFolder workspace folder}. * @param exclude A {@link GlobPattern glob pattern} that defines files and folders to exclude. The glob pattern * will be matched against the file paths of resulting matches relative to their workspace. When `undefined` or`null`, * no excludes will apply. * @param maxResults An upper-bound for the result. * @param token A token that can be used to signal cancellation to the underlying search engine. * @return A thenable that resolves to an array of resource identifiers. Will return no results if no * {@link workspace.workspaceFolders workspace folders} are opened. */ export function findFiles(include: GlobPattern, exclude?: GlobPattern | null, maxResults?: number, token?: CancellationToken): Thenable /** * Create persistence Mru instance. */ export function createMru(name: string): Mru /** * Create Task instance that runs in (neo)vim, no shell. * * @param id Unique id string, like `TSC` */ export function createTask(id: string): Task /** * Create DB instance at extension root. */ export function createDatabase(name: string): JsonDB } // }} // window module {{ /** * Represents how a terminal exited. */ export interface TerminalExitStatus { /** * The exit code that a terminal exited with, it can have the following values: * - Zero: the terminal process or custom execution succeeded. * - Non-zero: the terminal process or custom execution failed. * - `undefined`: the user forcibly closed the terminal or a custom execution exited * without providing an exit code. */ readonly code: number | undefined } export interface TerminalOptions { /** * A human-readable string which will be used to represent the terminal in the UI. */ name?: string /** * A path to a custom shell executable to be used in the terminal. */ shellPath?: string /** * Args for the custom shell executable, this does not work on Windows (see #8429) */ shellArgs?: string[] /** * A path or URI for the current working directory to be used for the terminal. */ cwd?: string /** * Object with environment variables that will be added to the VS Code process. */ env?: { [key: string]: string | null } /** * Whether the terminal process environment should be exactly as provided in * `TerminalOptions.env`. When this is false (default), the environment will be based on the * window's environment and also apply configured platform settings like * `terminal.integrated.windows.env` on top. When this is true, the complete environment * must be provided as nothing will be inherited from the process or any configuration. * Neovim only. */ strictEnv?: boolean } /** * An individual terminal instance within the integrated terminal. */ export interface Terminal { /** * The bufnr of terminal buffer. */ readonly bufnr: number /** * The name of the terminal. */ readonly name: string /** * The process ID of the shell process. */ readonly processId: Promise /** * The exit status of the terminal, this will be undefined while the terminal is active. * * **Example:** Show a notification with the exit code when the terminal exits with a * non-zero exit code. * ```typescript * window.onDidCloseTerminal(t => { * if (t.exitStatus && t.exitStatus.code) { * vscode.window.showInformationMessage(`Exit code: ${t.exitStatus.code}`); * } * }); * ``` */ readonly exitStatus: TerminalExitStatus | undefined /** * Send text to the terminal. The text is written to the stdin of the underlying pty process * (shell) of the terminal. * * @param text The text to send. * @param addNewLine Whether to add a new line to the text being sent, this is normally * required to run a command in the terminal. The character(s) added are \n or \r\n * depending on the platform. This defaults to `true`. */ sendText(text: string, addNewLine?: boolean): void /** * Show the terminal panel and reveal this terminal in the UI, return false when failed. * * @param preserveFocus When `true` the terminal will not take focus. */ show(preserveFocus?: boolean): Promise /** * Hide the terminal panel if this terminal is currently showing. */ hide(): void /** * Dispose and free associated resources. */ dispose(): void } /** * Option for create status item. */ export interface StatusItemOption { progress?: boolean } /** * Status item that included in `g:coc_status` */ export interface StatusBarItem { /** * The priority of this item. Higher value means the item should * be shown more to the left. */ readonly priority: number isProgress: boolean /** * The text to show for the entry. You can embed icons in the text by leveraging the syntax: * * `My text $(icon-name) contains icons like $(icon-name) this one.` * * Where the icon-name is taken from the [octicon](https://octicons.github.com) icon set, e.g. * `light-bulb`, `thumbsup`, `zap` etc. */ text: string /** * Shows the entry in the status bar. */ show(): void /** * Hide the entry in the status bar. */ hide(): void /** * Dispose and free associated resources. Call * [hide](#StatusBarItem.hide). */ dispose(): void } /** * Value-object describing where and how progress should show. */ export interface ProgressOptions { /** * A human-readable string which will be used to describe the * operation. */ title?: string /** * Controls if a cancel button should show to allow the user to * cancel the long running operation. */ cancellable?: boolean } /** * Defines a generalized way of reporting progress updates. */ export interface Progress { /** * Report a progress update. * * @param value A progress item, like a message and/or an * report on how much work finished */ report(value: T): void } /** * Represents an action that is shown with an information, warning, or * error message. * * @see [showInformationMessage](#window.showInformationMessage) * @see [showWarningMessage](#window.showWarningMessage) * @see [showErrorMessage](#window.showErrorMessage) */ export interface MessageItem { /** * A short title like 'Retry', 'Open Log' etc. */ title: string /** * A hint for modal dialogs that the item should be triggered * when the user cancels the dialog (e.g. by pressing the ESC * key). * * Note: this option is ignored for non-modal messages. * Note: not used by coc.nvim for now. */ isCloseAffordance?: boolean } export interface DialogButton { /** * Use by callback, should >= 0 */ index: number text: string /** * Not shown when true */ disabled?: boolean } export interface DialogConfig { /** * Content shown in window. */ content: string /** * Optional title text. */ title?: string /** * show close button, default to true when not specified. */ close?: boolean /** * highlight group for dialog window, default to `"dialog.floatHighlight"` or 'CocFlating' */ highlight?: string /** * highlight items of content. */ highlights?: ReadonlyArray /** * highlight groups for border, default to `"dialog.borderhighlight"` or 'CocFlating' */ borderhighlight?: string /** * Buttons as bottom of dialog. */ buttons?: DialogButton[] /** * index is -1 for window close without button click */ callback?: (index: number) => void } export type NotificationKind = 'error' | 'info' | 'warning' | 'progress' export interface NotificationConfig { kind?: NotificationKind content?: string /** * Optional title text. */ title?: string /** * Buttons as bottom of dialog. */ buttons?: DialogButton[] /** * index is -1 for window close without button click */ callback?: (index: number) => void } /** * Options to configure the behavior of the quick pick UI. */ export interface QuickPickOptions { /** * An optional string that represents the title of the quick pick. */ title?: string /** * An optional flag to include the description when filtering the picks. */ matchOnDescription?: boolean /** * An optional flag to make the picker accept multiple selections, if true the result is an array of picks. */ canPickMany?: boolean } /** * Represents an item that can be selected from * a list of items. */ export interface QuickPickItem { /** * A human-readable string which is rendered prominent */ label: string /** * A human-readable string which is rendered less prominent in the same line */ description?: string /** * Optional flag indicating if this item is picked initially. */ picked?: boolean } export interface QuickPickConfig { /** * An optional title. */ title?: string /** * Items to pick from. */ items: readonly T[] /** * Initial value of the filter text. */ value?: string /** * If multiple items can be selected at the same time. Defaults to false. */ canSelectMany?: boolean /** * Max height of list window. */ maxHeight?: number } export interface QuickPick { /** * An optional title. */ title: string | undefined /** * If the UI should show a progress indicator. Defaults to false. * * Change this to true, e.g., while loading more data or validating * user input. */ loading: boolean /** * Items to pick from. This can be read and updated by the extension. */ items: readonly T[] /** * Active items. This can be read and updated by the extension. */ activeItems: readonly T[] /** * If the filter text should also be matched against the description of the items. Defaults to false. */ matchOnDescription: boolean /** * Current input value */ readonly value: string /** * An event signaling when QuickPick closed, fired with selected items or null when canceled. */ readonly onDidFinish: Event /** * An event signaling when the value of the filter text has changed. */ readonly onDidChangeValue: Event /** * An event signaling when the selected items have changed. */ readonly onDidChangeSelection: Event } export interface ScreenPosition { row: number col: number } export type MsgTypes = 'error' | 'warning' | 'more' export interface OpenTerminalOption { /** * Cwd of terminal, default to result of |getcwd()| */ cwd?: string /** * Close terminal on job finish, default to true. */ autoclose?: boolean /** * Keep focus current window, default to false. */ keepfocus?: boolean /** * Position of terminal window, default to 'right'. */ position?: 'bottom' | 'right' } /** * An output channel is a container for readonly textual information. * * To get an instance of an `OutputChannel` use * [createOutputChannel](#window.createOutputChannel). */ export interface OutputChannel { /** * The human-readable name of this output channel. */ readonly name: string readonly content: string /** * Append the given value to the channel. * * @param value A string, falsy values will not be printed. */ append(value: string): void /** * Append the given value and a line feed character * to the channel. * * @param value A string, falsy values will be printed. */ appendLine(value: string): void /** * Removes output from the channel. Latest `keep` lines will be remained. */ clear(keep?: number): void /** * Reveal this channel in the UI. * * @param preserveFocus When `true` the channel will not take focus. */ show(preserveFocus?: boolean): void /** * Hide this channel from the UI. */ hide(): void /** * Dispose and free associated resources. */ dispose(): void } export interface TerminalResult { bufnr: number success: boolean content?: string } export interface Dialog { /** * Buffer number of dialog. */ bufnr: number /** * Window id of dialog. */ winid: Promise dispose: () => void } export type HighlightItemDef = [string, number, number, number, number?, number?, number?] export interface HighlightDiff { remove: number[] removeMarkers: number[] add: HighlightItemDef[] } export interface MenuItem { text: string disabled?: boolean | { reason: string } } export interface MenuOption { /** * Title in menu window. */ title?: string, /** * Content in menu window as normal text. */ content?: string /** * Create and highlight shortcut characters. */ shortcuts?: boolean /** * Position of menu, default to 'cursor' */ position?: 'center' | 'cursor' } export interface InputOptions { /** * Position to show input, default to 'cursor' */ position?: 'cursor' | 'center' /** * Margin top editor when position is 'center' */ marginTop?: number /** * Border highlight of float window/popup, configuration `dialog.borderhighlight` used as default. */ borderhighlight?: string /** * Create key-mappings for quickpick list. */ list?: boolean } export interface InputPreference extends InputOptions { /** * Top, right, bottom, left border existence, default to [1,1,1,1] */ border?: [0 | 1, 0 | 1, 0 | 1, 0 | 1] /** * Rounded border, default to true, configuration `dialog.rounded` used as default. */ rounded?: boolean /** * Minimal window width, `g:coc_prompt_win_width` or 32 used as default. */ minWidth?: number /** * Maximum window width, configuration `dialog.maxWidth` used as default. */ maxWidth?: number } export interface InputDimension { readonly width: number readonly height: number /** * 0 based screen row */ readonly row: number /** * O based screen col */ readonly col: number } export interface InputBox { /** * Change or get title of input box. */ title: string /** * Change or get loading state of input box. */ loading: boolean /** * Change or get borderhighlight of input box. */ borderhighlight: string /** * Dimension of float window/popup */ readonly dimension: InputDimension /** * Buffer number of float window/popup */ readonly bufnr: number /** * An event signaling when the value has changed. */ readonly onDidChange: Event /** * An event signaling input finished, emit input value or null when canceled. */ readonly onDidFinish: Event } export namespace window { /** * The currently active editor or `undefined`. The active editor is the one * that currently has focus or, when none has focus, the one that has changed * input most recently. */ export const activeTextEditor: TextEditor | undefined /** * The currently visible editors or an empty array. */ export const visibleTextEditors: readonly TextEditor[] /** * An {@link Event} which fires when the {@link window.activeTextEditor active editor} * has changed. *Note* that the event also fires when the active editor changes * to `undefined`. */ export const onDidChangeActiveTextEditor: Event /** * An {@link Event} which fires when the array of {@link window.visibleTextEditors visible editors} * has changed. */ export const onDidChangeVisibleTextEditors: Event /** * The currently opened terminals or an empty array. */ export const terminals: readonly Terminal[] /** * onDidChangeTerminalState doesn't exist since we can't detect window resize on vim. */ /** * Event fired after terminal created, only fired with Terminal that * created by `window.createTerminal` */ export const onDidOpenTerminal: Event /** * Event fired on terminal close, only fired with Terminal that created by * `window.createTerminal` */ export const onDidCloseTerminal: Event /** * Creates a {@link Terminal} with a backing shell process. * The terminal is created by (neo)vim. * * @param options A TerminalOptions object describing the characteristics of the new terminal. * @return A new Terminal. * @throws When running in an environment where a new process cannot be started. */ export function createTerminal(opts: TerminalOptions): Promise /** * Reveal message with message type. * * @deprecated Use `window.showErrorMessage`, `window.showWarningMessage` and `window.showInformationMessage` instead. * @param msg Message text to show. * @param messageType Type of message, could be `error` `warning` and `more`, default to `more` */ export function showMessage(msg: string, messageType?: MsgTypes): void /** * Run command in vim terminal for result * * @param cmd Command to run. * @param cwd Cwd of terminal, default to result of |getcwd()|. */ export function runTerminalCommand(cmd: string, cwd?: string, keepfocus?: boolean): Promise /** * Open terminal window. * * @param cmd Command to run. * @param opts Terminal option. * @returns buffer number of terminal. */ export function openTerminal(cmd: string, opts?: OpenTerminalOption): Promise /** * Show quickpick for single item, use `window.menuPick` for menu at current current position. * Use `window.showPickerDialog()` for multiple selection. * * @param items Label list. * @param placeholder Prompt text, default to 'choose by number'. * @returns Index of selected item, or -1 when canceled. */ export function showQuickpick(items: string[], placeholder?: string): Promise /** * Shows a selection list allowing multiple selections. * Throw error when 'workspace.env.dialog' is not true. * * @param items An array of strings, or a promise that resolves to an array of strings. * @param options Configures the behavior of the selection list. * @param token A token that can be used to signal cancellation. * @return A promise that resolves to the selected items or `undefined`. */ export function showQuickPick(items: readonly string[] | Thenable, options: QuickPickOptions & { canPickMany: true }, token?: CancellationToken): Thenable /** * Shows a selection list. * Throw error when 'workspace.env.dialog' is not true. * * @param items An array of strings, or a promise that resolves to an array of strings. * @param options Configures the behavior of the selection list. * @param token A token that can be used to signal cancellation. * @return A promise that resolves to the selection or `undefined`. */ export function showQuickPick(items: readonly string[] | Thenable, options?: QuickPickOptions, token?: CancellationToken): Thenable /** * Shows a selection list allowing multiple selections. * Throw error when 'workspace.env.dialog' is not true. * * @param items An array of items, or a promise that resolves to an array of items. * @param options Configures the behavior of the selection list. * @param token A token that can be used to signal cancellation. * @return A promise that resolves to the selected items or `undefined`. */ export function showQuickPick(items: readonly T[] | Thenable, options: QuickPickOptions & { canPickMany: true }, token?: CancellationToken): Thenable /** * Shows a selection list. * Throw error when `workspace.env.dialog` not true. * * @param items An array of items, or a promise that resolves to an array of items. * @param options Configures the behavior of the selection list. * @param token A token that can be used to signal cancellation. * @return A promise that resolves to the selected item or `undefined`. */ export function showQuickPick(items: readonly T[] | Thenable, options?: QuickPickOptions, token?: CancellationToken): Thenable /** * Show menu picker at current cursor position, |inputlist()| is used as fallback. * Throw error when `workspace.env.dialog` not true. * * @param items Array of texts or menu items. * @param title Optional title of float/popup window. * @param token A token that can be used to signal cancellation. * @returns Selected index (0 based), -1 when canceled. */ export function showMenuPicker(items: string[] | MenuItem[], option?: MenuOption | string, token?: CancellationToken): Promise /** * Prompt user for confirm, a float/popup window would be used when possible, * use vim's |confirm()| function as callback. * * @param title The prompt text. * @returns Result of confirm. */ export function showPrompt(title: string): Promise /** * Show dialog window at the center of screen. * Note that the dialog would always be closed after button click. * Throw error when `workspace.env.dialog` not true. * * @param config Dialog configuration. * @returns Dialog or null when dialog can't work. */ export function showDialog(config: DialogConfig): Promise /** * Request input from user, `input()` is used when `window.env.dialog` not true. * * @param title Title text of prompt window. * @param defaultValue Default value of input, empty text by default. * @param {InputOptions} option for input window, other preferences are read from user configuration. */ export function requestInput(title: string, defaultValue?: string, option?: InputOptions): Promise /** * Creates and show a {@link InputBox} to let the user enter some text input. * Throw error when `workspace.env.dialog` not true. * * @return A new {@link InputBox}. */ export function createInputBox(title: string, defaultValue: string | undefined, option: InputPreference): Promise /** * Creates and show a {@link QuickPick} to let the user pick an item or items from a * list of items of type T. * Throw error when `workspace.env.dialog` not true. * * Note that in many cases the more convenient {@link window.showQuickPick} * is easier to use. {@link window.createQuickPick} should be used * when {@link window.showQuickPick} does not offer the required flexibility. * * @return A new {@link QuickPick}. */ export function createQuickPick(config: QuickPickConfig): Promise> /** * Create statusbar item that would be included in `g:coc_status`. * * @param priority Higher priority item would be shown right. * @param option * @return A new status bar item. */ export function createStatusBarItem(priority?: number, option?: StatusItemOption): StatusBarItem /** * Open local config file */ export function openLocalConfig(): Promise /** * Create a new output channel * * @param name Unique name of output channel. * @returns A new output channel. */ export function createOutputChannel(name: string): OutputChannel /** * Create a {@link TreeView} instance, call `show()` method to render. * * @param viewId Id of the view, used as title of TreeView when title doesn't exist. * @param options Options for creating the {@link TreeView} * @returns a {@link TreeView}. */ export function createTreeView(viewId: string, options: TreeViewOptions): TreeView /** * Reveal buffer of output channel. * * @param name Name of output channel. * @param preserveFocus Preserve window focus when true. */ export function showOutputChannel(name: string, preserveFocus: boolean): void /** * Echo lines at the bottom of vim. * * @param lines Line list. * @param truncate Truncate the lines to avoid 'press enter to continue' when true */ export function echoLines(lines: string[], truncate?: boolean): Promise /** * Get current cursor position (line, character both 0 based). * * @returns Cursor position. */ export function getCursorPosition(): Promise /** * Move cursor to position (line, character both 0 based). * * @param position LSP position. */ export function moveTo(position: Position): Promise /** * Get current cursor character offset in document, * length of line break would always be 1. * * @returns Character offset. */ export function getOffset(): Promise /** * Get screen position of current cursor(relative to editor), * both `row` and `col` are 0 based. * * @returns Cursor screen position. */ export function getCursorScreenPosition(): Promise /** * Show multiple picker at center of screen. * Use `workspace.env.dialog` to check if dialog could work. * * @param items A set of items that will be rendered as actions in the message. * @param title Title of picker dialog. * @param token A token that can be used to signal cancellation. * @return A promise that resolves to the selected items or `undefined`. */ export function showPickerDialog(items: string[], title: string, token?: CancellationToken): Promise /** * Show multiple picker at center of screen. * Use `workspace.env.dialog` to check if dialog could work. * * @param items A set of items that will be rendered as actions in the message. * @param title Title of picker dialog. * @param token A token that can be used to signal cancellation. * @return A promise that resolves to the selected items or `undefined`. */ export function showPickerDialog(items: T[], title: string, token?: CancellationToken): Promise /** * Show an information message to users. Optionally provide an array of items which will be presented as * clickable buttons. * * @param message The message to show. * @param items A set of items that will be rendered as actions in the message. * @return Promise that resolves to the selected item or `undefined` when being dismissed. */ export function showInformationMessage(message: string, ...items: string[]): Promise /** * Show an information message to users. Optionally provide an array of items which will be presented as * clickable buttons. * * @param message The message to show. * @param items A set of items that will be rendered as actions in the message. * @return Promise that resolves to the selected item or `undefined` when being dismissed. */ export function showInformationMessage(message: string, ...items: T[]): Promise /** * Show an warning message to users. Optionally provide an array of items which will be presented as * clickable buttons. * * @param message The message to show. * @param items A set of items that will be rendered as actions in the message. * @return Promise that resolves to the selected item or `undefined` when being dismissed. */ export function showWarningMessage(message: string, ...items: string[]): Promise /** * Show an warning message to users. Optionally provide an array of items which will be presented as * clickable buttons. * * @param message The message to show. * @param items A set of items that will be rendered as actions in the message. * @return Promise that resolves to the selected item or `undefined` when being dismissed. */ export function showWarningMessage(message: string, ...items: T[]): Promise /** * Show an error message to users. Optionally provide an array of items which will be presented as * clickable buttons. * * @param message The message to show. * @param items A set of items that will be rendered as actions in the message. * @return Promise that resolves to the selected item or `undefined` when being dismissed. */ export function showErrorMessage(message: string, ...items: string[]): Promise /** * Show an error message to users. Optionally provide an array of items which will be presented as * clickable buttons. * * @param message The message to show. * @param items A set of items that will be rendered as actions in the message. * @return Promise that resolves to the selected item or `undefined` when being dismissed. */ export function showErrorMessage(message: string, ...items: T[]): Promise /** * Show notification window at bottom right of screen. */ export function showNotification(config: NotificationConfig): Promise /** * Show progress in the editor. Progress is shown while running the given callback * and while the promise it returned isn't resolved nor rejected. * * @param task A callback returning a promise. Progress state can be reported with * the provided [progress](#Progress)-object. * * To report discrete progress, use `increment` to indicate how much work has been completed. Each call with * a `increment` value will be summed up and reflected as overall progress until 100% is reached (a value of * e.g. `10` accounts for `10%` of work done). * * To monitor if the operation has been cancelled by the user, use the provided [`CancellationToken`](#CancellationToken). * * @return The thenable the task-callback returned. */ export function withProgress(options: ProgressOptions, task: (progress: Progress<{ message?: string increment?: number }>, token: CancellationToken) => Thenable): Promise /** * Get selected range for current document */ export function getSelectedRange(visualmode: string): Promise /** * Visual select range of current document */ export function selectRange(range: Range): Promise /** * Get diff between new highlight items and current highlights requested from vim * * @param {number} bufnr - Buffer number * @param {string} ns - Highlight namespace * @param {HighlightItem[]} items - Highlight items * @param {[number, number] | undefined} - region 0 based start line and end line (end exclusive) * @param {CancellationToken} token - CancellationToken * @returns {Promise} */ export function diffHighlights(bufnr: number, ns: string, items: ExtendedHighlightItem[], region?: [number, number] | undefined, token?: CancellationToken): Promise /** * Apply highlight diffs, normally used with `window.diffHighlights` * * Timer is used to add highlights when there're too many highlight items to add, * the highlight process won't be finished on that case. * * @param {number} bufnr - Buffer name * @param {string} ns - Namespace * @param {number} priority * @param {HighlightDiff} diff * @param {boolean} notify - Use notification, default false. * @returns {Promise} */ export function applyDiffHighlights(bufnr: number, ns: string, priority: number, diff: HighlightDiff, notify?: boolean): Promise } // }} // extensions module {{ export interface Logger { readonly category: string readonly level: string log(...args: any[]): void trace(message: any, ...args: any[]): void debug(message: any, ...args: any[]): void info(message: any, ...args: any[]): void warn(message: any, ...args: any[]): void error(message: any, ...args: any[]): void fatal(message: any, ...args: any[]): void mark(message: any, ...args: any[]): void } /** * A memento represents a storage utility. It can store and retrieve * values. */ export interface Memento { /** * Return a value. * * @param key A string. * @return The stored value or `undefined`. */ get(key: string): T | undefined /** * Return a value. * * @param key A string. * @param defaultValue A value that should be returned when there is no * value (`undefined`) with the given key. * @return The stored value or the defaultValue. */ get(key: string, defaultValue: T): T /** * Store a value. The value must be JSON-stringifyable. * * @param key A string. * @param value A value. MUST not contain cyclic references. */ update(key: string, value: any): Promise } export type ExtensionState = 'disabled' | 'loaded' | 'activated' | 'unknown' export enum ExtensionType { Global, Local, SingleFile, Internal } export interface ExtensionJson { name: string main?: string engines: { [key: string]: string } version?: string [key: string]: any } export interface ExtensionInfo { id: string version: string description: string root: string exotic: boolean uri?: string state: ExtensionState isLocal: boolean packageJSON: Readonly } /** * Represents an extension. * * To get an instance of an `Extension` use [getExtension](#extensions.getExtension). */ export interface Extension { /** * The canonical extension identifier in the form of: `publisher.name`. */ readonly id: string /** * The absolute file path of the directory containing this extension. */ readonly extensionPath: string /** * `true` if the extension has been activated. */ readonly isActive: boolean /** * The parsed contents of the extension's package.json. */ readonly packageJSON: any /** * The public API exported by this extension. It is an invalid action * to access this field before this extension has been activated. */ readonly exports: T /** * Activates this extension and returns its public API. * * @return A promise that will resolve when this extension has been activated. */ activate(): Promise } /** * An extension context is a collection of utilities private to an * extension. * * An instance of an `ExtensionContext` is provided as the first * parameter to the `activate`-call of an extension. */ export interface ExtensionContext { /** * An array to which disposables can be added. When this * extension is deactivated the disposables will be disposed. */ subscriptions: Disposable[] /** * The absolute file path of the directory containing the extension. */ extensionPath: string /** * Get the absolute path of a resource contained in the extension. * * @param relativePath A relative path to a resource contained in the extension. * @return The absolute path of the resource. */ asAbsolutePath(relativePath: string): string /** * The absolute directory path for extension to download persist data. * The directory might not exist. */ storagePath: string /** * A memento object that stores state in the context * of the currently opened [workspace](#workspace.workspaceFolders). */ workspaceState: Memento /** * A memento object that stores state independent * of the current opened [workspace](#workspace.workspaceFolders). */ globalState: Memento logger: Logger } export type ExtensionApi = { [index: string]: any } | void | null | undefined export interface PropertyScheme { type: string default: any description: string enum?: string[] items?: any [key: string]: any } export namespace extensions { /** * Fired on extension loaded, extension not activated yet. */ export const onDidLoadExtension: Event> /** * Fired on extension activated. */ export const onDidActiveExtension: Event> /** * Fired with extension id on extension unload. */ export const onDidUnloadExtension: Event /** * Get all loaded extensions, without disabled extensions, extension may not activated. */ export const all: ReadonlyArray> /** * Get state of specific extension. */ export function getExtensionState(id: string): ExtensionState /** * Get state of all extensions, including disabled extensions. */ export function getExtensionStates(): Promise /** * Check if extension is activated. */ export function isActivated(id: string): boolean /** * Dynamic add custom json schemes without using package.json. */ export function addSchemeProperty(key: string, def: PropertyScheme): void } // }} // listManager module {{ export interface LocationWithLine { uri: string /** * Match text of line. */ line: string /** * Highlight text in line. */ text?: string } export interface AnsiHighlight { /** * Byte indexes, 0 based. */ span: [number, number] hlGroup: string } export interface ListItem { label: string preselect?: boolean filterText?: string /** * A string that should be used when comparing this item * with other items, only used for fuzzy filter. */ sortText?: string location?: Location | LocationWithLine | string data?: any ansiHighlights?: AnsiHighlight[] resolved?: boolean } export interface ListHighlights { /** * Byte indexes list, 0 based. */ spans: [number, number][] /** * `CocListSearch` is used when it not exist. */ hlGroup?: string } export type ListMode = 'normal' | 'insert' export type ListMatcher = 'strict' | 'fuzzy' | 'regex' export interface ListOptions { position: string reverse: boolean input: string ignorecase: boolean interactive: boolean sort: boolean mode: ListMode matcher: ListMatcher autoPreview: boolean numberSelect: boolean noQuit: boolean first: boolean } export interface ListContext { /** * Input on list activated. */ input: string /** * Current work directory on activated. */ cwd: string /** * Options of list. */ options: ListOptions /** * Arguments passed to list. */ args: string[] /** * Original window on list invoke. */ window: Window /** * Original buffer on list invoke. */ buffer: Buffer listWindow: Window | null } export interface ListAction { /** * Action name */ name: string /** * Should persist list window on invoke. */ persist?: boolean /** * Should reload list after invoke. */ reload?: boolean /** * Inovke all selected items in parallel. */ parallel?: boolean /** * Support handle multiple items at once. */ multiple?: boolean /** * Tab positioned list should be persisted (no window switch) on action invoke. */ tabPersist?: boolean /** * Item is array of selected items when multiple is true. */ execute: (item: ListItem | ListItem[], context: ListContext) => ProviderResult } export interface MultipleListAction extends Omit { multiple: true execute: (item: ListItem[], context: ListContext) => ProviderResult } export interface ListTask { on(event: 'data', callback: (item: ListItem) => void): void on(event: 'end', callback: () => void): void on(event: 'error', callback: (msg: string | Error) => void): void dispose(): void } export interface ListArgument { key?: string hasValue?: boolean name: string description: string } export interface IList { /** * Unique name of list. */ name: string /** * Default action name. */ defaultAction: string /** * Action list. */ actions: ListAction[] /** * Load list items. */ loadItems(context: ListContext, token: CancellationToken): Promise /** * Should be true when interactive is supported. */ interactive?: boolean /** * Description of list. */ description?: string /** * Detail description, shown in help. */ detail?: string /** * Options supported by list. */ options?: ListArgument[] /** * Resolve list item. */ resolveItem?(item: ListItem): Promise /** * Highlight buffer by vim's syntax commands. */ doHighlight?(): void /** * Called on list unregistered. */ dispose?(): void } export interface PreviewOptions { bufname?: string lines: string[] filetype: string lnum?: number range?: Range /** * @deprecated not used */ sketch?: boolean } export namespace listManager { /** * Registered list names set. */ export const names: ReadonlyArray /** * Register list, list session can be created by `CocList [name]` after registered. */ export function registerList(list: IList): Disposable } // }} // snippetManager module {{ export interface SnippetSession { isActive: boolean } export interface UltiSnippetOption { regex?: string context?: string } /** * A snippet string is a template which allows to insert text * and to control the editor cursor when insertion happens. * * A snippet can define tab stops and placeholders with `$1`, `$2` * and `${3:foo}`. `$0` defines the final tab stop, it defaults to * the end of the snippet. Variables are defined with `$name` and * `${name:default value}`. The full snippet syntax is documented * [here](https://code.visualstudio.com/docs/editor/userdefinedsnippets#_creating-your-own-snippets). */ export class SnippetString { /** * The snippet string. */ value: string constructor( /** * The default snippet string. */ value?: string ) /** * Builder-function that appends the given string to * the {@link SnippetString.value `value`} of this snippet string. * * @param string A value to append 'as given'. The string will be escaped. * @return This snippet string. */ appendText(string: string): SnippetString /** * Builder-function that appends a tabstop (`$1`, `$2` etc) to * the {@link SnippetString.value `value`} of this snippet string. * * @param number The number of this tabstop, defaults to an auto-increment * value starting at 1. * @return This snippet string. */ appendTabstop(number?: number): SnippetString /** * Builder-function that appends a placeholder (`${1:value}`) to * the {@link SnippetString.value `value`} of this snippet string. * * @param value The value of this placeholder - either a string or a function * with which a nested snippet can be created. * @param number The number of this tabstop, defaults to an auto-increment * value starting at 1. * @return This snippet string. */ appendPlaceholder(value: string | ((snippet: SnippetString) => any), number?: number): SnippetString /** * Builder-function that appends a choice (`${1|a,b,c|}`) to * the {@link SnippetString.value `value`} of this snippet string. * * @param values The values for choices - the array of strings * @param number The number of this tabstop, defaults to an auto-increment * value starting at 1. * @return This snippet string. */ appendChoice(values: string[], number?: number): SnippetString /** * Builder-function that appends a variable (`${VAR}`) to * the {@link SnippetString.value `value`} of this snippet string. * * @param name The name of the variable - excluding the `$`. * @param defaultValue The default value which is used when the variable name cannot * be resolved - either a string or a function with which a nested snippet can be created. * @return This snippet string. */ appendVariable(name: string, defaultValue: string | ((snippet: SnippetString) => any)): SnippetString } /** * Manage snippet sessions. */ export namespace snippetManager { /** * Get snippet session by bufnr. */ export function getSession(bufnr: number): SnippetSession | undefined /** * Resolve snippet string to text. */ export function resolveSnippet(body: string, ultisnip?: UltiSnippetOption): Promise /** * Insert snippet at current buffer. * * @param {string} snippet Textmate snippet string. * @param {boolean} select Not select first placeholder when false, default `true`. * @param {Range} range Repalce range, insert to current cursor position when undefined. * @returns {Promise} true when insert success. */ export function insertSnippet(snippet: string | SnippetString, select?: boolean, range?: Range, ultisnip?: boolean): Promise /** * Jump to next placeholder, only works when snippet session activated. */ export function nextPlaceholder(): Promise /** * Jump to previous placeholder, only works when snippet session activated. */ export function previousPlaceholder(): Promise /** * Cancel snippet session of current buffer, does nothing when no session activated. */ export function cancel(): void /** * Check if snippet activated for bufnr. */ export function isActivated(bufnr: number): boolean } // }} // diagnosticManager module {{ export interface DiagnosticItem { file: string lnum: number col: number source: string code: string | number message: string severity: string level: number location: Location } export enum DiagnosticKind { Syntax, Semantic, Suggestion, } /** * A diagnostics collection is a container that manages a set of * [diagnostics](#Diagnostic). Diagnostics are always scopes to a * diagnostics collection and a resource. * * To get an instance of a `DiagnosticCollection` use * [createDiagnosticCollection](#languages.createDiagnosticCollection). */ export interface DiagnosticCollection { /** * The name of this diagnostic collection, for instance `typescript`. Every diagnostic * from this collection will be associated with this name. Also, the task framework uses this * name when defining [problem matchers](https://code.visualstudio.com/docs/editor/tasks#_defining-a-problem-matcher). */ readonly name: string /** * Assign diagnostics for given resource. Will replace * existing diagnostics for that resource. * * @param uri A resource identifier. * @param diagnostics Array of diagnostics or `undefined` */ set(uri: string, diagnostics: Diagnostic[] | null): void /** * Replace all entries in this collection. * * Diagnostics of multiple tuples of the same uri will be merged, e.g * `[[file1, [d1]], [file1, [d2]]]` is equivalent to `[[file1, [d1, d2]]]`. * If a diagnostics item is `undefined` as in `[file1, undefined]` * all previous but not subsequent diagnostics are removed. * * @param entries An array of tuples, like `[[file1, [d1, d2]], [file2, [d3, d4, d5]]]`, or `undefined`. */ set(entries: [string, Diagnostic[] | null][] | string, diagnostics?: Diagnostic[]): void /** * Remove all diagnostics from this collection that belong * to the provided `uri`. The same as `#set(uri, undefined)`. * * @param uri A resource identifier. */ delete(uri: string): void /** * Remove all diagnostics from this collection. The same * as calling `#set(undefined)` */ clear(): void /** * Iterate over each entry in this collection. * * @param callback Function to execute for each entry. * @param thisArg The `this` context used when invoking the handler function. */ forEach(callback: (uri: string, diagnostics: Diagnostic[], collection: DiagnosticCollection) => any, thisArg?: any): void /** * Get the diagnostics for a given resource. *Note* that you cannot * modify the diagnostics-array returned from this call. * * @param uri A resource identifier. * @returns An immutable array of [diagnostics](#Diagnostic) or `undefined`. */ get(uri: string): Diagnostic[] | undefined /** * Check if this collection contains diagnostics for a * given resource. * * @param uri A resource identifier. * @returns `true` if this collection has diagnostic for the given resource. */ has(uri: string): boolean /** * Dispose and free associated resources. Calls * [clear](#DiagnosticCollection.clear). */ dispose(): void } export interface DiagnosticEventParams { bufnr: number uri: string diagnostics: ReadonlyArray } export namespace diagnosticManager { export const onDidRefresh: Event /** * Create collection by name */ export function create(name: string): DiagnosticCollection /** * Get readonly diagnostics for uri */ export function getDiagnostics(uri: string): { [collection: string]: Diagnostic[] } /** * Get readonly diagnostics by document and range. */ export function getDiagnosticsInRange(doc: TextDocumentIdentifier, range: Range): ReadonlyArray /** * Get all sorted diagnostics */ export function getDiagnosticList(): Promise> /** * All diagnostics at current cursor position. */ export function getCurrentDiagnostics(): Promise> /** * Get diagnostic collection. */ export function getCollectionByName(name: string): DiagnosticCollection } // }} // language client {{ /** * An action to be performed when the connection is producing errors. */ export enum ErrorAction { /** * Continue running the server. */ Continue = 1, /** * Shutdown the server. */ Shutdown = 2 } /** * An action to be performed when the connection to a server got closed. */ export enum CloseAction { /** * Don't restart the server. The connection stays closed. */ DoNotRestart = 1, /** * Restart the server. */ Restart = 2 } /** * A pluggable error handler that is invoked when the connection is either * producing errors or got closed. */ export interface ErrorHandler { /** * An error has occurred while writing or reading from the connection. * * @param error - the error received * @param message - the message to be delivered to the server if know. * @param count - a count indicating how often an error is received. Will * be reset if a message got successfully send or received. */ error(error: Error, message: { jsonrpc: string }, count: number): ErrorAction /** * The connection to the server got closed. */ closed(): CloseAction } export interface InitializationFailedHandler { (error: Error | any): boolean } export interface SynchronizeOptions { configurationSection?: string | string[] fileEvents?: FileSystemWatcher | FileSystemWatcher[] } export enum RevealOutputChannelOn { Info = 1, Warn = 2, Error = 3, Never = 4 } export interface ConfigurationItem { /** * The scope to get the configuration section for. */ scopeUri?: string /** * The configuration section asked for. */ section?: string } export interface ResponseError { code: number data: D | undefined } export type HandlerResult = R | ResponseError | Thenable | Thenable> | Thenable> export interface RequestHandler { (params: P, token: CancellationToken): HandlerResult } export interface RequestHandler0 { (token: CancellationToken): HandlerResult } /** * The parameters of a configuration request. */ export interface ConfigurationParams { items: ConfigurationItem[] } export interface ConfigurationWorkspaceMiddleware { configuration?: (params: ConfigurationParams, token: CancellationToken, next: RequestHandler) => HandlerResult } export interface WorkspaceFolderWorkspaceMiddleware { workspaceFolders?: (token: CancellationToken, next: RequestHandler0) => HandlerResult didChangeWorkspaceFolders?: NextSignature } export interface ProvideTypeDefinitionSignature { ( this: void, document: LinesTextDocument, position: Position, token: CancellationToken ): ProviderResult } export interface TypeDefinitionMiddleware { provideTypeDefinition?: ( this: void, document: LinesTextDocument, position: Position, token: CancellationToken, next: ProvideTypeDefinitionSignature ) => ProviderResult } export interface ProvideImplementationSignature { (this: void, document: LinesTextDocument, position: Position, token: CancellationToken): ProviderResult } export interface ImplementationMiddleware { provideImplementation?: (this: void, document: LinesTextDocument, position: Position, token: CancellationToken, next: ProvideImplementationSignature) => ProviderResult } export type ProvideDocumentColorsSignature = (document: LinesTextDocument, token: CancellationToken) => ProviderResult export type ProvideColorPresentationSignature = ( color: Color, context: { document: LinesTextDocument; range: Range }, token: CancellationToken ) => ProviderResult export interface ColorProviderMiddleware { provideDocumentColors?: ( this: void, document: LinesTextDocument, token: CancellationToken, next: ProvideDocumentColorsSignature ) => ProviderResult provideColorPresentations?: ( this: void, color: Color, context: { document: LinesTextDocument; range: Range }, token: CancellationToken, next: ProvideColorPresentationSignature ) => ProviderResult } export interface ProvideDeclarationSignature { (this: void, document: LinesTextDocument, position: Position, token: CancellationToken): ProviderResult } export interface DeclarationMiddleware { provideDeclaration?: (this: void, document: LinesTextDocument, position: Position, token: CancellationToken, next: ProvideDeclarationSignature) => ProviderResult } export type ProvideFoldingRangeSignature = ( this: void, document: LinesTextDocument, context: FoldingContext, token: CancellationToken ) => ProviderResult export interface FoldingRangeProviderMiddleware { provideFoldingRanges?: ( this: void, document: LinesTextDocument, context: FoldingContext, token: CancellationToken, next: ProvideFoldingRangeSignature ) => ProviderResult } export interface PrepareCallHierarchySignature { (this: void, document: LinesTextDocument, position: Position, token: CancellationToken): ProviderResult } export interface CallHierarchyIncomingCallsSignature { (this: void, item: CallHierarchyItem, token: CancellationToken): ProviderResult } export interface CallHierarchyOutgoingCallsSignature { (this: void, item: CallHierarchyItem, token: CancellationToken): ProviderResult } export interface CallHierarchyMiddleware { prepareCallHierarchy?: ( this: void, document: LinesTextDocument, positions: Position, token: CancellationToken, next: PrepareCallHierarchySignature ) => ProviderResult provideCallHierarchyIncomingCalls?: ( this: void, item: CallHierarchyItem, token: CancellationToken, next: CallHierarchyIncomingCallsSignature ) => ProviderResult provideCallHierarchyOutgoingCalls?: ( this: void, item: CallHierarchyItem, token: CancellationToken, next: CallHierarchyOutgoingCallsSignature ) => ProviderResult } export interface DocumentSemanticsTokensSignature { (this: void, document: LinesTextDocument, token: CancellationToken): ProviderResult } export interface DocumentSemanticsTokensEditsSignature { (this: void, document: LinesTextDocument, previousResultId: string, token: CancellationToken): ProviderResult } export interface DocumentRangeSemanticTokensSignature { (this: void, document: LinesTextDocument, range: Range, token: CancellationToken): ProviderResult } export interface SemanticTokensMiddleware { provideDocumentSemanticTokens?: ( this: void, document: LinesTextDocument, token: CancellationToken, next: DocumentSemanticsTokensSignature ) => ProviderResult provideDocumentSemanticTokensEdits?: ( this: void, document: LinesTextDocument, previousResultId: string, token: CancellationToken, next: DocumentSemanticsTokensEditsSignature ) => ProviderResult provideDocumentRangeSemanticTokens?: ( this: void, document: LinesTextDocument, range: Range, token: CancellationToken, next: DocumentRangeSemanticTokensSignature ) => ProviderResult } /** * File operation middleware * @since 3.16.0 */ export interface FileOperationsMiddleware { didCreateFiles?: NextSignature willCreateFiles?: NextSignature> didRenameFiles?: NextSignature willRenameFiles?: NextSignature> didDeleteFiles?: NextSignature willDeleteFiles?: NextSignature> } export interface ProvideLinkedEditingRangeSignature { (this: void, document: LinesTextDocument, position: Position, token: CancellationToken): ProviderResult } export interface LinkedEditingRangeMiddleware { provideLinkedEditingRange?: ( this: void, document: LinesTextDocument, position: Position, token: CancellationToken, next: ProvideLinkedEditingRangeSignature ) => ProviderResult } export interface ProvideSelectionRangeSignature { (this: void, document: LinesTextDocument, positions: Position[], token: CancellationToken): ProviderResult } export interface SelectionRangeProviderMiddleware { provideSelectionRanges?: (this: void, document: LinesTextDocument, positions: Position[], token: CancellationToken, next: ProvideSelectionRangeSignature) => ProviderResult } export interface HandleWorkDoneProgressSignature { (this: void, token: ProgressToken, params: WorkDoneProgressBegin | WorkDoneProgressReport | WorkDoneProgressEnd): void } export interface HandleDiagnosticsSignature { (this: void, uri: string, diagnostics: Diagnostic[]): void } export interface ProvideCompletionItemsSignature { (this: void, document: LinesTextDocument, position: Position, context: CompletionContext, token: CancellationToken): ProviderResult } export interface ResolveCompletionItemSignature { (this: void, item: CompletionItem, token: CancellationToken): ProviderResult } export interface ProvideHoverSignature { (this: void, document: LinesTextDocument, position: Position, token: CancellationToken): ProviderResult } export interface ProvideSignatureHelpSignature { (this: void, document: LinesTextDocument, position: Position, context: SignatureHelpContext, token: CancellationToken): ProviderResult } export interface ProvideDefinitionSignature { (this: void, document: LinesTextDocument, position: Position, token: CancellationToken): ProviderResult } export interface ProvideReferencesSignature { (this: void, document: LinesTextDocument, position: Position, options: { includeDeclaration: boolean }, token: CancellationToken): ProviderResult } export interface ProvideDocumentHighlightsSignature { (this: void, document: LinesTextDocument, position: Position, token: CancellationToken): ProviderResult } export interface ProvideDocumentSymbolsSignature { (this: void, document: LinesTextDocument, token: CancellationToken): ProviderResult } export interface ProvideWorkspaceSymbolsSignature { (this: void, query: string, token: CancellationToken): ProviderResult } export interface ProvideCodeActionsSignature { (this: void, document: LinesTextDocument, range: Range, context: CodeActionContext, token: CancellationToken): ProviderResult<(Command | CodeAction)[]> } export interface ResolveCodeActionSignature { (this: void, item: CodeAction, token: CancellationToken): ProviderResult } export interface ProvideCodeLensesSignature { (this: void, document: LinesTextDocument, token: CancellationToken): ProviderResult } export interface ResolveCodeLensSignature { (this: void, codeLens: CodeLens, token: CancellationToken): ProviderResult } export interface ProvideDocumentFormattingEditsSignature { (this: void, document: LinesTextDocument, options: FormattingOptions, token: CancellationToken): ProviderResult } export interface ProvideDocumentRangeFormattingEditsSignature { (this: void, document: LinesTextDocument, range: Range, options: FormattingOptions, token: CancellationToken): ProviderResult } export interface ProvideOnTypeFormattingEditsSignature { (this: void, document: LinesTextDocument, position: Position, ch: string, options: FormattingOptions, token: CancellationToken): ProviderResult } export interface PrepareRenameSignature { (this: void, document: LinesTextDocument, position: Position, token: CancellationToken): ProviderResult } export interface ProvideRenameEditsSignature { (this: void, document: LinesTextDocument, position: Position, newName: string, token: CancellationToken): ProviderResult } export interface ProvideDocumentLinksSignature { (this: void, document: LinesTextDocument, token: CancellationToken): ProviderResult } export interface ResolveDocumentLinkSignature { (this: void, link: DocumentLink, token: CancellationToken): ProviderResult } export interface ExecuteCommandSignature { (this: void, command: string, args: any[]): ProviderResult } export interface NextSignature { (this: void, data: P, next: (data: P) => R): R } export interface DidChangeConfigurationSignature { (this: void, sections: string[] | undefined): void } export interface DidChangeWatchedFileSignature { (this: void, event: FileEvent): void } export interface _WorkspaceMiddleware { didChangeConfiguration?: (this: void, sections: string[] | undefined, next: DidChangeConfigurationSignature) => void didChangeWatchedFile?: (this: void, event: FileEvent, next: DidChangeWatchedFileSignature) => void } export type WorkspaceMiddleware = _WorkspaceMiddleware & ConfigurationWorkspaceMiddleware & WorkspaceFolderWorkspaceMiddleware & FileOperationsMiddleware /** * Params to show a document. * * @since 3.16.0 */ export interface ShowDocumentParams { /** * The document uri to show. */ uri: string /** * Indicates to show the resource in an external program. * To show for example `https://code.visualstudio.com/` * in the default WEB browser set `external` to `true`. */ external?: boolean /** * An optional property to indicate whether the editor * showing the document should take focus or not. * Clients might ignore this property if an external * program in started. */ takeFocus?: boolean /** * An optional selection range if the document is a text * document. Clients might ignore the property if an * external program is started or the file is not a text * file. */ selection?: Range } /** * The result of an show document request. * * @since 3.16.0 */ export interface ShowDocumentResult { /** * A boolean indicating if the show was successful. */ success: boolean } export interface _WindowMiddleware { showDocument?: ( this: void, params: ShowDocumentParams, next: RequestHandler ) => Promise } export type WindowMiddleware = _WindowMiddleware /** * The Middleware lets extensions intercept the request and notifications send and received * from the server */ interface _Middleware { didOpen?: NextSignature didChange?: NextSignature willSave?: NextSignature willSaveWaitUntil?: NextSignature> didSave?: NextSignature didClose?: NextSignature handleDiagnostics?: (this: void, uri: string, diagnostics: Diagnostic[], next: HandleDiagnosticsSignature) => void provideCompletionItem?: (this: void, document: LinesTextDocument, position: Position, context: CompletionContext, token: CancellationToken, next: ProvideCompletionItemsSignature) => ProviderResult resolveCompletionItem?: (this: void, item: CompletionItem, token: CancellationToken, next: ResolveCompletionItemSignature) => ProviderResult provideHover?: (this: void, document: LinesTextDocument, position: Position, token: CancellationToken, next: ProvideHoverSignature) => ProviderResult provideSignatureHelp?: (this: void, document: LinesTextDocument, position: Position, context: SignatureHelpContext, token: CancellationToken, next: ProvideSignatureHelpSignature) => ProviderResult provideDefinition?: (this: void, document: LinesTextDocument, position: Position, token: CancellationToken, next: ProvideDefinitionSignature) => ProviderResult provideReferences?: (this: void, document: LinesTextDocument, position: Position, options: { includeDeclaration: boolean }, token: CancellationToken, next: ProvideReferencesSignature) => ProviderResult provideDocumentHighlights?: (this: void, document: LinesTextDocument, position: Position, token: CancellationToken, next: ProvideDocumentHighlightsSignature) => ProviderResult provideDocumentSymbols?: (this: void, document: LinesTextDocument, token: CancellationToken, next: ProvideDocumentSymbolsSignature) => ProviderResult provideWorkspaceSymbols?: (this: void, query: string, token: CancellationToken, next: ProvideWorkspaceSymbolsSignature) => ProviderResult provideCodeActions?: (this: void, document: LinesTextDocument, range: Range, context: CodeActionContext, token: CancellationToken, next: ProvideCodeActionsSignature) => ProviderResult<(Command | CodeAction)[]> handleWorkDoneProgress?: (this: void, token: ProgressToken, params: WorkDoneProgressBegin | WorkDoneProgressReport | WorkDoneProgressEnd, next: HandleWorkDoneProgressSignature) => void resolveCodeAction?: (this: void, item: CodeAction, token: CancellationToken, next: ResolveCodeActionSignature) => ProviderResult provideCodeLenses?: (this: void, document: LinesTextDocument, token: CancellationToken, next: ProvideCodeLensesSignature) => ProviderResult resolveCodeLens?: (this: void, codeLens: CodeLens, token: CancellationToken, next: ResolveCodeLensSignature) => ProviderResult provideDocumentFormattingEdits?: (this: void, document: LinesTextDocument, options: FormattingOptions, token: CancellationToken, next: ProvideDocumentFormattingEditsSignature) => ProviderResult provideDocumentRangeFormattingEdits?: (this: void, document: LinesTextDocument, range: Range, options: FormattingOptions, token: CancellationToken, next: ProvideDocumentRangeFormattingEditsSignature) => ProviderResult provideOnTypeFormattingEdits?: (this: void, document: LinesTextDocument, position: Position, ch: string, options: FormattingOptions, token: CancellationToken, next: ProvideOnTypeFormattingEditsSignature) => ProviderResult prepareRename?: (this: void, document: LinesTextDocument, position: Position, token: CancellationToken, next: PrepareRenameSignature) => ProviderResult provideRenameEdits?: (this: void, document: LinesTextDocument, position: Position, newName: string, token: CancellationToken, next: ProvideRenameEditsSignature) => ProviderResult provideDocumentLinks?: (this: void, document: LinesTextDocument, token: CancellationToken, next: ProvideDocumentLinksSignature) => ProviderResult resolveDocumentLink?: (this: void, link: DocumentLink, token: CancellationToken, next: ResolveDocumentLinkSignature) => ProviderResult executeCommand?: (this: void, command: string, args: any[], next: ExecuteCommandSignature) => ProviderResult workspace?: WorkspaceMiddleware window?: WindowMiddleware } export type Middleware = _Middleware & TypeDefinitionMiddleware & ImplementationMiddleware & ColorProviderMiddleware & DeclarationMiddleware & FoldingRangeProviderMiddleware & CallHierarchyMiddleware & SemanticTokensMiddleware & LinkedEditingRangeMiddleware & SelectionRangeProviderMiddleware export interface ConnectionOptions { // cancellationStrategy: CancellationStrategy maxRestartCount?: number } export interface LanguageClientOptions { ignoredRootPaths?: string[] disableSnippetCompletion?: boolean disableDynamicRegister?: boolean disabledFeatures?: string[] formatterPriority?: number documentSelector?: DocumentSelector | string[] synchronize?: SynchronizeOptions diagnosticCollectionName?: string outputChannelName?: string outputChannel?: OutputChannel revealOutputChannelOn?: RevealOutputChannelOn /** * The encoding use to read stdout and stderr. Defaults * to 'utf8' if omitted. */ stdioEncoding?: string initializationOptions?: any | (() => any) initializationFailedHandler?: InitializationFailedHandler progressOnInitialization?: boolean errorHandler?: ErrorHandler middleware?: Middleware workspaceFolder?: WorkspaceFolder connectionOptions?: ConnectionOptions markdown?: { isTrusted: boolean } } export enum State { Stopped = 1, Running = 2, Starting = 3 } export interface StateChangeEvent { oldState: State newState: State } export enum ClientState { Initial = 0, Starting = 1, StartFailed = 2, Running = 3, Stopping = 4, Stopped = 5 } export interface RegistrationData { id: string registerOptions: T } /** * A static feature. A static feature can't be dynamically activate via the * server. It is wired during the initialize sequence. */ export interface StaticFeature { /** * Called to fill the initialize params. * * @params the initialize params. */ fillInitializeParams?: (params: any) => void /** * Called to fill in the client capabilities this feature implements. * * @param capabilities The client capabilities to fill. */ fillClientCapabilities(capabilities: any): void /** * Initialize the feature. This method is called on a feature instance * when the client has successfully received the initialize request from * the server and before the client sends the initialized notification * to the server. * * @param capabilities the server capabilities * @param documentSelector the document selector pass to the client's constructor. * May be `undefined` if the client was created without a selector. */ initialize(capabilities: any, documentSelector: DocumentSelector | undefined): void /** * Called when the client is stopped to dispose this feature. Usually a feature * unregisters listeners registered hooked up with the VS Code extension host. */ dispose(): void } class ParameterStructures { private readonly kind /** * The parameter structure is automatically inferred on the number of parameters * and the parameter type in case of a single param. */ static readonly auto: ParameterStructures /** * Forces `byPosition` parameter structure. This is useful if you have a single * parameter which has a literal type. */ static readonly byPosition: ParameterStructures /** * Forces `byName` parameter structure. This is only useful when having a single * parameter. The library will report errors if used with a different number of * parameters. */ static readonly byName: ParameterStructures private constructor() static is(value: any): value is ParameterStructures toString(): string } /** * An interface to type messages. */ export interface MessageSignature { readonly method: string readonly numberOfParams: number readonly parameterStructures: ParameterStructures } /** * * An abstract implementation of a MessageType. */ abstract class AbstractMessageSignature implements MessageSignature { readonly method: string readonly numberOfParams: number constructor(method: string, numberOfParams: number) get parameterStructures(): ParameterStructures } /** * Classes to type request response pairs */ export class RequestType0 extends AbstractMessageSignature { /** * Clients must not use this property. It is here to ensure correct typing. */ readonly _: [R, E, _EM] | undefined constructor(method: string) } export class RequestType extends AbstractMessageSignature { private _parameterStructures /** * Clients must not use this property. It is here to ensure correct typing. */ readonly _: [P, R, E, _EM] | undefined constructor(method: string, _parameterStructures?: ParameterStructures) get parameterStructures(): ParameterStructures } export class NotificationType

extends AbstractMessageSignature { /** * Clients must not use this property. It is here to ensure correct typing. */ readonly _: [P, _EM] | undefined constructor(method: string) } export class NotificationType0 extends AbstractMessageSignature { /** * Clients must not use this property. It is here to ensure correct typing. */ readonly _: [_EM] | undefined constructor(method: string) } export interface InitializeParams { /** * The process Id of the parent process that started * the server. */ processId: number | null /** * Information about the client * * @since 3.15.0 */ clientInfo?: { /** * The name of the client as defined by the client. */ name: string /** * The client's version as defined by the client. */ version?: string } /** * The rootPath of the workspace. Is null * if no folder is open. * * @deprecated in favour of rootUri. */ rootPath?: string | null /** * The rootUri of the workspace. Is null if no * folder is open. If both `rootPath` and `rootUri` are set * `rootUri` wins. * * @deprecated in favour of workspaceFolders. */ rootUri: string | null /** * The capabilities provided by the client (editor or tool) */ capabilities: any /** * User provided initialization options. */ initializationOptions?: any /** * The initial trace setting. If omitted trace is disabled ('off'). */ trace?: 'off' | 'messages' | 'verbose' /** * An optional token that a server can use to report work done progress. */ workDoneToken?: ProgressToken } class RegistrationType { /** * Clients must not use this property. It is here to ensure correct typing. */ readonly ____: [RO, _EM] | undefined readonly method: string constructor(method: string) } /** * The result returned from an initialize request. */ export interface InitializeResult { /** * The capabilities the language server provides. */ capabilities: any /** * Information about the server. * * @since 3.15.0 */ serverInfo?: { /** * The name of the server as defined by the server. */ name: string /** * The servers's version as defined by the server. */ version?: string } /** * Custom initialization results. */ [custom: string]: any } export interface DynamicFeature { /** * Called to fill the initialize params. * * @params the initialize params. */ fillInitializeParams?: (params: InitializeParams) => void /** * Called to fill in the client capabilities this feature implements. * * @param capabilities The client capabilities to fill. */ fillClientCapabilities(capabilities: any): void /** * Initialize the feature. This method is called on a feature instance * when the client has successfully received the initialize request from * the server and before the client sends the initialized notification * to the server. * * @param capabilities the server capabilities. * @param documentSelector the document selector pass to the client's constructor. * May be `undefined` if the client was created without a selector. */ initialize(capabilities: any, documentSelector: DocumentSelector | undefined): void /** * The signature (e.g. method) for which this features support dynamic activation / registration. */ registrationType: RegistrationType /** * Is called when the server send a register request for the given message. * * @param data additional registration data as defined in the protocol. */ register(data: RegistrationData): void /** * Is called when the server wants to unregister a feature. * * @param id the id used when registering the feature. */ unregister(id: string): void /** * Called when the client is stopped to dispose this feature. Usually a feature * unregisters listeners registered hooked up with the VS Code extension host. */ dispose(): void } export interface NotificationFeature { /** * Triggers the corresponding RPC method. */ getProvider(document: TextDocument): { send: T } } export interface ExecutableOptions { cwd?: string env?: any detached?: boolean shell?: boolean } export interface Executable { command: string args?: string[] options?: ExecutableOptions } export interface ForkOptions { cwd?: string env?: any execPath?: string encoding?: string execArgv?: string[] } export interface StreamInfo { writer: NodeJS.WritableStream reader: NodeJS.ReadableStream detached?: boolean } export enum TransportKind { stdio = 0, ipc = 1, pipe = 2, socket = 3 } export interface SocketTransport { kind: TransportKind.socket port: number } export interface NodeModule { module: string transport?: TransportKind | SocketTransport args?: string[] runtime?: string options?: ForkOptions } export interface ChildProcessInfo { process: cp.ChildProcess detached: boolean } export interface PartialMessageInfo { readonly messageToken: number readonly waitingTime: number } export interface MessageReader { readonly onError: Event readonly onClose: Event readonly onPartialMessage: Event listen(callback: (data: { jsonrpc: string }) => void): void dispose(): void } export interface MessageWriter { readonly onError: Event<[Error, { jsonrpc: string } | undefined, number | undefined]> readonly onClose: Event write(msg: { jsonrpc: string }): void dispose(): void } export class NullLogger { constructor() error(message: string): void warn(message: string): void info(message: string): void log(message: string): void } export interface MessageTransports { reader: MessageReader writer: MessageWriter detached?: boolean } export namespace MessageTransports { /** * Checks whether the given value conforms to the [MessageTransports](#MessageTransports) interface. */ function is(value: any): value is MessageTransports } export type ServerOptions = Executable | NodeModule | { run: Executable debug: Executable } | { run: NodeModule debug: NodeModule } | (() => Promise) export interface _EM { _$endMarker$_: number } export class ProgressType

{ /** * Clients must not use this property. It is here to ensure correct typing. */ readonly __?: [P, _EM] constructor() } export enum Trace { Off = 0, Messages = 1, Verbose = 2 } /** * A language server for manage a language server. * It's recommended to use `services.registLanguageClient` for regist language client to serviers, * you can have language client listed in `CocList services` and services could start the language client * by `documentselector` of `clientOptions`. */ export class LanguageClient { readonly id: string readonly name: string constructor(id: string, name: string, serverOptions: ServerOptions, clientOptions: LanguageClientOptions, forceDebug?: boolean) /** * Create language client by name and options, don't forget regist language client * to services by `services.registLanguageClient` */ constructor(name: string, serverOptions: ServerOptions, clientOptions: LanguageClientOptions, forceDebug?: boolean) /** * R => result * E => Error result */ sendRequest(type: RequestType0, token?: CancellationToken): Promise /** * P => params * R => result * E => Error result */ sendRequest(type: RequestType, params: P, token?: CancellationToken): Promise sendRequest(method: string, token?: CancellationToken): Promise sendRequest(method: string, param: any, token?: CancellationToken): Promise onRequest(type: RequestType0, handler: RequestHandler0): Disposable onRequest(type: RequestType, handler: RequestHandler): Disposable onRequest(method: string, handler: (...params: any[]) => HandlerResult): Disposable sendNotification(type: NotificationType0): void sendNotification

(type: NotificationType

, params?: P): void sendNotification(method: string): void sendNotification(method: string, params: any): void onNotification(type: NotificationType0, handler: () => void): Disposable onNotification

(type: NotificationType

, handler: (params: P) => void): Disposable onNotification(method: string, handler: (...params: any[]) => void): Disposable onProgress

(type: ProgressType, token: string | number, handler: (params: P) => void): Disposable sendProgress

(type: ProgressType

, token: string | number, value: P): void /** * Append info to outputChannel */ info(message: string, data?: any): void /** * Append warning to outputChannel */ warn(message: string, data?: any): void /** * append error to outputChannel */ error(message: string, data?: any): void getPublicState(): State get initializeResult(): InitializeResult | undefined get clientOptions(): LanguageClientOptions /** * Fired on language server state change. */ get onDidChangeState(): Event get outputChannel(): OutputChannel get diagnostics(): DiagnosticCollection | undefined /** * Current running state. */ get serviceState(): ServiceStat /** * Check if server could start. */ needsStart(): boolean /** * Check if server could stop. */ needsStop(): boolean onReady(): Promise get started(): boolean set trace(value: Trace) /** * Stop language server. */ stop(): Promise /** * Start language server, not needed when registered to services by `services.registLanguageClient` */ start(): Disposable /** * Restart language client. */ restart(): void /** * Register custom feature. */ registerFeature(feature: StaticFeature | DynamicFeature): void /** * Log failed request to outputChannel. */ handleFailedRequest(type: MessageSignature, token: CancellationToken | undefined, error: any, defaultValue: T) } /** * Monitor for setting change, restart language server when specified setting changed. */ export class SettingMonitor { constructor(client: LanguageClient, setting: string) start(): Disposable } // }} } // vim: set sw=2 ts=2 sts=2 et foldmarker={{,}} foldmethod=marker foldlevel=0 nofen: