1 " =============================================================================
2 " File: plugin/move.vim
3 " Description: Move lines and selections up and even down.
4 " Author: Matthias Vogelgesang <github.com/matze>
5 " =============================================================================
7 if exists('loaded_move') || &cp
13 if !exists('g:move_map_keys')
14 let g:move_map_keys = 1
17 if !exists('g:move_key_modifier')
18 let g:move_key_modifier = 'A'
21 function! s:ResetCursor()
25 function! s:MoveBlockDown(start, end, count)
26 let next_line = a:end + a:count
29 let next_line = next_line + v:count - 1
32 if next_line > line('$')
37 execute "silent" a:start "," a:end "m " next_line
41 function! s:MoveBlockUp(start, end, count)
42 let prev_line = a:start - a:count - 1
45 let prev_line = prev_line - v:count + 1
53 execute "silent" a:start "," a:end "m " prev_line
57 function! s:MoveLineUp(count) range
58 let distance = a:count + 1
61 let distance = distance + v:count - 1
64 if (line('.') - distance) < 0
70 execute 'silent m-' . distance
75 function! s:MoveLineDown(count) range
76 let distance = a:count
79 let distance = distance + v:count - 1
82 if (line('.') + distance) > line('$')
88 execute 'silent m+' . distance
92 function! s:MoveBlockOneLineUp() range
93 call s:MoveBlockUp(a:firstline, a:lastline, 1)
96 function! s:MoveBlockOneLineDown() range
97 call s:MoveBlockDown(a:firstline, a:lastline, 1)
100 function! s:MoveBlockHalfPageUp() range
101 let distance = winheight('.') / 2
102 call s:MoveBlockUp(a:firstline, a:lastline, distance)
105 function! s:MoveBlockHalfPageDown() range
106 let distance = winheight('.') / 2
107 call s:MoveBlockDown(a:firstline, a:lastline, distance)
110 function! s:MoveLineHalfPageUp() range
111 let distance = winheight('.') / 2
112 call s:MoveLineUp(distance)
115 function! s:MoveLineHalfPageDown() range
116 let distance = winheight('.') / 2
117 call s:MoveLineDown(distance)
120 function! s:MoveKey(key)
121 return '<' . g:move_key_modifier . '-' . a:key . '>'
125 vnoremap <silent> <Plug>MoveBlockDown :call <SID>MoveBlockOneLineDown()<CR>
126 vnoremap <silent> <Plug>MoveBlockUp :call <SID>MoveBlockOneLineUp()<CR>
127 vnoremap <silent> <Plug>MoveBlockHalfPageDown :call <SID>MoveBlockHalfPageDown()<CR>
128 vnoremap <silent> <Plug>MoveBlockHalfPageUp :call <SID>MoveBlockHalfPageUp()<CR>
130 nnoremap <silent> <Plug>MoveLineDown :call <SID>MoveLineDown(1)<CR>
131 nnoremap <silent> <Plug>MoveLineUp :call <SID>MoveLineUp(1)<CR>
132 nnoremap <silent> <Plug>MoveLineHalfPageDown :call <SID>MoveLineHalfPageDown()<CR>
133 nnoremap <silent> <Plug>MoveLineHalfPageUp :call <SID>MoveLineHalfPageUp()<CR>
137 execute 'vmap' s:MoveKey('j') '<Plug>MoveBlockDown'
138 execute 'vmap' s:MoveKey('k') '<Plug>MoveBlockUp'
139 execute 'nmap' s:MoveKey('j') '<Plug>MoveLineDown'
140 execute 'nmap' s:MoveKey('k') '<Plug>MoveLineUp'