diff --git a/docs/operators.md b/docs/operators.md index d816daa7..63d45484 100644 --- a/docs/operators.md +++ b/docs/operators.md @@ -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) diff --git a/keymaps/vim-mode.cson b/keymaps/vim-mode.cson index 1a58c494..c74f9d60 100644 --- a/keymaps/vim-mode.cson +++ b/keymaps/vim-mode.cson @@ -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' diff --git a/lib/vim-state.coffee b/lib/vim-state.coffee index a45551c3..3ca3628c 100644 --- a/lib/vim-state.coffee +++ b/lib/vim-state.coffee @@ -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) @@ -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) @@ -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 '_' @@ -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. # @@ -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) -> diff --git a/spec/prefixes-spec.coffee b/spec/prefixes-spec.coffee index e782d20a..1a773d90 100644 --- a/spec/prefixes-spec.coffee +++ b/spec/prefixes-spec.coffee @@ -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'