home *** CD-ROM | disk | FTP | other *** search
/ PC World 2005 June / PCWorld_2005-06_cd.bin / software / vyzkuste / firewally / firewally.exe / framework-2.3.exe / gzip.vim < prev    next >
Text File  |  2003-08-12  |  5KB  |  149 lines

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