summaryrefslogtreecommitdiffstats
path: root/runtime/plugin/gzip.vim
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2005-07-27 21:13:01 +0000
committerBram Moolenaar <Bram@vim.org>2005-07-27 21:13:01 +0000
commit87e25fdf80c7b45deee9c59389b51503e906d93b (patch)
treee477f86746245499e324e1d1e9ccada6aed035e9 /runtime/plugin/gzip.vim
parent231334e6efbf3a7f89183f8257e09492534a5f8c (diff)
updated for version 7.0117v7.0117
Diffstat (limited to 'runtime/plugin/gzip.vim')
-rw-r--r--runtime/plugin/gzip.vim202
1 files changed, 18 insertions, 184 deletions
diff --git a/runtime/plugin/gzip.vim b/runtime/plugin/gzip.vim
index 0eebc5cb31..6560238719 100644
--- a/runtime/plugin/gzip.vim
+++ b/runtime/plugin/gzip.vim
@@ -1,6 +1,6 @@
" Vim plugin for editing compressed files.
" Maintainer: Bram Moolenaar <Bram@vim.org>
-" Last Change: 2005 May 18
+" Last Change: 2005 Jul 26
" Exit quickly when:
" - this plugin was already loaded
@@ -15,188 +15,22 @@ augroup gzip
" Remove all gzip autocommands
au!
- " Enable editing of gzipped files
- " set binary mode before reading the file
- " use "gzip -d", gunzip isn't always available
+ " Enable editing of gzipped files.
+ " The functions are defined in autoload/gzip.vim.
+ "
+ " Set binary mode before reading the file.
+ " Use "gzip -d", gunzip isn't always available.
autocmd BufReadPre,FileReadPre *.gz,*.bz2,*.Z setlocal bin
- autocmd BufReadPost,FileReadPost *.gz call s:read("gzip -dn")
- autocmd BufReadPost,FileReadPost *.bz2 call s:read("bzip2 -d")
- autocmd BufReadPost,FileReadPost *.Z call s:read("uncompress")
- autocmd BufWritePost,FileWritePost *.gz call s:write("gzip")
- autocmd BufWritePost,FileWritePost *.bz2 call s:write("bzip2")
- autocmd BufWritePost,FileWritePost *.Z call s:write("compress -f")
- autocmd FileAppendPre *.gz call s:appre("gzip -dn")
- autocmd FileAppendPre *.bz2 call s:appre("bzip2 -d")
- autocmd FileAppendPre *.Z call s:appre("uncompress")
- autocmd FileAppendPost *.gz call s:write("gzip")
- autocmd FileAppendPost *.bz2 call s:write("bzip2")
- autocmd FileAppendPost *.Z call s:write("compress -f")
+ autocmd BufReadPost,FileReadPost *.gz call gzip#read("gzip -dn")
+ autocmd BufReadPost,FileReadPost *.bz2 call gzip#read("bzip2 -d")
+ autocmd BufReadPost,FileReadPost *.Z call gzip#read("uncompress")
+ autocmd BufWritePost,FileWritePost *.gz call gzip#write("gzip")
+ autocmd BufWritePost,FileWritePost *.bz2 call gzip#write("bzip2")
+ autocmd BufWritePost,FileWritePost *.Z call gzip#write("compress -f")
+ autocmd FileAppendPre *.gz call gzip#appre("gzip -dn")
+ autocmd FileAppendPre *.bz2 call gzip#appre("bzip2 -d")
+ autocmd FileAppendPre *.Z call gzip#appre("uncompress")
+ autocmd FileAppendPost *.gz call gzip#write("gzip")
+ autocmd FileAppendPost *.bz2 call gzip#write("bzip2")
+ autocmd FileAppendPost *.Z call gzip#write("compress -f")
augroup END
-
-" Function to check that executing "cmd [-f]" works.
-" The result is cached in s:have_"cmd" for speed.
-fun s:check(cmd)
- let name = substitute(a:cmd, '\(\S*\).*', '\1', '')
- if !exists("s:have_" . name)
- let e = executable(name)
- if e < 0
- let r = system(name . " --version")
- let e = (r !~ "not found" && r != "")
- endif
- exe "let s:have_" . name . "=" . e
- endif
- exe "return s:have_" . name
-endfun
-
-" Set b:gzip_comp_arg to the gzip argument to be used for compression, based on
-" the flags in the compressed file.
-" The only compression methods that can be detected are max speed (-1) and max
-" compression (-9).
-fun s:set_compression(line)
- " get the Compression Method
- let l:cm = char2nr(a:line[2])
- " if it's 8 (DEFLATE), we can check for the compression level
- if l:cm == 8
- " get the eXtra FLags
- let l:xfl = char2nr(a:line[8])
- " max compression
- if l:xfl == 2
- let b:gzip_comp_arg = "-9"
- " min compression
- elseif l:xfl == 4
- let b:gzip_comp_arg = "-1"
- endif
- endif
-endfun
-
-
-" After reading compressed file: Uncompress text in buffer with "cmd"
-fun s:read(cmd)
- " don't do anything if the cmd is not supported
- if !s:check(a:cmd)
- return
- endif
-
- " for gzip check current compression level and set b:gzip_comp_arg.
- silent! unlet b:gzip_comp_arg
- if a:cmd[0] == 'g'
- call s:set_compression(getline(1))
- endif
-
- " make 'patchmode' empty, we don't want a copy of the written file
- let pm_save = &pm
- set pm=
- " remove 'a' and 'A' from 'cpo' to avoid the alternate file changes
- let cpo_save = &cpo
- set cpo-=a cpo-=A
- " set 'modifiable'
- let ma_save = &ma
- setlocal ma
- " when filtering the whole buffer, it will become empty
- let empty = line("'[") == 1 && line("']") == line("$")
- let tmp = tempname()
- let tmpe = tmp . "." . expand("<afile>:e")
- " write the just read lines to a temp file "'[,']w tmp.gz"
- execute "silent '[,']w " . tmpe
- " uncompress the temp file: call system("gzip -dn tmp.gz")
- call system(a:cmd . " " . tmpe)
- if !filereadable(tmp)
- " uncompress didn't work! Keep the compressed file then.
- echoerr "Error: Could not read uncompressed file"
- return
- endif
- " delete the compressed lines; remember the line number
- let l = line("'[") - 1
- if exists(":lockmarks")
- lockmarks '[,']d _
- else
- '[,']d _
- endif
- " read in the uncompressed lines "'[-1r tmp"
- setlocal nobin
- if exists(":lockmarks")
- execute "silent lockmarks " . l . "r " . tmp
- else
- execute "silent " . l . "r " . tmp
- endif
-
- " if buffer became empty, delete trailing blank line
- if empty
- silent $delete _
- 1
- endif
- " delete the temp file and the used buffers
- call delete(tmp)
- silent! exe "bwipe " . tmp
- silent! exe "bwipe " . tmpe
- let &pm = pm_save
- let &cpo = cpo_save
- let &l:ma = ma_save
- " When uncompressed the whole buffer, do autocommands
- if empty
- if &verbose >= 8
- execute "doau BufReadPost " . expand("%:r")
- else
- execute "silent! doau BufReadPost " . expand("%:r")
- endif
- endif
-endfun
-
-" After writing compressed file: Compress written file with "cmd"
-fun s:write(cmd)
- " don't do anything if the cmd is not supported
- if s:check(a:cmd)
- " Rename the file before compressing it.
- let nm = resolve(expand("<afile>"))
- let nmt = s:tempname(nm)
- if rename(nm, nmt) == 0
- if exists("b:gzip_comp_arg")
- call system(a:cmd . " " . b:gzip_comp_arg . " " . nmt)
- else
- call system(a:cmd . " " . nmt)
- endif
- call rename(nmt . "." . expand("<afile>:e"), nm)
- endif
- endif
-endfun
-
-" Before appending to compressed file: Uncompress file with "cmd"
-fun s:appre(cmd)
- " don't do anything if the cmd is not supported
- if s:check(a:cmd)
- let nm = expand("<afile>")
-
- " for gzip check current compression level and set b:gzip_comp_arg.
- silent! unlet b:gzip_comp_arg
- if a:cmd[0] == 'g'
- call s:set_compression(readfile(nm, "b", 1)[0])
- endif
-
- " Rename to a weird name to avoid the risk of overwriting another file
- let nmt = expand("<afile>:p:h") . "/X~=@l9q5"
- let nmte = nmt . "." . expand("<afile>:e")
- if rename(nm, nmte) == 0
- if &patchmode != "" && getfsize(nm . &patchmode) == -1
- " Create patchmode file by creating the decompressed file new
- call system(a:cmd . " -c " . nmte . " > " . nmt)
- call rename(nmte, nm . &patchmode)
- else
- call system(a:cmd . " " . nmte)
- endif
- call rename(nmt, nm)
- endif
- endif
-endfun
-
-" find a file name for the file to be compressed. Use "name" without an
-" extension if possible. Otherwise use a weird name to avoid overwriting an
-" existing file.
-fun s:tempname(name)
- let fn = fnamemodify(a:name, ":r")
- if !filereadable(fn) && !isdirectory(fn)
- return fn
- endif
- return fnamemodify(a:name, ":p:h") . "/X~=@l9q5"
-endfun
-
-" vim: set sw=2 :