/
regionedit.vim
121 lines (94 loc) · 2.25 KB
/
regionedit.vim
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
" Region Edit
"
" Author: tAkihiko <pureodio1109@gmail.com>
" Licence: MIT
"
scriptencoding utf-8
command! -range=% -nargs=* RegionEdit call <SID>StartPatternRegionEdit(<line1>, <line2>, <q-args>)
function! s:StartPatternRegionEdit(begin, end, pat)
if exists('b:RegionEditFile')
return
endif
if &modified != 0
echohl Error
echo "保存してください"
echohl None
return
endif
let l:line_list = []
for l:lnum in range(a:begin, a:end)
let l:line = getline(l:lnum)
if match(l:line, a:pat) >= 0
let l:line_list += [[l:lnum, l:line]]
endif
endfor
if len(l:line_list) < 1
echohl Error
echo "対象の行がありません"
echohl None
return
endif
let l:fname = expand('%')
let l:ft = &filetype
rightbelow vnew `=tempname()`
setlocal buftype=nowrite
setlocal noswapfile
file [Region Edit]
let &filetype = l:ft
command! -buffer EndRegionEdit call <SID>EndRegionEdit()
for l:line_node in l:line_list
call append(line('$'), l:line_node[1])
endfor
0 delete _
let b:RegionEditFile = l:fname
let b:RegionEditList = l:line_list
if len(a:pat) > 0
let b:RegionEditMode = 0
else
let b:RegionEditMode = 1
endif
endfunction
function! s:EndRegionEdit()
if !exists('b:RegionEditFile') || !exists('b:RegionEditList') || !exists('b:RegionEditMode')
echohl Error
echo "編集中のものがありません"
echohl None
return
endif
let l:line_list = []
for l:lnum in range(1, line('$'))
let l:line_list += [getline(l:lnum)]
endfor
let l:line_prev_list = b:RegionEditList
let l:fname = b:RegionEditFile
if b:RegionEditMode == 0
if len(b:RegionEditList) != len(l:line_list)
echohl Error
echo "行数がちがいます"
echohl None
return
endif
execute 'edit' l:fname
setlocal buftype=
let l:lcnt = 0
for l:line in l:line_prev_list
if l:line[1] != l:line_list[l:lcnt]
call setline(l:line[0], l:line_list[l:lcnt])
endif
let l:lcnt += 1
endfor
close
elseif b:RegionEditMode == 1
execute 'edit' l:fname
setlocal buftype=
let l:begin = l:line_prev_list[0][0]
let l:end = l:line_prev_list[-1][0]
for l:lcnt in l:line_prev_list
execute l:begin "delete" "_"
endfor
for l:line in reverse(l:line_list)
call append(l:begin - 1, l:line)
endfor
close
endif
endfunction