laughing-hipster/.atom/packages/vim-mode/lib/operators/put-operator.coffee

70 lines
1.9 KiB
CoffeeScript

_ = require 'underscore-plus'
{Operator} = require './general-operators'
module.exports =
#
# It pastes everything contained within the specifed register
#
class Put extends Operator
register: '"'
constructor: (@editor, @vimState, {@location, @selectOptions}={}) ->
@location ?= 'after'
@complete = true
# Public: Pastes the text in the given register.
#
# count - The number of times to execute.
#
# Returns nothing.
execute: (count=1) ->
{text, type} = @vimState.getRegister(@register) || {}
return unless text
textToInsert = _.times(count, -> text).join('')
# Clean up some corner cases on the last line of the file
if type == 'linewise'
textToInsert = textToInsert.replace(/\n$/, '')
if @location == 'after' and @onLastRow()
textToInsert = "\n#{textToInsert}"
else
textToInsert = "#{textToInsert}\n"
if @location == 'after'
if type == 'linewise'
if @onLastRow()
@editor.moveCursorToEndOfLine()
originalPosition = @editor.getCursorScreenPosition()
originalPosition.row += 1
else
@editor.moveCursorDown()
else
unless @onLastColumn()
@editor.moveCursorRight()
if type == 'linewise' and !originalPosition?
@editor.moveCursorToBeginningOfLine()
originalPosition = @editor.getCursorScreenPosition()
@editor.insertText(textToInsert)
if originalPosition?
@editor.setCursorScreenPosition(originalPosition)
@editor.moveCursorToFirstCharacterOfLine()
@vimState.activateCommandMode()
if type != 'linewise'
@editor.moveCursorLeft()
# Private: Helper to determine if the editor is currently on the last row.
#
# Returns true on the last row and false otherwise.
onLastRow: ->
{row, column} = @editor.getCursorBufferPosition()
row == @editor.getBuffer().getLastRow()
onLastColumn: ->
@editor.getCursor().isAtEndOfLine()