1" netrwPlugin.vim: Handles file transfer and remote directory listing across a network
2"            PLUGIN SECTION
3" Date:		Jan 05, 2007
4" Maintainer:	Charles E Campbell, Jr <[email protected]>
5" GetLatestVimScripts: 1075 1 :AutoInstall: netrw.vim
6" Copyright:    Copyright (C) 1999-2005 Charles E. Campbell, Jr. {{{1
7"               Permission is hereby granted to use and distribute this code,
8"               with or without modifications, provided that this copyright
9"               notice is copied with it. Like anything else that's free,
10"               netrw.vim, netrwPlugin.vim, and netrwSettings.vim are provided
11"               *as is* and comes with no warranty of any kind, either
12"               expressed or implied. By using this plugin, you agree that
13"               in no event will the copyright holder be liable for any damages
14"               resulting from the use of this software.
15"
16"  But be doers of the Word, and not only hearers, deluding your own selves {{{1
17"  (James 1:22 RSV)
18" =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
19
20" ---------------------------------------------------------------------
21" Load Once: {{{1
22if &cp || exists("g:loaded_netrwPlugin")
23 finish
24endif
25let g:loaded_netrwPlugin = 1
26let s:keepcpo            = &cpo
27if v:version < 700
28 echohl WarningMsg | echo "***netrw*** you need vim version 7.0 for this version of netrw" | echohl None
29 finish
30endif
31let s:keepcpo= &cpo
32set cpo&vim
33
34" ---------------------------------------------------------------------
35" Public Interface: {{{1
36
37" Local Browsing: {{{2
38augroup FileExplorer
39 au!
40 au BufEnter * silent! call s:LocalBrowse(expand("<amatch>"))
41 if has("win32") || has("win95") || has("win64") || has("win16")
42  au BufEnter .* silent! call s:LocalBrowse(expand("<amatch>"))
43 endif
44augroup END
45
46" Network Browsing Reading Writing: {{{2
47augroup Network
48 au!
49 if has("win32") || has("win95") || has("win64") || has("win16")
50  au BufReadCmd  file://*		exe "silent doau BufReadPre ".netrw#RFC2396(expand("<amatch>"))|exe 'e '.substitute(netrw#RFC2396(expand("<amatch>")),'file://\(.*\)','\1',"")|exe "silent doau BufReadPost ".netrw#RFC2396(expand("<amatch>"))
51 else
52  au BufReadCmd  file://*		exe "silent doau BufReadPre ".netrw#RFC2396(expand("<amatch>"))|exe 'e '.substitute(netrw#RFC2396(expand("<amatch>")),'file://\(.*\)','\1',"")|exe "silent doau BufReadPost ".netrw#RFC2396(expand("<amatch>"))
53  au BufReadCmd  file://localhost/*	exe "silent doau BufReadPre ".netrw#RFC2396(expand("<amatch>"))|exe 'e '.substitute(netrw#RFC2396(expand("<amatch>")),'file://localhost/\(.*\)','\1',"")|exe "silent doau BufReadPost ".netrw#RFC2396(expand("<amatch>"))
54 endif
55 au BufReadCmd   ftp://*,rcp://*,scp://*,http://*,dav://*,rsync://*,sftp://*	exe "silent doau BufReadPre ".expand("<amatch>")|exe '2Nread "'.expand("<amatch>").'"'|exe "silent doau BufReadPost ".expand("<amatch>")
56 au FileReadCmd  ftp://*,rcp://*,scp://*,http://*,dav://*,rsync://*,sftp://*	exe "silent doau FileReadPre ".expand("<amatch>")|exe 'Nread "'   .expand("<amatch>").'"'|exe "silent doau FileReadPost ".expand("<amatch>")
57 au BufWriteCmd  ftp://*,rcp://*,scp://*,dav://*,rsync://*,sftp://*		exe "silent doau BufWritePre ".expand("<amatch>")|exe 'Nwrite "' .expand("<amatch>").'"'|exe "silent doau BufWritePost ".expand("<amatch>")
58 au FileWriteCmd ftp://*,rcp://*,scp://*,dav://*,rsync://*,sftp://*		exe "silent doau FileWritePre ".expand("<amatch>")|exe "'[,']".'Nwrite "' .expand("<amatch>").'"'|exe "silent doau FileWritePost ".expand("<amatch>")
59 try
60  au SourceCmd    ftp://*,rcp://*,scp://*,http://*,dav://*,rsync://*,sftp://*	exe 'Nsource "'.expand("<amatch>").'"'
61 catch /^Vim\%((\a\+)\)\=:E216/
62  au SourcePre    ftp://*,rcp://*,scp://*,http://*,dav://*,rsync://*,sftp://*	exe 'Nsource "'.expand("<amatch>").'"'
63 endtry
64augroup END
65
66" Commands: :Nread, :Nwrite, :NetUserPass {{{2
67com! -count=1 -nargs=*	Nread		call netrw#NetSavePosn()<bar>call netrw#NetRead(<count>,<f-args>)<bar>call netrw#NetRestorePosn()
68com! -range=% -nargs=*	Nwrite		call netrw#NetSavePosn()<bar><line1>,<line2>call netrw#NetWrite(<f-args>)<bar>call netrw#NetRestorePosn()
69com! -nargs=*		NetUserPass	call NetUserPass(<f-args>)
70com! -nargs=+           Ncopy           call netrw#NetObtain(<f-args>)
71com! -nargs=*	        Nsource		call netrw#NetSavePosn()<bar>call netrw#NetSource(<f-args>)<bar>call netrw#NetRestorePosn()
72
73" Commands: :Explore, :Sexplore, Hexplore, Vexplore {{{2
74com! -nargs=* -bar -bang -count=0 -complete=dir	Explore		call netrw#Explore(<count>,0,0+<bang>0,<q-args>)
75com! -nargs=* -bar -bang -count=0 -complete=dir	Sexplore	call netrw#Explore(<count>,1,0+<bang>0,<q-args>)
76com! -nargs=* -bar -bang -count=0 -complete=dir	Hexplore	call netrw#Explore(<count>,1,2+<bang>0,<q-args>)
77com! -nargs=* -bar -bang -count=0 -complete=dir	Vexplore	call netrw#Explore(<count>,1,4+<bang>0,<q-args>)
78com! -nargs=* -bar       -count=0 -complete=dir	Texplore	call netrw#Explore(<count>,0,6        ,<q-args>)
79com! -nargs=* -bar -bang			Nexplore	call netrw#Explore(-1,0,0,<q-args>)
80com! -nargs=* -bar -bang			Pexplore	call netrw#Explore(-2,0,0,<q-args>)
81
82" Commands: NetrwSettings {{{2
83com! -nargs=0 NetrwSettings :call netrwSettings#NetrwSettings()
84
85" Maps:
86if !exists("g:netrw_nogx") && maparg('g','n') == ""
87 if !hasmapto('<Plug>NetrwBrowseX')
88  nmap <unique> gx <Plug>NetrwBrowseX
89 endif
90 nno <silent> <Plug>NetrwBrowseX :call netrw#NetBrowseX(expand("<cWORD>"),0)<cr>
91endif
92
93" ---------------------------------------------------------------------
94" LocalBrowse: {{{2
95fun! s:LocalBrowse(dirname)
96  " unfortunate interaction -- debugging calls can't be used here;
97  " the BufEnter event causes triggering when attempts to write to
98  " the DBG buffer are made.
99"  echomsg "dirname<".a:dirname.">"
100  if has("amiga")
101   " The check against '' is made for the Amiga, where the empty
102   " string is the current directory and not checking would break
103   " things such as the help command.
104   if a:dirname != '' && isdirectory(a:dirname)
105    silent! call netrw#LocalBrowseCheck(a:dirname)
106   endif
107  elseif isdirectory(a:dirname)
108"   echomsg "dirname<".dirname."> isdir"
109   silent! call netrw#LocalBrowseCheck(a:dirname)
110  endif
111  " not a directory, ignore it
112endfun
113
114" ---------------------------------------------------------------------
115" NetrwStatusLine: {{{1
116fun! NetrwStatusLine()
117"  let g:stlmsg= "Xbufnr=".w:netrw_explore_bufnr." bufnr=".bufnr("%")." Xline#".w:netrw_explore_line." line#".line(".")
118  if !exists("w:netrw_explore_bufnr") || w:netrw_explore_bufnr != bufnr("%") || !exists("w:netrw_explore_line") || w:netrw_explore_line != line(".") || !exists("w:netrw_explore_list")
119   let &stl= s:netrw_explore_stl
120   if exists("w:netrw_explore_bufnr")|unlet w:netrw_explore_bufnr|endif
121   if exists("w:netrw_explore_line")|unlet w:netrw_explore_line|endif
122   return ""
123  else
124   return "Match ".w:netrw_explore_mtchcnt." of ".w:netrw_explore_listlen
125  endif
126endfun
127
128" ------------------------------------------------------------------------
129" NetUserPass: set username and password for subsequent ftp transfer {{{1
130"   Usage:  :call NetUserPass()			-- will prompt for userid and password
131"	    :call NetUserPass("uid")		-- will prompt for password
132"	    :call NetUserPass("uid","password") -- sets global userid and password
133fun! NetUserPass(...)
134
135 " get/set userid
136 if a:0 == 0
137"  call Dfunc("NetUserPass(a:0<".a:0.">)")
138  if !exists("g:netrw_uid") || g:netrw_uid == ""
139   " via prompt
140   let g:netrw_uid= input('Enter username: ')
141  endif
142 else	" from command line
143"  call Dfunc("NetUserPass(a:1<".a:1.">) {")
144  let g:netrw_uid= a:1
145 endif
146
147 " get password
148 if a:0 <= 1 " via prompt
149"  call Decho("a:0=".a:0." case <=1:")
150  let g:netrw_passwd= inputsecret("Enter Password: ")
151 else " from command line
152"  call Decho("a:0=".a:0." case >1: a:2<".a:2.">")
153  let g:netrw_passwd=a:2
154 endif
155"  call Dret("NetUserPass")
156endfun
157
158" ------------------------------------------------------------------------
159" NetReadFixup: this sort of function is typically written by the user {{{1
160"               to handle extra junk that their system's ftp dumps
161"               into the transfer.  This function is provided as an
162"               example and as a fix for a Windows 95 problem: in my
163"               experience, win95's ftp always dumped four blank lines
164"               at the end of the transfer.
165if has("win95") && exists("g:netrw_win95ftp") && g:netrw_win95ftp
166 fun! NetReadFixup(method, line1, line2)
167"   call Dfunc("NetReadFixup(method<".a:method."> line1=".a:line1." line2=".a:line2.")")
168   if method == 3   " ftp (no <.netrc>)
169    let fourblanklines= line2 - 3
170    silent fourblanklines.",".line2."g/^\s*/d"
171   endif
172"   call Dret("NetReadFixup")
173 endfun
174endif
175
176" ------------------------------------------------------------------------
177" Modelines And Restoration: {{{1
178let &cpo= s:keepcpo
179unlet s:keepcpo
180" vim:ts=8 fdm=marker
181