Skip to content

Commit 7f23ca5

Browse files
authored
add execContext-option to enable context-execution for completion (#349)
1 parent 0137b74 commit 7f23ca5

File tree

3 files changed

+24
-2
lines changed

3 files changed

+24
-2
lines changed

Readme.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,7 @@ some regex patterns can't be supported by javascript, including
193193
- `snippets.userSnippetsDirectory`, Directory that contains custom user ultisnips snippets, use ultisnips in extension root by default.
194194
- `snippets.shortcut`, shortcut in completion menu, default `S`.
195195
- `snippets.autoTrigger`: enable auto trigger for auto trigger ultisnips snippets, default `true`.
196+
- `snippets.execContext`: execute a snippet's `context` (if it exists) to check if the snippet should be shown in completion menu, default `false` (i.e., snippets with a `context` are never shown in completion menu)
196197
- `snippets.triggerCharacters`: trigger characters for completion, default `[]`.
197198
- `snippets.loadFromExtensions`: load snippets from coc.nvim extensions, default: `true`.
198199
- `snippets.loadVSCodeProjectSnippets`: Load code snippets in folder `${workspaceFolder}/.vscode`, default: `true`.

package.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,11 @@
117117
"default": true,
118118
"description": "Enable trigger auto trigger snippet after type character."
119119
},
120+
"snippets.execContext": {
121+
"type": "boolean",
122+
"default": false,
123+
"description": "Execute a snippet's context (if it exists) to check if the snippet should be shown in completion menu"
124+
},
120125
"snippets.ultisnips.enable": {
121126
"type": "boolean",
122127
"default": true,

src/provider.ts

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -125,11 +125,27 @@ export class ProviderManager implements CompletionItemProvider {
125125
let after = line.slice(characterIndex(line, colnr - 1))
126126
let res: CompletionItem[] = []
127127
let noneWords = before_content.endsWith(' ') ? '' : before_content.match(/\W*$/)[0]
128+
let contextPrefixes: string[] = []
129+
const configuration = workspace.getConfiguration('snippets')
130+
const execContext = configuration.get<boolean>('execContext', false)
128131
for (let snip of snippets) {
129-
// Avoid context during completion.
130-
if (snip.context || snip.prefix === '') continue
132+
if (!execContext && snip.context) continue
133+
if (snip.prefix === '') continue
131134
if (input.length == 0 && (!snip.special || !before_content.endsWith(snip.special))) continue
135+
if (contextPrefixes.indexOf(snip.prefix) !== -1) continue
132136
let contentBefore = before_content
137+
if (snip.context) {
138+
let provider = this.providers.get(snip.provider)
139+
let valid: boolean
140+
try {
141+
valid = await provider.checkContext(snip.context)
142+
} catch (e) {
143+
this.appendError(`checkContext of ${snip.provider}`, e)
144+
valid = false
145+
}
146+
if (!valid) continue
147+
contextPrefixes.push(snip.prefix)
148+
}
133149
let head = this.getPrefixHead(doc, snip.prefix)
134150
let ultisnip = snip.provider == 'ultisnips' || snip.provider == 'snipmate'
135151
let startCharacter = character

0 commit comments

Comments
 (0)