Vim 7.4 won't let us quit windows from a script.
[profile.git] / .vim / plugin / move.vim
1 " =============================================================================
2 " File: plugin/move.vim
3 " Description: Move lines and selections up and even down.
4 " Author: Matthias Vogelgesang <github.com/matze>
5 " =============================================================================
6
7 if exists('loaded_move') || &cp
8     finish
9 endif
10
11 let loaded_move = 1
12
13 if !exists('g:move_map_keys')
14     let g:move_map_keys = 1
15 endif
16
17 if !exists('g:move_key_modifier')
18     let g:move_key_modifier = 'A'
19 endif
20
21 function! s:ResetCursor()
22     normal! gv=gv^
23 endfunction
24
25 function! s:MoveBlockDown(start, end, count)
26     let next_line = a:end + a:count
27
28     if v:count > 0
29         let next_line = next_line + v:count - 1
30     endif
31
32     if next_line > line('$')
33         call s:ResetCursor()
34         return
35     endif
36
37     execute "silent" a:start "," a:end "m " next_line
38     call s:ResetCursor()
39 endfunction
40
41 function! s:MoveBlockUp(start, end, count)
42     let prev_line = a:start - a:count - 1
43
44     if v:count > 0
45         let prev_line = prev_line - v:count + 1
46     endif
47
48     if prev_line < 0
49         call s:ResetCursor()
50         return
51     endif
52
53     execute "silent" a:start "," a:end "m " prev_line
54     call s:ResetCursor()
55 endfunction
56
57 function! s:MoveLineUp(count) range
58     let distance = a:count + 1
59
60     if v:count > 0
61         let distance = distance + v:count - 1
62     endif
63
64     if (line('.') - distance) < 0
65         execute 'silent m 0'
66         normal! ==
67         return
68     endif
69
70     execute 'silent m-' . distance
71
72     normal! ==
73 endfunction
74
75 function! s:MoveLineDown(count) range
76     let distance = a:count
77
78     if v:count > 0
79         let distance = distance + v:count - 1
80     endif
81
82     if (line('.') + distance) > line('$')
83         execute 'silent m $'
84         normal! ==
85         return
86     endif
87
88     execute 'silent m+' . distance
89     normal! ==
90 endfunction
91
92 function! s:MoveBlockOneLineUp() range
93     call s:MoveBlockUp(a:firstline, a:lastline, 1)
94 endfunction
95
96 function! s:MoveBlockOneLineDown() range
97     call s:MoveBlockDown(a:firstline, a:lastline, 1)
98 endfunction
99
100 function! s:MoveBlockHalfPageUp() range
101     let distance = winheight('.') / 2
102     call s:MoveBlockUp(a:firstline, a:lastline, distance)
103 endfunction
104
105 function! s:MoveBlockHalfPageDown() range
106     let distance = winheight('.') / 2
107     call s:MoveBlockDown(a:firstline, a:lastline, distance)
108 endfunction
109
110 function! s:MoveLineHalfPageUp() range
111     let distance = winheight('.') / 2
112     call s:MoveLineUp(distance)
113 endfunction
114
115 function! s:MoveLineHalfPageDown() range
116     let distance = winheight('.') / 2
117     call s:MoveLineDown(distance)
118 endfunction
119
120 function! s:MoveKey(key)
121     return '<' . g:move_key_modifier . '-' . a:key . '>'
122 endfunction
123
124
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>
129
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>
134
135
136 if g:move_map_keys
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'
141 endif