diff --git a/spec/app/selection-spec.coffee b/spec/app/selection-spec.coffee index 8caa38c11..b8932f464 100644 --- a/spec/app/selection-spec.coffee +++ b/spec/app/selection-spec.coffee @@ -274,6 +274,24 @@ describe "Selection", -> expect(editor.buffer.lineForRow(2)).toBe " if (items.length <= 1) return items;" expect(selection.getBufferRange()).toEqual [[0, 1], [3, 15 - tabLength]] + describe ".toggleLineComments()", -> + it "toggles comments on the selected lines", -> + selection.setBufferRange([[4, 5], [7, 5]]) + selection.toggleLineComments() + + expect(buffer.lineForRow(4)).toBe "// while(items.length > 0) {" + expect(buffer.lineForRow(5)).toBe "// current = items.shift();" + expect(buffer.lineForRow(6)).toBe "// current < pivot ? left.push(current) : right.push(current);" + expect(buffer.lineForRow(7)).toBe "// }" + + expect(selection.getBufferRange()).toEqual [[4, 7], [7, 7]] + + selection.toggleLineComments() + expect(buffer.lineForRow(4)).toBe " while(items.length > 0) {" + expect(buffer.lineForRow(5)).toBe " current = items.shift();" + expect(buffer.lineForRow(6)).toBe " current < pivot ? left.push(current) : right.push(current);" + expect(buffer.lineForRow(7)).toBe " }" + describe "when the selection ends on the begining of a fold line", -> beforeEach -> editor.createFold(2,4) diff --git a/src/app/composite-selection.coffee b/src/app/composite-selection.coffee index 5a6887b45..7ca846203 100644 --- a/src/app/composite-selection.coffee +++ b/src/app/composite-selection.coffee @@ -113,6 +113,9 @@ class CompositeSeleciton deleteToEndOfWord: -> @mutateSelectedText (selection) -> selection.deleteToEndOfWord() + toggleLineComments: -> + @mutateSelectedText (selection) -> selection.toggleLineComments() + selectToScreenPosition: (position) -> @getLastSelection().selectToScreenPosition(position) diff --git a/src/app/editor.coffee b/src/app/editor.coffee index ce2f02ee8..1f8a329bf 100644 --- a/src/app/editor.coffee +++ b/src/app/editor.coffee @@ -38,7 +38,6 @@ class Editor extends View cursor: null selection: null buffer: null - highlighter: null renderer: null autoIndent: null lineCache: null @@ -146,6 +145,7 @@ class Editor extends View 'select-to-end-of-word': @selectToEndOfWord 'select-to-beginning-of-word': @selectToBeginningOfWord 'select-all': @selectAll + 'toggle-line-comments': @toggleLineCommentsInSelection for name, method of editorBindings do (name, method) => @@ -820,6 +820,12 @@ class Editor extends View logLines: (start, end) -> @renderer.logLines(start, end) + toggleLineCommentsInSelection: -> + @compositeSelection.toggleLineComments() + + toggleLineCommentsInRange: (range) -> + @renderer.toggleLineCommentsInRange(range) + logRenderedLines: -> @visibleLines.find('.line').each (n) -> console.log n, $(this).text() diff --git a/src/app/keymaps/editor.coffee b/src/app/keymaps/editor.coffee index be5805138..783de3ec8 100644 --- a/src/app/keymaps/editor.coffee +++ b/src/app/keymaps/editor.coffee @@ -30,3 +30,4 @@ window.keymap.bindKeys '.editor', 'meta-}': 'show-next-buffer' 'meta-+': 'increase-font-size' 'meta--': 'decrease-font-size' + 'meta-/': 'toggle-line-comments' diff --git a/src/app/renderer.coffee b/src/app/renderer.coffee index 2de0c9f10..f23f17a88 100644 --- a/src/app/renderer.coffee +++ b/src/app/renderer.coffee @@ -8,7 +8,7 @@ Range = require 'range' Fold = require 'fold' ScreenLine = require 'screen-line' Token = require 'token' -foldPlaceholderLength = 3 +LineCommenter = require 'line-commenter' module.exports = class Renderer @@ -16,13 +16,14 @@ class Renderer lineMap: null highlighter: null activeFolds: null + lineCommenter: null foldsById: null lastHighlighterChangeEvent: null - foldPlaceholderLength: 3 constructor: (@buffer, options={}) -> @id = @constructor.idCounter++ @highlighter = new Highlighter(@buffer, options.tabText ? ' ') + @lineCommenter = new LineCommenter(@highlighter) @foldSuggester = new FoldSuggester(@highlighter) @maxLineLength = options.maxLineLength ? Infinity @activeFolds = {} @@ -246,4 +247,8 @@ class Renderer logLines: (start, end) -> @lineMap.logLines(start, end) + toggleLineCommentsInRange: (range) -> + console.log range.inspect() + @lineCommenter.toggleLineCommentsInRange(range) + _.extend Renderer.prototype, EventEmitter diff --git a/src/app/selection.coffee b/src/app/selection.coffee index a02f34603..f460fe24b 100644 --- a/src/app/selection.coffee +++ b/src/app/selection.coffee @@ -84,6 +84,7 @@ class Selection extends View new Range(@cursor.getScreenPosition(), @cursor.getScreenPosition()) setScreenRange: (range, {reverse}={}) -> + range = Range.fromObject(range) { start, end } = range [start, end] = [end, start] if reverse @@ -125,6 +126,10 @@ class Selection extends View if leadingTabRegex.test buffer.lineForRow(row) buffer.delete [[row, 0], [row, @editor.tabText.length]] + toggleLineComments: -> + @modifySelection => + @editor.toggleLineCommentsInRange(@getBufferRange()) + autoIndentText: (text) -> if @editor.autoIndent mode = @editor.getCurrentMode()