home *** CD-ROM | disk | FTP | other *** search
/ vim.ftp.fu-berlin.de / 2015-02-03.vim.ftp.fu-berlin.de.tar / vim.ftp.fu-berlin.de / runtime / dos / autoload / spellfile.vim < prev    next >
Encoding:
Text File  |  2012-05-31  |  6.3 KB  |  210 lines

  1. " Vim script to download a missing spell file
  2. " Maintainer:    Bram Moolenaar <Bram@vim.org>
  3. " Last Change:    2012 Jan 08
  4.  
  5. if !exists('g:spellfile_URL')
  6.   " Prefer using http:// when netrw should be able to use it, since
  7.   " more firewalls let this through.
  8.   if executable("curl") || executable("wget") || executable("fetch")
  9.     let g:spellfile_URL = 'http://ftp.vim.org/pub/vim/runtime/spell'
  10.   else
  11.     let g:spellfile_URL = 'ftp://ftp.vim.org/pub/vim/runtime/spell'
  12.   endif
  13. endif
  14. let s:spellfile_URL = ''    " Start with nothing so that s:donedict is reset.
  15.  
  16. " This function is used for the spellfile plugin.
  17. function! spellfile#LoadFile(lang)
  18.   " If the netrw plugin isn't loaded we silently skip everything.
  19.   if !exists(":Nread")
  20.     if &verbose
  21.       echomsg 'spellfile#LoadFile(): Nread command is not available.'
  22.     endif
  23.     return
  24.   endif
  25.  
  26.   " If the URL changes we try all files again.
  27.   if s:spellfile_URL != g:spellfile_URL
  28.     let s:donedict = {}
  29.     let s:spellfile_URL = g:spellfile_URL
  30.   endif
  31.  
  32.   " I will say this only once!
  33.   if has_key(s:donedict, a:lang . &enc)
  34.     if &verbose
  35.       echomsg 'spellfile#LoadFile(): Tried this language/encoding before.'
  36.     endif
  37.     return
  38.   endif
  39.   let s:donedict[a:lang . &enc] = 1
  40.  
  41.   " Find spell directories we can write in.
  42.   let [dirlist, dirchoices] = spellfile#GetDirChoices()
  43.   if len(dirlist) == 0
  44.     let dir_to_create = spellfile#WritableSpellDir()
  45.     if &verbose || dir_to_create != ''
  46.       echomsg 'spellfile#LoadFile(): There is no writable spell directory.'
  47.     endif
  48.     if dir_to_create != ''
  49.       if confirm("Shall I create " . dir_to_create, "&Yes\n&No", 2) == 1
  50.     " After creating the directory it should show up in the list.
  51.     call mkdir(dir_to_create, "p")
  52.     let [dirlist, dirchoices] = spellfile#GetDirChoices()
  53.       endif
  54.     endif
  55.     if len(dirlist) == 0
  56.       return
  57.     endif
  58.   endif
  59.  
  60.   let msg = 'Cannot find spell file for "' . a:lang . '" in ' . &enc
  61.   let msg .= "\nDo you want me to try downloading it?"
  62.   if confirm(msg, "&Yes\n&No", 2) == 1
  63.     let enc = &encoding
  64.     if enc == 'iso-8859-15'
  65.       let enc = 'latin1'
  66.     endif
  67.     let fname = a:lang . '.' . enc . '.spl'
  68.  
  69.     " Split the window, read the file into a new buffer.
  70.     " Remember the buffer number, we check it below.
  71.     new
  72.     let newbufnr = winbufnr(0)
  73.     setlocal bin fenc=
  74.     echo 'Downloading ' . fname . '...'
  75.     call spellfile#Nread(fname)
  76.     if getline(2) !~ 'VIMspell'
  77.       " Didn't work, perhaps there is an ASCII one.
  78.       " Careful: Nread() may have opened a new window for the error message,
  79.       " we need to go back to our own buffer and window.
  80.       if newbufnr != winbufnr(0)
  81.     let winnr = bufwinnr(newbufnr)
  82.     if winnr == -1
  83.       " Our buffer has vanished!?  Open a new window.
  84.       echomsg "download buffer disappeared, opening a new one"
  85.       new
  86.       setlocal bin fenc=
  87.     else
  88.       exe winnr . "wincmd w"
  89.     endif
  90.       endif
  91.       if newbufnr == winbufnr(0)
  92.     " We are back the old buffer, remove any (half-finished) download.
  93.         g/^/d
  94.       else
  95.     let newbufnr = winbufnr(0)
  96.       endif
  97.  
  98.       let fname = a:lang . '.ascii.spl'
  99.       echo 'Could not find it, trying ' . fname . '...'
  100.       call spellfile#Nread(fname)
  101.       if getline(2) !~ 'VIMspell'
  102.     echo 'Sorry, downloading failed'
  103.     exe newbufnr . "bwipe!"
  104.     return
  105.       endif
  106.     endif
  107.  
  108.     " Delete the empty first line and mark the file unmodified.
  109.     1d
  110.     set nomod
  111.  
  112.     let msg = "In which directory do you want to write the file:"
  113.     for i in range(len(dirlist))
  114.       let msg .= "\n" . (i + 1) . '. ' . dirlist[i]
  115.     endfor
  116.     let dirchoice = confirm(msg, dirchoices) - 2
  117.     if dirchoice >= 0
  118.       if exists('*fnameescape')
  119.     let dirname = fnameescape(dirlist[dirchoice])
  120.       else
  121.     let dirname = escape(dirlist[dirchoice], ' ')
  122.       endif
  123.       setlocal fenc=
  124.       exe "write " . dirname . '/' . fname
  125.  
  126.       " Also download the .sug file, if the user wants to.
  127.       let msg = "Do you want me to try getting the .sug file?\n"
  128.       let msg .= "This will improve making suggestions for spelling mistakes,\n"
  129.       let msg .= "but it uses quite a bit of memory."
  130.       if confirm(msg, "&No\n&Yes") == 2
  131.     g/^/d
  132.     let fname = substitute(fname, '\.spl$', '.sug', '')
  133.     echo 'Downloading ' . fname . '...'
  134.     call spellfile#Nread(fname)
  135.     if getline(2) =~ 'VIMsug'
  136.       1d
  137.       exe "write " . dirname . '/' . fname
  138.       set nomod
  139.     else
  140.       echo 'Sorry, downloading failed'
  141.       " Go back to our own buffer/window, Nread() may have taken us to
  142.       " another window.
  143.       if newbufnr != winbufnr(0)
  144.         let winnr = bufwinnr(newbufnr)
  145.         if winnr != -1
  146.           exe winnr . "wincmd w"
  147.         endif
  148.       endif
  149.       if newbufnr == winbufnr(0)
  150.         set nomod
  151.       endif
  152.     endif
  153.       endif
  154.     endif
  155.  
  156.     " Wipe out the buffer we used.
  157.     exe newbufnr . "bwipe"
  158.   endif
  159. endfunc
  160.  
  161. " Read "fname" from the server.
  162. function! spellfile#Nread(fname)
  163.   " We do our own error handling, don't want a window for it.
  164.   if exists("g:netrw_use_errorwindow")
  165.     let save_ew = g:netrw_use_errorwindow
  166.   endif
  167.   let g:netrw_use_errorwindow=0
  168.  
  169.   if g:spellfile_URL =~ '^ftp://'
  170.     " for an ftp server use a default login and password to avoid a prompt
  171.     let machine = substitute(g:spellfile_URL, 'ftp://\([^/]*\).*', '\1', '')
  172.     let dir = substitute(g:spellfile_URL, 'ftp://[^/]*/\(.*\)', '\1', '')
  173.     exe 'Nread "' . machine . ' anonymous vim7user ' . dir . '/' . a:fname . '"'
  174.   else
  175.     exe 'Nread ' g:spellfile_URL . '/' . a:fname
  176.   endif
  177.  
  178.   if exists("save_ew")
  179.     let g:netrw_use_errorwindow = save_ew
  180.   else
  181.     unlet g:netrw_use_errorwindow
  182.   endif
  183. endfunc
  184.  
  185. " Get a list of writable spell directories and choices for confirm().
  186. function! spellfile#GetDirChoices()
  187.   let dirlist = []
  188.   let dirchoices = '&Cancel'
  189.   for dir in split(globpath(&rtp, 'spell'), "\n")
  190.     if filewritable(dir) == 2
  191.       call add(dirlist, dir)
  192.       let dirchoices .= "\n&" . len(dirlist)
  193.     endif
  194.   endfor
  195.   return [dirlist, dirchoices]
  196. endfunc
  197.  
  198. function! spellfile#WritableSpellDir()
  199.   if has("unix")
  200.     " For Unix always use the $HOME/.vim directory
  201.     return $HOME . "/.vim/spell"
  202.   endif
  203.   for dir in split(&rtp, ',')
  204.     if filewritable(dir) == 2
  205.       return dir . "/spell"
  206.     endif
  207.   endfor
  208.   return ''
  209. endfunction
  210.