Skip to content

Commit 13f5c88

Browse files
committed
preselect last inserted snippet in CocList
1 parent 3012548 commit 13f5c88

File tree

9 files changed

+38
-7
lines changed

9 files changed

+38
-7
lines changed

Readme.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,8 @@ some regex patterns can't be supported by javascript, including
175175

176176
## Commands
177177

178-
- Use `:CocList snippets` to open snippets list used by current buffer.
178+
- Use `:CocList snippets` to open snippets list used by current buffer, the last
179+
used snippet item would be preselected.
179180
- Use `:CocCommand snippets.openSnippetFiles` to choose and open a snippet file
180181
that used by current document.
181182
- Use `:CocCommand snippets.editSnippets` to edit user's ultisnips snippets of

src/index.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import { SnipmateProvider } from './snipmateProvider'
99
import { TextmateProvider } from './textmateProvider'
1010
import { UltiSnipsConfig } from './types'
1111
import { getSnippetsDirectory, UltiSnippetsProvider } from './ultisnipsProvider'
12-
import { addFiletypes, getAdditionalFiletype, getSnippetFiletype, insertSnippetEdit, sameFile, waitDocument } from './util'
12+
import { addFiletypes, getAdditionalFiletype, getSnippetFiletype, insertSnippetEdit, sameFile, setLastSnippet, waitDocument } from './util'
1313

1414
interface API {
1515
expandable: () => Promise<boolean>
@@ -114,6 +114,13 @@ export async function activate(context: ExtensionContext): Promise<API> {
114114
manager.loadSnippetsByFiletype(filetypes.join('.'))
115115
}))
116116

117+
events.on('CompleteDone', item => {
118+
if (item && item['data'] && item['data']['snip']) {
119+
let snip = item['data']['snip']
120+
setLastSnippet(snip.filepath, snip.lnum)
121+
}
122+
}, null, context.subscriptions)
123+
117124
let excludes = configuration.get<string[]>('excludePatterns', [])
118125
if (!Array.isArray(excludes)) excludes = []
119126
excludes = excludes.map(p => workspace.expand(p))

