blob: d7439f828fa7434e1b5e3b394ce8d37528a995b7 [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 Moolenaar8d043172014-01-23 14:24:41 +01003" Date: Dec 31, 2013
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 Moolenaar8d043172014-01-23 14:24:41 +010023let g:loaded_netrwPlugin = "v150"
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 Moolenaar8d043172014-01-23 14:24:41 +010046 au BufEnter * sil call s:LocalBrowse(expand("<amatch>"))
47 au VimEnter * sil call s:VimEnter(expand("<amatch>"))
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +000048 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar8d043172014-01-23 14:24:41 +010049 au BufEnter .* sil call s:LocalBrowse(expand("<amatch>"))
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +000050 endif
Bram Moolenaar482aaeb2005-09-29 18:26:07 +000051augroup END
52
53" Network Browsing Reading Writing: {{{2
54augroup Network
55 au!
Bram Moolenaare6ae6222013-05-21 21:01:10 +020056 au BufReadCmd file://* call netrw#FileUrlRead(expand("<amatch>"))
Bram Moolenaarff034192013-04-24 18:51:19 +020057 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>"))
58 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 +010059 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>"))
60 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 +000061 try
Bram Moolenaar15146672011-10-20 22:22:38 +020062 au SourceCmd ftp://*,rcp://*,scp://*,http://*,https://*,dav://*,davs://*,rsync://*,sftp://* exe 'Nsource '.fnameescape(expand("<amatch>"))
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +000063 catch /^Vim\%((\a\+)\)\=:E216/
Bram Moolenaar15146672011-10-20 22:22:38 +020064 au SourcePre ftp://*,rcp://*,scp://*,http://*,https://*,dav://*,davs://*,rsync://*,sftp://* exe 'Nsource '.fnameescape(expand("<amatch>"))
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +000065 endtry
Bram Moolenaar482aaeb2005-09-29 18:26:07 +000066augroup END
67
68" Commands: :Nread, :Nwrite, :NetUserPass {{{2
Bram Moolenaarf2330482008-06-24 20:19:36 +000069com! -count=1 -nargs=* Nread call netrw#NetrwSavePosn()<bar>call netrw#NetRead(<count>,<f-args>)<bar>call netrw#NetrwRestorePosn()
70com! -range=% -nargs=* Nwrite call netrw#NetrwSavePosn()<bar><line1>,<line2>call netrw#NetWrite(<f-args>)<bar>call netrw#NetrwRestorePosn()
Bram Moolenaar482aaeb2005-09-29 18:26:07 +000071com! -nargs=* NetUserPass call NetUserPass(<f-args>)
Bram Moolenaarf2330482008-06-24 20:19:36 +000072com! -nargs=* Nsource call netrw#NetrwSavePosn()<bar>call netrw#NetSource(<f-args>)<bar>call netrw#NetrwRestorePosn()
Bram Moolenaar8d043172014-01-23 14:24:41 +010073com! -nargs=? Ntree call netrw#NetrwSetTreetop(<q-args>)
Bram Moolenaar482aaeb2005-09-29 18:26:07 +000074
Bram Moolenaar8d043172014-01-23 14:24:41 +010075" Commands: :Explore, :Sexplore, Hexplore, Vexplore, Lexplore {{{2
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +000076com! -nargs=* -bar -bang -count=0 -complete=dir Explore call netrw#Explore(<count>,0,0+<bang>0,<q-args>)
77com! -nargs=* -bar -bang -count=0 -complete=dir Sexplore call netrw#Explore(<count>,1,0+<bang>0,<q-args>)
78com! -nargs=* -bar -bang -count=0 -complete=dir Hexplore call netrw#Explore(<count>,1,2+<bang>0,<q-args>)
79com! -nargs=* -bar -bang -count=0 -complete=dir Vexplore call netrw#Explore(<count>,1,4+<bang>0,<q-args>)
80com! -nargs=* -bar -count=0 -complete=dir Texplore call netrw#Explore(<count>,0,6 ,<q-args>)
81com! -nargs=* -bar -bang Nexplore call netrw#Explore(-1,0,0,<q-args>)
82com! -nargs=* -bar -bang Pexplore call netrw#Explore(-2,0,0,<q-args>)
Bram Moolenaar8d043172014-01-23 14:24:41 +010083com! -nargs=* -bar -complete=dir Lexplore call netrw#Lexplore(<q-args>)
Bram Moolenaar482aaeb2005-09-29 18:26:07 +000084
85" Commands: NetrwSettings {{{2
Bram Moolenaarf2330482008-06-24 20:19:36 +000086com! -nargs=0 NetrwSettings call netrwSettings#NetrwSettings()
87com! -bang NetrwClean call netrw#NetrwClean(<bang>0)
Bram Moolenaar482aaeb2005-09-29 18:26:07 +000088
Bram Moolenaarb8a7b562006-02-01 21:47:16 +000089" Maps:
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +020090if !exists("g:netrw_nogx") && maparg('gx','n') == ""
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +000091 if !hasmapto('<Plug>NetrwBrowseX')
92 nmap <unique> gx <Plug>NetrwBrowseX
93 endif
Bram Moolenaar8d043172014-01-23 14:24:41 +010094 nno <silent> <Plug>NetrwBrowseX :call netrw#NetrwBrowseX(expand("<cfile>"),0)<cr>
Bram Moolenaarb8a7b562006-02-01 21:47:16 +000095endif
Bram Moolenaarb8a7b562006-02-01 21:47:16 +000096
Bram Moolenaar482aaeb2005-09-29 18:26:07 +000097" ---------------------------------------------------------------------
Bram Moolenaar8d043172014-01-23 14:24:41 +010098" LocalBrowse: invokes netrw#LocalBrowseCheck() on directory buffers {{{2
Bram Moolenaar482aaeb2005-09-29 18:26:07 +000099fun! s:LocalBrowse(dirname)
Bram Moolenaar8d043172014-01-23 14:24:41 +0100100 " Unfortunate interaction -- only DechoMsg debugging calls can be safely used here.
101 " Otherwise, the BufEnter event gets triggered when attempts to write to
Bram Moolenaar482aaeb2005-09-29 18:26:07 +0000102 " the DBG buffer are made.
Bram Moolenaar8d043172014-01-23 14:24:41 +0100103
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200104 if !exists("s:vimentered")
Bram Moolenaar8d043172014-01-23 14:24:41 +0100105 " If s:vimentered doesn't exist, then the VimEnter event hasn't fired. It will,
106 " and so s:VimEnter() will then be calling this routine, but this time with s:vimentered defined.
107" call Dfunc("s:LocalBrowse(dirname<".a:dirname.">) (s:vimentered doesn't exist)")
108" call Dret("s:LocalBrowse")
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200109 return
110 endif
Bram Moolenaar8d043172014-01-23 14:24:41 +0100111
112" call Dfunc("s:LocalBrowse(dirname<".a:dirname.">) (s:vimentered=".s:vimentered.")")
113
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000114 if has("amiga")
115 " The check against '' is made for the Amiga, where the empty
116 " string is the current directory and not checking would break
117 " things such as the help command.
Bram Moolenaar8d043172014-01-23 14:24:41 +0100118" call Decho("(LocalBrowse) dirname<".a:dirname."> (isdirectory, amiga)")
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000119 if a:dirname != '' && isdirectory(a:dirname)
Bram Moolenaaradc21822011-04-01 18:03:16 +0200120 sil! call netrw#LocalBrowseCheck(a:dirname)
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000121 endif
Bram Moolenaar8d043172014-01-23 14:24:41 +0100122
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000123 elseif isdirectory(a:dirname)
Bram Moolenaar8d043172014-01-23 14:24:41 +0100124" call Decho("(LocalBrowse) dirname<".a:dirname."> (isdirectory, not amiga)")
Bram Moolenaaradc21822011-04-01 18:03:16 +0200125 sil! call netrw#LocalBrowseCheck(a:dirname)
Bram Moolenaar8d043172014-01-23 14:24:41 +0100126
127 else
128 " not a directory, ignore it
129" call Decho("(LocalBrowse) dirname<".a:dirname."> not a directory, ignoring...")
Bram Moolenaar482aaeb2005-09-29 18:26:07 +0000130 endif
Bram Moolenaar8d043172014-01-23 14:24:41 +0100131
132" call Dret("s:LocalBrowse")
Bram Moolenaar482aaeb2005-09-29 18:26:07 +0000133endfun
134
135" ---------------------------------------------------------------------
Bram Moolenaar8d043172014-01-23 14:24:41 +0100136" s:VimEnter: after all vim startup stuff is done, this function is called. {{{2
137" Its purpose: to look over all windows and run s:LocalBrowse() on
138" them, which checks if they're directories and will create a directory
139" listing when appropriate.
140" It also sets s:vimentered, letting s:LocalBrowse() know that s:VimEnter()
141" has already been called.
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200142fun! s:VimEnter(dirname)
Bram Moolenaar8d043172014-01-23 14:24:41 +0100143" call Dfunc("s:VimEnter(dirname<".a:dirname.">) expand(%)<".expand("%").">")
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200144 let curwin = winnr()
145 let s:vimentered = 1
Bram Moolenaar8d043172014-01-23 14:24:41 +0100146 windo call s:LocalBrowse(expand("%:p"))
Bram Moolenaar477db062010-07-28 18:17:41 +0200147 exe curwin."wincmd w"
Bram Moolenaar8d043172014-01-23 14:24:41 +0100148" call Dret("s:VimEnter")
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200149endfun
150
151" ---------------------------------------------------------------------
Bram Moolenaar482aaeb2005-09-29 18:26:07 +0000152" NetrwStatusLine: {{{1
153fun! NetrwStatusLine()
Bram Moolenaaraf48b092006-03-14 22:51:38 +0000154" let g:stlmsg= "Xbufnr=".w:netrw_explore_bufnr." bufnr=".bufnr("%")." Xline#".w:netrw_explore_line." line#".line(".")
155 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 +0000156 let &stl= s:netrw_explore_stl
157 if exists("w:netrw_explore_bufnr")|unlet w:netrw_explore_bufnr|endif
158 if exists("w:netrw_explore_line")|unlet w:netrw_explore_line|endif
159 return ""
160 else
161 return "Match ".w:netrw_explore_mtchcnt." of ".w:netrw_explore_listlen
162 endif
163endfun
164
165" ------------------------------------------------------------------------
166" NetUserPass: set username and password for subsequent ftp transfer {{{1
167" Usage: :call NetUserPass() -- will prompt for userid and password
168" :call NetUserPass("uid") -- will prompt for password
169" :call NetUserPass("uid","password") -- sets global userid and password
170fun! NetUserPass(...)
171
172 " get/set userid
173 if a:0 == 0
174" call Dfunc("NetUserPass(a:0<".a:0.">)")
175 if !exists("g:netrw_uid") || g:netrw_uid == ""
176 " via prompt
177 let g:netrw_uid= input('Enter username: ')
178 endif
179 else " from command line
180" call Dfunc("NetUserPass(a:1<".a:1.">) {")
181 let g:netrw_uid= a:1
182 endif
183
184 " get password
185 if a:0 <= 1 " via prompt
186" call Decho("a:0=".a:0." case <=1:")
187 let g:netrw_passwd= inputsecret("Enter Password: ")
188 else " from command line
189" call Decho("a:0=".a:0." case >1: a:2<".a:2.">")
190 let g:netrw_passwd=a:2
191 endif
192" call Dret("NetUserPass")
193endfun
194
195" ------------------------------------------------------------------------
Bram Moolenaar482aaeb2005-09-29 18:26:07 +0000196" Modelines And Restoration: {{{1
197let &cpo= s:keepcpo
198unlet s:keepcpo
199" vim:ts=8 fdm=marker