Skip to content

Commit ff777ea

Browse files
authored
Merge pull request #380 from mre/feat/377
Display snippets in IntelliSense
2 parents 35d5031 + 812681c commit ff777ea

File tree

7 files changed

+80
-6
lines changed

7 files changed

+80
-6
lines changed

README.md

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
[![GitHub](https://img.shields.io/github/release/mre/vscode-snippet.svg?style=flat-square)](https://github.com/mre/vscode-snippet/releases)
77
[![GitHub Marketplace](https://img.shields.io/badge/Marketplace-Snippet-blue.svg?colorA=24292e&colorB=0366d6&style=flat&longCache=true&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAM6wAADOsB5dZE0gAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAERSURBVCiRhZG/SsMxFEZPfsVJ61jbxaF0cRQRcRJ9hlYn30IHN/+9iquDCOIsblIrOjqKgy5aKoJQj4O3EEtbPwhJbr6Te28CmdSKeqzeqr0YbfVIrTBKakvtOl5dtTkK+v4HfA9PEyBFCY9AGVgCBLaBp1jPAyfAJ/AAdIEG0dNAiyP7+K1qIfMdonZic6+WJoBJvQlvuwDqcXadUuqPA1NKAlexbRTAIMvMOCjTbMwl1LtI/6KWJ5Q6rT6Ht1MA58AX8Apcqqt5r2qhrgAXQC3CZ6i1+KMd9TRu3MvA3aH/fFPnBodb6oe6HM8+lYHrGdRXW8M9bMZtPXUji69lmf5Cmamq7quNLFZXD9Rq7v0Bpc1o/tp0fisAAAAASUVORK5CYII=)](https://marketplace.visualstudio.com/items?itemName=vscode-snippet.Snippet)
88

9-
A Visual Studio Code extension for [cht.sh](https://cht.sh/).
9+
A Visual Studio Code extension for [cht.sh](https://cht.sh/).
1010
[Watch this lightning talk to learn more](https://www.youtube.com/watch?v=edGVRJf6uvg).
1111

1212
## Features
@@ -44,7 +44,7 @@ Marketplace](https://marketplace.visualstudio.com/items?itemName=vscode-snippet.
4444

4545
### Moving between answers
4646

47-
Sometimes the first answer is not what you're looking for.
47+
Sometimes the first answer is not what you're looking for.
4848
In that case, use `Snippet: Show next answer` and `Snippet: Show previous answer` to show alternative snippets.
4949

5050
### Search for snippet based on selected text
@@ -115,6 +115,11 @@ You can move snippets or folders in the Snippets view by dragging and dropping t
115115

116116
![Preview](https://raw.githubusercontent.com/mre/vscode-snippet/master/contrib/snippets-storage/move.gif)
117117

118+
### IntelliSense
119+
120+
Saved snippets are displayed in IntelliSense
121+
122+
![Preview](https://raw.githubusercontent.com/mre/vscode-snippet/master/contrib/snippets-storage/intellisense.gif)
118123

119124
## Contributing
120125

339 KB
Loading

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "snippet",
33
"displayName": "Snippet",
44
"description": "Insert a snippet from cht.sh for Python, JavaScript, Ruby, C#, Go, Rust (and any other language)",
5-
"version": "1.0.2",
5+
"version": "1.0.3",
66
"publisher": "vscode-snippet",
77
"engines": {
88
"vscode": "^1.74.0"

src/completionManager.ts

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
import SnippetsStorage, { TreeElement } from "./snippetsStorage";
2+
import * as vscode from "vscode";
3+
4+
export class CompletionManager {
5+
constructor(
6+
private readonly context: vscode.ExtensionContext,
7+
private readonly snippets: SnippetsStorage,
8+
private readonly registeredFileExtensions = new Set<string>()
9+
) {
10+
for (const snippet of snippets.getSnippets()) {
11+
this.ensureRegistered(snippet);
12+
}
13+
14+
snippets.onSnippetSave = (snippet) => {
15+
this.ensureRegistered(snippet);
16+
};
17+
}
18+
19+
private ensureRegistered(snippet: TreeElement): void {
20+
const fileExtension = snippet.data.fileExtension;
21+
22+
if (!fileExtension) {
23+
return;
24+
}
25+
26+
if (this.registeredFileExtensions.has(fileExtension)) {
27+
return;
28+
}
29+
30+
const fileSelector: vscode.DocumentSelector = {
31+
pattern: `**/*${fileExtension}`,
32+
};
33+
const provider = vscode.languages.registerCompletionItemProvider(
34+
fileSelector,
35+
((snippets: SnippetsStorage) => ({
36+
provideCompletionItems() {
37+
const completions: vscode.CompletionItem[] = [];
38+
39+
for (const snippet of snippets.getSnippets()) {
40+
if (snippet.data.fileExtension === fileExtension) {
41+
const completion = new vscode.CompletionItem(snippet.data.label);
42+
completion.insertText = snippet.data.content;
43+
completion.detail = "[snippet]";
44+
completion.documentation = snippet.data.content;
45+
completions.push(completion);
46+
}
47+
}
48+
49+
return completions;
50+
},
51+
}))(this.snippets)
52+
);
53+
this.context.subscriptions.push(provider);
54+
this.registeredFileExtensions.add(fileExtension);
55+
}
56+
}

src/extension.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,15 @@ import SnippetProvider from "./provider";
66
import * as endpoints from "./endpoints";
77
import { SnippetsTreeProvider } from "./snippetsTreeProvider";
88
import SnippetsStorage from "./snippetsStorage";
9+
import { CompletionManager } from "./completionManager";
910

1011
export function activate(ctx: vscode.ExtensionContext) {
1112
const snippetStorageKey = "snippet.snippetsStorageKey";
1213
ctx.globalState.setKeysForSync([snippetStorageKey]);
1314

1415
const snippetsStorage = new SnippetsStorage(ctx, snippetStorageKey);
1516
const snippetsTreeProvider = new SnippetsTreeProvider(ctx, snippetsStorage);
17+
new CompletionManager(ctx, snippetsStorage);
1618

1719
vscode.commands.registerCommand("snippet.find", endpoints.findDefault);
1820
vscode.commands.registerCommand(

src/snippetsStorage.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ export interface FolderListItem extends vscode.QuickPickItem {
2121

2222
export default class SnippetsStorage {
2323
public onSave?: () => void;
24+
public onSnippetSave?: (snippet: TreeElement) => void;
2425
private readonly elements = new Map<string, TreeElement>();
2526
private rootId = "";
2627

@@ -179,10 +180,12 @@ export default class SnippetsStorage {
179180
fileExtension,
180181
};
181182

182-
this.elements.set(data.id, { data, parentId });
183+
const element: TreeElement = { data, parentId };
184+
this.elements.set(data.id, element);
183185
this.getElement(parentId).childIds?.push(data.id);
184186

185187
await this.save();
188+
this.onSnippetSave?.(element);
186189
}
187190

188191
getSnippet(id: string): string {
@@ -198,6 +201,14 @@ export default class SnippetsStorage {
198201
this.deserialize(this.context.globalState.get(this.storageKey) || "[]");
199202
}
200203

204+
*getSnippets(): IterableIterator<TreeElement> {
205+
for (const element of this.elements.values()) {
206+
if (!this.isFolder(element)) {
207+
yield element;
208+
}
209+
}
210+
}
211+
201212
private async loadDefaultElements(): Promise<void> {
202213
const root: TreeElementData = {
203214
id: nanoid(),

0 commit comments

Comments
 (0)