One of my students showed me a cool Sublime Text feature that made editing a bit more efficient than Vim: Instead of moving lines by deleting them with dd, jumping to the desired location and pasting them, he just had to press a key combination. Because it looked so intuitive, I had to figure out how to emulate that with Vim.
First thing I stumbled upon and never knew before, is the
It takes a range (or the current line) and moves the lines in that range to some
target “address”. The simplest possible movement is the
:m+1 shortcut, that
swaps the current line with the one right below. Typing the command manually is
a chore but mapping that command and its inverse
:m-2 is pretty
straightforward once you take care of the top and bottom boundaries. Moving
whole selections up and down is more interesting. Fortunately, you can get
easily retrieve selected range in a function and adaptively call
To make these mappings more manageable, I wrote a simple but pretty effective
plugin called vim-move. Put the
matze/vim-move repo into your Vundle
bundle and this is what you get:
By default, alt+k and alt+j move the current line in normal mode1 whereas ctrl+k and ctrl+j shift a selection in visual mode. You can prefix the calls with a count, e.g. 5ctrl+j which will then shift the line or selection relative by that number. To remap the keys you should
let g:move_map_keys = 0
and then map the keys, for example
vmap <C-j> <Plug>MoveBlockDown vmap <C-k> <Plug>MoveBlockUp nmap <A-j> <Plug>MoveLineDown nmap <A-k> <Plug>MoveLineUp
Hope you like the plugin. If you have any suggestions or problems, open an issue on the issue tracker.
In some environments I have to use the GNOME terminal and need to re-map the normal mode keys because I am not able to stop the terminal from intercepting the alt key. If you know how to let the GNOME terminal use the alt key, I’d pay you a beer. Update: you can keep your wallets closed ;-) ↩
This post might also have some comments at Google+.