Skip to content
This repository was archived by the owner on Apr 6, 2018. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions docs/operators.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,8 @@
* [Put](http://vimhelp.appspot.com/change.txt.html#p)
* `p` - default register
* `P` - pastes the default register before the current cursor.
* `"ap` - supports registers (only named a-h, pending more
advanced atom keymap support)
* `"ap` - supports registers
* `ctrl-r a` or `ctrl-r "` etc. - supports pasting register content in insert mode
* [Join](http://vimhelp.appspot.com/change.txt.html#J)
* `J` - joins the current line with the immediately following line.
* [Mark](http://vimhelp.appspot.com/motion.txt.html#m)
Expand Down
58 changes: 58 additions & 0 deletions keymaps/vim-mode.cson
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,64 @@
'ctrl-w': 'editor:delete-to-beginning-of-word'
'ctrl-u': 'editor:delete-to-beginning-of-line'

'ctrl-r a': 'vim-mode:insert-mode-put'
'ctrl-r b': 'vim-mode:insert-mode-put'
'ctrl-r c': 'vim-mode:insert-mode-put'
'ctrl-r d': 'vim-mode:insert-mode-put'
'ctrl-r e': 'vim-mode:insert-mode-put'
'ctrl-r f': 'vim-mode:insert-mode-put'
'ctrl-r g': 'vim-mode:insert-mode-put'
'ctrl-r h': 'vim-mode:insert-mode-put'
'ctrl-r i': 'vim-mode:insert-mode-put'
'ctrl-r j': 'vim-mode:insert-mode-put'
'ctrl-r k': 'vim-mode:insert-mode-put'
'ctrl-r l': 'vim-mode:insert-mode-put'
'ctrl-r m': 'vim-mode:insert-mode-put'
'ctrl-r n': 'vim-mode:insert-mode-put'
'ctrl-r o': 'vim-mode:insert-mode-put'
'ctrl-r p': 'vim-mode:insert-mode-put'
'ctrl-r q': 'vim-mode:insert-mode-put'
'ctrl-r r': 'vim-mode:insert-mode-put'
'ctrl-r s': 'vim-mode:insert-mode-put'
'ctrl-r t': 'vim-mode:insert-mode-put'
'ctrl-r u': 'vim-mode:insert-mode-put'
'ctrl-r v': 'vim-mode:insert-mode-put'
'ctrl-r w': 'vim-mode:insert-mode-put'
'ctrl-r x': 'vim-mode:insert-mode-put'
'ctrl-r y': 'vim-mode:insert-mode-put'
'ctrl-r z': 'vim-mode:insert-mode-put'
'ctrl-r A': 'vim-mode:insert-mode-put'
'ctrl-r B': 'vim-mode:insert-mode-put'
'ctrl-r C': 'vim-mode:insert-mode-put'
'ctrl-r D': 'vim-mode:insert-mode-put'
'ctrl-r E': 'vim-mode:insert-mode-put'
'ctrl-r F': 'vim-mode:insert-mode-put'
'ctrl-r G': 'vim-mode:insert-mode-put'
'ctrl-r H': 'vim-mode:insert-mode-put'
'ctrl-r I': 'vim-mode:insert-mode-put'
'ctrl-r J': 'vim-mode:insert-mode-put'
'ctrl-r K': 'vim-mode:insert-mode-put'
'ctrl-r L': 'vim-mode:insert-mode-put'
'ctrl-r M': 'vim-mode:insert-mode-put'
'ctrl-r N': 'vim-mode:insert-mode-put'
'ctrl-r O': 'vim-mode:insert-mode-put'
'ctrl-r P': 'vim-mode:insert-mode-put'
'ctrl-r Q': 'vim-mode:insert-mode-put'
'ctrl-r R': 'vim-mode:insert-mode-put'
'ctrl-r S': 'vim-mode:insert-mode-put'
'ctrl-r T': 'vim-mode:insert-mode-put'
'ctrl-r U': 'vim-mode:insert-mode-put'
'ctrl-r V': 'vim-mode:insert-mode-put'
'ctrl-r W': 'vim-mode:insert-mode-put'
'ctrl-r X': 'vim-mode:insert-mode-put'
'ctrl-r Y': 'vim-mode:insert-mode-put'
'ctrl-r Z': 'vim-mode:insert-mode-put'
'ctrl-r *': 'vim-mode:insert-mode-put'
'ctrl-r +': 'vim-mode:insert-mode-put'
'ctrl-r %': 'vim-mode:insert-mode-put'
'ctrl-r _': 'vim-mode:insert-mode-put'
'ctrl-r "': 'vim-mode:insert-mode-put'

'atom-text-editor.vim-mode:not(.insert-mode)':
'h': 'vim-mode:move-left'
'left': 'vim-mode:move-left'
Expand Down
24 changes: 23 additions & 1 deletion lib/vim-state.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@ class VimState
'repeat-prefix': (e) => @repeatPrefix(e)
'reverse-selections': (e) => @reverseSelections(e)
'undo': (e) => @undo(e)
'insert-mode-put': (e) => @insertRegister(@registerName(e))

@registerOperationCommands
'activate-insert-mode': => new Operators.Insert(@editor, this)
Expand Down Expand Up @@ -278,6 +279,8 @@ class VimState
# Returns the value of the given register or undefined if it hasn't
# been set.
getRegister: (name) ->
if name is '"'
name = settings.defaultRegister()
if name in ['*', '+']
text = atom.clipboard.read()
type = Utils.copyType(text)
Expand Down Expand Up @@ -312,6 +315,8 @@ class VimState
#
# Returns nothing.
setRegister: (name, value) ->
if name is '"'
name = settings.defaultRegister()
if name in ['*', '+']
atom.clipboard.write(value.text)
else if name is '_'
Expand Down Expand Up @@ -512,11 +517,19 @@ class VimState
#
# Returns nothing.
registerPrefix: (e) ->
new Prefixes.Register(@registerName(e))

# Private: Gets a register name from a keyboard event
#
# e - The event
#
# Returns the name of the register
registerName: (e) ->
keyboardEvent = e.originalEvent?.originalEvent ? e.originalEvent
name = atom.keymaps.keystrokeForKeyboardEvent(keyboardEvent)
if name.lastIndexOf('shift-', 0) is 0
name = name.slice(6)
new Prefixes.Register(name)
name

# Private: A generic way to create a Number prefix based on the event.
#
Expand Down Expand Up @@ -581,6 +594,15 @@ class VimState
updateStatusBar: ->
@statusBarManager.update(@mode, @submode)

# Private: insert the contents of the register in the editor
#
# name - the name of the register to insert
#
# Returns nothing.
insertRegister: (name) ->
text = @getRegister(name)?.text
@editor.insertText(text) if text?

# This uses private APIs and may break if TextBuffer is refactored.
# Package authors - copy and paste this code at your own risk.
getChangesSinceCheckpoint = (buffer, checkpoint) ->
Expand Down
27 changes: 27 additions & 0 deletions spec/prefixes-spec.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -146,3 +146,30 @@ describe "Prefixes", ->
it "throws away anything written to it", ->
vimState.setRegister('%', "new content")
expect(vimState.getRegister('%').text).toEqual '/Users/atom/known_value.txt'

describe "the ctrl-r command in insert mode", ->
beforeEach ->
editor.setText "02\n"
editor.setCursorScreenPosition [0, 0]
vimState.setRegister('"', text: '345')
vimState.setRegister('a', text: 'abc')
atom.clipboard.write "clip"
keydown 'a'
editor.insertText '1'

it "inserts contents of the unnamed register with \"", ->
keydown 'r', ctrl: true
keydown '"'
expect(editor.getText()).toBe '013452\n'

describe "when useClipboardAsDefaultRegister enabled", ->
it "inserts contents from clipboard with \"", ->
atom.config.set 'vim-mode.useClipboardAsDefaultRegister', true
keydown 'r', ctrl: true
keydown '"'
expect(editor.getText()).toBe '01clip2\n'

it "inserts contents of the 'a' register", ->
keydown 'r', ctrl: true
keydown 'a'
expect(editor.getText()).toBe '01abc2\n'