comparison runtime/plugin/gzip.vim @ 446:7472c565592a v7.0117

updated for version 7.0117
author vimboss
date Wed, 27 Jul 2005 21:13:01 +0000
parents 8d34af900bae
children 7bc41231fbc7
comparison
equal deleted inserted replaced
445:c773cb978acf 446:7472c565592a
1 " Vim plugin for editing compressed files. 1 " Vim plugin for editing compressed files.
2 " Maintainer: Bram Moolenaar <Bram@vim.org> 2 " Maintainer: Bram Moolenaar <Bram@vim.org>
3 " Last Change: 2005 May 18 3 " Last Change: 2005 Jul 26
4 4
5 " Exit quickly when: 5 " Exit quickly when:
6 " - this plugin was already loaded 6 " - this plugin was already loaded
7 " - when 'compatible' is set 7 " - when 'compatible' is set
8 " - some autocommands are already taking care of compressed files 8 " - some autocommands are already taking care of compressed files
13 13
14 augroup gzip 14 augroup gzip
15 " Remove all gzip autocommands 15 " Remove all gzip autocommands
16 au! 16 au!
17 17
18 " Enable editing of gzipped files 18 " Enable editing of gzipped files.
19 " set binary mode before reading the file 19 " The functions are defined in autoload/gzip.vim.
20 " use "gzip -d", gunzip isn't always available 20 "
21 " Set binary mode before reading the file.
22 " Use "gzip -d", gunzip isn't always available.
21 autocmd BufReadPre,FileReadPre *.gz,*.bz2,*.Z setlocal bin 23 autocmd BufReadPre,FileReadPre *.gz,*.bz2,*.Z setlocal bin
22 autocmd BufReadPost,FileReadPost *.gz call s:read("gzip -dn") 24 autocmd BufReadPost,FileReadPost *.gz call gzip#read("gzip -dn")
23 autocmd BufReadPost,FileReadPost *.bz2 call s:read("bzip2 -d") 25 autocmd BufReadPost,FileReadPost *.bz2 call gzip#read("bzip2 -d")
24 autocmd BufReadPost,FileReadPost *.Z call s:read("uncompress") 26 autocmd BufReadPost,FileReadPost *.Z call gzip#read("uncompress")
25 autocmd BufWritePost,FileWritePost *.gz call s:write("gzip") 27 autocmd BufWritePost,FileWritePost *.gz call gzip#write("gzip")
26 autocmd BufWritePost,FileWritePost *.bz2 call s:write("bzip2") 28 autocmd BufWritePost,FileWritePost *.bz2 call gzip#write("bzip2")
27 autocmd BufWritePost,FileWritePost *.Z call s:write("compress -f") 29 autocmd BufWritePost,FileWritePost *.Z call gzip#write("compress -f")
28 autocmd FileAppendPre *.gz call s:appre("gzip -dn") 30 autocmd FileAppendPre *.gz call gzip#appre("gzip -dn")
29 autocmd FileAppendPre *.bz2 call s:appre("bzip2 -d") 31 autocmd FileAppendPre *.bz2 call gzip#appre("bzip2 -d")
30 autocmd FileAppendPre *.Z call s:appre("uncompress") 32 autocmd FileAppendPre *.Z call gzip#appre("uncompress")
31 autocmd FileAppendPost *.gz call s:write("gzip") 33 autocmd FileAppendPost *.gz call gzip#write("gzip")
32 autocmd FileAppendPost *.bz2 call s:write("bzip2") 34 autocmd FileAppendPost *.bz2 call gzip#write("bzip2")
33 autocmd FileAppendPost *.Z call s:write("compress -f") 35 autocmd FileAppendPost *.Z call gzip#write("compress -f")
34 augroup END 36 augroup END
35
36 " Function to check that executing "cmd [-f]" works.
37 " The result is cached in s:have_"cmd" for speed.
38 fun s:check(cmd)
39 let name = substitute(a:cmd, '\(\S*\).*', '\1', '')
40 if !exists("s:have_" . name)
41 let e = executable(name)
42 if e < 0
43 let r = system(name . " --version")
44 let e = (r !~ "not found" && r != "")
45 endif
46 exe "let s:have_" . name . "=" . e
47 endif
48 exe "return s:have_" . name
49 endfun
50
51 " Set b:gzip_comp_arg to the gzip argument to be used for compression, based on
52 " the flags in the compressed file.
53 " The only compression methods that can be detected are max speed (-1) and max
54 " compression (-9).
55 fun s:set_compression(line)
56 " get the Compression Method
57 let l:cm = char2nr(a:line[2])
58 " if it's 8 (DEFLATE), we can check for the compression level
59 if l:cm == 8
60 " get the eXtra FLags
61 let l:xfl = char2nr(a:line[8])
62 " max compression
63 if l:xfl == 2
64 let b:gzip_comp_arg = "-9"
65 " min compression
66 elseif l:xfl == 4
67 let b:gzip_comp_arg = "-1"
68 endif
69 endif
70 endfun
71
72
73 " After reading compressed file: Uncompress text in buffer with "cmd"
74 fun s:read(cmd)
75 " don't do anything if the cmd is not supported
76 if !s:check(a:cmd)
77 return
78 endif
79
80 " for gzip check current compression level and set b:gzip_comp_arg.
81 silent! unlet b:gzip_comp_arg
82 if a:cmd[0] == 'g'
83 call s:set_compression(getline(1))
84 endif
85
86 " make 'patchmode' empty, we don't want a copy of the written file
87 let pm_save = &pm
88 set pm=
89 " remove 'a' and 'A' from 'cpo' to avoid the alternate file changes
90 let cpo_save = &cpo
91 set cpo-=a cpo-=A
92 " set 'modifiable'
93 let ma_save = &ma
94 setlocal ma
95 " when filtering the whole buffer, it will become empty
96 let empty = line("'[") == 1 && line("']") == line("$")
97 let tmp = tempname()
98 let tmpe = tmp . "." . expand("<afile>:e")
99 " write the just read lines to a temp file "'[,']w tmp.gz"
100 execute "silent '[,']w " . tmpe
101 " uncompress the temp file: call system("gzip -dn tmp.gz")
102 call system(a:cmd . " " . tmpe)
103 if !filereadable(tmp)
104 " uncompress didn't work! Keep the compressed file then.
105 echoerr "Error: Could not read uncompressed file"
106 return
107 endif
108 " delete the compressed lines; remember the line number
109 let l = line("'[") - 1
110 if exists(":lockmarks")
111 lockmarks '[,']d _
112 else
113 '[,']d _
114 endif
115 " read in the uncompressed lines "'[-1r tmp"
116 setlocal nobin
117 if exists(":lockmarks")
118 execute "silent lockmarks " . l . "r " . tmp
119 else
120 execute "silent " . l . "r " . tmp
121 endif
122
123 " if buffer became empty, delete trailing blank line
124 if empty
125 silent $delete _
126 1
127 endif
128 " delete the temp file and the used buffers
129 call delete(tmp)
130 silent! exe "bwipe " . tmp
131 silent! exe "bwipe " . tmpe
132 let &pm = pm_save
133 let &cpo = cpo_save
134 let &l:ma = ma_save
135 " When uncompressed the whole buffer, do autocommands
136 if empty
137 if &verbose >= 8
138 execute "doau BufReadPost " . expand("%:r")
139 else
140 execute "silent! doau BufReadPost " . expand("%:r")
141 endif
142 endif
143 endfun
144
145 " After writing compressed file: Compress written file with "cmd"
146 fun s:write(cmd)
147 " don't do anything if the cmd is not supported
148 if s:check(a:cmd)
149 " Rename the file before compressing it.
150 let nm = resolve(expand("<afile>"))
151 let nmt = s:tempname(nm)
152 if rename(nm, nmt) == 0
153 if exists("b:gzip_comp_arg")
154 call system(a:cmd . " " . b:gzip_comp_arg . " " . nmt)
155 else
156 call system(a:cmd . " " . nmt)
157 endif
158 call rename(nmt . "." . expand("<afile>:e"), nm)
159 endif
160 endif
161 endfun
162
163 " Before appending to compressed file: Uncompress file with "cmd"
164 fun s:appre(cmd)
165 " don't do anything if the cmd is not supported
166 if s:check(a:cmd)
167 let nm = expand("<afile>")
168
169 " for gzip check current compression level and set b:gzip_comp_arg.
170 silent! unlet b:gzip_comp_arg
171 if a:cmd[0] == 'g'
172 call s:set_compression(readfile(nm, "b", 1)[0])
173 endif
174
175 " Rename to a weird name to avoid the risk of overwriting another file
176 let nmt = expand("<afile>:p:h") . "/X~=@l9q5"
177 let nmte = nmt . "." . expand("<afile>:e")
178 if rename(nm, nmte) == 0
179 if &patchmode != "" && getfsize(nm . &patchmode) == -1
180 " Create patchmode file by creating the decompressed file new
181 call system(a:cmd . " -c " . nmte . " > " . nmt)
182 call rename(nmte, nm . &patchmode)
183 else
184 call system(a:cmd . " " . nmte)
185 endif
186 call rename(nmt, nm)
187 endif
188 endif
189 endfun
190
191 " find a file name for the file to be compressed. Use "name" without an
192 " extension if possible. Otherwise use a weird name to avoid overwriting an
193 " existing file.
194 fun s:tempname(name)
195 let fn = fnamemodify(a:name, ":r")
196 if !filereadable(fn) && !isdirectory(fn)
197 return fn
198 endif
199 return fnamemodify(a:name, ":p:h") . "/X~=@l9q5"
200 endfun
201
202 " vim: set sw=2 :