annotate runtime/plugin/gzip.vim @ 7:3fc0f57ecb91 v7.0001

updated for version 7.0001
author vimboss
date Sun, 13 Jun 2004 20:20:40 +0000
parents
children cc049b00ee70
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1 " Vim plugin for editing compressed files.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2 " Maintainer: Bram Moolenaar <Bram@vim.org>
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3 " Last Change: 2004 Jan 12
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5 " Exit quickly when:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6 " - this plugin was already loaded
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7 " - when 'compatible' is set
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8 " - some autocommands are already taking care of compressed files
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9 if exists("loaded_gzip") || &cp || exists("#BufReadPre#*.gz")
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10 finish
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
11 endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
12 let loaded_gzip = 1
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
13
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
14 augroup gzip
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
15 " Remove all gzip autocommands
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
16 au!
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
17
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
18 " Enable editing of gzipped files
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
19 " set binary mode before reading the file
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
20 " use "gzip -d", gunzip isn't always available
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
21 autocmd BufReadPre,FileReadPre *.gz,*.bz2,*.Z setlocal bin
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
22 autocmd BufReadPost,FileReadPost *.gz call s:read("gzip -dn")
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
23 autocmd BufReadPost,FileReadPost *.bz2 call s:read("bzip2 -d")
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
24 autocmd BufReadPost,FileReadPost *.Z call s:read("uncompress")
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
25 autocmd BufWritePost,FileWritePost *.gz call s:write("gzip")
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
26 autocmd BufWritePost,FileWritePost *.bz2 call s:write("bzip2")
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
27 autocmd BufWritePost,FileWritePost *.Z call s:write("compress -f")
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
28 autocmd FileAppendPre *.gz call s:appre("gzip -dn")
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
29 autocmd FileAppendPre *.bz2 call s:appre("bzip2 -d")
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
30 autocmd FileAppendPre *.Z call s:appre("uncompress")
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
31 autocmd FileAppendPost *.gz call s:write("gzip")
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
32 autocmd FileAppendPost *.bz2 call s:write("bzip2")
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
33 autocmd FileAppendPost *.Z call s:write("compress -f")
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
34 augroup END
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
35
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
36 " Function to check that executing "cmd [-f]" works.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
37 " The result is cached in s:have_"cmd" for speed.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
38 fun s:check(cmd)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
39 let name = substitute(a:cmd, '\(\S*\).*', '\1', '')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
40 if !exists("s:have_" . name)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
41 let e = executable(name)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
42 if e < 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
43 let r = system(name . " --version")
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
44 let e = (r !~ "not found" && r != "")
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
45 endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
46 exe "let s:have_" . name . "=" . e
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
47 endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
48 exe "return s:have_" . name
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
49 endfun
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
50
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
51 " After reading compressed file: Uncompress text in buffer with "cmd"
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
52 fun s:read(cmd)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
53 " don't do anything if the cmd is not supported
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
54 if !s:check(a:cmd)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
55 return
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
56 endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
57 " make 'patchmode' empty, we don't want a copy of the written file
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
58 let pm_save = &pm
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
59 set pm=
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
60 " remove 'a' and 'A' from 'cpo' to avoid the alternate file changes
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
61 let cpo_save = &cpo
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
62 set cpo-=a cpo-=A
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
63 " set 'modifiable'
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
64 let ma_save = &ma
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
65 setlocal ma
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
66 " when filtering the whole buffer, it will become empty
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
67 let empty = line("'[") == 1 && line("']") == line("$")
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
68 let tmp = tempname()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
69 let tmpe = tmp . "." . expand("<afile>:e")
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
70 " write the just read lines to a temp file "'[,']w tmp.gz"
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
71 execute "silent '[,']w " . tmpe
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
72 " uncompress the temp file: call system("gzip -dn tmp.gz")
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
73 call system(a:cmd . " " . tmpe)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
74 " delete the compressed lines; remember the line number
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
75 let l = line("'[") - 1
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
76 if exists(":lockmarks")
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
77 lockmarks '[,']d _
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
78 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
79 '[,']d _
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
80 endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
81 " read in the uncompressed lines "'[-1r tmp"
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
82 setlocal nobin
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
83 if exists(":lockmarks")
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
84 execute "silent lockmarks " . l . "r " . tmp
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
85 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
86 execute "silent " . l . "r " . tmp
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
87 endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
88
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
89 " if buffer became empty, delete trailing blank line
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
90 if empty
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
91 silent $delete _
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
92 1
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
93 endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
94 " delete the temp file and the used buffers
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
95 call delete(tmp)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
96 silent! exe "bwipe " . tmp
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
97 silent! exe "bwipe " . tmpe
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
98 let &pm = pm_save
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
99 let &cpo = cpo_save
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
100 let &l:ma = ma_save
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
101 " When uncompressed the whole buffer, do autocommands
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
102 if empty
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
103 if &verbose >= 8
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
104 execute "doau BufReadPost " . expand("%:r")
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
105 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
106 execute "silent! doau BufReadPost " . expand("%:r")
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
107 endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
108 endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
109 endfun
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
110
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
111 " After writing compressed file: Compress written file with "cmd"
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
112 fun s:write(cmd)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
113 " don't do anything if the cmd is not supported
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
114 if s:check(a:cmd)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
115 " Rename the file before compressing it.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
116 let nm = expand("<afile>")
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
117 let nmt = s:tempname(nm)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
118 if rename(nm, nmt) == 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
119 call system(a:cmd . " " . nmt)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
120 call rename(nmt . "." . expand("<afile>:e"), nm)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
121 endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
122 endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
123 endfun
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
124
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
125 " Before appending to compressed file: Uncompress file with "cmd"
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
126 fun s:appre(cmd)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
127 " don't do anything if the cmd is not supported
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
128 if s:check(a:cmd)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
129 " Rename to a weird name to avoid the risk of overwriting another file
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
130 let nm = expand("<afile>")
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
131 let nmt = expand("<afile>:p:h") . "/X~=@l9q5"
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
132 let nmte = nmt . "." . expand("<afile>:e")
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
133 if rename(nm, nmte) == 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
134 if &patchmode != "" && getfsize(nm . &patchmode) == -1
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
135 " Create patchmode file by creating the decompressed file new
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
136 call system(a:cmd . " -c " . nmte . " > " . nmt)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
137 call rename(nmte, nm . &patchmode)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
138 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
139 call system(a:cmd . " " . nmte)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
140 endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
141 call rename(nmt, nm)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
142 endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
143 endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
144 endfun
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
145
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
146 " find a file name for the file to be compressed. Use "name" without an
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
147 " extension if possible. Otherwise use a weird name to avoid overwriting an
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
148 " existing file.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
149 fun s:tempname(name)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
150 let fn = fnamemodify(a:name, ":r")
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
151 if !filereadable(fn) && !isdirectory(fn)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
152 return fn
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
153 endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
154 return fnamemodify(a:name, ":p:h") . "/X~=@l9q5"
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
155 endfun
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
156
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
157 " vim: set sw=2 :