This repository was archived by the owner on Dec 15, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 107
/
Copy pathsnippet-expansion.coffee
93 lines (78 loc) · 3.09 KB
/
snippet-expansion.coffee
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
{CompositeDisposable} = require 'atom'
module.exports =
class SnippetExpansion
settingTabStop: false
constructor: (@snippet, @editor, @cursor, @snippets, @group) ->
@subscriptions = new CompositeDisposable
@tabStopMarkers = []
@selections = [@cursor.selection]
startPosition = @cursor.selection.getBufferRange().start
@editor.transact =>
newRange = @editor.transact =>
@cursor.selection.insertText(@snippet.body, autoIndent: false)
if @snippet.tabStops.length > 0
@subscriptions.add @cursor.onDidChangePosition (event) => @cursorMoved(event)
@subscriptions.add @cursor.onDidDestroy => @cursorDestroyed()
@placeTabStopMarkers(startPosition, @snippet.tabStops)
@group.expansions.push(this)
@editor.normalizeTabsInBufferRange(newRange)
@indentSubsequentLines(startPosition.row, @snippet) if @snippet.lineCount > 1
cursorMoved: ({oldBufferPosition, newBufferPosition, textChanged}) ->
return if @settingTabStop or textChanged
@destroy() unless @tabStopMarkers[@tabStopIndex].some (marker) ->
marker.getBufferRange().containsPoint(newBufferPosition)
cursorDestroyed: -> @destroy() unless @settingTabStop
placeTabStopMarkers: (startPosition, tabStopRanges) ->
for ranges in tabStopRanges
@tabStopMarkers.push ranges.map ({start, end}) =>
@editor.markBufferRange([startPosition.traverse(start), startPosition.traverse(end)])
@setTabStopIndex(0)
indentSubsequentLines: (startRow, snippet) ->
initialIndent = @editor.lineTextForBufferRow(startRow).match(/^\s*/)[0]
for row in [startRow + 1...startRow + snippet.lineCount]
@editor.buffer.insert([row, 0], initialIndent)
goToNextTabStop: ->
nextIndex = @tabStopIndex + 1
if nextIndex < @tabStopMarkers.length
if @setTabStopIndex(nextIndex)
true
else
@goToNextTabStop()
else
@destroy()
false
goToPreviousTabStop: ->
if @tabStopIndex > 0
if @setTabStopIndex(@tabStopIndex - 1)
true
else
@goToPreviousTabStop()
else
@destroy()
false
setTabStopIndex: (@tabStopIndex) ->
@settingTabStop = true
markerSelected = false
ranges = []
for marker in @tabStopMarkers[@tabStopIndex] when marker.isValid()
ranges.push(marker.getBufferRange())
if ranges.length > 0
selection.destroy() for selection in @selections[ranges.length...]
@selections = @selections[...ranges.length]
for range, i in ranges
if @selections[i]
@selections[i].setBufferRange(range)
else
newSelection = @editor.addSelectionForBufferRange(range)
@subscriptions.add newSelection.cursor.onDidChangePosition (event) => @cursorMoved(event)
@subscriptions.add newSelection.cursor.onDidDestroy => @cursorDestroyed()
@selections.push newSelection
markerSelected = true
@settingTabStop = false
markerSelected
destroy: ->
@subscriptions.dispose()
for markers in @tabStopMarkers
marker.destroy() for marker in markers
@tabStopMarkers = []
@group.expansions = []