diff options
author | Bram Moolenaar <Bram@vim.org> | 2004-06-13 20:20:40 +0000 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2004-06-13 20:20:40 +0000 |
commit | 071d4279d6ab81b7187b48f3a0fc61e587b6db6c (patch) | |
tree | 221cbe3c40e043163c06f61c52a7ba2eb41e12ce /runtime/plugin | |
parent | b4210b3bc14e2918f153a7307530fbe6eba659e1 (diff) | |
download | vim-071d4279d6ab81b7187b48f3a0fc61e587b6db6c.zip |
updated for version 7.0001
Diffstat (limited to 'runtime/plugin')
-rw-r--r-- | runtime/plugin/README.txt | 9 | ||||
-rw-r--r-- | runtime/plugin/explorer.vim | 1326 | ||||
-rw-r--r-- | runtime/plugin/gzip.vim | 157 | ||||
-rw-r--r-- | runtime/plugin/netrw.vim | 1160 | ||||
-rw-r--r-- | runtime/plugin/rrhelper.vim | 47 | ||||
-rw-r--r-- | runtime/plugin/tohtml.vim | 27 |
6 files changed, 2726 insertions, 0 deletions
diff --git a/runtime/plugin/README.txt b/runtime/plugin/README.txt new file mode 100644 index 000000000..489ebf613 --- /dev/null +++ b/runtime/plugin/README.txt @@ -0,0 +1,9 @@ +The plugin directory is for standard Vim plugin scripts. + +All files here ending in .vim will be sourced by Vim when it starts up. + +Standard plugins: +explorer.vim file browser +gzip.vim edit compressed files +netrw.vim edit files over a network +rrhelper.vim used for --remote-wait editing diff --git a/runtime/plugin/explorer.vim b/runtime/plugin/explorer.vim new file mode 100644 index 000000000..4a5b6057f --- /dev/null +++ b/runtime/plugin/explorer.vim @@ -0,0 +1,1326 @@ +"============================================================================= +" File: explorer.vim +" Author: M A Aziz Ahmed (aziz@acorn-networks.com - doesn't work) +" Last Change: 2004 May 13 +" Version: 2.5 + changes +" Additions by Mark Waggoner (waggoner@aracnet.com) et al. +"----------------------------------------------------------------------------- +" This file implements a file explorer. +"----------------------------------------------------------------------------- +" Normally, this file will reside in the plugins directory and be +" automatically sourced. If not, you must manually source this file +" using :source explorer.vim +" +" To use it, just edit a directory (vi dirname) or type :Explore to +" launch the file explorer in the current window, or :Sexplore to split +" the current window and launch explorer there. +" +" If the current buffer is modified, the window is always split. +" +" It is also possible to delete files and rename files within explorer. +" See :help file-explorer for more details +" +"----------------------------------------------------------------------------- +" Update history removed, it's not very interesting. +" Contributors were: Doug Potts, Bram Moolenaar, Thomas Köhler +"============================================================================= + +" Has this already been loaded? +if exists("loaded_explorer") + finish +endif +let loaded_explorer=1 + +" Line continuation used here +let s:cpo_save = &cpo +set cpo&vim + +"--- +" Default settings for global configuration variables + +" Split vertically instead of horizontally? +if !exists("g:explVertical") + let g:explVertical=0 +endif + +" How big to make the window? Set to "" to avoid resizing +if !exists("g:explWinSize") + let g:explWinSize=15 +endif + +" When opening a new file/directory, split below current window (or +" above)? 1 = below, 0 = to above +if !exists("g:explSplitBelow") + let g:explSplitBelow = &splitbelow +endif + +" Split to right of current window (or to left)? +" 1 = to right, 0 = to left +if !exists("g:explSplitRight") + let g:explSplitRight = &splitright +endif + +" Start the first explorer window... +" Defaults to be the same as explSplitBelow +if !exists("g:explStartBelow") + let g:explStartBelow = g:explSplitBelow +endif + +" Start the first explorer window... +" Defaults to be the same as explSplitRight +if !exists("g:explStartRight") + let g:explStartRight = g:explSplitRight +endif + +" Show detailed help? +if !exists("g:explDetailedHelp") + let g:explDetailedHelp=0 +endif + +" Show file size and dates? +if !exists("g:explDetailedList") + let g:explDetailedList=0 +endif + +" Format for the date +if !exists("g:explDateFormat") + let g:explDateFormat="%d %b %Y %H:%M" +endif + +" Files to hide +if !exists("g:explHideFiles") + let g:explHideFiles='' +endif + +" Field to sort by +if !exists("g:explSortBy") + let g:explSortBy='name' +endif + +" Segregate directories? 1, 0, or -1 +if !exists("g:explDirsFirst") + let g:explDirsFirst=1 +endif + +" Segregate items in suffixes option? 1, 0, or -1 +if !exists("g:explSuffixesLast") + let g:explSuffixesLast=1 +endif + +" Include separator lines between directories, files, and suffixes? +if !exists("g:explUseSeparators") + let g:explUseSeparators=0 +endif + +" Execute file handler +if !exists("g:explFileHandler") + if has("win32") + " for Win32 use rundll32 + function! s:explFileHandlerWin32(fn) + exec 'silent !start rundll32 url.dll,FileProtocolHandler "' + \ . escape(a:fn, '%#') . '"' + endfunction + let g:explFileHandler = "<SID>explFileHandlerWin32" + + elseif has("unix") + " for KDE use kfmclient, for GNUME use gnome-open + if executable("kfmclient") + let g:explFileHandlerCmd = "kfmclient exec" + elseif executable("gnome-open") + let g:explFileHandlerCmd = "gnome-open" + else + let g:explFileHandlerCmd = "" + endif + if g:explFileHandlerCmd != "" + function! s:explFileHandlerUnix(fn) + if &shellredir =~ "%s" + let redir = substitute(&shellredir, "%s", "/dev/null", "") + else + let redir = &shellredir . "/dev/null" + endif + " Need to escape % and # but not spaces. + exec "silent !" . g:explFileHandlerCmd . " '" . escape(a:fn, '%#') . "'" . redir + endfunction + let g:explFileHandler = "<SID>explFileHandlerUnix" + endif + endif +endif + +"--- +" script variables - these are the same across all +" explorer windows + +" characters that must be escaped for a regular expression +let s:escregexp = '/*^$.~\' + +" characters that must be escaped for filenames +if has("dos16") || has("dos32") || has("win16") || has("win32") || has("os2") + let s:escfilename = ' %#' +else + let s:escfilename = ' \%#[]' +endif + + +" A line to use for separating sections +let s:separator='"---------------------------------------------------' + +"--- +" Create commands + +if !exists(':Explore') + command -n=? -complete=dir Explore :call s:StartExplorer(0, '<a>') +endif +if !exists(':Sexplore') + command -n=? -complete=dir Sexplore :call s:StartExplorer(1, '<a>') +endif + +"--- +" Start the explorer using the preferences from the global variables +" +function! s:StartExplorer(split, start_dir) + let startcmd = "edit" + if a:start_dir != "" + let fname=a:start_dir + else + let fname = expand("%:p:h") + endif + if fname == "" + let fname = getcwd() + endif + + " Create a variable to use if splitting vertically + let splitMode = "" + if g:explVertical == 1 + let splitMode = "vertical" + endif + + " Save the user's settings for splitbelow and splitright + let savesplitbelow = &splitbelow + let savesplitright = &splitright + + if a:split || &modified + let startcmd = splitMode . " " . g:explWinSize . "new " . fname + let &splitbelow = g:explStartBelow + let &splitright = g:explStartRight + else + let startcmd = "edit " . fname + endif + silent execute startcmd + let &splitbelow = savesplitbelow + let &splitright = savesplitright +endfunction + +"--- +" This is the main entry for 'editing' a directory +" +function! s:EditDir() + " Get out of here right away if this isn't a directory! + let name = expand("%") + if name == "" + let name = expand("%:p") + endif + if !isdirectory(name) + return + endif + + " Turn off the swapfile, set the buffer type so that it won't get + " written, and so that it will get deleted when it gets hidden. + setlocal noreadonly modifiable + setlocal noswapfile + setlocal buftype=nowrite + setlocal bufhidden=delete + " Don't wrap around long lines + setlocal nowrap + + " No need for any insertmode abbreviations, since we don't allow + " insertions anyway! + iabc <buffer> + + " Long or short listing? Use the global variable the first time + " explorer is called, after that use the script variable as set by + " the interactive user. + if exists("s:longlist") + let w:longlist = s:longlist + else + let w:longlist = g:explDetailedList + endif + + " Show keyboard shortcuts? + if exists("s:longhelp") + let w:longhelp = s:longhelp + else + let w:longhelp = g:explDetailedHelp + endif + + " Set the sort based on the global variables the first time. If you + " later change the sort order, it will be retained in the s:sortby + " variable for the next time you open explorer + let w:sortdirection=1 + let w:sortdirlabel = "" + let w:sorttype = "" + if exists("s:sortby") + let sortby=s:sortby + else + let sortby=g:explSortBy + endif + if sortby =~ "reverse" + let w:sortdirection=-1 + let w:sortdirlabel = "reverse " + endif + if sortby =~ "date" + let w:sorttype = "date" + elseif sortby =~ "size" + let w:sorttype = "size" + else + let w:sorttype = "name" + endif + call s:SetSuffixesLast() + + " If directory is already loaded, don't open it again! + if line('$') > 1 + setlocal readonly nomodifiable + return + endif + + " Get the complete path to the directory to look at with a slash at + " the end. This also removes "/../" and "/./" things. + let b:completePath = s:Path(expand("%:p")) + + " Add a slash at the end + if b:completePath !~ '/$' + let b:completePath = b:completePath . '/' + endif + + " escape special characters for exec commands + let b:completePathEsc = escape(b:completePath, s:escfilename) + let b:parentDirEsc = substitute(b:completePathEsc, '/[^/]*/$', '/', 'g') + + " Set up syntax highlighting + " Something wrong with the evaluation of the conditional though... + if has("syntax") && exists("g:syntax_on") && !has("syntax_items") + syn match browseSynopsis "^\"[ -].*" + syn match browseDirectory "[^\"].*/ " + syn match browseDirectory "[^\"].*/$" + syn match browseCurDir "^\"= .*$" + syn match browseSortBy "^\" Sorted by .*$" contains=browseSuffixInfo + syn match browseSuffixInfo "(.*)$" contained + syn match browseFilter "^\" Not Showing:.*$" + syn match browseFiletime "««\d\+$" + exec('syn match browseSuffixes "' . b:suffixesHighlight . '"') + + "hi def link browseSynopsis PreProc + hi def link browseSynopsis Special + hi def link browseDirectory Directory + hi def link browseCurDir Statement + hi def link browseSortBy String + hi def link browseSuffixInfo Type + hi def link browseFilter String + hi def link browseFiletime Ignore + hi def link browseSuffixes Type + endif + + " Set filter for hiding files + let b:filterFormula=substitute(g:explHideFiles, '\([^\\]\),', '\1\\|', 'g') + if b:filterFormula != '' + let b:filtering="\nNot showing: " . b:filterFormula + else + let b:filtering="" + endif + + " Show the files + call s:ShowDirectory() + + " Set up mappings for this buffer + let cpo_save = &cpo + set cpo&vim + nnoremap <buffer> <cr> :call <SID>EditEntry("","edit")<cr> + nnoremap <buffer> - :exec ("silent e " . b:parentDirEsc)<cr> + if exists("g:explFileHandler") + nnoremap <buffer> x :call <SID>ExecuteEntry()<cr> + endif + nnoremap <buffer> o :call <SID>OpenEntry()<cr> + nnoremap <buffer> O :call <SID>OpenEntryPrevWindow()<cr> + nnoremap <buffer> p :call <SID>EditEntry("","pedit")<cr> + nnoremap <buffer> ? :call <SID>ToggleHelp()<cr> + nnoremap <buffer> a :call <SID>ShowAllFiles()<cr> + nnoremap <buffer> R :call <SID>RenameFile()<cr> + nnoremap <buffer> D :. call <SID>DeleteFile()<cr> + vnoremap <buffer> D :call <SID>DeleteFile()<cr> + nnoremap <buffer> i :call <SID>ToggleLongList()<cr> + nnoremap <buffer> s :call <SID>SortSelect()<cr> + nnoremap <buffer> r :call <SID>SortReverse()<cr> + nnoremap <buffer> c :exec "cd ".b:completePathEsc<cr> + nnoremap <buffer> <2-leftmouse> :call <SID>DoubleClick()<cr> + if exists("*ExplorerCustomMap") + call ExplorerCustomMap() + endif + let &cpo = cpo_save + + " prevent the buffer from being modified + setlocal readonly nomodifiable +endfunction + +"--- +" Determine the number of windows open to this buffer number. +" Care of Yegappan Lakshman. Thanks! +fun! s:BufInWindows(bnum) + let cnt = 0 + let winnum = 1 + while 1 + let bufnum = winbufnr(winnum) + if bufnum < 0 + break + endif + if bufnum == a:bnum + let cnt = cnt + 1 + endif + let winnum = winnum + 1 + endwhile + + return cnt +endfunction + +" If this is the only window, open file in a new window +" Otherwise, open file in the most recently visited window +" +function! s:OpenEntryPrevWindow() + " Figure out if there are any other windows + let n = winnr() + wincmd p + " No other window? Then open a new one + if n == winnr() + call s:OpenEntry() + " Other windows exist + else + " Check if the previous buffer is modified - ask if they want to save! + " Was it modified, and is it the only window open to this file + if &modified && s:BufInWindows(winbufnr(winnr())) < 2 + let bufname = bufname(winbufnr(winnr())) + + let action=confirm("Save Changes in " . bufname . "?","&Yes\n&No\n&Cancel") + " Yes - try to save - if there is an error, cancel + if action == 1 + let v:errmsg = "" + silent w + if v:errmsg != "" + echoerr "Unable to write buffer!" + wincmd p + return + endif + " No, abandon changes + elseif action == 2 + set nomodified + echomsg "Warning, abandoning changes in " . bufname + " Cancel (or any other result), don't do the open + else + wincmd p + return + endif + endif + wincmd p + call s:EditEntry("wincmd p","edit") + endif +endfunction + + +"--- +" Open a file or directory in a new window. +" Use g:explSplitBelow and g:explSplitRight to decide where to put the +" split window, and resize the original explorer window if it is +" larger than g:explWinSize +" +function! s:OpenEntry() + " Are we on a line with a file name? + let l = getline(".") + if l =~ '^"' + return + endif + + " Copy window settings to script settings + let s:sortby=w:sortdirlabel . w:sorttype + let s:longhelp = w:longhelp + let s:longlist = w:longlist + + " Get the window number of the explorer window + let n = winnr() + + " Save the user's settings for splitbelow and splitright + let savesplitbelow=&splitbelow + let savesplitright=&splitright + + " Figure out how to do the split based on the user's preferences. + " We want to split to the (left,right,top,bottom) of the explorer + " window, but we want to extract the screen real-estate from the + " window next to the explorer if possible. + " + " 'there' will be set to a command to move from the split window + " back to the explorer window + " + " 'back' will be set to a command to move from the explorer window + " back to the newly split window + " + " 'right' and 'below' will be set to the settings needed for + " splitbelow and splitright IF the explorer is the only window. + " + if g:explVertical + if g:explSplitRight + let there="wincmd h" + let back ="wincmd l" + let right=1 + let below=0 + else + let there="wincmd l" + let back ="wincmd h" + let right=0 + let below=0 + endif + else + if g:explSplitBelow + let there="wincmd k" + let back ="wincmd j" + let right=0 + let below=1 + else + let there="wincmd j" + let back ="wincmd k" + let right=0 + let below=0 + endif + endif + + " Get the file name + let fn=s:GetFullFileName() + + " Attempt to go to adjacent window + exec(back) + " If no adjacent window, set splitright and splitbelow appropriately + if n == winnr() + let &splitright=right + let &splitbelow=below + else + " found adjacent window - invert split direction + let &splitright=!right + let &splitbelow=!below + endif + + " Create a variable to use if splitting vertically + let splitMode = "" + if g:explVertical == 1 + let splitMode = "vertical" + endif + + " Is it a directory? If so, get a real path to it instead of + " relative path. This also removes "/../" and "/./" things. + if isdirectory(fn) + let fn = fnamemodify(fn, ":p") + endif + + " Open the new window + exec("silent " . splitMode." sp " . escape(fn,s:escfilename)) + + " resize the explorer window if it is larger than the requested size + exec(there) + if g:explWinSize =~ '[0-9]\+' && winheight("") > g:explWinSize + exec("silent ".splitMode." resize ".g:explWinSize) + endif + exec(back) + + " Restore splitmode settings + let &splitbelow=savesplitbelow + let &splitright=savesplitright + +endfunction + +function! s:ExecuteEntry() + " Are we on a line with a file name? + let l = getline(".") + if l =~ '^"' + return + endif + + " Get the file name + let fn = s:GetFullFileName() + if has("win32") && fn =~ '^//' + let fn = substitute(fn, '/', '\\', 'g') + endif + exec "call " . g:explFileHandler . "(fn)" +endfunction + +"--- +" Double click with the mouse +" +function s:DoubleClick() + if expand("<cfile>") =~ '[\\/]$' + call s:EditEntry("","edit") " directory: open in this window + else + call s:OpenEntryPrevWindow() " file: open in another window + endif +endfun + +"--- +" Open file or directory in the same window as the explorer is +" currently in +" +function! s:EditEntry(movefirst,editcmd) + " Are we on a line with a file name? + let l = getline(".") + if l =~ '^"' + return + endif + + " Copy window settings to script settings + let s:sortby=w:sortdirlabel . w:sorttype + let s:longhelp = w:longhelp + let s:longlist = w:longlist + + " Get the file name + let fn = s:GetFullFileName() + if isdirectory(fn) + " This removes "/../" and "/./" things. + let fn = fnamemodify(fn, ":p") + endif + + " Move to desired window if needed + exec(a:movefirst) + " Edit the file/dir + exec(a:editcmd . " " . escape(fn,s:escfilename)) +endfunction + + +"--- +" Create a regular expression out of the suffixes option for sorting +" and set a string to indicate whether we are sorting with the +" suffixes at the end (or the beginning) +" +function! s:SetSuffixesLast() + let b:suffixesRegexp = '\(' . substitute(escape(&suffixes,s:escregexp),',','\\|','g') . '\)$' + let b:suffixesHighlight = '^[^"].*\(' . substitute(escape(&suffixes,s:escregexp),',','\\|','g') . '\)\( \|$\)' + if has("fname_case") + let b:suffixesRegexp = '\C' . b:suffixesRegexp + let b:suffixesHighlight = '\C' . b:suffixesHighlight + else + let b:suffixesRegexp = '\c' . b:suffixesRegexp + let b:suffixesHighlight = '\c' . b:suffixesHighlight + endif + if g:explSuffixesLast > 0 && &suffixes != "" + let b:suffixeslast=" (" . &suffixes . " at end of list)" + elseif g:explSuffixesLast < 0 && &suffixes != "" + let b:suffixeslast=" (" . &suffixes . " at start of list)" + else + let b:suffixeslast=" ('suffixes' mixed with files)" + endif +endfunction + +"--- +" Show the header and contents of the directory +" +function! s:ShowDirectory() + "Delete all lines + 1,$d _ + " Prevent a report of our actions from showing up + let oldRep=&report + let save_sc = &sc + set report=10000 nosc + + " Add the header + call s:AddHeader() + $d _ + + " Display the files + + " Get a list of all the files + let files = s:Path(glob(b:completePathEsc . "*")) + if files != "" && files !~ "\n$" + let files = files . "\n" + endif + + " Add the dot files now, making sure "." is not included! + let files = files . substitute(s:Path(glob(b:completePathEsc . ".*")), "[^\n]*/./\\=\n", '' , '') + if files != "" && files !~ "\n$" + let files = files . "\n" + endif + + " Are there any files left after filtering? + if files != "" + normal! mt + put =files + let b:maxFileLen = 0 + 0 + /^"=/+1,$g/^/call s:MarkDirs() + normal! `t + call s:AddFileInfo() + endif + + normal! zz + + " Move to first directory in the listing + 0 + /^"=/+1 + + " Do the sort + call s:SortListing("Loaded contents of ".b:completePath.". ") + + " Move to first directory in the listing + 0 + /^"=/+1 + + let &report=oldRep + let &sc = save_sc + +endfunction + +"--- +" Mark which items are directories - called once for each file name +" must be used only when size/date is not displayed +" +function! s:MarkDirs() + let oldRep=&report + set report=1000 + "Remove slashes if added + s;/$;;e + "Removes all the leading slashes and adds slashes at the end of directories + s;^.*\\\([^\\]*\)$;\1;e + s;^.*/\([^/]*\)$;\1;e + "normal! ^ + let currLine=getline(".") + if isdirectory(b:completePath . currLine) + s;$;/; + let fileLen=strlen(currLine)+1 + else + let fileLen=strlen(currLine) + if (b:filterFormula!="") && (currLine =~ b:filterFormula) + " Don't show the file if it is to be filtered. + d _ + endif + endif + if fileLen > b:maxFileLen + let b:maxFileLen=fileLen + endif + let &report=oldRep +endfunction + +"--- +" Make sure a path has proper form +" +function! s:Path(p) + if has("dos16") || has("dos32") || has("win16") || has("win32") || has("os2") + return substitute(a:p,'\\','/','g') + else + return a:p + endif +endfunction + +"--- +" Extract the file name from a line in several different forms +" +function! s:GetFullFileNameEsc() + return s:EscapeFilename(s:GetFullFileName()) +endfunction + +function! s:GetFileNameEsc() + return s:EscapeFilename(s:GetFileName()) +endfunction + +function! s:EscapeFilename(name) + return escape(a:name,s:escfilename) +endfunction + + +function! s:GetFullFileName() + return s:ExtractFullFileName(getline(".")) +endfunction + +function! s:GetFileName() + return s:ExtractFileName(getline(".")) +endfunction + +function! s:ExtractFullFileName(line) + let fn=s:ExtractFileName(a:line) + if fn == '/' + return b:completePath + else + return b:completePath . s:ExtractFileName(a:line) + endif +endfunction + +function! s:ExtractFileName(line) + return substitute(strpart(a:line,0,b:maxFileLen),'\s\+$','','') +endfunction + +"--- +" Get the size of the file +function! s:ExtractFileSize(line) + if (w:longlist==0) + return getfsize(s:ExtractFileName(a:line)) + else + return strpart(a:line,b:maxFileLen+2,b:maxFileSizeLen) + endif +endfunction + +"--- +" Get the date of the file as a number +function! s:ExtractFileDate(line) + if w:longlist==0 + return getftime(s:ExtractFileName(a:line)) + else + return strpart(matchstr(strpart(a:line,b:maxFileLen+b:maxFileSizeLen+4),"««.*"),2) + 0 + endif +endfunction + + +"--- +" Add the header with help information +" +function! s:AddHeader() + let save_f=@f + 1 + if w:longhelp==1 + let @f="\" <enter> : open file or directory\n" + \."\" o : open new window for file/directory\n" + \."\" O : open file in previously visited window\n" + \."\" p : preview the file\n" + if exists("g:explFileHandler") + let @f=@f."\" x : execute file or directory\n" + endif + let @f=@f + \."\" i : toggle size/date listing\n" + \."\" s : select sort field r : reverse sort\n" + \."\" - : go up one level c : cd to this dir\n" + \."\" R : rename file D : delete file\n" + \."\" :help file-explorer for detailed help\n" + else + let @f="\" Press ? for keyboard shortcuts\n" + endif + let @f=@f."\" Sorted by ".w:sortdirlabel.w:sorttype.b:suffixeslast.b:filtering."\n" + let @f=@f."\"= ".b:completePath."\n" + put! f + let @f=save_f +endfunction + + +"--- +" Show the size and date for each file +" +function! s:AddFileInfo() + let save_sc = &sc + set nosc + + " Mark our starting point + normal! mt + + call s:RemoveSeparators() + + " Remove all info + 0 + /^"=/+1,$g/^/call setline(line("."),s:GetFileName()) + + " Add info if requested + if w:longlist==1 + " Add file size and calculate maximum length of file size field + let b:maxFileSizeLen = 0 + 0 + /^"=/+1,$g/^/let fn=s:GetFullFileName() | + \let fileSize=getfsize(fn) | + \let fileSizeLen=strlen(fileSize) | + \if fileSizeLen > b:maxFileSizeLen | + \ let b:maxFileSizeLen = fileSizeLen | + \endif | + \exec "normal! ".(b:maxFileLen-strlen(getline("."))+2)."A \<esc>" | + \exec 's/$/'.fileSize.'/' + + " Right justify the file sizes and + " add file modification date + 0 + /^"=/+1,$g/^/let fn=s:GetFullFileName() | + \exec "normal! A \<esc>$b".(b:maxFileLen+b:maxFileSizeLen-strlen(getline("."))+3)."i \<esc>\"_x" | + \exec 's/$/ '.escape(s:FileModDate(fn), '/').'/' + setlocal nomodified + endif + + call s:AddSeparators() + + " return to start + normal! `t + + let &sc = save_sc +endfunction + + +"---- +" Get the modification time for a file +" +function! s:FileModDate(name) + let filetime=getftime(a:name) + if filetime > 0 + return strftime(g:explDateFormat,filetime) . " ««" . filetime + else + return "" + endif +endfunction + +"--- +" Delete a file or files +" +function! s:DeleteFile() range + let oldRep = &report + let &report = 1000 + + let filesDeleted = 0 + let stopDel = 0 + let delAll = 0 + let currLine = a:firstline + let lastLine = a:lastline + setlocal noreadonly modifiable + + while ((currLine <= lastLine) && (stopDel==0)) + exec(currLine) + let fileName=s:GetFullFileName() + if isdirectory(fileName) + echo fileName." : Directory deletion not supported yet" + let currLine = currLine + 1 + else + if delAll == 0 + let sure=input("Delete ".fileName." (y/n/a/q)? ") + if sure=="a" + let delAll = 1 + endif + endif + if (sure=="y") || (sure=="a") + let success=delete(fileName) + if success!=0 + exec (" ") + echo "\nCannot delete ".fileName + let currLine = currLine + 1 + else + d _ + let filesDeleted = filesDeleted + 1 + let lastLine = lastLine - 1 + endif + elseif sure=="q" + let stopDel = 1 + elseif sure=="n" + let currLine = currLine + 1 + endif + endif + endwhile + echo "\n".filesDeleted." files deleted" + let &report = oldRep + setlocal nomodified + setlocal readonly nomodifiable +endfunction + +"--- +" Rename a file +" +function! s:RenameFile() + let fileName=s:GetFullFileName() + setlocal noreadonly modifiable + if isdirectory(fileName) + echo "Directory renaming not supported yet" + elseif filereadable(fileName) + let altName=input("Rename ".fileName." to : ") + echo " " + if altName=="" + setlocal readonly nomodifiable + return + endif + let success=rename(fileName, b:completePath.altName) + if success!=0 + echo "Cannot rename ".fileName. " to ".altName + else + echo "Renamed ".fileName." to ".altName + let oldRep=&report + set report=1000 + e! + let &report=oldRep + endif + endif + setlocal nomodified + setlocal readonly nomodifiable +endfunction + +"--- +" Toggle between short and long help +" +function! s:ToggleHelp() + if exists("w:longhelp") && w:longhelp==0 + let w:longhelp=1 + let s:longhelp=1 + else + let w:longhelp=0 + let s:longhelp=0 + endif + " Allow modification + setlocal noreadonly modifiable + call s:UpdateHeader() + " Disallow modification + setlocal readonly nomodifiable +endfunction + +"--- +" Update the header +" +function! s:UpdateHeader() + let oldRep=&report + set report=10000 + " Save position + normal! mt + " Remove old header + 0 + 1,/^"=/ d _ + " Add new header + call s:AddHeader() + " Go back where we came from if possible + 0 + if line("'t") != 0 + normal! `t + endif + + let &report=oldRep + setlocal nomodified +endfunction + +"--- +" Toggle long vs. short listing +" +function! s:ToggleLongList() + setlocal noreadonly modifiable + if exists("w:longlist") && w:longlist==1 + let w:longlist=0 + let s:longlist=0 + else + let w:longlist=1 + let s:longlist=1 + endif + call s:AddFileInfo() + setlocal readonly nomodifiable +endfunction + +"--- +" Show all files - remove filtering +" +function! s:ShowAllFiles() + setlocal noreadonly modifiable + let b:filterFormula="" + let b:filtering="" + call s:ShowDirectory() + setlocal readonly nomodifiable +endfunction + +"--- +" Figure out what section we are in +" +function! s:GetSection() + let fn=s:GetFileName() + let section="file" + if fn =~ '/$' + let section="directory" + elseif fn =~ b:suffixesRegexp + let section="suffixes" + endif + return section +endfunction + +"--- +" Remove section separators +" +function! s:RemoveSeparators() + if !g:explUseSeparators + return + endif + 0 + silent! exec '/^"=/+1,$g/^' . s:separator . "/d _" +endfunction + +"--- +" Add section separators +" between directories and files if they are separated +" between files and 'suffixes' files if they are separated +function! s:AddSeparators() + if !g:explUseSeparators + return + endif + 0 + /^"=/+1 + let lastsec=s:GetSection() + +1 + .,$g/^/let sec=s:GetSection() | + \if g:explDirsFirst != 0 && sec != lastsec && + \ (lastsec == "directory" || sec == "directory") | + \ exec "normal! I" . s:separator . "\n\<esc>" | + \elseif g:explSuffixesLast != 0 && sec != lastsec && + \ (lastsec == "suffixes" || sec == "suffixes") | + \ exec "normal! I" . s:separator . "\n\<esc>" | + \endif | + \let lastsec=sec +endfunction + +"--- +" General string comparison function +" +function! s:StrCmp(line1, line2, direction) + if a:line1 < a:line2 + return -a:direction + elseif a:line1 > a:line2 + return a:direction + else + return 0 + endif +endfunction + +"--- +" Function for use with Sort(), to compare the file names +" Default sort is to put in alphabetical order, but with all directory +" names before all file names +" +function! s:FileNameCmp(line1, line2, direction) + let f1=s:ExtractFileName(a:line1) + let f2=s:ExtractFileName(a:line2) + + " Put directory names before file names + if (g:explDirsFirst != 0) && (f1 =~ '\/$') && (f2 !~ '\/$') + return -g:explDirsFirst + elseif (g:explDirsFirst != 0) && (f1 !~ '\/$') && (f2 =~ '\/$') + return g:explDirsFirst + elseif (g:explSuffixesLast != 0) && (f1 =~ b:suffixesRegexp) && (f2 !~ b:suffixesRegexp) + return g:explSuffixesLast + elseif (g:explSuffixesLast != 0) && (f1 !~ b:suffixesRegexp) && (f2 =~ b:suffixesRegexp) + return -g:explSuffixesLast + else + return s:StrCmp(substitute(f1, "/$", "", ""), substitute(f2, "/$", "", ""), a:direction) + endif + +endfunction + +"--- +" Function for use with Sort(), to compare the file modification dates +" Default sort is to put NEWEST files first. Reverse will put oldest +" files first +" +function! s:FileDateCmp(line1, line2, direction) + let f1=s:ExtractFileName(a:line1) + let f2=s:ExtractFileName(a:line2) + let t1=s:ExtractFileDate(a:line1) + let t2=s:ExtractFileDate(a:line2) + + " Put directory names before file names + if (g:explDirsFirst != 0) && (f1 =~ '\/$') && (f2 !~ '\/$') + return -g:explDirsFirst + elseif (g:explDirsFirst != 0) && (f1 !~ '\/$') && (f2 =~ '\/$') + return g:explDirsFirst + elseif (g:explSuffixesLast != 0) && (f1 =~ b:suffixesRegexp) && (f2 !~ b:suffixesRegexp) + return g:explSuffixesLast + elseif (g:explSuffixesLast != 0) && (f1 !~ b:suffixesRegexp) && (f2 =~ b:suffixesRegexp) + return -g:explSuffixesLast + elseif t1 > t2 + return -a:direction + elseif t1 < t2 + return a:direction + else + return s:StrCmp(substitute(f1, "/$", "", ""), substitute(f2, "/$", "", ""), 1) + endif +endfunction + +"--- +" Function for use with Sort(), to compare the file sizes +" Default sort is to put largest files first. Reverse will put +" smallest files first +" +function! s:FileSizeCmp(line1, line2, direction) + let f1=s:ExtractFileName(a:line1) + let f2=s:ExtractFileName(a:line2) + let s1=s:ExtractFileSize(a:line1) + let s2=s:ExtractFileSize(a:line2) + + if (g:explDirsFirst != 0) && (f1 =~ '\/$') && (f2 !~ '\/$') + return -g:explDirsFirst + elseif (g:explDirsFirst != 0) && (f1 !~ '\/$') && (f2 =~ '\/$') + return g:explDirsFirst + elseif (g:explSuffixesLast != 0) && (f1 =~ b:suffixesRegexp) && (f2 !~ b:suffixesRegexp) + return g:explSuffixesLast + elseif (g:explSuffixesLast != 0) && (f1 !~ b:suffixesRegexp) && (f2 =~ b:suffixesRegexp) + return -g:explSuffixesLast + elseif s1 > s2 + return -a:direction + elseif s1 < s2 + return a:direction + else + return s:StrCmp(substitute(f1, "/$", "", ""), substitute(f2, "/$", "", ""), 1) + endif +endfunction + +"--- +" Sort lines. SortR() is called recursively. +" +function! s:SortR(start, end, cmp, direction) + + " Bottom of the recursion if start reaches end + if a:start >= a:end + return + endif + " + let partition = a:start - 1 + let middle = partition + let partStr = getline((a:start + a:end) / 2) + let i = a:start + while (i <= a:end) + let str = getline(i) + exec "let result = " . a:cmp . "(str, partStr, " . a:direction . ")" + if result <= 0 + " Need to put it before the partition. Swap lines i and partition. + let partition = partition + 1 + if result == 0 + let middle = partition + endif + if i != partition + let str2 = getline(partition) + call setline(i, str2) + call setline(partition, str) + endif + endif + let i = i + 1 + endwhile + + " Now we have a pointer to the "middle" element, as far as partitioning + " goes, which could be anywhere before the partition. Make sure it is at + " the end of the partition. + if middle != partition + let str = getline(middle) + let str2 = getline(partition) + call setline(middle, str2) + call setline(partition, str) + endif + call s:SortR(a:start, partition - 1, a:cmp,a:direction) + call s:SortR(partition + 1, a:end, a:cmp,a:direction) +endfunction + +"--- +" To Sort a range of lines, pass the range to Sort() along with the name of a +" function that will compare two lines. +" +function! s:Sort(cmp,direction) range + call s:SortR(a:firstline, a:lastline, a:cmp, a:direction) +endfunction + +"--- +" Reverse the current sort order +" +function! s:SortReverse() + if exists("w:sortdirection") && w:sortdirection == -1 + let w:sortdirection = 1 + let w:sortdirlabel = "" + else + let w:sortdirection = -1 + let w:sortdirlabel = "reverse " + endif + let s:sortby=w:sortdirlabel . w:sorttype + call s:SortListing("") +endfunction + +"--- +" Toggle through the different sort orders +" +function! s:SortSelect() + " Select the next sort option + if !exists("w:sorttype") + let w:sorttype="name" + elseif w:sorttype == "name" + let w:sorttype="size" + elseif w:sorttype == "size" + let w:sorttype="date" + else + let w:sorttype="name" + endif + let s:sortby=w:sortdirlabel . w:sorttype + call s:SortListing("") +endfunction + +"--- +" Sort the file listing +" +function! s:SortListing(msg) + " Save the line we start on so we can go back there when done + " sorting + let startline = getline(".") + let col=col(".") + let lin=line(".") + + " Allow modification + setlocal noreadonly modifiable + + " Send a message about what we're doing + " Don't really need this - it can cause hit return prompts +" echo a:msg . "Sorting by" . w:sortdirlabel . w:sorttype + + " Create a regular expression out of the suffixes option in case + " we need it. + call s:SetSuffixesLast() + + " Remove section separators + call s:RemoveSeparators() + + " Do the sort + 0 + if w:sorttype == "size" + /^"=/+1,$call s:Sort("s:FileSizeCmp",w:sortdirection) + elseif w:sorttype == "date" + /^"=/+1,$call s:Sort("s:FileDateCmp",w:sortdirection) + else + /^"=/+1,$call s:Sort("s:FileNameCmp",w:sortdirection) + endif + + " Replace the header with updated information + call s:UpdateHeader() + + " Restore section separators + call s:AddSeparators() + + " Return to the position we started on + 0 + if search('\m^'.escape(startline,s:escregexp),'W') <= 0 + execute lin + endif + execute "normal!" col . "|" + + " Disallow modification + setlocal nomodified + setlocal readonly nomodifiable + +endfunction + +"--- +" Setup for editing directories after starting up by going to each window. +" Required for "vim -o filename dirname" +" +function! s:EditAll() + if winbufnr(2) == -1 + return + endif + let cmd = winrestcmd() + let curwin = winnr() + while 1 + wincmd w + if winnr() == curwin + break + endif + call s:EditDir() + endwhile + exe cmd +endfunction + +"--- +" Set up the autocommand to allow directories to be edited +" +augroup fileExplorer + au! + " Fill the window when entering the buffer; ":edit dir". + au BufEnter * call s:EditDir() + " Set the window variables after a split; ":split". + au WinEnter * if !exists("w:sortdirection") | call s:EditDir() | endif + " Fill the windows after Vim has started up. + au VimEnter * call s:EditAll() +augroup end + +" restore 'cpo' +let &cpo = s:cpo_save +unlet s:cpo_save diff --git a/runtime/plugin/gzip.vim b/runtime/plugin/gzip.vim new file mode 100644 index 000000000..39b0cbc36 --- /dev/null +++ b/runtime/plugin/gzip.vim @@ -0,0 +1,157 @@ +" Vim plugin for editing compressed files. +" Maintainer: Bram Moolenaar <Bram@vim.org> +" Last Change: 2004 Jan 12 + +" Exit quickly when: +" - this plugin was already loaded +" - when 'compatible' is set +" - some autocommands are already taking care of compressed files +if exists("loaded_gzip") || &cp || exists("#BufReadPre#*.gz") + finish +endif +let loaded_gzip = 1 + +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 + 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") +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 + +" 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 + " 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) + " 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 = expand("<afile>") + let nmt = s:tempname(nm) + if rename(nm, nmt) == 0 + call system(a:cmd . " " . nmt) + 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) + " Rename to a weird name to avoid the risk of overwriting another file + let nm = expand("<afile>") + 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 : diff --git a/runtime/plugin/netrw.vim b/runtime/plugin/netrw.vim new file mode 100644 index 000000000..d3058c55d --- /dev/null +++ b/runtime/plugin/netrw.vim @@ -0,0 +1,1160 @@ +" netrw.vim: (global plugin) Handles file transfer across a network +" Last Change: Jun 04, 2004 +" Maintainer: Charles E. Campbell, Jr. PhD <drchipNOSPAM at campbellfamily.biz> +" Version: 44 +" License: Vim License (see vim's :help license) +" +" But be doers of the word, and not only hearers, deluding your own selves +" (James 1:22 RSV) +" =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- + +" Exit quickly when already loaded or when 'compatible' is set. +if exists("loaded_netrw") || &cp + finish +endif +let loaded_netrw = "v44" +let s:save_cpo = &cpo +set cpo&vim + +" --------------------------------------------------------------------- +" Default values for global netrw variables {{{1 +if !exists("g:netrw_ftpmode") + let g:netrw_ftpmode= "binary" +endif +if !exists("g:netrw_win95ftp") + let g:netrw_win95ftp= 1 +endif +if !exists("g:netrw_cygwin") + if has("win32") + let g:netrw_cygwin= 1 + else + let g:netrw_cygwin= 0 + endif +endif + +" --------------------------------------------------------------------- +" Default values for global protocol variables {{{1 +if !exists("g:netrw_rcp_cmd") + let g:netrw_rcp_cmd = "rcp" +endif +if !exists("g:netrw_ftp_cmd") + let g:netrw_ftp_cmd = "ftp" +endif +if !exists("g:netrw_scp_cmd") + let g:netrw_scp_cmd = "scp -q" +endif +if !exists("g:netrw_sftp_cmd") + let g:netrw_sftp_cmd = "sftp" +endif +if !exists("g:netrw_http_cmd") + if executable("wget") + let g:netrw_http_cmd = "wget -q -O" + elseif executable("fetch") + let g:netrw_http_cmd = "fetch -o" + else + let g:netrw_http_cmd = "" + endif +endif +if !exists("g:netrw_dav_cmd") + let g:netrw_dav_cmd = "cadaver" +endif +if !exists("g:netrw_rsync_cmd") + let g:netrw_rsync_cmd = "rsync" +endif +if !exists("g:netrw_fetch_cmd") + if executable("fetch") + let g:netrw_fetch_cmd = "fetch -o" + else + let g:netrw_fetch_cmd = "" + endif +endif + +if has("win32") + \ && exists("g:netrw_use_nt_rcp") + \ && g:netrw_use_nt_rcp + \ && executable( $SystemRoot .'/system32/rcp.exe') + let s:netrw_has_nt_rcp = 1 + let s:netrw_rcpmode = '-b' + else + let s:netrw_has_nt_rcp = 0 + let s:netrw_rcpmode = '' +endif + +" --------------------------------------------------------------------- +" Transparency Support: {{{1 +" Auto-detection for ftp://*, rcp://*, scp://*, sftp://*, http://*, dav://*, +" and rsync://* +" Should make file transfers across networks transparent. Currently I haven't +" supported appends. Hey, gotta leave something for a future <netrw.vim>! +if version >= 600 + augroup Network + au! + if has("win32") + au BufReadCmd file://* exe "doau BufReadPre ".expand("<afile>")|exe 'e '.substitute(expand("<afile>"),"file:/*","","")|exe "doau BufReadPost ".expand("<afile>") + else + au BufReadCmd file:///* exe "doau BufReadPre ".expand("<afile>")|exe 'e /'.substitute(expand("<afile>"),"file:/*","","")|exe "doau BufReadPost ".expand("<afile>") + au BufReadCmd file://localhost/* exe "doau BufReadPre ".expand("<afile>")|exe 'e /'.substitute(expand("<afile>"),"file:/*","","")|exe "doau BufReadPost ".expand("<afile>") + endif + au BufReadCmd ftp://*,rcp://*,scp://*,http://*,dav://*,rsync://*,sftp://* exe "doau BufReadPre ".expand("<afile>")|exe "Nread 0r ".expand("<afile>")|exe "doau BufReadPost ".expand("<afile>") + au FileReadCmd ftp://*,rcp://*,scp://*,http://*,dav://*,rsync://*,sftp://* exe "doau BufReadPre ".expand("<afile>")|exe "Nread " .expand("<afile>")|exe "doau BufReadPost ".expand("<afile>") + au BufWriteCmd ftp://*,rcp://*,scp://*,dav://*,rsync://*,sftp://* exe "Nwrite " .expand("<afile>")|call <SID>NetRestorePosn() + augroup END +endif + +" ------------------------------------------------------------------------ +" Commands: :Nread, :Nwrite, and :NetUserPass {{{1 +com! -nargs=* Nread call <SID>NetSavePosn()<bar>call <SID>NetRead(<f-args>)<bar>call <SID>NetRestorePosn() +com! -range=% -nargs=* Nwrite call <SID>NetSavePosn()<bar><line1>,<line2>call <SID>NetWrite(<f-args>)<bar>call <SID>NetRestorePosn() +com! -nargs=* NetUserPass call NetUserPass(<f-args>) + +" ------------------------------------------------------------------------ +" NetSavePosn: saves position of cursor on screen {{{1 +fun! s:NetSavePosn() +" call Dfunc("NetSavePosn()") + " Save current line and column + let s:netrw_winnr= winnr() + let s:netrw_line = line(".") + let s:netrw_col = virtcol(".") + + " Save top-of-screen line + norm! H0 + let s:netrw_hline= line(".") + + call s:NetRestorePosn() +" call Dret("NetSavePosn : winnr=".s:netrw_winnr." line=".s:netrw_line." col=".s:netrw_col." hline=".s:netrw_hline) +endfun + +" ------------------------------------------------------------------------ +" NetRestorePosn: restores the cursor and file position as saved by NetSavePosn() {{{1 +fun! <SID>NetRestorePosn() +" call Dfunc("NetRestorePosn() winnr=".s:netrw_winnr." line=".s:netrw_line." col=".s:netrw_col." hline=".s:netrw_hline) + + exe "silent! ".s:netrw_winnr."wincmd w" + if v:shell_error == 0 + " as suggested by Bram M: redraw on no error + " allows protocol error messages to remain visible + redraw! + endif + " restore top-of-screen line + exe "norm! ".s:netrw_hline."G0z\<CR>" + " restore position + exe "norm! ".s:netrw_line."G0".s:netrw_col."\<bar>" + +" call Dret("NetRestorePosn") +endfun + +" ------------------------------------------------------------------------ +" NetRead: responsible for reading a file over the net {{{1 +fun! s:NetRead(...) +" call Dfunc("NetRead(a:1<".a:1.">)") + + " save options + call s:NetOptionSave() + + " get name of a temporary file + let tmpfile= tempname() + + " Special Exception: if a file is named "0r", then + " "0r" will be used to read the + " following files instead of "r" + if a:0 == 0 + let readcmd= "r" + let ichoice= 0 + elseif a:1 == "0r" + let readcmd = "0r" + let ichoice = 2 + else + let readcmd = "r" + let ichoice = 1 + endif + + while ichoice <= a:0 + + " attempt to repeat with previous host-file-etc + if exists("b:netrw_lastfile") && a:0 == 0 +" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">") + let choice = b:netrw_lastfile + let ichoice= ichoice + 1 + + else + exe "let choice= a:" . ichoice +" call Decho("NetRead1: choice<" . choice . ">") + + " Reconstruct Choice if choice starts with '"' + if match(choice,"?") == 0 + echo 'NetRead Usage:' + echo ':Nread machine:path uses rcp' + echo ':Nread "machine path" uses ftp with <.netrc>' + echo ':Nread "machine id password path" uses ftp' + echo ':Nread dav://machine[:port]/path uses cadaver' + echo ':Nread fetch://machine/path uses fetch' + echo ':Nread ftp://[user@]machine[:port]/path uses ftp autodetects <.netrc>' + echo ':Nread http://[user@]machine/path uses http wget' + echo ':Nread rcp://[user@]machine/path uses rcp' + echo ':Nread rsync://machine[:port]/path uses rsync' + echo ':Nread scp://[user@]machine[[:#]port]/path uses scp' + echo ':Nread sftp://[user@]machine[[:#]port]/path uses sftp' + break + elseif match(choice,"^\"") != -1 +" call Decho("reconstructing choice") + if match(choice,"\"$") != -1 + " case "..." + let choice=strpart(choice,1,strlen(choice)-2) + else + " case "... ... ..." + let choice = strpart(choice,1,strlen(choice)-1) + let wholechoice = "" + + while match(choice,"\"$") == -1 + let wholechoice = wholechoice . " " . choice + let ichoice = ichoice + 1 + if ichoice > a:0 + echoerr "Unbalanced string in filename '". wholechoice ."'" +" call Dret("NetRead") + return + endif + let choice= a:{ichoice} + endwhile + let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1) + endif + endif + endif +" call Decho("NetRead2: choice<" . choice . ">") + let ichoice= ichoice + 1 + + " fix up windows urls + if has("win32") + let choice = substitute(choice,'\\','/','ge') +" call Decho("fixing up windows url to <".choice.">") + exe 'lcd ' . fnamemodify(tmpfile,':h') + let tmpfile = fnamemodify(tmpfile,':t') + endif + + " Determine method of read (ftp, rcp, etc) + call s:NetMethod(choice) + + " ============ + " Perform Read + " ============ + + "......................................... + " rcp: Method #1 + if b:netrw_method == 1 " read with rcp +" call Decho("read via rcp (method #1)") + " ER: noting done with g:netrw_uid yet? + " ER: on Win2K" rcp machine[.user]:file tmpfile + " ER: if machine contains '.' adding .user is required (use $USERNAME) + " ER: the tmpfile is full path: rcp sees C:\... as host C + if s:netrw_has_nt_rcp == 1 + if exists("g:netrw_uid") && ( g:netrw_uid != "" ) + let uid_machine = g:netrw_machine .'.'. g:netrw_uid + else + " Any way needed it machine contains a '.' + let uid_machine = g:netrw_machine .'.'. $USERNAME + endif + else + if exists("g:netrw_uid") && ( g:netrw_uid != "" ) + let uid_machine = g:netrw_uid .'@'. g:netrw_machine + else + let uid_machine = g:netrw_machine + endif + endif +" call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".uid_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile) + exe "!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".uid_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile + let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method) + let b:netrw_lastfile = choice + + "......................................... + " ftp + <.netrc>: Method #2 + elseif b:netrw_method == 2 " read with ftp + <.netrc> +" call Decho("read via ftp+.netrc (method #2)") + let netrw_fname= b:netrw_fname + new + set ff=unix + exe "put ='".g:netrw_ftpmode."'" + exe "put ='get ".netrw_fname." ".tmpfile."'" + if exists("g:netrw_port") && g:netrw_port != "" +" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port) + exe "%!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port + else +" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine) + exe "%!".g:netrw_ftp_cmd." -i ".g:netrw_machine + endif + " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar) + if getline(1) !~ "^$" + echoerr getline(1) + endif + bd! + let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method) + let b:netrw_lastfile = choice + + "......................................... + " ftp + machine,id,passwd,filename: Method #3 + elseif b:netrw_method == 3 " read with ftp + machine, id, passwd, and fname + " Construct execution string (four lines) which will be passed through filter +" call Decho("read via ftp+mipf (method #3)") + let netrw_fname= b:netrw_fname + new + set ff=unix + if exists("g:netrw_port") && g:netrw_port != "" + put ='open '.g:netrw_machine.' '.g:netrw_port + else + put ='open '.g:netrw_machine + endif + + if exists("g:netrw_ftp") && g:netrw_ftp == 1 + put =g:netrw_uid + put =g:netrw_passwd + else + put ='user '.g:netrw_uid.' '.g:netrw_passwd + endif + + if exists("g:netrw_ftpmode") && g:netrw_ftpmode != "" + put =g:netrw_ftpmode + endif + put ='get '.netrw_fname.' '.tmpfile + + " perform ftp: + " -i : turns off interactive prompting from ftp + " -n unix : DON'T use <.netrc>, even though it exists + " -n win32: quit being obnoxious about password +" call Decho('performing ftp -i -n') + norm 1Gdd +" call Decho("executing: %!".g:netrw_ftp_cmd." -i -n") + exe "%!".g:netrw_ftp_cmd." -i -n" + " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar) + if getline(1) !~ "^$" + echoerr getline(1) + endif + bd! + let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method) + let b:netrw_lastfile = choice + + "......................................... + " scp: Method #4 + elseif b:netrw_method == 4 " read with scp +" call Decho("read via scp (method #4)") + if exists("g:netrw_port") && g:netrw_port != "" + let useport= " -P ".g:netrw_port + else + let useport= "" + endif + if g:netrw_cygwin == 1 + let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e') +" call Decho("executing: !".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile) + exe "!".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile + else +" call Decho("executing: !".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile) + exe "!".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile + endif + let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method) + let b:netrw_lastfile = choice + + "......................................... + elseif b:netrw_method == 5 " read with http (wget) +" call Decho("read via http (method #5)") + if g:netrw_http_cmd == "" + echoerr "neither wget nor fetch command is available" + exit + endif + + if match(b:netrw_fname,"#") == -1 + " simple wget +" call Decho("executing: !".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.escape(b:netrw_fname,' ?&')) + exe "!".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.escape(b:netrw_fname,' ?&') + let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method) + + else + " wget plus a jump to an in-page marker (ie. http://abc/def.html#aMarker) + let netrw_html= substitute(b:netrw_fname,"#.*$","","") + let netrw_tag = substitute(b:netrw_fname,"^.*#","","") +" call Decho("netrw_html<".netrw_html.">") +" call Decho("netrw_tag <".netrw_tag.">") +" call Decho("executing: !".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.netrw_html) + exe "!".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.netrw_html + let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method) +" call Decho('<\s*a\s*name=\s*"'.netrw_tag.'"/') + exe 'norm! 1G/<\s*a\s*name=\s*"'.netrw_tag.'"/'."\<CR>" + endif + let b:netrw_lastfile = choice + + "......................................... + " cadaver: Method #6 + elseif b:netrw_method == 6 " read with cadaver +" call Decho("read via cadaver (method #6)") + + " Construct execution string (four lines) which will be passed through filter + let netrw_fname= b:netrw_fname + new + set ff=unix + if exists("g:netrw_port") && g:netrw_port != "" + put ='open '.g:netrw_machine.' '.g:netrw_port + else + put ='open '.g:netrw_machine + endif + put ='user '.g:netrw_uid.' '.g:netrw_passwd + + if g:netrw_cygwin == 1 + let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e') + put ='get '.netrw_fname.' '.cygtmpfile + else + put ='get '.netrw_fname.' '.tmpfile + endif + + " perform cadaver operation: + norm 1Gdd +" call Decho("executing: %!".g:netrw_dav_cmd) + exe "%!".g:netrw_dav_cmd + bd! + let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method) + let b:netrw_lastfile = choice + + "......................................... + " rsync: Method #7 + elseif b:netrw_method == 7 " read with rsync +" call Decho("read via rsync (method #7)") + if g:netrw_cygwin == 1 + let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e') +" call Decho("executing: !".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile) + exe "!".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile + else +" call Decho("executing: !".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile) + exe "!".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile + endif + let result = s:NetGetFile(readcmd,tmpfile, b:netrw_method) + let b:netrw_lastfile = choice + + "......................................... + " fetch: Method #8 + " fetch://[user@]host[:http]/path + elseif b:netrw_method == 8 " read with fetch + if g:netrw_fetch_cmd == "" + echoerr "fetch command not available" + exit + endif + if exists("g:netrw_option") && g:netrw_option == ":http" + let netrw_option= "http" + else + let netrw_option= "ftp" + endif +" call Decho("read via fetch for ".netrw_option) + + if exists("g:netrw_uid") && g:netrw_uid != "" && exists("g:netrw_passwd") && g:netrw_passwd != "" +" call Decho("executing: !".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_uid.':'.g:netrw_passwd.'@'.g:netrw_machine."/".escape(b:netrw_fname,' ?&')) + exe "!".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_uid.':'.g:netrw_passwd.'@'.g:netrw_machine."/".escape(b:netrw_fname,' ?&') + else +" call Decho("executing: !".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_machine."/".escape(b:netrw_fname,' ?&')) + exe "!".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_machine."/".escape(b:netrw_fname,' ?&') + endif + + let result = s:NetGetFile(readcmd,tmpfile, b:netrw_method) + let b:netrw_lastfile = choice + + "......................................... + " sftp: Method #9 + elseif b:netrw_method == 9 " read with sftp +" call Decho("read via sftp (method #4)") + if g:netrw_cygwin == 1 + let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e') +" call Decho("!".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile) +" call Decho("executing: !".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile) + exe "!".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile + else +" call Decho("executing: !".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile) + exe "!".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile + endif + let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method) + let b:netrw_lastfile = choice + + "......................................... + else " Complain + echo "***warning*** unable to comply with your request<" . choice . ">" + endif + endwhile + + " cleanup +" call Decho("cleanup") + if exists("b:netrw_method") + unlet b:netrw_method + unlet g:netrw_machine + unlet b:netrw_fname + endif + call s:NetOptionRestore() + +" call Dret("NetRead") +endfun +" end of NetRead + +" ------------------------------------------------------------------------ +" NetGetFile: Function to read file "fname" with command "readcmd". {{{1 +fun! s:NetGetFile(readcmd, fname, method) +" call Dfunc("NetGetFile(readcmd<".a:readcmd.">,fname<".a:fname."> method<".a:method.">)") + + if exists("*NetReadFixup") + " for the use of NetReadFixup (not otherwise used internally) + let line2= line("$") + endif + + " transform paths from / to \ for Windows, unless the shell is bash + if &term == "win32" + if &shell == "bash" + let fname=a:fname +" call Decho("(win32 && bash) fname<".fname.">") + else + let fname=substitute(a:fname,'/','\\\\','ge') +" call Decho("(win32 && !bash) fname<".fname.">") + endif + else + let fname= a:fname +" call Decho("(copied) fname<".fname.">") + endif + + " get the file, but disable undo when reading a new buffer + if a:readcmd[0] == '0' + let use_e_cmd = 0 " 1 when using ':edit' + let delline = 0 " 1 when have to delete empty last line + if line("$") == 1 && getline(1) == "" + " Now being asked to 0r a file into an empty file. + " Safe to :e it instead, unless there is another window on the same buffer. + let curbufnr = bufnr("%") + let use_e_cmd = 1 + let delline = 1 + " Loop over all windows, + " reset use_e_cmd when another one is editing the current buffer. + let i = 1 + while 1 + if i != winnr() && winbufnr(i) == curbufnr + let use_e_cmd = 0 + break + endif + let i = i + 1 + if winbufnr(i) < 0 + break + endif + endwhile + endif + + if use_e_cmd > 0 + " ':edit' the temp file, wipe out the old buffer and rename the buffer + let curfilename = expand("%") + + let binlocal = &l:bin + let binglobal = &g:bin + if binlocal + setglobal bin " Need to set 'bin' globally for ":e" command. + endif + silent exe "e! ".v:cmdarg." ".fname + if binlocal && !binglobal + setglobal nobin + setlocal bin + endif + + exe curbufnr . "bwipe!" + exe "f ".curfilename + " the ":f newname" apparently leaves the temporary file as the alternate + " file in the buffer list (see :ls!). The following command wipes it out. + exe bufnr("#")."bwipe!" + else + let oldul= &ul + set ul=-1 + exe a:readcmd." ".v:cmdarg." ".fname + if delline > 0 + " wipe out last line, which should be a blank line anyway + $del + endif + let &ul= oldul + endif + else + exe a:readcmd." ".v:cmdarg." ".fname + endif + + " User-provided (ie. optional) fix-it-up command + if exists("*NetReadFixup") + let line1= line(".") + if a:readcmd == "r" + let line2= line("$") - line2 + line1 + else + let line2= line("$") - line2 + endif +" call Decho("calling NetReadFixup(method<".a:method."> line1=".line1." line2=".line2.")") + call NetReadFixup(a:method, line1, line2) + endif +" call Decho("readcmd<".a:readcmd."> cmdarg<".v:cmdarg."> fname<".a:fname."> readable=".filereadable(a:fname)) + +" insure that we have the right filetype and that its being displayed + filetype detect + redraw! +" call Dret("NetGetFile") +endfun + +" ------------------------------------------------------------------------ +" NetWrite: responsible for writing a file over the net {{{1 +fun! s:NetWrite(...) range +" call Dfunc("NetWrite(a:0=".a:0.")") + + " option handling + let mod= 0 + call s:NetOptionSave() + + " Get Temporary Filename + let tmpfile= tempname() + + if a:0 == 0 + let ichoice = 0 + else + let ichoice = 1 + endif + + " write (selected portion of) file to temporary + silent exe a:firstline."," . a:lastline . "w! ".v:cmdarg." ".tmpfile + + while ichoice <= a:0 + + " attempt to repeat with previous host-file-etc + if exists("b:netrw_lastfile") && a:0 == 0 +" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">") + let choice = b:netrw_lastfile + let ichoice= ichoice + 1 + else + exe "let choice= a:" . ichoice + + " Reconstruct Choice if choice starts with '"' + if match(choice,"?") == 0 + echo 'NetWrite Usage:"' + echo ':Nwrite machine:path uses rcp' + echo ':Nwrite "machine path" uses ftp with <.netrc>' + echo ':Nwrite "machine id password path" uses ftp' + echo ':Nwrite dav://[user@]machine/path uses cadaver' + echo ':Nwrite fetch://[user@]machine/path uses fetch' + echo ':Nwrite ftp://machine[#port]/path uses ftp (autodetects <.netrc>)' + echo ':Nwrite rcp://machine/path uses rcp' + echo ':Nwrite rsync://[user@]machine/path uses rsync' + echo ':Nwrite scp://[user@]machine[[:#]port]/path uses scp' + echo ':Nwrite sftp://[user@]machine/path uses sftp' + break + + elseif match(choice,"^\"") != -1 + if match(choice,"\"$") != -1 + " case "..." + let choice=strpart(choice,1,strlen(choice)-2) + else + " case "... ... ..." + let choice = strpart(choice,1,strlen(choice)-1) + let wholechoice = "" + + while match(choice,"\"$") == -1 + let wholechoice= wholechoice . " " . choice + let ichoice = ichoice + 1 + if choice > a:0 + echoerr "Unbalanced string in filename '". wholechoice ."'" +" call Dret("NetWrite") + return + endif + let choice= a:{ichoice} + endwhile + let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1) + endif + endif + endif +" call Decho("choice<" . choice . ">") + let ichoice= ichoice + 1 + + " fix up windows urls + if has("win32") + let choice= substitute(choice,'\\','/','ge') + "ER: see NetRead() + exe 'lcd ' . fnamemodify(tmpfile,':h') + let tmpfile = fnamemodify(tmpfile,':t') + endif + + " Determine method of read (ftp, rcp, etc) + call s:NetMethod(choice) + + " ============= + " Perform Write + " ============= + + "......................................... + " rcp: Method #1 + if b:netrw_method == 1 " write with rcp +" Decho "write via rcp (method #1)" + if s:netrw_has_nt_rcp == 1 + if exists("g:netrw_uid") && ( g:netrw_uid != "" ) + let uid_machine = g:netrw_machine .'.'. g:netrw_uid + else + let uid_machine = g:netrw_machine .'.'. $USERNAME + endif + else + if exists("g:netrw_uid") && ( g:netrw_uid != "" ) + let uid_machine = g:netrw_uid .'@'. g:netrw_machine + else + let uid_machine = g:netrw_machine + endif + endif +" call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".tmpfile." ".uid_machine.":".escape(b:netrw_fname,' ?&')) + exe "!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".tmpfile." ".uid_machine.":".escape(b:netrw_fname,' ?&') + let b:netrw_lastfile = choice + + "......................................... + " ftp + <.netrc>: Method #2 + elseif b:netrw_method == 2 " write with ftp + <.netrc> + let netrw_fname = b:netrw_fname + new + set ff=unix + exe "put ='".g:netrw_ftpmode."'" +" call Decho(" NetWrite: put ='".g:netrw_ftpmode."'") + exe "put ='put ".tmpfile." ".netrw_fname."'" +" call Decho("put ='put ".tmpfile." ".netrw_fname."'") + if exists("g:netrw_port") && g:netrw_port != "" +" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port) + exe "%!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port + else +" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine) + exe "%!".g:netrw_ftp_cmd." -i ".g:netrw_machine + endif + " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar) + if getline(1) !~ "^$" + echoerr getline(1) + let mod=1 + endif + bd! + let b:netrw_lastfile = choice + + "......................................... + " ftp + machine, id, passwd, filename: Method #3 + elseif b:netrw_method == 3 " write with ftp + machine, id, passwd, and fname + let netrw_fname= b:netrw_fname + new + set ff=unix + if exists("g:netrw_port") && g:netrw_port != "" + put ='open '.g:netrw_machine.' '.g:netrw_port + else + put ='open '.g:netrw_machine + endif + if exists("g:netrw_ftp") && g:netrw_ftp == 1 + put =g:netrw_uid + put =g:netrw_passwd + else + put ='user '.g:netrw_uid.' '.g:netrw_passwd + endif + put ='put '.tmpfile.' '.netrw_fname + " save choice/id/password for future use + let b:netrw_lastfile = choice + + " perform ftp: + " -i : turns off interactive prompting from ftp + " -n unix : DON'T use <.netrc>, even though it exists + " -n win32: quit being obnoxious about password +" call Decho('performing ftp -i -n') + norm 1Gdd +" call Decho("executing: %!".g:netrw_ftp_cmd." -i -n") + exe "%!".g:netrw_ftp_cmd." -i -n" + " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar) + if getline(1) !~ "^$" + echoerr getline(1) + let mod=1 + endif + bd! + + "......................................... + " scp: Method #4 + elseif b:netrw_method == 4 " write with scp + if exists("g:netrw_port") && g:netrw_port != "" + let useport= " -P ".g:netrw_port + else + let useport= "" + endif + if g:netrw_cygwin == 1 + let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e') +" call Decho("executing: !".g:netrw_scp_cmd.useport." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')) + exe "!".g:netrw_scp_cmd.useport." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&') + else +" call Decho("executing: !".g:netrw_scp_cmd.useport." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')) + exe "!".g:netrw_scp_cmd.useport." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&') + endif + let b:netrw_lastfile = choice + + "......................................... + " http: Method #5 + elseif b:netrw_method == 5 + echoerr "***warning*** currently <netrw.vim> does not support writing using http:" + + "......................................... + " dav: Method #6 + elseif b:netrw_method == 6 " write with cadaver +" call Decho("write via cadaver (method #6)") + + " Construct execution string (four lines) which will be passed through filter + let netrw_fname= b:netrw_fname + new + set ff=unix + if exists("g:netrw_port") && g:netrw_port != "" + put ='open '.g:netrw_machine.' '.g:netrw_port + else + put ='open '.g:netrw_machine + endif + put ='user '.g:netrw_uid.' '.g:netrw_passwd + + if g:netrw_cygwin == 1 + let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e') + put ='put '.cygtmpfile.' '.netrw_fname + else + put ='put '.tmpfile.' '.netrw_fname + endif + + " perform cadaver operation: + norm 1Gdd +" call Decho("executing: %!".g:netrw_dav_cmd) + exe "%!".g:netrw_dav_cmd + bd! + let b:netrw_lastfile = choice + + "......................................... + " rsync: Method #7 + elseif b:netrw_method == 7 " write with rsync + if g:netrw_cygwin == 1 + let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e') +" call Decho("executing: !".g:netrw_rsync_cmd." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')) + exe "!".g:netrw_rsync_cmd." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&') + else +" call Decho("executing: !".g:netrw_rsync_cmd." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')) + exe "!".g:netrw_rsync_cmd." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&') + endif + let b:netrw_lastfile = choice + + "......................................... + " scp: Method #9 + elseif b:netrw_method == 9 " write with sftp + let netrw_fname= b:netrw_fname + if exists("g:netrw_uid") && ( g:netrw_uid != "" ) + let uid_machine = g:netrw_uid .'@'. g:netrw_machine + else + let uid_machine = g:netrw_machine + endif + new + set ff=unix + put ='put '.tmpfile.' '.netrw_fname + norm 1Gdd +" call Decho("executing: %!".g:netrw_sftp_cmd.' '.uid_machine) + exe "%!".g:netrw_sftp_cmd.' '.uid_machine + bd! + let b:netrw_lastfile= choice + + "......................................... + else " Complain + echo "***warning*** unable to comply with your request<" . choice . ">" + endif + endwhile + + " cleanup +" call Decho("cleanup") + let result=delete(tmpfile) + call s:NetOptionRestore() + + if a:firstline == 1 && a:lastline == line("$") + let &mod= mod " usually equivalent to set nomod + endif + +" call Dret("NetWrite") +endfun +" end of NetWrite + +" ------------------------------------------------------------------------ +" NetMethod: determine method of transfer {{{1 +" method == 1: rcp +" 2: ftp + <.netrc> +" 3: ftp + machine, id, password, and [path]filename +" 4: scp +" 5: http (wget) +" 6: cadaver +" 7: rsync +" 8: fetch +" 9: sftp +fun! s:NetMethod(choice) " globals: method machine id passwd fname +" call Dfunc("NetMethod(a:choice<".a:choice.">)") + + " initialization + let b:netrw_method = 0 + let g:netrw_machine = "" + let b:netrw_fname = "" + let g:netrw_port = "" + + " Patterns: + " mipf : a:machine a:id password filename Use ftp + " mf : a:machine filename Use ftp + <.netrc> or g:netrw_uid g:netrw_passwd + " ftpurm : ftp://[user@]host[[#:]port]/filename Use ftp + <.netrc> or g:netrw_uid g:netrw_passwd + " rcpurm : rcp://[user@]host/filename Use rcp + " rcphf : [user@]host:filename Use rcp + " scpurm : scp://[user@]host[[#:]port]/filename Use scp + " httpurm : http://[user@]host/filename Use wget + " davurm : dav://host[:port]/path Use cadaver + " rsyncurm : rsync://host[:port]/path Use rsync + " fetchurm : fetch://[user@]host[:http]/filename Use fetch (defaults to ftp, override for http) + " sftpurm : sftp://[user@]host/filename Use scp + let mipf = '\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)' + let mf = '\(\S\+\)\s\+\(\S\+\)' + let ftpurm = 'ftp://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\([#:]\d\+\)\=/\(.*\)$' + let rcpurm = 'rcp://\(\([^/@]\{-}\)@\)\=\([^/]\{-}\)/\(.*\)$' + let rcphf = '\(\([^@]\{-}\)@\)\=\(\I\i*\):\(\S\+\)' + let scpurm = 'scp://\([^/]\{-}\)\([#:]\d\+\)\=/\(.*\)$' + let httpurm = 'http://\([^/]\{-}\)\(/.*\)\=$' + let davurm = 'dav://\([^/]\{-}\)/\(.*\)\=$' + let rsyncurm = 'rsync://\([^/]\{-}\)/\(.*\)\=$' + let fetchurm = 'fetch://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\(:http\)\=/\(.*\)$' + let sftpurm = 'sftp://\([^/]\{-}\)/\(.*\)\=$' + +" call Decho("determine method:") + " Determine Method + " rcp://user@hostname/...path-to-file + if match(a:choice,rcpurm) == 0 +" call Decho("rcp://...") + let b:netrw_method = 1 + let userid = substitute(a:choice,rcpurm,'\2',"") + let g:netrw_machine= substitute(a:choice,rcpurm,'\3',"") + let b:netrw_fname = substitute(a:choice,rcpurm,'\4',"") + if userid != "" + let g:netrw_uid= userid + endif + + " scp://user@hostname/...path-to-file + elseif match(a:choice,scpurm) == 0 +" call Decho("scp://...") + let b:netrw_method = 4 + let g:netrw_machine= substitute(a:choice,scpurm,'\1',"") + let b:netrw_port = substitute(a:choice,scpurm,'\2',"") + let b:netrw_fname = substitute(a:choice,scpurm,'\3',"") + + " http://user@hostname/...path-to-file + elseif match(a:choice,httpurm) == 0 +" call Decho("http://...") + let b:netrw_method = 5 + let g:netrw_machine= substitute(a:choice,httpurm,'\1',"") + let b:netrw_fname = substitute(a:choice,httpurm,'\2',"") + + " dav://hostname[:port]/..path-to-file.. + elseif match(a:choice,davurm) == 0 +" call Decho("dav://...") + let b:netrw_method= 6 + let g:netrw_machine= substitute(a:choice,davurm,'\1',"") + let b:netrw_fname = substitute(a:choice,davurm,'\2',"") + + " rsync://user@hostname/...path-to-file + elseif match(a:choice,rsyncurm) == 0 +" call Decho("rsync://...") + let b:netrw_method = 7 + let g:netrw_machine= substitute(a:choice,rsyncurm,'\1',"") + let b:netrw_fname = substitute(a:choice,rsyncurm,'\2',"") + + " ftp://[user@]hostname[[:#]port]/...path-to-file + elseif match(a:choice,ftpurm) == 0 +" call Decho("ftp://...") + let userid = substitute(a:choice,ftpurm,'\2',"") + let g:netrw_machine= substitute(a:choice,ftpurm,'\3',"") + let g:netrw_port = substitute(a:choice,ftpurm,'\4',"") + let b:netrw_fname = substitute(a:choice,ftpurm,'\5',"") + if g:netrw_port != "" + let g:netrw_port = substitute(g:netrw_port,"[#:]","","") + endif + if userid != "" + let g:netrw_uid= userid + endif + if exists("g:netrw_uid") && exists("g:netrw_passwd") + let b:netrw_method = 3 + else + if filereadable(expand("$HOME/.netrc")) && !exists("g:netrw_ignorenetrc") + let b:netrw_method= 2 + else + if !exists("g:netrw_uid") || g:netrw_uid == "" + call NetUserPass() + elseif !exists("g:netrw_passwd") || g:netrw_passwd == "" + call NetUserPass(g:netrw_uid) + " else just use current g:netrw_uid and g:netrw_passwd + endif + let b:netrw_method= 3 + endif + endif + + elseif match(a:choice,fetchurm) == 0 +" call Decho("fetch://...") + let b:netrw_method = 8 + let g:netrw_userid = substitute(a:choice,fetchurm,'\2',"") + let g:netrw_machine= substitute(a:choice,fetchurm,'\3',"") + let b:netrw_option = substitute(a:choice,fetchurm,'\4',"") + let b:netrw_fname = substitute(a:choice,fetchurm,'\5',"") + + " Issue an ftp : "machine id password [path/]filename" + elseif match(a:choice,mipf) == 0 +" call Decho("(ftp) host id pass file") + let b:netrw_method = 3 + let g:netrw_machine = substitute(a:choice,mipf,'\1',"") + let g:netrw_uid = substitute(a:choice,mipf,'\2',"") + let g:netrw_passwd = substitute(a:choice,mipf,'\3',"") + let b:netrw_fname = substitute(a:choice,mipf,'\4',"") + + " Issue an ftp: "hostname [path/]filename" + elseif match(a:choice,mf) == 0 +" call Decho("(ftp) host file") + if exists("g:netrw_uid") && exists("g:netrw_passwd") + let b:netrw_method = 3 + let g:netrw_machine = substitute(a:choice,mf,'\1',"") + let b:netrw_fname = substitute(a:choice,mf,'\2',"") + + elseif filereadable(expand("$HOME/.netrc")) + let b:netrw_method = 2 + let g:netrw_machine = substitute(a:choice,mf,'\1',"") + let b:netrw_fname = substitute(a:choice,mf,'\2',"") + endif + + " sftp://user@hostname/...path-to-file + elseif match(a:choice,sftpurm) == 0 +" call Decho("sftp://...") + let b:netrw_method = 9 + let g:netrw_machine= substitute(a:choice,sftpurm,'\1',"") + let b:netrw_fname = substitute(a:choice,sftpurm,'\2',"") + + " Issue an rcp: hostname:filename" (this one should be last) + elseif match(a:choice,rcphf) == 0 +" call Decho("(rcp) host:file)") + let b:netrw_method = 1 + let userid = substitute(a:choice,rcphf,'\2',"") + let g:netrw_machine= substitute(a:choice,rcphf,'\3',"") + let b:netrw_fname = substitute(a:choice,rcphf,'\4',"") + if userid != "" + let g:netrw_uid= userid + endif + if has("win32") + " don't let PCs try <.netrc> + let b:netrw_method = 3 + endif + + else + echoerr "***error*** cannot determine method" + let b:netrw_method = -1 + endif + +" call Decho("a:choice <".a:choice.">") +" call Decho("b:netrw_method <".b:netrw_method.">") +" call Decho("g:netrw_machine<".g:netrw_machine.">") +" call Decho("g:netrw_port <".g:netrw_port.">") +" if exists("g:netrw_uid") "Decho +" call Decho("g:netrw_uid <".g:netrw_uid.">") +" endif "Decho +" if exists("g:netrw_passwd") "Decho +" call Decho("g:netrw_passwd <".g:netrw_passwd.">") +" endif "Decho +" call Decho("b:netrw_fname <".b:netrw_fname.">") +" call Dret("NetMethod") +endfun +" end of NetMethod + +" ------------------------------------------------------------------------ +" NetUserPass: set username and password for subsequent ftp transfer {{{1 +" Usage: :call NetUserPass() -- will prompt for userid and password +" :call NetUserPass("uid") -- will prompt for password +" :call NetUserPass("uid","password") -- sets global userid and password +fun! NetUserPass(...) + + " get/set userid + if a:0 == 0 +" call Dfunc("NetUserPass(a:0<".a:0.">)") + if !exists("g:netrw_uid") || g:netrw_uid == "" + " via prompt + let g:netrw_uid= input('Enter username: ') + endif + else " from command line +" call Dfunc("NetUserPass(a:1<".a:1.">) {") + let g:netrw_uid= a:1 + endif + + " get password + if a:0 <= 1 " via prompt +" call Decho("a:0=".a:0." case <=1:") + let g:netrw_passwd= inputsecret("Enter Password: ") + else " from command line +" call Decho("a:0=".a:0." case >1: a:2<".a:2.">") + let g:netrw_passwd=a:2 + endif +" call Dret("NetUserPass") +endfun +" end NetUserPass + +" ------------------------------------------------------------------------ +" NetOptionSave: save options and set to "standard" form {{{1 +fun!s:NetOptionSave() +" call Dfunc("NetOptionSave()") + + " Get Temporary Filename + let s:aikeep = &ai + let s:cinkeep = &cin + let s:cinokeep = &cino + let s:comkeep = &com + let s:cpokeep = &cpo + let s:dirkeep = getcwd() + let s:gdkeep = &gd + let s:twkeep = &tw + set cino = + set com = + set cpo -=aA + set nocin noai + set tw =0 + if has("win32") && !has("win95") + let s:swfkeep= &swf + set noswf +" call Decho("setting s:swfkeep to <".&swf.">") + endif + +" call Dret("NetOptionSave") +endfun + +" ------------------------------------------------------------------------ +" NetOptionRestore: restore options {{{1 +fun! s:NetOptionRestore() +" call Dfunc("NetOptionRestore()") + + let &ai = s:aikeep + let &cin = s:cinkeep + let &cino = s:cinokeep + let &com = s:comkeep + let &cpo = s:cpokeep + exe "lcd ".s:dirkeep + let &gd = s:gdkeep + let &tw = s:twkeep + if exists("s:swfkeep") + let &swf= s:swfkeep + unlet s:swfkeep + endif + unlet s:aikeep + unlet s:cinkeep + unlet s:cinokeep + unlet s:comkeep + unlet s:cpokeep + unlet s:gdkeep + unlet s:twkeep + unlet s:dirkeep + +" call Dret("NetOptionRestore") +endfun + +" ------------------------------------------------------------------------ +" NetReadFixup: this sort of function is typically written by the user {{{1 +" to handle extra junk that their system's ftp dumps +" into the transfer. This function is provided as an +" example and as a fix for a Windows 95 problem: in my +" experience, win95's ftp always dumped four blank lines +" at the end of the transfer. +if has("win95") && g:netrw_win95ftp + fun! NetReadFixup(method, line1, line2) +" call Dfunc("NetReadFixup(method<".a:method."> line1=".a:line1." line2=".a:line2.")") + if method == 3 " ftp (no <.netrc>) + let fourblanklines= line2 - 3 + silent fourblanklines.",".line2."g/^\s*/d" + endif +" call Dret("NetReadFixup") + endfun +endif + +" ------------------------------------------------------------------------ +" Restore {{{1 +let &cpo= s:save_cpo +unlet s:save_cpo +" vim:ts=8 fdm=marker diff --git a/runtime/plugin/rrhelper.vim b/runtime/plugin/rrhelper.vim new file mode 100644 index 000000000..05090b59c --- /dev/null +++ b/runtime/plugin/rrhelper.vim @@ -0,0 +1,47 @@ +" Vim plugin with helper function(s) for --remote-wait +" Maintainer: Flemming Madsen <fma@cci.dk> +" Last Change: 2004 May 30 + +" Has this already been loaded? +if exists("loaded_rrhelper") + finish +endif +let loaded_rrhelper = 1 + +" Setup answers for a --remote-wait client who will assume +" a SetupRemoteReplies() function in the command server + +if has("clientserver") + function SetupRemoteReplies() + let cnt = 0 + let max = argc() + + let id = expand("<client>") + if id == 0 + return + endif + while cnt < max + " Handle same file from more clients and file being more than once + " on the command line by encoding this stuff in the group name + let uniqueGroup = "RemoteReply_".id."_".cnt + + " Path separators are always forward slashes for the autocommand pattern. + " Escape special characters with a backslash. + let f = escape(substitute(argv(cnt), '\\', '/', "g"), ' *,?[{') + execute "augroup ".uniqueGroup + execute "autocmd ".uniqueGroup." BufUnload ". f ." call DoRemoteReply('".id."', '".cnt."', '".uniqueGroup."', '". f ."')" + let cnt = cnt + 1 + endwhile + augroup END + endfunc + + function DoRemoteReply(id, cnt, group, file) + call server2client(a:id, a:cnt) + execute 'autocmd! '.a:group.' BufUnload '.a:file + execute 'augroup! '.a:group + endfunc + +endif + + +" vim: set sw=2 sts=2 : diff --git a/runtime/plugin/tohtml.vim b/runtime/plugin/tohtml.vim new file mode 100644 index 000000000..9914bed6d --- /dev/null +++ b/runtime/plugin/tohtml.vim @@ -0,0 +1,27 @@ +" Vim plugin for converting a syntax highlighted file to HTML. +" Maintainer: Bram Moolenaar <Bram@vim.org> +" Last Change: 2003 Apr 06 + +" Don't do this when: +" - when 'compatible' is set +" - this plugin was already loaded +" - user commands are not available. +if !&cp && !exists(":TOhtml") && has("user_commands") + command -range=% TOhtml :call Convert2HTML(<line1>, <line2>) + + func Convert2HTML(line1, line2) + if a:line2 >= a:line1 + let g:html_start_line = a:line1 + let g:html_end_line = a:line2 + else + let g:html_start_line = a:line2 + let g:html_end_line = a:line1 + endif + + runtime syntax/2html.vim + + unlet g:html_start_line + unlet g:html_end_line + endfunc + +endif |