1482aaeb0SBram Moolenaar" netrwPlugin.vim: Handles file transfer and remote directory listing across a network
2*dd2a3cdaSBram Moolenaar"            PLUGIN SECTION
3*dd2a3cdaSBram Moolenaar" Date:		Jan 05, 2007
4*dd2a3cdaSBram Moolenaar" Maintainer:	Charles E Campbell, Jr <[email protected]>
5482aaeb0SBram Moolenaar" GetLatestVimScripts: 1075 1 :AutoInstall: netrw.vim
6482aaeb0SBram Moolenaar" Copyright:    Copyright (C) 1999-2005 Charles E. Campbell, Jr. {{{1
7482aaeb0SBram Moolenaar"               Permission is hereby granted to use and distribute this code,
8482aaeb0SBram Moolenaar"               with or without modifications, provided that this copyright
9482aaeb0SBram Moolenaar"               notice is copied with it. Like anything else that's free,
10482aaeb0SBram Moolenaar"               netrw.vim, netrwPlugin.vim, and netrwSettings.vim are provided
11482aaeb0SBram Moolenaar"               *as is* and comes with no warranty of any kind, either
12482aaeb0SBram Moolenaar"               expressed or implied. By using this plugin, you agree that
13482aaeb0SBram Moolenaar"               in no event will the copyright holder be liable for any damages
14482aaeb0SBram Moolenaar"               resulting from the use of this software.
15482aaeb0SBram Moolenaar"
16482aaeb0SBram Moolenaar"  But be doers of the Word, and not only hearers, deluding your own selves {{{1
17482aaeb0SBram Moolenaar"  (James 1:22 RSV)
18482aaeb0SBram Moolenaar" =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
19482aaeb0SBram Moolenaar
20482aaeb0SBram Moolenaar" ---------------------------------------------------------------------
21482aaeb0SBram Moolenaar" Load Once: {{{1
22*dd2a3cdaSBram Moolenaarif &cp || exists("g:loaded_netrwPlugin")
23482aaeb0SBram Moolenaar finish
24482aaeb0SBram Moolenaarendif
25*dd2a3cdaSBram Moolenaarlet g:loaded_netrwPlugin = 1
26*dd2a3cdaSBram Moolenaarlet s:keepcpo            = &cpo
278349fd7cSBram Moolenaarif v:version < 700
288349fd7cSBram Moolenaar echohl WarningMsg | echo "***netrw*** you need vim version 7.0 for this version of netrw" | echohl None
298349fd7cSBram Moolenaar finish
308349fd7cSBram Moolenaarendif
31482aaeb0SBram Moolenaarlet s:keepcpo= &cpo
32482aaeb0SBram Moolenaarset cpo&vim
33482aaeb0SBram Moolenaar
34482aaeb0SBram Moolenaar" ---------------------------------------------------------------------
35482aaeb0SBram Moolenaar" Public Interface: {{{1
36482aaeb0SBram Moolenaar
37482aaeb0SBram Moolenaar" Local Browsing: {{{2
38482aaeb0SBram Moolenaaraugroup FileExplorer
39482aaeb0SBram Moolenaar au!
40b8a7b560SBram Moolenaar au BufEnter * silent! call s:LocalBrowse(expand("<amatch>"))
41*dd2a3cdaSBram Moolenaar if has("win32") || has("win95") || has("win64") || has("win16")
42*dd2a3cdaSBram Moolenaar  au BufEnter .* silent! call s:LocalBrowse(expand("<amatch>"))
43*dd2a3cdaSBram Moolenaar endif
44482aaeb0SBram Moolenaaraugroup END
45482aaeb0SBram Moolenaar
46482aaeb0SBram Moolenaar" Network Browsing Reading Writing: {{{2
47482aaeb0SBram Moolenaaraugroup Network
48482aaeb0SBram Moolenaar au!
49482aaeb0SBram Moolenaar if has("win32") || has("win95") || has("win64") || has("win16")
50a5792f58SBram Moolenaar  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>"))
51482aaeb0SBram Moolenaar else
52a5792f58SBram Moolenaar  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>"))
53a5792f58SBram Moolenaar  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>"))
54482aaeb0SBram Moolenaar endif
550fd9289dSBram Moolenaar 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>")
56b8a7b560SBram Moolenaar 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>")
57b8a7b560SBram Moolenaar au BufWriteCmd  ftp://*,rcp://*,scp://*,dav://*,rsync://*,sftp://*		exe "silent doau BufWritePre ".expand("<amatch>")|exe 'Nwrite "' .expand("<amatch>").'"'|exe "silent doau BufWritePost ".expand("<amatch>")
58b8a7b560SBram Moolenaar 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*dd2a3cdaSBram Moolenaar try
60*dd2a3cdaSBram Moolenaar  au SourceCmd    ftp://*,rcp://*,scp://*,http://*,dav://*,rsync://*,sftp://*	exe 'Nsource "'.expand("<amatch>").'"'
61*dd2a3cdaSBram Moolenaar catch /^Vim\%((\a\+)\)\=:E216/
62*dd2a3cdaSBram Moolenaar  au SourcePre    ftp://*,rcp://*,scp://*,http://*,dav://*,rsync://*,sftp://*	exe 'Nsource "'.expand("<amatch>").'"'
63*dd2a3cdaSBram Moolenaar endtry
64482aaeb0SBram Moolenaaraugroup END
65482aaeb0SBram Moolenaar
66482aaeb0SBram Moolenaar" Commands: :Nread, :Nwrite, :NetUserPass {{{2
670fd9289dSBram Moolenaarcom! -count=1 -nargs=*	Nread		call netrw#NetSavePosn()<bar>call netrw#NetRead(<count>,<f-args>)<bar>call netrw#NetRestorePosn()
68482aaeb0SBram Moolenaarcom! -range=% -nargs=*	Nwrite		call netrw#NetSavePosn()<bar><line1>,<line2>call netrw#NetWrite(<f-args>)<bar>call netrw#NetRestorePosn()
69482aaeb0SBram Moolenaarcom! -nargs=*		NetUserPass	call NetUserPass(<f-args>)
700fd9289dSBram Moolenaarcom! -nargs=+           Ncopy           call netrw#NetObtain(<f-args>)
71*dd2a3cdaSBram Moolenaarcom! -nargs=*	        Nsource		call netrw#NetSavePosn()<bar>call netrw#NetSource(<f-args>)<bar>call netrw#NetRestorePosn()
72482aaeb0SBram Moolenaar
73482aaeb0SBram Moolenaar" Commands: :Explore, :Sexplore, Hexplore, Vexplore {{{2
74*dd2a3cdaSBram Moolenaarcom! -nargs=* -bar -bang -count=0 -complete=dir	Explore		call netrw#Explore(<count>,0,0+<bang>0,<q-args>)
75*dd2a3cdaSBram Moolenaarcom! -nargs=* -bar -bang -count=0 -complete=dir	Sexplore	call netrw#Explore(<count>,1,0+<bang>0,<q-args>)
76*dd2a3cdaSBram Moolenaarcom! -nargs=* -bar -bang -count=0 -complete=dir	Hexplore	call netrw#Explore(<count>,1,2+<bang>0,<q-args>)
77*dd2a3cdaSBram Moolenaarcom! -nargs=* -bar -bang -count=0 -complete=dir	Vexplore	call netrw#Explore(<count>,1,4+<bang>0,<q-args>)
78*dd2a3cdaSBram Moolenaarcom! -nargs=* -bar       -count=0 -complete=dir	Texplore	call netrw#Explore(<count>,0,6        ,<q-args>)
79*dd2a3cdaSBram Moolenaarcom! -nargs=* -bar -bang			Nexplore	call netrw#Explore(-1,0,0,<q-args>)
80*dd2a3cdaSBram Moolenaarcom! -nargs=* -bar -bang			Pexplore	call netrw#Explore(-2,0,0,<q-args>)
81482aaeb0SBram Moolenaar
82482aaeb0SBram Moolenaar" Commands: NetrwSettings {{{2
83482aaeb0SBram Moolenaarcom! -nargs=0 NetrwSettings :call netrwSettings#NetrwSettings()
84482aaeb0SBram Moolenaar
85b8a7b560SBram Moolenaar" Maps:
86*dd2a3cdaSBram Moolenaarif !exists("g:netrw_nogx") && maparg('g','n') == ""
87b8a7b560SBram Moolenaar if !hasmapto('<Plug>NetrwBrowseX')
88b8a7b560SBram Moolenaar  nmap <unique> gx <Plug>NetrwBrowseX
89b8a7b560SBram Moolenaar endif
90b8a7b560SBram Moolenaar nno <silent> <Plug>NetrwBrowseX :call netrw#NetBrowseX(expand("<cWORD>"),0)<cr>
91*dd2a3cdaSBram Moolenaarendif
92b8a7b560SBram Moolenaar
93482aaeb0SBram Moolenaar" ---------------------------------------------------------------------
94482aaeb0SBram Moolenaar" LocalBrowse: {{{2
95482aaeb0SBram Moolenaarfun! s:LocalBrowse(dirname)
96482aaeb0SBram Moolenaar  " unfortunate interaction -- debugging calls can't be used here;
97482aaeb0SBram Moolenaar  " the BufEnter event causes triggering when attempts to write to
98482aaeb0SBram Moolenaar  " the DBG buffer are made.
99*dd2a3cdaSBram Moolenaar"  echomsg "dirname<".a:dirname.">"
100*dd2a3cdaSBram Moolenaar  if has("amiga")
101*dd2a3cdaSBram Moolenaar   " The check against '' is made for the Amiga, where the empty
102*dd2a3cdaSBram Moolenaar   " string is the current directory and not checking would break
103*dd2a3cdaSBram Moolenaar   " things such as the help command.
104*dd2a3cdaSBram Moolenaar   if a:dirname != '' && isdirectory(a:dirname)
105*dd2a3cdaSBram Moolenaar    silent! call netrw#LocalBrowseCheck(a:dirname)
106*dd2a3cdaSBram Moolenaar   endif
107*dd2a3cdaSBram Moolenaar  elseif isdirectory(a:dirname)
108*dd2a3cdaSBram Moolenaar"   echomsg "dirname<".dirname."> isdir"
109*dd2a3cdaSBram Moolenaar   silent! call netrw#LocalBrowseCheck(a:dirname)
110482aaeb0SBram Moolenaar  endif
111482aaeb0SBram Moolenaar  " not a directory, ignore it
112482aaeb0SBram Moolenaarendfun
113482aaeb0SBram Moolenaar
114482aaeb0SBram Moolenaar" ---------------------------------------------------------------------
115482aaeb0SBram Moolenaar" NetrwStatusLine: {{{1
116482aaeb0SBram Moolenaarfun! NetrwStatusLine()
117af48b092SBram Moolenaar"  let g:stlmsg= "Xbufnr=".w:netrw_explore_bufnr." bufnr=".bufnr("%")." Xline#".w:netrw_explore_line." line#".line(".")
118af48b092SBram Moolenaar  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")
119482aaeb0SBram Moolenaar   let &stl= s:netrw_explore_stl
120482aaeb0SBram Moolenaar   if exists("w:netrw_explore_bufnr")|unlet w:netrw_explore_bufnr|endif
121482aaeb0SBram Moolenaar   if exists("w:netrw_explore_line")|unlet w:netrw_explore_line|endif
122482aaeb0SBram Moolenaar   return ""
123482aaeb0SBram Moolenaar  else
124482aaeb0SBram Moolenaar   return "Match ".w:netrw_explore_mtchcnt." of ".w:netrw_explore_listlen
125482aaeb0SBram Moolenaar  endif
126482aaeb0SBram Moolenaarendfun
127482aaeb0SBram Moolenaar
128482aaeb0SBram Moolenaar" ------------------------------------------------------------------------
129482aaeb0SBram Moolenaar" NetUserPass: set username and password for subsequent ftp transfer {{{1
130482aaeb0SBram Moolenaar"   Usage:  :call NetUserPass()			-- will prompt for userid and password
131482aaeb0SBram Moolenaar"	    :call NetUserPass("uid")		-- will prompt for password
132482aaeb0SBram Moolenaar"	    :call NetUserPass("uid","password") -- sets global userid and password
133482aaeb0SBram Moolenaarfun! NetUserPass(...)
134482aaeb0SBram Moolenaar
135482aaeb0SBram Moolenaar " get/set userid
136482aaeb0SBram Moolenaar if a:0 == 0
137482aaeb0SBram Moolenaar"  call Dfunc("NetUserPass(a:0<".a:0.">)")
138482aaeb0SBram Moolenaar  if !exists("g:netrw_uid") || g:netrw_uid == ""
139482aaeb0SBram Moolenaar   " via prompt
140482aaeb0SBram Moolenaar   let g:netrw_uid= input('Enter username: ')
141482aaeb0SBram Moolenaar  endif
142482aaeb0SBram Moolenaar else	" from command line
143482aaeb0SBram Moolenaar"  call Dfunc("NetUserPass(a:1<".a:1.">) {")
144482aaeb0SBram Moolenaar  let g:netrw_uid= a:1
145482aaeb0SBram Moolenaar endif
146482aaeb0SBram Moolenaar
147482aaeb0SBram Moolenaar " get password
148482aaeb0SBram Moolenaar if a:0 <= 1 " via prompt
149482aaeb0SBram Moolenaar"  call Decho("a:0=".a:0." case <=1:")
150482aaeb0SBram Moolenaar  let g:netrw_passwd= inputsecret("Enter Password: ")
151482aaeb0SBram Moolenaar else " from command line
152482aaeb0SBram Moolenaar"  call Decho("a:0=".a:0." case >1: a:2<".a:2.">")
153482aaeb0SBram Moolenaar  let g:netrw_passwd=a:2
154482aaeb0SBram Moolenaar endif
155482aaeb0SBram Moolenaar"  call Dret("NetUserPass")
156482aaeb0SBram Moolenaarendfun
157482aaeb0SBram Moolenaar
158482aaeb0SBram Moolenaar" ------------------------------------------------------------------------
159482aaeb0SBram Moolenaar" NetReadFixup: this sort of function is typically written by the user {{{1
160482aaeb0SBram Moolenaar"               to handle extra junk that their system's ftp dumps
161482aaeb0SBram Moolenaar"               into the transfer.  This function is provided as an
162482aaeb0SBram Moolenaar"               example and as a fix for a Windows 95 problem: in my
163482aaeb0SBram Moolenaar"               experience, win95's ftp always dumped four blank lines
164482aaeb0SBram Moolenaar"               at the end of the transfer.
165482aaeb0SBram Moolenaarif has("win95") && exists("g:netrw_win95ftp") && g:netrw_win95ftp
166482aaeb0SBram Moolenaar fun! NetReadFixup(method, line1, line2)
167482aaeb0SBram Moolenaar"   call Dfunc("NetReadFixup(method<".a:method."> line1=".a:line1." line2=".a:line2.")")
168482aaeb0SBram Moolenaar   if method == 3   " ftp (no <.netrc>)
169482aaeb0SBram Moolenaar    let fourblanklines= line2 - 3
170482aaeb0SBram Moolenaar    silent fourblanklines.",".line2."g/^\s*/d"
171482aaeb0SBram Moolenaar   endif
172482aaeb0SBram Moolenaar"   call Dret("NetReadFixup")
173482aaeb0SBram Moolenaar endfun
174482aaeb0SBram Moolenaarendif
175482aaeb0SBram Moolenaar
176482aaeb0SBram Moolenaar" ------------------------------------------------------------------------
177482aaeb0SBram Moolenaar" Modelines And Restoration: {{{1
178482aaeb0SBram Moolenaarlet &cpo= s:keepcpo
179482aaeb0SBram Moolenaarunlet s:keepcpo
180482aaeb0SBram Moolenaar" vim:ts=8 fdm=marker
181