1482aaeb0SBram Moolenaar" netrwPlugin.vim: Handles file transfer and remote directory listing across a network
2dd2a3cdaSBram Moolenaar"            PLUGIN SECTION
3*e37d50a5SBram Moolenaar" Date:		Aug 01, 2008
4dd2a3cdaSBram Moolenaar" Maintainer:	Charles E Campbell, Jr <[email protected]>
5482aaeb0SBram Moolenaar" GetLatestVimScripts: 1075 1 :AutoInstall: netrw.vim
6*e37d50a5SBram Moolenaar" Copyright:    Copyright (C) 1999-2008 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
22dd2a3cdaSBram Moolenaarif &cp || exists("g:loaded_netrwPlugin")
23482aaeb0SBram Moolenaar finish
24482aaeb0SBram Moolenaarendif
25*e37d50a5SBram Moolenaarlet g:loaded_netrwPlugin = "v131"
26dd2a3cdaSBram 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>"))
41dd2a3cdaSBram Moolenaar if has("win32") || has("win95") || has("win64") || has("win16")
42dd2a3cdaSBram Moolenaar  au BufEnter .* silent! call s:LocalBrowse(expand("<amatch>"))
43dd2a3cdaSBram 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")
50*e37d50a5SBram Moolenaar  au BufReadCmd  file://*		exe "silent doau BufReadPre ".fnameescape(netrw#RFC2396(expand("<amatch>")))|exe 'e '.fnameescape(substitute(netrw#RFC2396(expand("<amatch>")),'file://\(.*\)','\1',""))|exe "bwipe ".fnameescape(expand("<amatch>"))|exe "silent doau BufReadPost ".fnameescape(netrw#RFC2396(expand("<amatch>")))
51482aaeb0SBram Moolenaar else
52*e37d50a5SBram Moolenaar  au BufReadCmd  file://*		exe "silent doau BufReadPre ".fnameescape(netrw#RFC2396(expand("<amatch>")))|exe 'e '.fnameescape(substitute(netrw#RFC2396(expand("<amatch>")),'file://\(.*\)','\1',""))|exe "bwipe ".fnameescape(expand("<amatch>"))|exe "silent doau BufReadPost ".fnameescape(netrw#RFC2396(expand("<amatch>")))
53*e37d50a5SBram Moolenaar  au BufReadCmd  file://localhost/*	exe "silent doau BufReadPre ".fnameescape(netrw#RFC2396(expand("<amatch>")))|exe 'e '.fnameescape(substitute(netrw#RFC2396(expand("<amatch>")),'file://localhost/\(.*\)','\1',""))|exe "bwipe ".fnameescape(substitute(expand("<amatch>"),'file://\(\k\+@\)\=','',''))|exe "silent doau BufReadPost ".fnameescape(netrw#RFC2396(expand("<amatch>")))
54482aaeb0SBram Moolenaar endif
55*e37d50a5SBram Moolenaar au BufReadCmd   ftp://*,rcp://*,scp://*,http://*,dav://*,davs://*,rsync://*,sftp://*	exe "silent doau BufReadPre ".fnameescape(expand("<amatch>"))|exe '2Nread '.fnameescape(expand("<amatch>"))|exe "silent doau BufReadPost ".fnameescape(expand("<amatch>"))
56*e37d50a5SBram Moolenaar au FileReadCmd  ftp://*,rcp://*,scp://*,http://*,dav://*,davs://*,rsync://*,sftp://*	exe "silent doau FileReadPre ".fnameescape(expand("<amatch>"))|exe 'Nread '.fnameescape(expand("<amatch>"))|exe "silent doau FileReadPost ".fnameescape(expand("<amatch>"))
57*e37d50a5SBram Moolenaar au BufWriteCmd  ftp://*,rcp://*,scp://*,dav://*,davs://*,rsync://*,sftp://*		exe "silent doau BufWritePre ".fnameescape(expand("<amatch>"))|exe 'Nwrite '.fnameescape(expand("<amatch>"))|exe "silent doau BufWritePost ".fnameescape(expand("<amatch>"))
58*e37d50a5SBram Moolenaar au FileWriteCmd ftp://*,rcp://*,scp://*,dav://*,davs://*,rsync://*,sftp://*		exe "silent doau FileWritePre ".fnameescape(expand("<amatch>"))|exe "'[,']".'Nwrite '.fnameescape(expand("<amatch>"))|exe "silent doau FileWritePost ".fnameescape(expand("<amatch>"))
59dd2a3cdaSBram Moolenaar try
60*e37d50a5SBram Moolenaar  au SourceCmd   ftp://*,rcp://*,scp://*,http://*,dav://*,davs://*,rsync://*,sftp://*	exe 'Nsource '.fnameescape(expand("<amatch>"))
61dd2a3cdaSBram Moolenaar catch /^Vim\%((\a\+)\)\=:E216/
62*e37d50a5SBram Moolenaar  au SourcePre   ftp://*,rcp://*,scp://*,http://*,dav://*,davs://*,rsync://*,sftp://*	exe 'Nsource '.fnameescape(expand("<amatch>"))
63dd2a3cdaSBram Moolenaar endtry
64482aaeb0SBram Moolenaaraugroup END
65482aaeb0SBram Moolenaar
66482aaeb0SBram Moolenaar" Commands: :Nread, :Nwrite, :NetUserPass {{{2
67f233048aSBram Moolenaarcom! -count=1 -nargs=*	Nread		call netrw#NetrwSavePosn()<bar>call netrw#NetRead(<count>,<f-args>)<bar>call netrw#NetrwRestorePosn()
68f233048aSBram Moolenaarcom! -range=% -nargs=*	Nwrite		call netrw#NetrwSavePosn()<bar><line1>,<line2>call netrw#NetWrite(<f-args>)<bar>call netrw#NetrwRestorePosn()
69482aaeb0SBram Moolenaarcom! -nargs=*		NetUserPass	call NetUserPass(<f-args>)
70f233048aSBram Moolenaarcom! -nargs=*	        Nsource		call netrw#NetrwSavePosn()<bar>call netrw#NetSource(<f-args>)<bar>call netrw#NetrwRestorePosn()
71482aaeb0SBram Moolenaar
72482aaeb0SBram Moolenaar" Commands: :Explore, :Sexplore, Hexplore, Vexplore {{{2
73dd2a3cdaSBram Moolenaarcom! -nargs=* -bar -bang -count=0 -complete=dir	Explore		call netrw#Explore(<count>,0,0+<bang>0,<q-args>)
74dd2a3cdaSBram Moolenaarcom! -nargs=* -bar -bang -count=0 -complete=dir	Sexplore	call netrw#Explore(<count>,1,0+<bang>0,<q-args>)
75dd2a3cdaSBram Moolenaarcom! -nargs=* -bar -bang -count=0 -complete=dir	Hexplore	call netrw#Explore(<count>,1,2+<bang>0,<q-args>)
76dd2a3cdaSBram Moolenaarcom! -nargs=* -bar -bang -count=0 -complete=dir	Vexplore	call netrw#Explore(<count>,1,4+<bang>0,<q-args>)
77dd2a3cdaSBram Moolenaarcom! -nargs=* -bar       -count=0 -complete=dir	Texplore	call netrw#Explore(<count>,0,6        ,<q-args>)
78dd2a3cdaSBram Moolenaarcom! -nargs=* -bar -bang			Nexplore	call netrw#Explore(-1,0,0,<q-args>)
79dd2a3cdaSBram Moolenaarcom! -nargs=* -bar -bang			Pexplore	call netrw#Explore(-2,0,0,<q-args>)
80482aaeb0SBram Moolenaar
81482aaeb0SBram Moolenaar" Commands: NetrwSettings {{{2
82f233048aSBram Moolenaarcom! -nargs=0	NetrwSettings	call netrwSettings#NetrwSettings()
83f233048aSBram Moolenaarcom! -bang	NetrwClean	call netrw#NetrwClean(<bang>0)
84482aaeb0SBram Moolenaar
85b8a7b560SBram Moolenaar" Maps:
86dd2a3cdaSBram Moolenaarif !exists("g:netrw_nogx") && maparg('g','n') == ""
87b8a7b560SBram Moolenaar if !hasmapto('<Plug>NetrwBrowseX')
88b8a7b560SBram Moolenaar  nmap <unique> gx <Plug>NetrwBrowseX
89b8a7b560SBram Moolenaar endif
90f233048aSBram Moolenaar nno <silent> <Plug>NetrwBrowseX :call netrw#NetrwBrowseX(expand("<cWORD>"),0)<cr>
91dd2a3cdaSBram 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.
99dd2a3cdaSBram Moolenaar"  echomsg "dirname<".a:dirname.">"
100dd2a3cdaSBram Moolenaar  if has("amiga")
101dd2a3cdaSBram Moolenaar   " The check against '' is made for the Amiga, where the empty
102dd2a3cdaSBram Moolenaar   " string is the current directory and not checking would break
103dd2a3cdaSBram Moolenaar   " things such as the help command.
104dd2a3cdaSBram Moolenaar   if a:dirname != '' && isdirectory(a:dirname)
105dd2a3cdaSBram Moolenaar    silent! call netrw#LocalBrowseCheck(a:dirname)
106dd2a3cdaSBram Moolenaar   endif
107dd2a3cdaSBram Moolenaar  elseif isdirectory(a:dirname)
108dd2a3cdaSBram Moolenaar"   echomsg "dirname<".dirname."> isdir"
109dd2a3cdaSBram 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