blob: f17aeeb1fb8994ba433b147c4c1e188f9dd458c8 [file] [log] [blame]
Bram Moolenaar482aaeb2005-09-29 18:26:07 +00001" netrwPlugin.vim: Handles file transfer and remote directory listing across a network
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +00002" PLUGIN SECTION
Bram Moolenaara6878372014-03-22 21:02:50 +01003" Date: Jan 22, 2014
Bram Moolenaarff034192013-04-24 18:51:19 +02004" Maintainer: Charles E Campbell <NdrOchip@ScampbellPfamily.AbizM-NOSPAM>
Bram Moolenaar482aaeb2005-09-29 18:26:07 +00005" GetLatestVimScripts: 1075 1 :AutoInstall: netrw.vim
Bram Moolenaar8d043172014-01-23 14:24:41 +01006" Copyright: Copyright (C) 1999-2013 Charles E. Campbell {{{1
Bram Moolenaar482aaeb2005-09-29 18:26:07 +00007" 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" =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
Bram Moolenaar482aaeb2005-09-29 18:26:07 +000019" Load Once: {{{1
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +000020if &cp || exists("g:loaded_netrwPlugin")
Bram Moolenaar482aaeb2005-09-29 18:26:07 +000021 finish
22endif
Bram Moolenaara6878372014-03-22 21:02:50 +010023let g:loaded_netrwPlugin = "v151"
Bram Moolenaar5c736222010-01-06 20:54:52 +010024if v:version < 702
Bram Moolenaar8d043172014-01-23 14:24:41 +010025 echohl WarningMsg
26 echo "***warning*** you need vim version 7.2 for this version of netrw"
27 echohl None
28 finish
29endif
30if v:version < 703 || (v:version == 703 && !has("patch465"))
31 echohl WarningMsg
32 echo "***warning*** this version of netrw needs vim 7.3.465 or later"
33 echohl Normal
Bram Moolenaar8349fd72005-10-12 20:52:20 +000034 finish
35endif
Bram Moolenaar5c736222010-01-06 20:54:52 +010036let s:keepcpo = &cpo
Bram Moolenaar482aaeb2005-09-29 18:26:07 +000037set cpo&vim
Bram Moolenaar8d043172014-01-23 14:24:41 +010038"DechoRemOn
Bram Moolenaar482aaeb2005-09-29 18:26:07 +000039
40" ---------------------------------------------------------------------
41" Public Interface: {{{1
42
Bram Moolenaar8d043172014-01-23 14:24:41 +010043" Local Browsing Autocmds: {{{2
Bram Moolenaar482aaeb2005-09-29 18:26:07 +000044augroup FileExplorer
45 au!
Bram Moolenaara6878372014-03-22 21:02:50 +010046 au BufLeave * if &ft != "netrw"|let w:netrw_prvfile= expand("%:p")|endif
Bram Moolenaar8d043172014-01-23 14:24:41 +010047 au BufEnter * sil call s:LocalBrowse(expand("<amatch>"))
48 au VimEnter * sil call s:VimEnter(expand("<amatch>"))
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +000049 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar8d043172014-01-23 14:24:41 +010050 au BufEnter .* sil call s:LocalBrowse(expand("<amatch>"))
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +000051 endif
Bram Moolenaar482aaeb2005-09-29 18:26:07 +000052augroup END
53
54" Network Browsing Reading Writing: {{{2
55augroup Network
56 au!
Bram Moolenaare6ae6222013-05-21 21:01:10 +020057 au BufReadCmd file://* call netrw#FileUrlRead(expand("<amatch>"))
Bram Moolenaarff034192013-04-24 18:51:19 +020058 au BufReadCmd ftp://*,rcp://*,scp://*,http://*,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 au FileReadCmd ftp://*,rcp://*,scp://*,http://*,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>"))
Bram Moolenaar8d043172014-01-23 14:24:41 +010060 au BufWriteCmd ftp://*,rcp://*,scp://*,http://*,dav://*,davs://*,rsync://*,sftp://* exe "sil doau BufWritePre ".fnameescape(expand("<amatch>"))|exe 'Nwrite '.fnameescape(expand("<amatch>"))|exe "sil doau BufWritePost ".fnameescape(expand("<amatch>"))
61 au FileWriteCmd ftp://*,rcp://*,scp://*,http://*,dav://*,davs://*,rsync://*,sftp://* exe "sil doau FileWritePre ".fnameescape(expand("<amatch>"))|exe "'[,']".'Nwrite '.fnameescape(expand("<amatch>"))|exe "sil doau FileWritePost ".fnameescape(expand("<amatch>"))
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +000062 try
Bram Moolenaar15146672011-10-20 22:22:38 +020063 au SourceCmd ftp://*,rcp://*,scp://*,http://*,https://*,dav://*,davs://*,rsync://*,sftp://* exe 'Nsource '.fnameescape(expand("<amatch>"))
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +000064 catch /^Vim\%((\a\+)\)\=:E216/
Bram Moolenaar15146672011-10-20 22:22:38 +020065 au SourcePre ftp://*,rcp://*,scp://*,http://*,https://*,dav://*,davs://*,rsync://*,sftp://* exe 'Nsource '.fnameescape(expand("<amatch>"))
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +000066 endtry
Bram Moolenaar482aaeb2005-09-29 18:26:07 +000067augroup END
68
69" Commands: :Nread, :Nwrite, :NetUserPass {{{2
Bram Moolenaara6878372014-03-22 21:02:50 +010070com! -count=1 -nargs=* Nread call netrw#SavePosn()<bar>call netrw#NetRead(<count>,<f-args>)<bar>call netrw#RestorePosn()
71com! -range=% -nargs=* Nwrite call netrw#SavePosn()<bar><line1>,<line2>call netrw#NetWrite(<f-args>)<bar>call netrw#RestorePosn()
Bram Moolenaar482aaeb2005-09-29 18:26:07 +000072com! -nargs=* NetUserPass call NetUserPass(<f-args>)
Bram Moolenaara6878372014-03-22 21:02:50 +010073com! -nargs=* Nsource call netrw#SavePosn()<bar>call netrw#NetSource(<f-args>)<bar>call netrw#RestorePosn()
74com! -nargs=? Ntree call netrw#SetTreetop(<q-args>)
Bram Moolenaar482aaeb2005-09-29 18:26:07 +000075
Bram Moolenaar8d043172014-01-23 14:24:41 +010076" Commands: :Explore, :Sexplore, Hexplore, Vexplore, Lexplore {{{2
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +000077com! -nargs=* -bar -bang -count=0 -complete=dir Explore call netrw#Explore(<count>,0,0+<bang>0,<q-args>)
78com! -nargs=* -bar -bang -count=0 -complete=dir Sexplore call netrw#Explore(<count>,1,0+<bang>0,<q-args>)
79com! -nargs=* -bar -bang -count=0 -complete=dir Hexplore call netrw#Explore(<count>,1,2+<bang>0,<q-args>)
80com! -nargs=* -bar -bang -count=0 -complete=dir Vexplore call netrw#Explore(<count>,1,4+<bang>0,<q-args>)
81com! -nargs=* -bar -count=0 -complete=dir Texplore call netrw#Explore(<count>,0,6 ,<q-args>)
82com! -nargs=* -bar -bang Nexplore call netrw#Explore(-1,0,0,<q-args>)
83com! -nargs=* -bar -bang Pexplore call netrw#Explore(-2,0,0,<q-args>)
Bram Moolenaar8d043172014-01-23 14:24:41 +010084com! -nargs=* -bar -complete=dir Lexplore call netrw#Lexplore(<q-args>)
Bram Moolenaar482aaeb2005-09-29 18:26:07 +000085
86" Commands: NetrwSettings {{{2
Bram Moolenaarf2330482008-06-24 20:19:36 +000087com! -nargs=0 NetrwSettings call netrwSettings#NetrwSettings()
Bram Moolenaara6878372014-03-22 21:02:50 +010088com! -bang NetrwClean call netrw#Clean(<bang>0)
Bram Moolenaar482aaeb2005-09-29 18:26:07 +000089
Bram Moolenaarb8a7b562006-02-01 21:47:16 +000090" Maps:
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +020091if !exists("g:netrw_nogx") && maparg('gx','n') == ""
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +000092 if !hasmapto('<Plug>NetrwBrowseX')
93 nmap <unique> gx <Plug>NetrwBrowseX
94 endif
Bram Moolenaar8d043172014-01-23 14:24:41 +010095 nno <silent> <Plug>NetrwBrowseX :call netrw#NetrwBrowseX(expand("<cfile>"),0)<cr>
Bram Moolenaarb8a7b562006-02-01 21:47:16 +000096endif
Bram Moolenaarb8a7b562006-02-01 21:47:16 +000097
Bram Moolenaar482aaeb2005-09-29 18:26:07 +000098" ---------------------------------------------------------------------
Bram Moolenaar8d043172014-01-23 14:24:41 +010099" LocalBrowse: invokes netrw#LocalBrowseCheck() on directory buffers {{{2
Bram Moolenaar482aaeb2005-09-29 18:26:07 +0000100fun! s:LocalBrowse(dirname)
Bram Moolenaar8d043172014-01-23 14:24:41 +0100101 " Unfortunate interaction -- only DechoMsg debugging calls can be safely used here.
102 " Otherwise, the BufEnter event gets triggered when attempts to write to
Bram Moolenaar482aaeb2005-09-29 18:26:07 +0000103 " the DBG buffer are made.
Bram Moolenaar8d043172014-01-23 14:24:41 +0100104
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200105 if !exists("s:vimentered")
Bram Moolenaar8d043172014-01-23 14:24:41 +0100106 " If s:vimentered doesn't exist, then the VimEnter event hasn't fired. It will,
107 " and so s:VimEnter() will then be calling this routine, but this time with s:vimentered defined.
108" call Dfunc("s:LocalBrowse(dirname<".a:dirname.">) (s:vimentered doesn't exist)")
109" call Dret("s:LocalBrowse")
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200110 return
111 endif
Bram Moolenaar8d043172014-01-23 14:24:41 +0100112
113" call Dfunc("s:LocalBrowse(dirname<".a:dirname.">) (s:vimentered=".s:vimentered.")")
114
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000115 if has("amiga")
116 " The check against '' is made for the Amiga, where the empty
117 " string is the current directory and not checking would break
118 " things such as the help command.
Bram Moolenaar8d043172014-01-23 14:24:41 +0100119" call Decho("(LocalBrowse) dirname<".a:dirname."> (isdirectory, amiga)")
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000120 if a:dirname != '' && isdirectory(a:dirname)
Bram Moolenaaradc21822011-04-01 18:03:16 +0200121 sil! call netrw#LocalBrowseCheck(a:dirname)
Bram Moolenaara6878372014-03-22 21:02:50 +0100122 if exists("w:netrw_bannercnt")
123 exe w:netrw_bannercnt
124 endif
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000125 endif
Bram Moolenaar8d043172014-01-23 14:24:41 +0100126
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000127 elseif isdirectory(a:dirname)
Bram Moolenaara6878372014-03-22 21:02:50 +0100128" call Decho("(LocalBrowse) dirname<".a:dirname."> ft=".&ft." (isdirectory, not amiga)")
129" call Dredir("LocalBrowse ft last set: ","verbose set ft")
Bram Moolenaaradc21822011-04-01 18:03:16 +0200130 sil! call netrw#LocalBrowseCheck(a:dirname)
Bram Moolenaara6878372014-03-22 21:02:50 +0100131 if exists("w:netrw_bannercnt")
132 exe w:netrw_bannercnt
133 endif
Bram Moolenaar8d043172014-01-23 14:24:41 +0100134
135 else
136 " not a directory, ignore it
137" call Decho("(LocalBrowse) dirname<".a:dirname."> not a directory, ignoring...")
Bram Moolenaar482aaeb2005-09-29 18:26:07 +0000138 endif
Bram Moolenaar8d043172014-01-23 14:24:41 +0100139
140" call Dret("s:LocalBrowse")
Bram Moolenaar482aaeb2005-09-29 18:26:07 +0000141endfun
142
143" ---------------------------------------------------------------------
Bram Moolenaar8d043172014-01-23 14:24:41 +0100144" s:VimEnter: after all vim startup stuff is done, this function is called. {{{2
145" Its purpose: to look over all windows and run s:LocalBrowse() on
146" them, which checks if they're directories and will create a directory
147" listing when appropriate.
148" It also sets s:vimentered, letting s:LocalBrowse() know that s:VimEnter()
149" has already been called.
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200150fun! s:VimEnter(dirname)
Bram Moolenaar8d043172014-01-23 14:24:41 +0100151" call Dfunc("s:VimEnter(dirname<".a:dirname.">) expand(%)<".expand("%").">")
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200152 let curwin = winnr()
153 let s:vimentered = 1
Bram Moolenaar8d043172014-01-23 14:24:41 +0100154 windo call s:LocalBrowse(expand("%:p"))
Bram Moolenaar477db062010-07-28 18:17:41 +0200155 exe curwin."wincmd w"
Bram Moolenaar8d043172014-01-23 14:24:41 +0100156" call Dret("s:VimEnter")
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200157endfun
158
159" ---------------------------------------------------------------------
Bram Moolenaar482aaeb2005-09-29 18:26:07 +0000160" NetrwStatusLine: {{{1
161fun! NetrwStatusLine()
Bram Moolenaaraf48b092006-03-14 22:51:38 +0000162" let g:stlmsg= "Xbufnr=".w:netrw_explore_bufnr." bufnr=".bufnr("%")." Xline#".w:netrw_explore_line." line#".line(".")
163 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")
Bram Moolenaar482aaeb2005-09-29 18:26:07 +0000164 let &stl= s:netrw_explore_stl
165 if exists("w:netrw_explore_bufnr")|unlet w:netrw_explore_bufnr|endif
166 if exists("w:netrw_explore_line")|unlet w:netrw_explore_line|endif
167 return ""
168 else
169 return "Match ".w:netrw_explore_mtchcnt." of ".w:netrw_explore_listlen
170 endif
171endfun
172
173" ------------------------------------------------------------------------
174" NetUserPass: set username and password for subsequent ftp transfer {{{1
175" Usage: :call NetUserPass() -- will prompt for userid and password
176" :call NetUserPass("uid") -- will prompt for password
177" :call NetUserPass("uid","password") -- sets global userid and password
178fun! NetUserPass(...)
179
180 " get/set userid
181 if a:0 == 0
182" call Dfunc("NetUserPass(a:0<".a:0.">)")
183 if !exists("g:netrw_uid") || g:netrw_uid == ""
184 " via prompt
185 let g:netrw_uid= input('Enter username: ')
186 endif
187 else " from command line
188" call Dfunc("NetUserPass(a:1<".a:1.">) {")
189 let g:netrw_uid= a:1
190 endif
191
192 " get password
193 if a:0 <= 1 " via prompt
194" call Decho("a:0=".a:0." case <=1:")
195 let g:netrw_passwd= inputsecret("Enter Password: ")
196 else " from command line
197" call Decho("a:0=".a:0." case >1: a:2<".a:2.">")
198 let g:netrw_passwd=a:2
199 endif
200" call Dret("NetUserPass")
201endfun
202
203" ------------------------------------------------------------------------
Bram Moolenaar482aaeb2005-09-29 18:26:07 +0000204" Modelines And Restoration: {{{1
205let &cpo= s:keepcpo
206unlet s:keepcpo
207" vim:ts=8 fdm=marker