src/list/snippet.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ Author Qiming Zhao <chemzqm@gmail> (https://github.com/chemzqm)
55
import { BasicList, ListContext, ListItem, Location, Position, Range, Uri, workspace } from 'coc.nvim'
66
import os from 'os'
77
import { ProviderManager } from '../provider'
8-
import { getSnippetFiletype } from '../util'
8+
import { getLastSnippet, getSnippetFiletype } from '../util'
99

1010
function formatPrefix(prefix: string): string {
1111
if (prefix.length >= 20) return prefix.slice(0, 17) + '...'
@@ -30,13 +30,16 @@ export default class SnippetsList extends BasicList {
3030
let filetype = getSnippetFiletype(doc)
3131
let snippets = this.manager.getSnippets(filetype)
3232
let res: ListItem[] = []
33+
let last = getLastSnippet()
3334
for (let snip of snippets) {
3435
let pos: Position = Position.create(snip.lnum, 0)
3536
let location: Location = Location.create(Uri.file(snip.filepath).toString(), Range.create(pos, Position.create(snip.lnum, 1)))
3637
let prefix = snip.prefix.length ? snip.prefix : snip.originRegex ?? ''
38+
let preselect = last && last.filepath == snip.filepath && last.lnum == snip.lnum
3739
res.push({
38-
label: `${formatPrefix(prefix)}\t${snip.description}\t${snip.filepath.replace(os.homedir(), '~')}`,
40+
label: `${formatPrefix(prefix)}\t${snip.description}\t${snip.filepath.replace(os.homedir(), '~')}:${snip.lnum}`,
3941
filterText: `${snip.prefix} ${snip.description}`,
42+
preselect,
4043
location,
4144
data: { prefix }
4245
})

src/massCodeProvider.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { Document, OutputChannel, Position, Range, window, workspace } from 'coc.nvim'
22
import http from 'http'
33

4-
import type { Snippet, SnippetEdit, MassCodeConfig } from './types'
4+
import type { MassCodeConfig, Snippet, SnippetEdit } from './types'
55
import { TriggerKind } from './types'
66

77
import BaseProvider from './baseProvider'
@@ -122,6 +122,7 @@ export class MassCodeProvider extends BaseProvider {
122122
prefix: s.prefix,
123123
description: s.description,
124124
location: s.filepath,
125+
lnum: s.lnum,
125126
priority: s.priority,
126127
regex: s.originRegex,
127128
context: s.context,

src/snipmateProvider.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,7 @@ export class SnipmateProvider extends BaseProvider {
200200
prefix: s.prefix,
201201
description: s.description,
202202
location: s.filepath,
203+
lnum: s.lnum,
203204
range,
204205
newText: s.body,
205206
priority: -1

src/textmateProvider.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,7 @@ export class TextmateProvider extends BaseProvider {
165165
range: Range.create(position.line, position.character - prefix.length, position.line, position.character),
166166
newText: snip.body,
167167
location: snip.filepath,
168+
lnum: snip.lnum,
168169
description: snip.description,
169170
priority: snip.priority ?? -1
170171
})

src/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ export interface SnippetEdit {
126126
prefix: string
127127
newText: string
128128
location: string
129+
lnum: number
129130
description: string
130131
priority: number
131132
regex?: string

src/ultisnipsProvider.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,7 @@ export class UltiSnippetsProvider extends BaseProvider {
228228
prefix: s.prefix,
229229
description: s.description,
230230
location: s.filepath,
231+
lnum: s.lnum,
231232
priority: s.priority,
232233
regex: s.originRegex,
233234
context: s.context,

src/util.ts

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,24 +2,38 @@
22
MIT License http://www.opensource.org/licenses/mit-license.php
33
Author Qiming Zhao <chemzqm@gmail> (https://github.com/chemzqm)
44
*******************************************************************/
5-
import { commands, workspace, Document, TextEdit, Uri } from 'coc.nvim'
6-
import { promisify } from 'util'
5+
import { commands, Document, TextEdit, Uri, workspace } from 'coc.nvim'
76
import crypto from 'crypto'
87
import fs from 'fs'
98
import os from 'os'
109
import path from 'path'
10+
import { promisify } from 'util'
1111
import { ReplaceItem, SnippetEditWithSource, UltiSnippetOption } from './types'
1212

1313
export interface CodeInfo {
1414
readonly hash: string
1515
readonly code: string
1616
}
1717

18+
export interface LastSnippet {
19+
filepath: string
20+
lnum: number
21+
}
22+
1823
export const pythonCodes: Map<string, CodeInfo> = new Map()
1924

2025
const caseInsensitive = os.platform() == 'win32' || os.platform() == 'darwin'
2126
const BASE64 = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_'
2227
const additionalFiletypes: Map<number, string[]> = new Map()
28+
var lastSnippet: LastSnippet = undefined
29+
30+
export function setLastSnippet(filepath: string, lnum: number): void {
31+
lastSnippet = { filepath, lnum }
32+
}
33+
34+
export function getLastSnippet(): LastSnippet | undefined {
35+
return lastSnippet
36+
}
2337

2438
export async function insertSnippetEdit(edit: SnippetEditWithSource) {
2539
let ultisnips = edit.source == 'ultisnips' || edit.source == 'snipmate'
@@ -35,6 +49,7 @@ export async function insertSnippetEdit(edit: SnippetEditWithSource) {
3549
removeWhiteSpace: formatOptions.removeWhiteSpace
3650
}
3751
}
52+
setLastSnippet(edit.location, edit.lnum)
3853
await commands.executeCommand('editor.action.insertSnippet', TextEdit.replace(edit.range, edit.newText), option)
3954
}
4055

0 commit comments

Comments
 (0)