1482aaeb0SBram Moolenaar" netrwPlugin.vim: Handles file transfer and remote directory listing across a network
2dd2a3cdaSBram Moolenaar"            PLUGIN SECTION
3*8feef4ffSBram Moolenaar" Date:		Nov 07, 2014
4ff034194SBram Moolenaar" Maintainer:	Charles E Campbell <[email protected]>
5482aaeb0SBram Moolenaar" GetLatestVimScripts: 1075 1 :AutoInstall: netrw.vim
68d043171SBram Moolenaar" Copyright:    Copyright (C) 1999-2013 Charles E. Campbell {{{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" Load Once: {{{1
20dd2a3cdaSBram Moolenaarif &cp || exists("g:loaded_netrwPlugin")
21482aaeb0SBram Moolenaar finish
22482aaeb0SBram Moolenaarendif
23*8feef4ffSBram Moolenaarlet g:loaded_netrwPlugin = "v153"
245c73622aSBram Moolenaarif v:version < 702
258d043171SBram Moolenaar echohl WarningMsg
268d043171SBram Moolenaar echo "***warning*** you need vim version 7.2 for this version of netrw"
278d043171SBram Moolenaar echohl None
288d043171SBram Moolenaar finish
298d043171SBram Moolenaarendif
308d043171SBram Moolenaarif v:version < 703 || (v:version == 703 && !has("patch465"))
318d043171SBram Moolenaar echohl WarningMsg
328d043171SBram Moolenaar echo "***warning*** this version of netrw needs vim 7.3.465 or later"
338d043171SBram Moolenaar echohl Normal
348349fd7cSBram Moolenaar finish
358349fd7cSBram Moolenaarendif
36482aaeb0SBram Moolenaarlet s:keepcpo = &cpo
37482aaeb0SBram Moolenaarset cpo&vim
388d043171SBram Moolenaar"DechoRemOn
39482aaeb0SBram Moolenaar
40482aaeb0SBram Moolenaar" ---------------------------------------------------------------------
41482aaeb0SBram Moolenaar" Public Interface: {{{1
42482aaeb0SBram Moolenaar
438d043171SBram Moolenaar" Local Browsing Autocmds: {{{2
44482aaeb0SBram Moolenaaraugroup FileExplorer
45482aaeb0SBram Moolenaar au!
46a6878375SBram Moolenaar au BufLeave *  if &ft != "netrw"|let w:netrw_prvfile= expand("%:p")|endif
478d043171SBram Moolenaar au BufEnter *	sil call s:LocalBrowse(expand("<amatch>"))
488d043171SBram Moolenaar au VimEnter *	sil call s:VimEnter(expand("<amatch>"))
49dd2a3cdaSBram Moolenaar if has("win32") || has("win95") || has("win64") || has("win16")
508d043171SBram Moolenaar  au BufEnter .* sil call s:LocalBrowse(expand("<amatch>"))
51dd2a3cdaSBram Moolenaar endif
52482aaeb0SBram Moolenaaraugroup END
53482aaeb0SBram Moolenaar
54482aaeb0SBram Moolenaar" Network Browsing Reading Writing: {{{2
55482aaeb0SBram Moolenaaraugroup Network
56482aaeb0SBram Moolenaar au!
57adc2182cSBram Moolenaar au BufReadCmd   file://*											call netrw#FileUrlRead(expand("<amatch>"))
58*8feef4ffSBram Moolenaar au BufReadCmd   ftp://*,rcp://*,scp://*,http://*,file://*,https://*,dav://*,davs://*,rsync://*,sftp://*	exe "sil doau BufReadPre ".fnameescape(expand("<amatch>"))|call netrw#Nread(2,expand("<amatch>"))|exe "sil doau BufReadPost ".fnameescape(expand("<amatch>"))
59*8feef4ffSBram Moolenaar au FileReadCmd  ftp://*,rcp://*,scp://*,http://*,file://*,https://*,dav://*,davs://*,rsync://*,sftp://*	exe "sil doau FileReadPre ".fnameescape(expand("<amatch>"))|call netrw#Nread(1,expand("<amatch>"))|exe "sil doau FileReadPost ".fnameescape(expand("<amatch>"))
60*8feef4ffSBram Moolenaar au BufWriteCmd  ftp://*,rcp://*,scp://*,http://*,file://*,dav://*,davs://*,rsync://*,sftp://*			exe "sil doau BufWritePre ".fnameescape(expand("<amatch>"))|exe 'Nwrite '.fnameescape(expand("<amatch>"))|exe "sil doau BufWritePost ".fnameescape(expand("<amatch>"))
61*8feef4ffSBram Moolenaar au FileWriteCmd ftp://*,rcp://*,scp://*,http://*,file://*,dav://*,davs://*,rsync://*,sftp://*			exe "sil doau FileWritePre ".fnameescape(expand("<amatch>"))|exe "'[,']".'Nwrite '.fnameescape(expand("<amatch>"))|exe "sil doau FileWritePost ".fnameescape(expand("<amatch>"))
62dd2a3cdaSBram Moolenaar try
63*8feef4ffSBram Moolenaar  au SourceCmd   ftp://*,rcp://*,scp://*,http://*,file://*,https://*,dav://*,davs://*,rsync://*,sftp://*	exe 'Nsource '.fnameescape(expand("<amatch>"))
64dd2a3cdaSBram Moolenaar catch /^Vim\%((\a\+)\)\=:E216/
65*8feef4ffSBram Moolenaar  au SourcePre   ftp://*,rcp://*,scp://*,http://*,file://*,https://*,dav://*,davs://*,rsync://*,sftp://*	exe 'Nsource '.fnameescape(expand("<amatch>"))
66dd2a3cdaSBram Moolenaar endtry
67482aaeb0SBram Moolenaaraugroup END
68482aaeb0SBram Moolenaar
69482aaeb0SBram Moolenaar" Commands: :Nread, :Nwrite, :NetUserPass {{{2
70a6878375SBram Moolenaarcom! -count=1 -nargs=*	Nread		call netrw#SavePosn()<bar>call netrw#NetRead(<count>,<f-args>)<bar>call netrw#RestorePosn()
71a6878375SBram Moolenaarcom! -range=% -nargs=*	Nwrite		call netrw#SavePosn()<bar><line1>,<line2>call netrw#NetWrite(<f-args>)<bar>call netrw#RestorePosn()
72482aaeb0SBram Moolenaarcom! -nargs=*		NetUserPass	call NetUserPass(<f-args>)
73a6878375SBram Moolenaarcom! -nargs=*	        Nsource		call netrw#SavePosn()<bar>call netrw#NetSource(<f-args>)<bar>call netrw#RestorePosn()
74a6878375SBram Moolenaarcom! -nargs=?		Ntree		call netrw#SetTreetop(<q-args>)
75482aaeb0SBram Moolenaar
768d043171SBram Moolenaar" Commands: :Explore, :Sexplore, Hexplore, Vexplore, Lexplore {{{2
77dd2a3cdaSBram Moolenaarcom! -nargs=* -bar -bang -count=0 -complete=dir	Explore		call netrw#Explore(<count>,0,0+<bang>0,<q-args>)
78dd2a3cdaSBram Moolenaarcom! -nargs=* -bar -bang -count=0 -complete=dir	Sexplore	call netrw#Explore(<count>,1,0+<bang>0,<q-args>)
79dd2a3cdaSBram Moolenaarcom! -nargs=* -bar -bang -count=0 -complete=dir	Hexplore	call netrw#Explore(<count>,1,2+<bang>0,<q-args>)
80dd2a3cdaSBram Moolenaarcom! -nargs=* -bar -bang -count=0 -complete=dir	Vexplore	call netrw#Explore(<count>,1,4+<bang>0,<q-args>)
81dd2a3cdaSBram Moolenaarcom! -nargs=* -bar       -count=0 -complete=dir	Texplore	call netrw#Explore(<count>,0,6        ,<q-args>)
82dd2a3cdaSBram Moolenaarcom! -nargs=* -bar -bang			Nexplore	call netrw#Explore(-1,0,0,<q-args>)
83dd2a3cdaSBram Moolenaarcom! -nargs=* -bar -bang			Pexplore	call netrw#Explore(-2,0,0,<q-args>)
84*8feef4ffSBram Moolenaarcom! -nargs=* -bar -bang -count=0 -complete=dir Lexplore	call netrw#Lexplore(<count>,<bang>0,<q-args>)
85482aaeb0SBram Moolenaar
86482aaeb0SBram Moolenaar" Commands: NetrwSettings {{{2
87f233048aSBram Moolenaarcom! -nargs=0	NetrwSettings	call netrwSettings#NetrwSettings()
88a6878375SBram Moolenaarcom! -bang	NetrwClean	call netrw#Clean(<bang>0)
89482aaeb0SBram Moolenaar
90b8a7b560SBram Moolenaar" Maps:
91*8feef4ffSBram Moolenaarif !exists("g:netrw_nogx")
92*8feef4ffSBram Moolenaar if maparg('gx','n') == ""
93b8a7b560SBram Moolenaar  if !hasmapto('<Plug>NetrwBrowseX')
94b8a7b560SBram Moolenaar   nmap <unique> gx <Plug>NetrwBrowseX
95b8a7b560SBram Moolenaar  endif
96*8feef4ffSBram Moolenaar  nno <silent> <Plug>NetrwBrowseX :call netrw#BrowseX(expand((exists("g:netrw_gx")? g:netrw_gx : '<cfile>')),netrw#CheckIfRemote())<cr>
97*8feef4ffSBram Moolenaar endif
98*8feef4ffSBram Moolenaar if maparg('gx','v') == ""
99*8feef4ffSBram Moolenaar  if !hasmapto('<Plug>NetrwBrowseXVis')
100*8feef4ffSBram Moolenaar   vmap <unique> gx <Plug>NetrwBrowseXVis
101*8feef4ffSBram Moolenaar  endif
102*8feef4ffSBram Moolenaar  vno <silent> <Plug>NetrwBrowseXVis :<c-u>call netrw#BrowseXVis()<cr>
103*8feef4ffSBram Moolenaar endif
104dd2a3cdaSBram Moolenaarendif
105b8a7b560SBram Moolenaar
106482aaeb0SBram Moolenaar" ---------------------------------------------------------------------
1078d043171SBram Moolenaar" LocalBrowse: invokes netrw#LocalBrowseCheck() on directory buffers {{{2
108482aaeb0SBram Moolenaarfun! s:LocalBrowse(dirname)
1098d043171SBram Moolenaar  " Unfortunate interaction -- only DechoMsg debugging calls can be safely used here.
1108d043171SBram Moolenaar  " Otherwise, the BufEnter event gets triggered when attempts to write to
111482aaeb0SBram Moolenaar  " the DBG buffer are made.
1128d043171SBram Moolenaar
113e6ae6225SBram Moolenaar  if !exists("s:vimentered")
1148d043171SBram Moolenaar   " If s:vimentered doesn't exist, then the VimEnter event hasn't fired.  It will,
1158d043171SBram Moolenaar   " and so s:VimEnter() will then be calling this routine, but this time with s:vimentered defined.
1168d043171SBram Moolenaar"   call Dfunc("s:LocalBrowse(dirname<".a:dirname.">)  (s:vimentered doesn't exist)")
1178d043171SBram Moolenaar"   call Dret("s:LocalBrowse")
118e6ae6225SBram Moolenaar   return
119e6ae6225SBram Moolenaar  endif
1208d043171SBram Moolenaar
1218d043171SBram Moolenaar"  call Dfunc("s:LocalBrowse(dirname<".a:dirname.">)  (s:vimentered=".s:vimentered.")")
1228d043171SBram Moolenaar
123dd2a3cdaSBram Moolenaar  if has("amiga")
124dd2a3cdaSBram Moolenaar   " The check against '' is made for the Amiga, where the empty
125dd2a3cdaSBram Moolenaar   " string is the current directory and not checking would break
126dd2a3cdaSBram Moolenaar   " things such as the help command.
1278d043171SBram Moolenaar"   call Decho("(LocalBrowse) dirname<".a:dirname.">  (isdirectory, amiga)")
128dd2a3cdaSBram Moolenaar   if a:dirname != '' && isdirectory(a:dirname)
129adc2182cSBram Moolenaar    sil! call netrw#LocalBrowseCheck(a:dirname)
130*8feef4ffSBram Moolenaar    if exists("w:netrw_bannercnt") && line('.') < w:netrw_bannercnt
131a6878375SBram Moolenaar     exe w:netrw_bannercnt
132a6878375SBram Moolenaar    endif
133dd2a3cdaSBram Moolenaar   endif
1348d043171SBram Moolenaar
135dd2a3cdaSBram Moolenaar  elseif isdirectory(a:dirname)
136a6878375SBram Moolenaar"   call Decho("(LocalBrowse) dirname<".a:dirname."> ft=".&ft."  (isdirectory, not amiga)")
137a6878375SBram Moolenaar"   call Dredir("LocalBrowse ft last set: ","verbose set ft")
138adc2182cSBram Moolenaar   sil! call netrw#LocalBrowseCheck(a:dirname)
139*8feef4ffSBram Moolenaar   if exists("w:netrw_bannercnt") && line('.') < w:netrw_bannercnt
140a6878375SBram Moolenaar    exe w:netrw_bannercnt
141a6878375SBram Moolenaar   endif
1428d043171SBram Moolenaar
1438d043171SBram Moolenaar  else
144482aaeb0SBram Moolenaar   " not a directory, ignore it
1458d043171SBram Moolenaar"   call Decho("(LocalBrowse) dirname<".a:dirname."> not a directory, ignoring...")
1468d043171SBram Moolenaar  endif
1478d043171SBram Moolenaar
1488d043171SBram Moolenaar"  call Dret("s:LocalBrowse")
149482aaeb0SBram Moolenaarendfun
150482aaeb0SBram Moolenaar
151482aaeb0SBram Moolenaar" ---------------------------------------------------------------------
1528d043171SBram Moolenaar" s:VimEnter: after all vim startup stuff is done, this function is called. {{{2
1538d043171SBram Moolenaar"             Its purpose: to look over all windows and run s:LocalBrowse() on
1548d043171SBram Moolenaar"             them, which checks if they're directories and will create a directory
1558d043171SBram Moolenaar"             listing when appropriate.
1568d043171SBram Moolenaar"             It also sets s:vimentered, letting s:LocalBrowse() know that s:VimEnter()
1578d043171SBram Moolenaar"             has already been called.
15800a927d6SBram Moolenaarfun! s:VimEnter(dirname)
1598d043171SBram Moolenaar"  call Dfunc("s:VimEnter(dirname<".a:dirname.">) expand(%)<".expand("%").">")
160477db060SBram Moolenaar  let curwin       = winnr()
161e6ae6225SBram Moolenaar  let s:vimentered = 1
1628d043171SBram Moolenaar  windo call s:LocalBrowse(expand("%:p"))
163477db060SBram Moolenaar  exe curwin."wincmd w"
1648d043171SBram Moolenaar"  call Dret("s:VimEnter")
16500a927d6SBram Moolenaarendfun
16600a927d6SBram Moolenaar
16700a927d6SBram Moolenaar" ---------------------------------------------------------------------
168482aaeb0SBram Moolenaar" NetrwStatusLine: {{{1
169482aaeb0SBram Moolenaarfun! NetrwStatusLine()
170af48b092SBram Moolenaar"  let g:stlmsg= "Xbufnr=".w:netrw_explore_bufnr." bufnr=".bufnr("%")." Xline#".w:netrw_explore_line." line#".line(".")
171af48b092SBram 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")
172482aaeb0SBram Moolenaar   let &stl= s:netrw_explore_stl
173482aaeb0SBram Moolenaar   if exists("w:netrw_explore_bufnr")|unlet w:netrw_explore_bufnr|endif
174482aaeb0SBram Moolenaar   if exists("w:netrw_explore_line")|unlet w:netrw_explore_line|endif
175482aaeb0SBram Moolenaar   return ""
176482aaeb0SBram Moolenaar  else
177482aaeb0SBram Moolenaar   return "Match ".w:netrw_explore_mtchcnt." of ".w:netrw_explore_listlen
178482aaeb0SBram Moolenaar  endif
179482aaeb0SBram Moolenaarendfun
180482aaeb0SBram Moolenaar
181482aaeb0SBram Moolenaar" ------------------------------------------------------------------------
182482aaeb0SBram Moolenaar" NetUserPass: set username and password for subsequent ftp transfer {{{1
183482aaeb0SBram Moolenaar"   Usage:  :call NetUserPass()			-- will prompt for userid and password
184482aaeb0SBram Moolenaar"	    :call NetUserPass("uid")		-- will prompt for password
185482aaeb0SBram Moolenaar"	    :call NetUserPass("uid","password") -- sets global userid and password
186482aaeb0SBram Moolenaarfun! NetUserPass(...)
187482aaeb0SBram Moolenaar
188482aaeb0SBram Moolenaar " get/set userid
189482aaeb0SBram Moolenaar if a:0 == 0
190482aaeb0SBram Moolenaar"  call Dfunc("NetUserPass(a:0<".a:0.">)")
191482aaeb0SBram Moolenaar  if !exists("g:netrw_uid") || g:netrw_uid == ""
192482aaeb0SBram Moolenaar   " via prompt
193482aaeb0SBram Moolenaar   let g:netrw_uid= input('Enter username: ')
194482aaeb0SBram Moolenaar  endif
195482aaeb0SBram Moolenaar else	" from command line
196482aaeb0SBram Moolenaar"  call Dfunc("NetUserPass(a:1<".a:1.">) {")
197482aaeb0SBram Moolenaar  let g:netrw_uid= a:1
198482aaeb0SBram Moolenaar endif
199482aaeb0SBram Moolenaar
200482aaeb0SBram Moolenaar " get password
201482aaeb0SBram Moolenaar if a:0 <= 1 " via prompt
202482aaeb0SBram Moolenaar"  call Decho("a:0=".a:0." case <=1:")
203482aaeb0SBram Moolenaar  let g:netrw_passwd= inputsecret("Enter Password: ")
204482aaeb0SBram Moolenaar else " from command line
205482aaeb0SBram Moolenaar"  call Decho("a:0=".a:0." case >1: a:2<".a:2.">")
206482aaeb0SBram Moolenaar  let g:netrw_passwd=a:2
207482aaeb0SBram Moolenaar endif
208482aaeb0SBram Moolenaar"  call Dret("NetUserPass")
209482aaeb0SBram Moolenaarendfun
210482aaeb0SBram Moolenaar
211482aaeb0SBram Moolenaar" ------------------------------------------------------------------------
212482aaeb0SBram Moolenaar" Modelines And Restoration: {{{1
213482aaeb0SBram Moolenaarlet &cpo= s:keepcpo
214482aaeb0SBram Moolenaarunlet s:keepcpo
215482aaeb0SBram Moolenaar" vim:ts=8 fdm=marker
216