From 5b8cc8a6b6831da74caccf22977d7aa6212dec44 Mon Sep 17 00:00:00 2001 From: David Graham & Nathan Sobo Date: Tue, 19 Jun 2012 17:47:09 -0600 Subject: [PATCH] Snippets matching the cursor's word prefix are inserted on 'tab' events --- spec/extensions/snippets-spec.coffee | 22 +++++++++++----------- src/app/buffer.coffee | 6 ++++++ src/app/cursor.coffee | 3 +++ src/app/edit-session.coffee | 3 +++ src/app/tokenized-buffer.coffee | 3 +-- src/extensions/snippets/snippets.coffee | 18 ++++++++++++++++-- 6 files changed, 40 insertions(+), 15 deletions(-) diff --git a/spec/extensions/snippets-spec.coffee b/spec/extensions/snippets-spec.coffee index d7b982e9d..50d939939 100644 --- a/spec/extensions/snippets-spec.coffee +++ b/spec/extensions/snippets-spec.coffee @@ -1,4 +1,5 @@ Snippets = require 'snippets' +RootView = require 'root-view' Buffer = require 'buffer' Editor = require 'editor' _ = require 'underscore' @@ -6,8 +7,11 @@ _ = require 'underscore' fdescribe "Snippets extension", -> [buffer, editor] = [] beforeEach -> - buffer = new Buffer(require.resolve('fixtures/sample.js')) - editor = new Editor({buffer}) + rootView = new RootView(require.resolve('fixtures/sample.js')) + editor = rootView.activeEditor() + buffer = editor.buffer + rootView.activateExtension(Snippets) + rootView.simulateDomAttachment() describe "when 'tab' is triggered on the editor", -> describe "when the letters preceding the cursor are registered as a global extension", -> @@ -16,19 +20,15 @@ fdescribe "Snippets extension", -> snippet te "Test snippet description" this is a test endsnippet - - snippet moo "Moo snippet" - Mooooooo! - endsnippet """ - editor.insertText("te") - editor.trigger 'tab' - expect(editor.getCursorScreenPosition()).toEqual [0, 2] - expect(buffer.lineForRow(0)).toBe "this is a testvar quicksort = function () {" - ffdescribe "Snippets parser", -> + editor.trigger 'tab' + expect(buffer.lineForRow(0)).toBe "this is a testvar quicksort = function () {" + expect(editor.getCursorScreenPosition()).toEqual [0, 14] + + describe "Snippets parser", -> it "can parse a snippet", -> snippets = Snippets.snippetsParser.parse """ snippet te "Test snippet description" diff --git a/src/app/buffer.coffee b/src/app/buffer.coffee index 7fbf8792f..ffe0bb00b 100644 --- a/src/app/buffer.coffee +++ b/src/app/buffer.coffee @@ -32,6 +32,12 @@ class Buffer getPath: -> @path + getExtension: -> + if @getPath() + @getPath().split('/').pop().split('.').pop() + else + null + setPath: (path) -> @path = path @trigger "path-change", this diff --git a/src/app/cursor.coffee b/src/app/cursor.coffee index c151efc21..7db99eb49 100644 --- a/src/app/cursor.coffee +++ b/src/app/cursor.coffee @@ -155,6 +155,9 @@ class Cursor getCurrentLineBufferRange: -> @editSession.bufferRangeForBufferRow(@getBufferRow()) + getCurrentWordPrefix: -> + @editSession.getTextInBufferRange([@getBeginningOfCurrentWordBufferPosition(), @getBufferPosition()]) + isAtBeginningOfLine: -> @getBufferPosition().column == 0 diff --git a/src/app/edit-session.coffee b/src/app/edit-session.coffee index 7d71304a0..3c5a89036 100644 --- a/src/app/edit-session.coffee +++ b/src/app/edit-session.coffee @@ -329,6 +329,9 @@ class EditSession getSelectedText: -> @getLastSelection().getText() + getTextInBufferRange: (range) -> + @buffer.getTextInRange(range) + moveCursorUp: -> @moveCursors (cursor) -> cursor.moveUp() diff --git a/src/app/tokenized-buffer.coffee b/src/app/tokenized-buffer.coffee index 01c015c43..80649b8e4 100644 --- a/src/app/tokenized-buffer.coffee +++ b/src/app/tokenized-buffer.coffee @@ -23,8 +23,7 @@ class TokenizedBuffer @aceAdaptor = new AceAdaptor(this) requireAceMode: -> - extension = if @buffer.getPath() then @buffer.getPath().split('/').pop().split('.').pop() else null - modeName = switch extension + modeName = switch @buffer.getExtension() when 'js' then 'javascript' when 'coffee' then 'coffee' when 'rb', 'ru' then 'ruby' diff --git a/src/extensions/snippets/snippets.coffee b/src/extensions/snippets/snippets.coffee index d29938aba..10b4f3ec8 100644 --- a/src/extensions/snippets/snippets.coffee +++ b/src/extensions/snippets/snippets.coffee @@ -2,9 +2,23 @@ fs = require 'fs' PEG = require 'pegjs' module.exports = + name: 'Snippets' snippetsByExtension: {} snippetsParser: PEG.buildParser(fs.read(require.resolve 'extensions/snippets/snippets.pegjs')) - evalSnippets: (extension, text) -> - @snippetsByExtension[extension] = snippetsParser.parse(text) + activate: (@rootView) -> + rootView.on 'editor-open', (e, editor) => + editor.preempt 'tab', => + return false if @expandSnippet() + evalSnippets: (extension, text) -> + @snippetsByExtension[extension] = @snippetsParser.parse(text) + + expandSnippet: -> + editSession = @rootView.activeEditor().activeEditSession + return unless snippets = @snippetsByExtension[editSession.buffer.getExtension()] + prefix = editSession.getLastCursor().getCurrentWordPrefix() + if body = snippets[prefix]?.body + editSession.selectToBeginningOfWord() + editSession.insertText(body) + true