blob: d309f814841698186f8da5eca706316ddffaf70d [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 Moolenaar89a9c152021-08-29 21:55:35 +02003" Date: Feb 09, 2021
Bram Moolenaar29634562020-01-09 21:46:04 +01004" Maintainer: Charles E Campbell <NcampObell@SdrPchip.AorgM-NOSPAM>
Bram Moolenaar482aaeb2005-09-29 18:26:07 +00005" GetLatestVimScripts: 1075 1 :AutoInstall: netrw.vim
Bram Moolenaar89a9c152021-08-29 21:55:35 +02006" Copyright: Copyright (C) 1999-2021 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 Moolenaar89a9c152021-08-29 21:55:35 +020023let g:loaded_netrwPlugin = "v171"
Bram Moolenaar5c736222010-01-06 20:54:52 +010024let s:keepcpo = &cpo
Bram Moolenaar482aaeb2005-09-29 18:26:07 +000025set cpo&vim
Bram Moolenaar8d043172014-01-23 14:24:41 +010026"DechoRemOn
Bram Moolenaar482aaeb2005-09-29 18:26:07 +000027
28" ---------------------------------------------------------------------
29" Public Interface: {{{1
30
Bram Moolenaar8d043172014-01-23 14:24:41 +010031" Local Browsing Autocmds: {{{2
Bram Moolenaar482aaeb2005-09-29 18:26:07 +000032augroup FileExplorer
33 au!
Bram Moolenaara6878372014-03-22 21:02:50 +010034 au BufLeave * if &ft != "netrw"|let w:netrw_prvfile= expand("%:p")|endif
Bram Moolenaar8d043172014-01-23 14:24:41 +010035 au BufEnter * sil call s:LocalBrowse(expand("<amatch>"))
36 au VimEnter * sil call s:VimEnter(expand("<amatch>"))
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +000037 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar8d043172014-01-23 14:24:41 +010038 au BufEnter .* sil call s:LocalBrowse(expand("<amatch>"))
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +000039 endif
Bram Moolenaar482aaeb2005-09-29 18:26:07 +000040augroup END
41
42" Network Browsing Reading Writing: {{{2
43augroup Network
44 au!
Bram Moolenaar85850f32019-07-19 22:05:51 +020045 au BufReadCmd file://* call netrw#FileUrlEdit(expand("<amatch>"))
46 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>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010047 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>"))
48 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>"))
49 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>"))
Bram Moolenaar589edb32019-09-20 14:38:13 +020050 try
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010051 au SourceCmd ftp://*,rcp://*,scp://*,http://*,file://*,https://*,dav://*,davs://*,rsync://*,sftp://* exe 'Nsource '.fnameescape(expand("<amatch>"))
Bram Moolenaar589edb32019-09-20 14:38:13 +020052 catch /^Vim\%((\a\+)\)\=:E216/
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010053 au SourcePre ftp://*,rcp://*,scp://*,http://*,file://*,https://*,dav://*,davs://*,rsync://*,sftp://* exe 'Nsource '.fnameescape(expand("<amatch>"))
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +000054 endtry
Bram Moolenaar482aaeb2005-09-29 18:26:07 +000055augroup END
56
57" Commands: :Nread, :Nwrite, :NetUserPass {{{2
Bram Moolenaare0fa3742016-02-20 15:47:01 +010058com! -count=1 -nargs=* Nread let s:svpos= winsaveview()<bar>call netrw#NetRead(<count>,<f-args>)<bar>call winrestview(s:svpos)
59com! -range=% -nargs=* Nwrite let s:svpos= winsaveview()<bar><line1>,<line2>call netrw#NetWrite(<f-args>)<bar>call winrestview(s:svpos)
Bram Moolenaar482aaeb2005-09-29 18:26:07 +000060com! -nargs=* NetUserPass call NetUserPass(<f-args>)
Bram Moolenaare0fa3742016-02-20 15:47:01 +010061com! -nargs=* Nsource let s:svpos= winsaveview()<bar>call netrw#NetSource(<f-args>)<bar>call winrestview(s:svpos)
Bram Moolenaar85850f32019-07-19 22:05:51 +020062com! -nargs=? Ntree call netrw#SetTreetop(1,<q-args>)
Bram Moolenaar482aaeb2005-09-29 18:26:07 +000063
Bram Moolenaar8d043172014-01-23 14:24:41 +010064" Commands: :Explore, :Sexplore, Hexplore, Vexplore, Lexplore {{{2
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +000065com! -nargs=* -bar -bang -count=0 -complete=dir Explore call netrw#Explore(<count>,0,0+<bang>0,<q-args>)
66com! -nargs=* -bar -bang -count=0 -complete=dir Sexplore call netrw#Explore(<count>,1,0+<bang>0,<q-args>)
67com! -nargs=* -bar -bang -count=0 -complete=dir Hexplore call netrw#Explore(<count>,1,2+<bang>0,<q-args>)
68com! -nargs=* -bar -bang -count=0 -complete=dir Vexplore call netrw#Explore(<count>,1,4+<bang>0,<q-args>)
69com! -nargs=* -bar -count=0 -complete=dir Texplore call netrw#Explore(<count>,0,6 ,<q-args>)
70com! -nargs=* -bar -bang Nexplore call netrw#Explore(-1,0,0,<q-args>)
71com! -nargs=* -bar -bang Pexplore call netrw#Explore(-2,0,0,<q-args>)
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010072com! -nargs=* -bar -bang -count=0 -complete=dir Lexplore call netrw#Lexplore(<count>,<bang>0,<q-args>)
Bram Moolenaar482aaeb2005-09-29 18:26:07 +000073
74" Commands: NetrwSettings {{{2
Bram Moolenaarf2330482008-06-24 20:19:36 +000075com! -nargs=0 NetrwSettings call netrwSettings#NetrwSettings()
Bram Moolenaara6878372014-03-22 21:02:50 +010076com! -bang NetrwClean call netrw#Clean(<bang>0)
Bram Moolenaar482aaeb2005-09-29 18:26:07 +000077
Bram Moolenaarb8a7b562006-02-01 21:47:16 +000078" Maps:
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010079if !exists("g:netrw_nogx")
80 if maparg('gx','n') == ""
81 if !hasmapto('<Plug>NetrwBrowseX')
82 nmap <unique> gx <Plug>NetrwBrowseX
83 endif
Bram Moolenaar5ef1c6a2019-11-10 22:09:11 +010084 nno <silent> <Plug>NetrwBrowseX :call netrw#BrowseX(netrw#GX(),netrw#CheckIfRemote(netrw#GX()))<cr>
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +000085 endif
Bram Moolenaar89a9c152021-08-29 21:55:35 +020086 if maparg('gx','x') == ""
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010087 if !hasmapto('<Plug>NetrwBrowseXVis')
Bram Moolenaar89a9c152021-08-29 21:55:35 +020088 xmap <unique> gx <Plug>NetrwBrowseXVis
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010089 endif
Bram Moolenaar89a9c152021-08-29 21:55:35 +020090 xno <silent> <Plug>NetrwBrowseXVis :<c-u>call netrw#BrowseXVis()<cr>
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010091 endif
Bram Moolenaarb8a7b562006-02-01 21:47:16 +000092endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +010093if exists("g:netrw_usetab") && g:netrw_usetab
94 if maparg('<c-tab>','n') == ""
95 nmap <unique> <c-tab> <Plug>NetrwShrink
96 endif
97 nno <silent> <Plug>NetrwShrink :call netrw#Shrink()<cr>
98endif
Bram Moolenaarb8a7b562006-02-01 21:47:16 +000099
Bram Moolenaar482aaeb2005-09-29 18:26:07 +0000100" ---------------------------------------------------------------------
Bram Moolenaar8d043172014-01-23 14:24:41 +0100101" LocalBrowse: invokes netrw#LocalBrowseCheck() on directory buffers {{{2
Bram Moolenaar482aaeb2005-09-29 18:26:07 +0000102fun! s:LocalBrowse(dirname)
Bram Moolenaar8d043172014-01-23 14:24:41 +0100103 " Unfortunate interaction -- only DechoMsg debugging calls can be safely used here.
104 " Otherwise, the BufEnter event gets triggered when attempts to write to
Bram Moolenaar482aaeb2005-09-29 18:26:07 +0000105 " the DBG buffer are made.
Bram Moolenaar589edb32019-09-20 14:38:13 +0200106
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200107 if !exists("s:vimentered")
Bram Moolenaar8d043172014-01-23 14:24:41 +0100108 " If s:vimentered doesn't exist, then the VimEnter event hasn't fired. It will,
109 " and so s:VimEnter() will then be calling this routine, but this time with s:vimentered defined.
110" call Dfunc("s:LocalBrowse(dirname<".a:dirname.">) (s:vimentered doesn't exist)")
111" call Dret("s:LocalBrowse")
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200112 return
113 endif
Bram Moolenaar8d043172014-01-23 14:24:41 +0100114
115" call Dfunc("s:LocalBrowse(dirname<".a:dirname.">) (s:vimentered=".s:vimentered.")")
116
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000117 if has("amiga")
118 " The check against '' is made for the Amiga, where the empty
119 " string is the current directory and not checking would break
120 " things such as the help command.
Bram Moolenaar8d043172014-01-23 14:24:41 +0100121" call Decho("(LocalBrowse) dirname<".a:dirname."> (isdirectory, amiga)")
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000122 if a:dirname != '' && isdirectory(a:dirname)
Bram Moolenaaradc21822011-04-01 18:03:16 +0200123 sil! call netrw#LocalBrowseCheck(a:dirname)
Bram Moolenaar8feef4f2015-01-07 16:57:10 +0100124 if exists("w:netrw_bannercnt") && line('.') < w:netrw_bannercnt
Bram Moolenaara6878372014-03-22 21:02:50 +0100125 exe w:netrw_bannercnt
126 endif
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000127 endif
Bram Moolenaar8d043172014-01-23 14:24:41 +0100128
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000129 elseif isdirectory(a:dirname)
Bram Moolenaara6878372014-03-22 21:02:50 +0100130" call Decho("(LocalBrowse) dirname<".a:dirname."> ft=".&ft." (isdirectory, not amiga)")
131" call Dredir("LocalBrowse ft last set: ","verbose set ft")
Bram Moolenaar89a9c152021-08-29 21:55:35 +0200132 " Jul 13, 2021: for whatever reason, preceding the following call with
133 " a sil! causes an unbalanced if-endif vim error
134 call netrw#LocalBrowseCheck(a:dirname)
Bram Moolenaar8feef4f2015-01-07 16:57:10 +0100135 if exists("w:netrw_bannercnt") && line('.') < w:netrw_bannercnt
Bram Moolenaara6878372014-03-22 21:02:50 +0100136 exe w:netrw_bannercnt
137 endif
Bram Moolenaar8d043172014-01-23 14:24:41 +0100138
139 else
140 " not a directory, ignore it
141" call Decho("(LocalBrowse) dirname<".a:dirname."> not a directory, ignoring...")
Bram Moolenaar482aaeb2005-09-29 18:26:07 +0000142 endif
Bram Moolenaar8d043172014-01-23 14:24:41 +0100143
144" call Dret("s:LocalBrowse")
Bram Moolenaar482aaeb2005-09-29 18:26:07 +0000145endfun
146
147" ---------------------------------------------------------------------
Bram Moolenaar8d043172014-01-23 14:24:41 +0100148" s:VimEnter: after all vim startup stuff is done, this function is called. {{{2
149" Its purpose: to look over all windows and run s:LocalBrowse() on
150" them, which checks if they're directories and will create a directory
151" listing when appropriate.
152" It also sets s:vimentered, letting s:LocalBrowse() know that s:VimEnter()
153" has already been called.
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200154fun! s:VimEnter(dirname)
Bram Moolenaar8d043172014-01-23 14:24:41 +0100155" call Dfunc("s:VimEnter(dirname<".a:dirname.">) expand(%)<".expand("%").">")
Bram Moolenaar89a9c152021-08-29 21:55:35 +0200156 if has('nvim') || v:version < 802
157 " Johann Hรถchtl: reported that the call range... line causes an E488: Trailing characters
158 " error with neovim. I suspect its because neovim hasn't updated with recent
159 " vim patches. As is, this code will have problems with popup terminals
160 " instantiated before the VimEnter event runs.
161 " Ingo Karkat : E488 also in Vim 8.1.1602
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200162 let curwin = winnr()
163 let s:vimentered = 1
Bram Moolenaar8d043172014-01-23 14:24:41 +0100164 windo call s:LocalBrowse(expand("%:p"))
Bram Moolenaar477db062010-07-28 18:17:41 +0200165 exe curwin."wincmd w"
Bram Moolenaar89a9c152021-08-29 21:55:35 +0200166 else
167 " the following complicated expression comes courtesy of lacygoill; largely does the same thing as the windo and
168 " wincmd which are commented out, but avoids some side effects. Allows popup terminal before VimEnter.
169 let s:vimentered = 1
170 call range(1, winnr('$'))->map({_, v -> win_execute(win_getid(v), 'call expand("%:p")->s:LocalBrowse()')})
171 endif
Bram Moolenaar8d043172014-01-23 14:24:41 +0100172" call Dret("s:VimEnter")
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200173endfun
174
175" ---------------------------------------------------------------------
Bram Moolenaar482aaeb2005-09-29 18:26:07 +0000176" NetrwStatusLine: {{{1
177fun! NetrwStatusLine()
Bram Moolenaaraf48b092006-03-14 22:51:38 +0000178" let g:stlmsg= "Xbufnr=".w:netrw_explore_bufnr." bufnr=".bufnr("%")." Xline#".w:netrw_explore_line." line#".line(".")
179 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 +0000180 let &stl= s:netrw_explore_stl
181 if exists("w:netrw_explore_bufnr")|unlet w:netrw_explore_bufnr|endif
182 if exists("w:netrw_explore_line")|unlet w:netrw_explore_line|endif
183 return ""
184 else
185 return "Match ".w:netrw_explore_mtchcnt." of ".w:netrw_explore_listlen
186 endif
187endfun
188
189" ------------------------------------------------------------------------
190" NetUserPass: set username and password for subsequent ftp transfer {{{1
191" Usage: :call NetUserPass() -- will prompt for userid and password
192" :call NetUserPass("uid") -- will prompt for password
193" :call NetUserPass("uid","password") -- sets global userid and password
194fun! NetUserPass(...)
195
196 " get/set userid
197 if a:0 == 0
198" call Dfunc("NetUserPass(a:0<".a:0.">)")
199 if !exists("g:netrw_uid") || g:netrw_uid == ""
200 " via prompt
201 let g:netrw_uid= input('Enter username: ')
202 endif
203 else " from command line
204" call Dfunc("NetUserPass(a:1<".a:1.">) {")
205 let g:netrw_uid= a:1
206 endif
207
208 " get password
209 if a:0 <= 1 " via prompt
210" call Decho("a:0=".a:0." case <=1:")
211 let g:netrw_passwd= inputsecret("Enter Password: ")
212 else " from command line
213" call Decho("a:0=".a:0." case >1: a:2<".a:2.">")
214 let g:netrw_passwd=a:2
215 endif
216" call Dret("NetUserPass")
217endfun
218
219" ------------------------------------------------------------------------
Bram Moolenaar482aaeb2005-09-29 18:26:07 +0000220" Modelines And Restoration: {{{1
221let &cpo= s:keepcpo
222unlet s:keepcpo
223" vim:ts=8 fdm=marker